From 5be7e0e0b0f4f1039ecf07aeef7346fe2285e053 Mon Sep 17 00:00:00 2001 From: Jianzheng Zhou Date: Tue, 15 Oct 2013 17:32:51 +0800 Subject: ENGR00275869 wifi: update new rtl8723as wifi driver Base on rtl8723as driver(v4.1.8_9180.20130927_BTCOEX20130528_ver3.3_beta) still do the following changes for imx6: 1.add imx6 in Makefile. 2.fix suspend/resume issue.Just refactor runtime_pm in suspend. Signed-off-by: Jianzheng Zhou --- drivers/net/wireless/rtl8723as/Makefile | 131 +- .../rtl8723as/autoconf_rtl8723a_sdio_linux.h | 14 +- .../rtl8723as/autoconf_rtl8723a_usb_linux.h | 22 +- drivers/net/wireless/rtl8723as/core/rtw_ap.c | 5875 ++++---- drivers/net/wireless/rtl8723as/core/rtw_bt_mp.c | 3469 ++--- drivers/net/wireless/rtl8723as/core/rtw_cmd.c | 376 +- drivers/net/wireless/rtl8723as/core/rtw_debug.c | 152 + .../net/wireless/rtl8723as/core/rtw_ieee80211.c | 181 +- drivers/net/wireless/rtl8723as/core/rtw_io.c | 26 + .../net/wireless/rtl8723as/core/rtw_ioctl_set.c | 171 +- drivers/net/wireless/rtl8723as/core/rtw_led.c | 4844 +++--- drivers/net/wireless/rtl8723as/core/rtw_mlme.c | 311 +- drivers/net/wireless/rtl8723as/core/rtw_mlme_ext.c | 1058 +- drivers/net/wireless/rtl8723as/core/rtw_mp.c | 46 +- drivers/net/wireless/rtl8723as/core/rtw_mp_ioctl.c | 4 +- drivers/net/wireless/rtl8723as/core/rtw_odm.c | 217 + drivers/net/wireless/rtl8723as/core/rtw_p2p.c | 911 +- drivers/net/wireless/rtl8723as/core/rtw_pwrctrl.c | 272 +- drivers/net/wireless/rtl8723as/core/rtw_recv.c | 277 +- drivers/net/wireless/rtl8723as/core/rtw_security.c | 325 +- drivers/net/wireless/rtl8723as/core/rtw_sreset.c | 706 +- drivers/net/wireless/rtl8723as/core/rtw_sta_mgt.c | 11 + drivers/net/wireless/rtl8723as/core/rtw_tdls.c | 5882 ++++---- drivers/net/wireless/rtl8723as/core/rtw_wapi.c | 2652 ++-- .../net/wireless/rtl8723as/core/rtw_wapi_sms4.c | 1846 +-- .../net/wireless/rtl8723as/core/rtw_wlan_util.c | 145 +- drivers/net/wireless/rtl8723as/core/rtw_xmit.c | 386 +- drivers/net/wireless/rtl8723as/hal/HalPwrSeqCmd.c | 374 +- drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.c | 1222 +- drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.h | 4046 ++--- .../wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.c | 2373 +-- .../wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.h | 390 +- .../rtl8723as/hal/OUTSRC/odm_RegDefine11AC.h | 110 +- .../rtl8723as/hal/OUTSRC/odm_RegDefine11N.h | 344 +- .../net/wireless/rtl8723as/hal/OUTSRC/odm_debug.c | 1254 +- .../net/wireless/rtl8723as/hal/OUTSRC/odm_debug.h | 1810 +-- .../wireless/rtl8723as/hal/OUTSRC/odm_interface.c | 1332 +- .../wireless/rtl8723as/hal/OUTSRC/odm_interface.h | 748 +- .../wireless/rtl8723as/hal/OUTSRC/odm_precomp.h | 444 +- .../net/wireless/rtl8723as/hal/OUTSRC/odm_reg.h | 240 +- .../hal/OUTSRC/rtl8192c/Hal8192CEMACImg_CE.c | 188 +- .../hal/OUTSRC/rtl8192c/Hal8192CEMACImg_CE.h | 20 +- .../hal/OUTSRC/rtl8192c/Hal8192CEPHYImg_CE.c | 2396 +-- .../hal/OUTSRC/rtl8192c/Hal8192CEPHYImg_CE.h | 120 +- .../rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CReg.h | 90 +- .../hal/OUTSRC/rtl8192c/Hal8192CUMACImg_CE.c | 194 +- .../hal/OUTSRC/rtl8192c/Hal8192CUMACImg_CE.h | 24 +- .../hal/OUTSRC/rtl8192c/Hal8192CUPHYImg_CE.c | 5284 +++---- .../hal/OUTSRC/rtl8192c/Hal8192CUPHYImg_CE.h | 162 +- .../hal/OUTSRC/rtl8192c/HalDMOutSrc8192C_CE.c | 11 +- .../rtl8723as/hal/OUTSRC/rtl8192c/odm_RTL8192C.c | 4466 +++--- .../rtl8723as/hal/OUTSRC/rtl8192c/odm_RTL8192C.h | 172 +- .../rtl8723as/hal/OUTSRC/rtl8723a/Hal8723Reg.h | 90 +- .../hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.c | 13217 ++++++++--------- .../hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.h | 134 +- .../hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.c | 14764 +++++++++---------- .../hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.h | 150 +- .../hal/OUTSRC/rtl8723a/HalHWImg8723A_BB.c | 1630 +- .../hal/OUTSRC/rtl8723a/HalHWImg8723A_BB.h | 126 +- .../hal/OUTSRC/rtl8723a/HalHWImg8723A_FW.c | 3194 ++-- .../hal/OUTSRC/rtl8723a/HalHWImg8723A_FW.h | 78 +- .../hal/OUTSRC/rtl8723a/HalHWImg8723A_MAC.c | 438 +- .../hal/OUTSRC/rtl8723a/HalHWImg8723A_MAC.h | 72 +- .../hal/OUTSRC/rtl8723a/HalHWImg8723A_RF.c | 580 +- .../hal/OUTSRC/rtl8723a/HalHWImg8723A_RF.h | 74 +- drivers/net/wireless/rtl8723as/hal/hal_com.c | 58 + drivers/net/wireless/rtl8723as/hal/hal_intf.c | 100 +- .../rtl8723as/hal/rtl8723a/Hal8723PwrSeq.c | 182 +- .../rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c | 469 +- .../wireless/rtl8723as/hal/rtl8723a/rtl8723a_cmd.c | 2344 +-- .../wireless/rtl8723as/hal/rtl8723a/rtl8723a_dm.c | 1159 +- .../rtl8723as/hal/rtl8723a/rtl8723a_hal_init.c | 230 +- .../wireless/rtl8723as/hal/rtl8723a/rtl8723a_mp.c | 2393 +-- .../rtl8723as/hal/rtl8723a/rtl8723a_phycfg.c | 6803 ++++----- .../rtl8723as/hal/rtl8723a/rtl8723a_rf6052.c | 1970 +-- .../rtl8723as/hal/rtl8723a/rtl8723a_rxdesc.c | 2 +- .../rtl8723as/hal/rtl8723a/rtl8723a_sreset.c | 215 +- .../rtl8723as/hal/rtl8723a/rtl8723a_xmit.c | 130 +- .../rtl8723as/hal/rtl8723a/sdio/rtl8723as_led.c | 258 +- .../rtl8723as/hal/rtl8723a/sdio/rtl8723as_recv.c | 75 +- .../rtl8723as/hal/rtl8723a/sdio/rtl8723as_xmit.c | 49 +- .../rtl8723as/hal/rtl8723a/sdio/sdio_halinit.c | 78 +- .../rtl8723as/hal/rtl8723a/sdio/sdio_ops.c | 258 +- .../rtl8723as/hal/rtl8723a/usb/rtl8723au_recv.c | 18 +- .../rtl8723as/hal/rtl8723a/usb/rtl8723au_xmit.c | 29 +- .../rtl8723as/hal/rtl8723a/usb/usb_halinit.c | 162 +- .../rtl8723as/hal/rtl8723a/usb/usb_ops_linux.c | 83 +- drivers/net/wireless/rtl8723as/ifcfg-wlan0 | 6 +- .../wireless/rtl8723as/include/Hal8188EPhyCfg.h | 857 +- .../wireless/rtl8723as/include/Hal8188EPhyReg.h | 2222 +-- .../wireless/rtl8723as/include/Hal8188EPwrSeq.h | 354 +- .../wireless/rtl8723as/include/Hal8192CPhyCfg.h | 1 + .../wireless/rtl8723as/include/Hal8192DPhyCfg.h | 1 + .../wireless/rtl8723as/include/Hal8192DPhyReg.h | 2308 +-- .../wireless/rtl8723as/include/Hal8723APhyCfg.h | 60 +- .../wireless/rtl8723as/include/Hal8723APhyReg.h | 148 +- .../net/wireless/rtl8723as/include/Hal8723PwrSeq.h | 342 +- .../net/wireless/rtl8723as/include/HalPwrSeqCmd.h | 276 +- drivers/net/wireless/rtl8723as/include/HalVerDef.h | 7 + drivers/net/wireless/rtl8723as/include/autoconf.h | 14 +- .../wireless/rtl8723as/include/byteorder/swab.h | 4 +- drivers/net/wireless/rtl8723as/include/drv_conf.h | 5 - drivers/net/wireless/rtl8723as/include/drv_types.h | 25 +- .../wireless/rtl8723as/include/drv_types_gspi.h | 98 +- .../wireless/rtl8723as/include/drv_types_sdio.h | 142 +- drivers/net/wireless/rtl8723as/include/hal_com.h | 3 + drivers/net/wireless/rtl8723as/include/hal_intf.h | 10 +- drivers/net/wireless/rtl8723as/include/ieee80211.h | 21 +- .../net/wireless/rtl8723as/include/ieee80211_ext.h | 918 +- .../wireless/rtl8723as/include/ioctl_cfg80211.h | 313 +- .../wireless/rtl8723as/include/osdep_ce_service.h | 306 +- .../net/wireless/rtl8723as/include/osdep_intf.h | 7 + .../net/wireless/rtl8723as/include/osdep_service.h | 207 +- .../net/wireless/rtl8723as/include/rtl8188e_cmd.h | 59 + .../net/wireless/rtl8723as/include/rtl8188e_hal.h | 1434 +- .../net/wireless/rtl8723as/include/rtl8188e_led.h | 92 +- .../net/wireless/rtl8723as/include/rtl8188e_recv.h | 292 +- .../net/wireless/rtl8723as/include/rtl8188e_spec.h | 3473 ++--- .../net/wireless/rtl8723as/include/rtl8188e_xmit.h | 622 +- .../wireless/rtl8723as/include/rtl8192c_event.h | 20 +- .../net/wireless/rtl8723as/include/rtl8192c_hal.h | 1 - .../net/wireless/rtl8723as/include/rtl8192c_led.h | 48 +- .../net/wireless/rtl8723as/include/rtl8192c_recv.h | 2 +- .../net/wireless/rtl8723as/include/rtl8192c_rf.h | 148 +- .../wireless/rtl8723as/include/rtl8192c_sreset.h | 30 +- .../net/wireless/rtl8723as/include/rtl8192d_hal.h | 1 - .../net/wireless/rtl8723as/include/rtl8192d_led.h | 50 +- .../net/wireless/rtl8723as/include/rtl8192d_recv.h | 2 +- .../net/wireless/rtl8723as/include/rtl8192d_rf.h | 158 +- .../rtl8723as/include/rtl8723a_bt-coexist.h | 7 + .../net/wireless/rtl8723as/include/rtl8723a_cmd.h | 2 + .../net/wireless/rtl8723as/include/rtl8723a_hal.h | 1695 +-- .../net/wireless/rtl8723as/include/rtl8723a_led.h | 100 +- .../net/wireless/rtl8723as/include/rtl8723a_recv.h | 82 +- .../net/wireless/rtl8723as/include/rtl8723a_spec.h | 1069 +- .../net/wireless/rtl8723as/include/rtl8723a_xmit.h | 476 +- drivers/net/wireless/rtl8723as/include/rtw_ap.h | 130 +- drivers/net/wireless/rtl8723as/include/rtw_bt_mp.h | 636 +- .../net/wireless/rtl8723as/include/rtw_byteorder.h | 2 +- drivers/net/wireless/rtl8723as/include/rtw_cmd.h | 19 +- drivers/net/wireless/rtl8723as/include/rtw_debug.h | 16 + .../net/wireless/rtl8723as/include/rtw_eeprom.h | 1 + drivers/net/wireless/rtl8723as/include/rtw_io.h | 23 +- .../net/wireless/rtl8723as/include/rtw_ioctl_set.h | 3 +- drivers/net/wireless/rtl8723as/include/rtw_iol.h | 278 +- drivers/net/wireless/rtl8723as/include/rtw_led.h | 438 +- drivers/net/wireless/rtl8723as/include/rtw_mlme.h | 50 +- .../net/wireless/rtl8723as/include/rtw_mlme_ext.h | 39 +- drivers/net/wireless/rtl8723as/include/rtw_mp.h | 3 + drivers/net/wireless/rtl8723as/include/rtw_odm.h | 42 + .../net/wireless/rtl8723as/include/rtw_pwrctrl.h | 22 +- drivers/net/wireless/rtl8723as/include/rtw_recv.h | 20 + .../net/wireless/rtl8723as/include/rtw_security.h | 27 +- drivers/net/wireless/rtl8723as/include/rtw_tdls.h | 286 +- .../net/wireless/rtl8723as/include/rtw_version.h | 2 +- drivers/net/wireless/rtl8723as/include/rtw_wapi.h | 458 +- drivers/net/wireless/rtl8723as/include/rtw_xmit.h | 27 +- .../net/wireless/rtl8723as/include/sdio_ops_ce.h | 74 +- .../wireless/rtl8723as/include/sdio_ops_linux.h | 28 +- drivers/net/wireless/rtl8723as/include/sta_info.h | 23 +- drivers/net/wireless/rtl8723as/include/usb_ops.h | 26 - drivers/net/wireless/rtl8723as/include/wifi.h | 9 +- .../net/wireless/rtl8723as/include/xmit_osdep.h | 1 + .../rtl8723as/os_dep/linux/custom_gpio_linux.c | 33 +- .../wireless/rtl8723as/os_dep/linux/gspi_intf.c | 37 +- .../rtl8723as/os_dep/linux/ioctl_cfg80211.c | 11117 +++++++------- .../wireless/rtl8723as/os_dep/linux/ioctl_linux.c | 1089 +- .../wireless/rtl8723as/os_dep/linux/mlme_linux.c | 45 +- .../net/wireless/rtl8723as/os_dep/linux/os_intfs.c | 705 +- .../net/wireless/rtl8723as/os_dep/linux/pci_intf.c | 31 +- .../rtl8723as/os_dep/linux/pci_ops_linux.c | 48 +- .../wireless/rtl8723as/os_dep/linux/recv_linux.c | 72 +- .../wireless/rtl8723as/os_dep/linux/rtw_android.c | 53 +- .../wireless/rtl8723as/os_dep/linux/sdio_intf.c | 1172 +- .../rtl8723as/os_dep/linux/sdio_ops_linux.c | 385 +- .../net/wireless/rtl8723as/os_dep/linux/usb_intf.c | 307 +- .../rtl8723as/os_dep/linux/usb_ops_linux.c | 1344 +- .../wireless/rtl8723as/os_dep/linux/xmit_linux.c | 29 +- .../net/wireless/rtl8723as/os_dep/osdep_service.c | 642 +- 179 files changed, 76547 insertions(+), 71499 deletions(-) create mode 100755 drivers/net/wireless/rtl8723as/core/rtw_odm.c create mode 100755 drivers/net/wireless/rtl8723as/include/rtw_odm.h (limited to 'drivers') diff --git a/drivers/net/wireless/rtl8723as/Makefile b/drivers/net/wireless/rtl8723as/Makefile index 5ebf2598a208..e8e633c5ccee 100755 --- a/drivers/net/wireless/rtl8723as/Makefile +++ b/drivers/net/wireless/rtl8723as/Makefile @@ -42,10 +42,13 @@ CONFIG_WAPI_SUPPORT = n CONFIG_EFUSE_CONFIG_FILE = n CONFIG_EXT_CLK = n CONFIG_FTP_PROTECT = n -CONFIG_WOWLAN = y +CONFIG_WOWLAN = n +CONFIG_GPIO_WAKEUP = n +CONFIG_ODM_ADAPTIVITY = n -CONFIG_PLATFORM_I386_PC = n +CONFIG_PLATFORM_I386_PC = y CONFIG_PLATFORM_ANDROID_X86 = n +CONFIG_PLATFORM_JB_X86 = n CONFIG_PLATFORM_ARM_S3C2K4 = n CONFIG_PLATFORM_ARM_PXA2XX = n CONFIG_PLATFORM_ARM_S3C6K4 = n @@ -62,6 +65,7 @@ CONFIG_PLATFORM_TEGRA3_CARDHU = n CONFIG_PLATFORM_TEGRA4_DALMORE = n CONFIG_PLATFORM_ARM_TCC8900 = n CONFIG_PLATFORM_ARM_TCC8920 = n +CONFIG_PLATFORM_ARM_TCC8920_JB42 = n CONFIG_PLATFORM_ARM_RK2818 = n CONFIG_PLATFORM_ARM_URBETTER = n CONFIG_PLATFORM_ARM_TI_PANDA = n @@ -69,15 +73,17 @@ CONFIG_PLATFORM_MIPS_JZ4760 = n CONFIG_PLATFORM_DMP_PHILIPS = n CONFIG_PLATFORM_TI_DM365 = n CONFIG_PLATFORM_MSTAR_TITANIA12 = n +CONFIG_PLATFORM_MSTAR = n CONFIG_PLATFORM_SZEBOOK = n CONFIG_PLATFORM_ARM_SUNxI = n CONFIG_PLATFORM_ARM_SUN6I = n +CONFIG_PLATFORM_ARM_SUN7I = n CONFIG_PLATFORM_ACTIONS_ATM702X = n CONFIG_PLATFORM_MN10300 = n CONFIG_PLATFORM_ACTIONS_ATV5201 = n +CONFIG_PLATFORM_IMX6 = y CONFIG_DRVEXT_MODULE = n -CONFIG_PLATFORM_NEW = y export TopDIR ?= $(shell pwd) @@ -358,10 +364,17 @@ ifeq ($(CONFIG_FTP_PROTECT), y) EXTRA_CFLAGS += -DCONFIG_FTP_PROTECT endif -ifeq ($(CONFIG_RTL8723A), y) +ifeq ($(CONFIG_ODM_ADAPTIVITY), y) +EXTRA_CFLAGS += -DCONFIG_ODM_ADAPTIVITY +endif + +ifeq ($(CONFIG_RTL8188E), y) ifeq ($(CONFIG_WOWLAN), y) EXTRA_CFLAGS += -DCONFIG_WOWLAN endif +ifeq ($(CONFIG_GPIO_WAKEUP), y) +EXTRA_CFLAGS += -DCONFIG_GPIO_WAKEUP +endif endif ifeq ($(CONFIG_RTL8188E), y) @@ -370,15 +383,15 @@ EXTRA_CFLAGS += -DCONFIG_RF_GAIN_OFFSET endif endif -ifeq ($(CONFIG_PLATFORM_NEW), y) - EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -# ARCH := arm -# CROSS_COMPILE := ~/madicsdq/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- - KSRC := $(TopDIR)/../../kernel_imx - MODULE_NAME := 8723as +ifeq ($(CONFIG_PLATFORM_IMX6), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +EXTRA_CFLAGS += -DCONFIG_P2P_IPS +KSRC := $(TopDIR)/../../kernel_imx +MODULE_NAME := 8723as endif - ifeq ($(CONFIG_PLATFORM_I386_PC), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN SUBARCH := $(shell uname -m | sed -e s/i.86/i386/) @@ -410,13 +423,21 @@ ARCH := arm endif ifeq ($(CONFIG_PLATFORM_MSTAR_TITANIA12), y) -EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR_TITANIA12 +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR -DCONFIG_PLATFORM_MSTAR_TITANIA12 ARCH:=mips CROSS_COMPILE:= /usr/src/Mstar_kernel/mips-4.3/bin/mips-linux-gnu- KVER:= 2.6.28.9 KSRC:= /usr/src/Mstar_kernel/2.6.28.9/ endif +ifeq ($(CONFIG_PLATFORM_MSTAR), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR +ARCH:=arm +CROSS_COMPILE:= /usr/src/bin/arm-none-linux-gnueabi- +KVER:= 3.1.10 +KSRC:= /usr/src/Mstar_kernel/3.1.10/ +endif + ifeq ($(CONFIG_PLATFORM_ANDROID_X86), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN SUBARCH := $(shell uname -m | sed -e s/i.86/i386/) @@ -426,6 +447,18 @@ KSRC := /media/DATA-2/android-x86/ics-x86_20120130/out/target/product/generic_x8 MODULE_NAME :=wlan endif +ifeq ($(CONFIG_PLATFORM_JB_X86), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +EXTRA_CFLAGS += -DCONFIG_P2P_IPS +SUBARCH := $(shell uname -m | sed -e s/i.86/i386/) +ARCH := $(SUBARCH) +CROSS_COMPILE := /home/android_sdk/android-x86_JB/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7/bin/i686-linux-android- +KSRC := /home/android_sdk/android-x86_JB/out/target/product/x86/obj/kernel/ +MODULE_NAME :=wlan +endif + ifeq ($(CONFIG_PLATFORM_ARM_PXA2XX), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN ARCH := arm @@ -543,7 +576,7 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DDCONFIG_P2P_IPS +EXTRA_CFLAGS += -DCONFIG_P2P_IPS ARCH := arm CROSS_COMPILE := /home/android_sdk/nvidia/tegra-16r3-partner-android-4.1_20120723/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- KSRC := /home/android_sdk/nvidia/tegra-16r3-partner-android-4.1_20120723/out/target/product/cardhu/obj/KERNEL @@ -556,7 +589,7 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DDCONFIG_P2P_IPS +EXTRA_CFLAGS += -DCONFIG_P2P_IPS ARCH := arm CROSS_COMPILE := /home/android_sdk/nvidia/tegra-17r9-partner-android-4.2-dalmore_20130131/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- KSRC := /home/android_sdk/nvidia/tegra-17r9-partner-android-4.2-dalmore_20130131/out/target/product/dalmore/obj/KERNEL @@ -579,8 +612,23 @@ KSRC := /home/android_sdk/Telechips/v12.06_r1-tcc-android-4.0.4/kernel MODULE_NAME := wlan endif +ifeq ($(CONFIG_PLATFORM_ARM_TCC8920_JB42), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +# default setting for Android 4.1, 4.2 +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +EXTRA_CFLAGS += -DCONFIG_P2P_IPS +ARCH := arm +CROSS_COMPILE := /home/android_sdk/Telechips/v13.03_r1-tcc-android-4.2.2_ds_patched/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- +KSRC := /home/android_sdk/Telechips/v13.03_r1-tcc-android-4.2.2_ds_patched/kernel +MODULE_NAME := wlan +endif + ifeq ($(CONFIG_PLATFORM_ARM_RK2818), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS -DCONFIG_MINIMAL_MEMORY_USAGE +ifeq ($(CONFIG_SDIO_HCI), y) +EXTRA_CFLAGS += -DCONFIG_DETECT_CPWM_BY_POLLING -DCONFIG_DETECT_C2H_BY_POLLING +endif ARCH := arm CROSS_COMPILE := /usr/src/release_fae_version/toolchain/arm-eabi-4.4.0/bin/arm-eabi- KSRC := /usr/src/release_fae_version/kernel25_A7_281x @@ -630,29 +678,73 @@ KSRC := /home/winuser/work/Plat_sLD2T_V3010/usr/src/linux-2.6.32.2 INSTALL_PREFIX := endif - ifeq ($(CONFIG_PLATFORM_ARM_SUNxI), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ARM_SUNxI +ifeq ($(CONFIG_USB_HCI), y) +EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX +endif +# default setting for Android 4.1, 4.2 +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +EXTRA_CFLAGS += -DDCONFIG_P2P_IPS +# default setting for A10-EVB mmc0 +ifeq ($(CONFIG_SDIO_HCI), y) +#EXTRA_CFLAGS += -DCONFIG_WITS_EVB_V13 +endif ARCH := arm -CROSS_COMPILE := arm-none-linux-gnueabi- +#CROSS_COMPILE := arm-none-linux-gnueabi- +CROSS_COMPILE=/home/android_sdk/Allwinner/a10/android-jb42/lichee-jb42/buildroot/output/external-toolchain/bin/arm-none-linux-gnueabi- KVER := 3.0.8 #KSRC:= ../lichee/linux-3.0/ +KSRC=/home/android_sdk/Allwinner/a10/android-jb42/lichee-jb42/linux-3.0 endif ifeq ($(CONFIG_PLATFORM_ARM_SUN6I), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN6I +ifeq ($(CONFIG_USB_HCI), y) EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX +endif +# default setting for A31-EVB mmc0 +ifeq ($(CONFIG_SDIO_HCI), y) +EXTRA_CFLAGS += -DCONFIG_A31_EVB +endif + +EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DDCONFIG_P2P_IPS +EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION ARCH := arm -CROSS_COMPILE := arm-none-linux-gnueabi- +CROSS_COMPILE := /home/android_sdk/Allwinner/a31/android-jb42/lichee/buildroot/output/external-toolchain/bin/arm-linux-gnueabi- KVER := 3.3.0 #KSRC:= ../lichee/linux-3.3/ +KSRC :=/home/android_sdk/Allwinner/a31/android-jb42/lichee/linux-3.3 +ifeq ($(CONFIG_USB_HCI), y) +MODULE_NAME := 8188eu_sw +endif endif +ifeq ($(CONFIG_PLATFORM_ARM_SUN7I), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN6I +ifeq ($(CONFIG_USB_HCI), y) +EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX +endif +EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT +# default setting for Android 4.1, 4.2 +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION +ARCH := arm +CROSS_COMPILE := /home/android_sdk/Allwinner/a20/sugar/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi- +KVER := 3.3.0 +#KSRC:= ../lichee/linux-3.3/ +KSRC :=/home/android_sdk/Allwinner/a20/sugar/lichee/linux-3.3 + +endif + + ifeq ($(CONFIG_PLATFORM_ACTIONS_ATV5201), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ACTIONS_ATV5201 ARCH := mips @@ -688,7 +780,8 @@ rtk_core := core/rtw_cmd.o \ core/rtw_br_ext.o \ core/rtw_iol.o \ core/rtw_led.o \ - core/rtw_sreset.o + core/rtw_sreset.o \ + core/rtw_odm.o $(MODULE_NAME)-y += $(rtk_core) diff --git a/drivers/net/wireless/rtl8723as/autoconf_rtl8723a_sdio_linux.h b/drivers/net/wireless/rtl8723as/autoconf_rtl8723a_sdio_linux.h index 2165c253ebd7..d34be3689d89 100755 --- a/drivers/net/wireless/rtl8723as/autoconf_rtl8723a_sdio_linux.h +++ b/drivers/net/wireless/rtl8723as/autoconf_rtl8723a_sdio_linux.h @@ -47,9 +47,9 @@ #define CONFIG_80211N_HT #define CONFIG_RECV_REORDERING_CTRL -#define CONFIG_IOCTL_CFG80211 +//#define CONFIG_IOCTL_CFG80211 #ifdef CONFIG_IOCTL_CFG80211 - #define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */ + //#define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */ #define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER //#define CONFIG_DEBUG_CFG80211 #define CONFIG_SET_SCAN_DENY_TIMER @@ -76,8 +76,9 @@ #endif //#define CONFIG_DBG_P2P - //#define CONFIG_P2P_PS + #define CONFIG_P2P_PS //#define CONFIG_P2P_IPS + #define P2P_OP_CHECK_SOCIAL_CH #endif // Added by Kurt 20110511 @@ -119,6 +120,7 @@ #define CONFIG_LONG_DELAY_ISSUE #define CONFIG_NEW_SIGNAL_STAT_PROCESS #define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */ +#define CONFIG_DEAUTH_BEFORE_CONNECT //#define CONFIG_PATCH_JOIN_WRONG_CHANNEL @@ -141,10 +143,11 @@ #endif -#define CONFIG_CONCURRENT_MODE +//#define CONFIG_CONCURRENT_MODE #ifdef CONFIG_CONCURRENT_MODE #define CONFIG_TSF_RESET_OFFLOAD // For 2 PORT TSF SYNC. //#define CONFIG_HWPORT_SWAP //Port0->Sec , Port1 -> Pri + //#define CONFIG_STA_MODE_SCAN_UNDER_AP_MODE #endif // CONFIG_CONCURRENT_MODE @@ -183,6 +186,7 @@ #ifndef CONFIG_LPS #define CONFIG_LPS // download reserved page to FW #endif + #define CONFIG_CHECK_BT_HANG #endif @@ -191,6 +195,8 @@ //#define CONFIG_HW_ANTENNA_DIVERSITY #endif +//#define CONFIG_RF_GAIN_OFFSET + #ifndef DISABLE_BB_RF #define DISABLE_BB_RF 0 #endif diff --git a/drivers/net/wireless/rtl8723as/autoconf_rtl8723a_usb_linux.h b/drivers/net/wireless/rtl8723as/autoconf_rtl8723a_usb_linux.h index 033ea90c4d05..21053fd02d37 100755 --- a/drivers/net/wireless/rtl8723as/autoconf_rtl8723a_usb_linux.h +++ b/drivers/net/wireless/rtl8723as/autoconf_rtl8723a_usb_linux.h @@ -51,11 +51,6 @@ #define SUPPORT_HW_RFOFF_DETECTED //#define CONFIG_IOCTL_CFG80211 -#ifdef CONFIG_PLATFORM_ARM_SUNxI - #ifndef CONFIG_IOCTL_CFG80211 - #define CONFIG_IOCTL_CFG80211 - #endif -#endif #ifdef CONFIG_IOCTL_CFG80211 //#define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */ @@ -87,6 +82,7 @@ #define CONFIG_P2P_PS //#define CONFIG_P2P_IPS + #define P2P_OP_CHECK_SOCIAL_CH #endif // Added by Kurt 20110511 @@ -106,6 +102,7 @@ #ifdef CONFIG_CONCURRENT_MODE #define CONFIG_TSF_RESET_OFFLOAD // For 2 PORT TSF SYNC. //#define CONFIG_HWPORT_SWAP //Port0->Sec , Port1 -> Pri + //#define CONFIG_STA_MODE_SCAN_UNDER_AP_MODE #endif // CONFIG_CONCURRENT_MODE #define CONFIG_SKB_COPY //for amsdu @@ -119,7 +116,7 @@ #define CONFIG_LONG_DELAY_ISSUE #define CONFIG_NEW_SIGNAL_STAT_PROCESS #define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */ - +#define CONFIG_DEAUTH_BEFORE_CONNECT //#define CONFIG_ANTENNA_DIVERSITY @@ -174,7 +171,7 @@ #endif // CONFIG_BR_EXT //#define CONFIG_TX_MCAST2UNI // Support IP multicast->unicast - +//#define CONFIG_CHECK_AC_LIFETIME // Check packet lifetime of 4 ACs. #if defined(CONFIG_BT_COEXIST) || defined(CONFIG_POWER_SAVING) #ifndef CONFIG_USB_INTERRUPT_IN_PIPE @@ -182,6 +179,9 @@ #endif #endif +#if defined(CONFIG_BT_COEXIST) + #define CONFIG_CHECK_BT_HANG +#endif /* * Interface Related Config */ @@ -201,12 +201,6 @@ #undef CONFIG_PREALLOC_RECV_SKB #endif -#ifdef CONFIG_PLATFORM_ARM_SUNxI - #ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX - #define CONFIG_USE_USB_BUFFER_ALLOC_TX - #endif -#endif - /* * USB VENDOR REQ BUFFER ALLOCATION METHOD * if not set we'll use function local variable (stack memory) @@ -236,7 +230,7 @@ #define CONFIG_OUT_EP_WIFI_MODE 0 -#define ENABLE_USB_DROP_INCORRECT_OUT 0 +#define ENABLE_USB_DROP_INCORRECT_OUT #define RTL8192CU_ASIC_VERIFICATION 0 // For ASIC verification. diff --git a/drivers/net/wireless/rtl8723as/core/rtw_ap.c b/drivers/net/wireless/rtl8723as/core/rtw_ap.c index 4213f3bdf1b4..adebe11f32c7 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_ap.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_ap.c @@ -1,2936 +1,2939 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTW_AP_C_ - -#include -#include -#include -#include - - -#ifdef CONFIG_AP_MODE - -extern unsigned char RTW_WPA_OUI[]; -extern unsigned char WMM_OUI[]; -extern unsigned char WPS_OUI[]; -extern unsigned char P2P_OUI[]; -extern unsigned char WFD_OUI[]; - -void init_mlme_ap_info(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - - - _rtw_spinlock_init(&pmlmepriv->bcn_update_lock); - - //for ACL - _rtw_init_queue(&pacl_list->acl_node_q); - - //pmlmeext->bstart_bss = _FALSE; - - start_ap_mode(padapter); -} - -void free_mlme_ap_info(_adapter *padapter) -{ - _irqL irqL; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //stop_ap_mode(padapter); - - pmlmepriv->update_bcn = _FALSE; - pmlmeext->bstart_bss = _FALSE; - - rtw_sta_flush(padapter); - - pmlmeinfo->state = _HW_STATE_NOLINK_; - - //free_assoc_sta_resources - rtw_free_all_stainfo(padapter); - - //free bc/mc sta_info - psta = rtw_get_bcmc_stainfo(padapter); - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - - _rtw_spinlock_free(&pmlmepriv->bcn_update_lock); - -} - -static void update_BCNTIM(_adapter *padapter) -{ - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); - unsigned char *pie = pnetwork_mlmeext->IEs; - - //DBG_871X("%s\n", __FUNCTION__); - - //update TIM IE - //if(pstapriv->tim_bitmap) - if(_TRUE) - { - u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; - u16 tim_bitmap_le; - uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen; - - tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap); - - p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_); - if (p != NULL && tim_ielen>0) - { - tim_ielen += 2; - - premainder_ie = p+tim_ielen; - - tim_ie_offset = (sint)(p -pie); - - remainder_ielen = pnetwork_mlmeext->IELength - tim_ie_offset - tim_ielen; - - //append TIM IE from dst_ie offset - dst_ie = p; - } - else - { - tim_ielen = 0; - - //calucate head_len - offset = _FIXED_IE_LENGTH_; - - /* get ssid_ie len */ - p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SSID_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); - if (p != NULL) - offset += tmp_len+2; - - // get supported rates len - p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); - if (p != NULL) - { - offset += tmp_len+2; - } - - //DS Parameter Set IE, len=3 - offset += 3; - - premainder_ie = pie + offset; - - remainder_ielen = pnetwork_mlmeext->IELength - offset - tim_ielen; - - //append TIM IE from offset - dst_ie = pie + offset; - - } - - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie && premainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - *dst_ie++=_TIM_IE_; - - if((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fc)) - tim_ielen = 5; - else - tim_ielen = 4; - - *dst_ie++= tim_ielen; - - *dst_ie++=0;//DTIM count - *dst_ie++=1;//DTIM peroid - - if(pstapriv->tim_bitmap&BIT(0))//for bc/mc frames - *dst_ie++ = BIT(0);//bitmap ctrl - else - *dst_ie++ = 0; - - if(tim_ielen==4) - { - *dst_ie++ = *(u8*)&tim_bitmap_le; - } - else if(tim_ielen==5) - { - _rtw_memcpy(dst_ie, &tim_bitmap_le, 2); - dst_ie+=2; - } - - //copy remainder IE - if(pbackup_remainder_ie) - { - _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); - - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - } - - offset = (uint)(dst_ie - pie); - pnetwork_mlmeext->IELength = offset + remainder_ielen; - - } - -#ifndef CONFIG_INTERRUPT_BASED_TXBCN -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - set_tx_beacon_cmd(padapter); -#endif -#endif //!CONFIG_INTERRUPT_BASED_TXBCN - - -} - -void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len) -{ - PNDIS_802_11_VARIABLE_IEs pIE; - u8 bmatch = _FALSE; - u8 *pie = pnetwork->IEs; - u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; - u32 i, offset, ielen, ie_offset, remainder_ielen = 0; - - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); - - if (pIE->ElementID > index) - { - break; - } - else if(pIE->ElementID == index) // already exist the same IE - { - p = (u8 *)pIE; - ielen = pIE->Length; - bmatch = _TRUE; - break; - } - - p = (u8 *)pIE; - ielen = pIE->Length; - i += (pIE->Length + 2); - } - - if (p != NULL && ielen>0) - { - ielen += 2; - - premainder_ie = p+ielen; - - ie_offset = (sint)(p -pie); - - remainder_ielen = pnetwork->IELength - ie_offset - ielen; - - if(bmatch) - dst_ie = p; - else - dst_ie = (p+ielen); - } - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie && premainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - *dst_ie++=index; - *dst_ie++=len; - - _rtw_memcpy(dst_ie, data, len); - dst_ie+=len; - - //copy remainder IE - if(pbackup_remainder_ie) - { - _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); - - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - } - - offset = (uint)(dst_ie - pie); - pnetwork->IELength = offset + remainder_ielen; -} - -void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index) -{ - u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; - uint offset, ielen, ie_offset, remainder_ielen = 0; - u8 *pie = pnetwork->IEs; - - p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, index, &ielen, pnetwork->IELength - _FIXED_IE_LENGTH_); - if (p != NULL && ielen>0) - { - ielen += 2; - - premainder_ie = p+ielen; - - ie_offset = (sint)(p -pie); - - remainder_ielen = pnetwork->IELength - ie_offset - ielen; - - dst_ie = p; - } - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie && premainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - //copy remainder IE - if(pbackup_remainder_ie) - { - _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); - - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - } - - offset = (uint)(dst_ie - pie); - pnetwork->IELength = offset + remainder_ielen; -} - - -u8 chk_sta_is_alive(struct sta_info *psta); -u8 chk_sta_is_alive(struct sta_info *psta) -{ - u8 ret = _FALSE; - #ifdef DBG_EXPIRATION_CHK - DBG_871X("sta:"MAC_FMT", rssi:%d, rx:"STA_PKTS_FMT", expire_to:%u, %s%ssq_len:%u\n" - , MAC_ARG(psta->hwaddr) - , psta->rssi_stat.UndecoratedSmoothedPWDB - //, STA_RX_PKTS_ARG(psta) - , STA_RX_PKTS_DIFF_ARG(psta) - , psta->expire_to - , psta->state&WIFI_SLEEP_STATE?"PS, ":"" - , psta->state&WIFI_STA_ALIVE_CHK_STATE?"SAC, ":"" - , psta->sleepq_len - ); - #endif - - //if(sta_last_rx_pkts(psta) == sta_rx_pkts(psta)) - if((psta->sta_stats.last_rx_data_pkts + psta->sta_stats.last_rx_ctrl_pkts) == (psta->sta_stats.rx_data_pkts + psta->sta_stats.rx_ctrl_pkts)) - { - #if 0 - if(psta->state&WIFI_SLEEP_STATE) - ret = _TRUE; - #endif - } - else - { - ret = _TRUE; - } - - sta_update_last_rx_pkts(psta); - - return ret; -} - -void expire_timeout_chk(_adapter *padapter) -{ - _irqL irqL; - _list *phead, *plist; - u8 updated; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 chk_alive_num = 0; - char chk_alive_list[NUM_STA]; - int i; - - _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); - - phead = &pstapriv->auth_list; - plist = get_next(phead); - - //check auth_queue - #ifdef DBG_EXPIRATION_CHK - if (rtw_end_of_queue_search(phead, plist) == _FALSE) { - DBG_871X(FUNC_NDEV_FMT" auth_list, cnt:%u\n" - , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->auth_list_cnt); - } - #endif - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, auth_list); - plist = get_next(plist); - - if(psta->expire_to>0) - { - psta->expire_to--; - if (psta->expire_to == 0) - { - rtw_list_delete(&psta->auth_list); - pstapriv->auth_list_cnt--; - - DBG_871X("auth expire %02X%02X%02X%02X%02X%02X\n", - psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); - - _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); - } - } - - } - - _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); - - psta = NULL; - - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //check asoc_queue - #ifdef DBG_EXPIRATION_CHK - if (rtw_end_of_queue_search(phead, plist) == _FALSE) { - DBG_871X(FUNC_NDEV_FMT" asoc_list, cnt:%u\n" - , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->asoc_list_cnt); - } - #endif - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - plist = get_next(plist); - - if (chk_sta_is_alive(psta) || !psta->expire_to) { - psta->expire_to = pstapriv->expire_to; - psta->keep_alive_trycnt = 0; - #ifdef CONFIG_TX_MCAST2UNI - psta->under_exist_checking = 0; - #endif // CONFIG_TX_MCAST2UNI - } else { - psta->expire_to--; - } - -#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK -#ifdef CONFIG_TX_MCAST2UNI -#ifdef CONFIG_80211N_HT - if ( (psta->flags & WLAN_STA_HT) && (psta->htpriv.agg_enable_bitmap || psta->under_exist_checking) ) { - // check sta by delba(addba) for 11n STA - // ToDo: use CCX report to check for all STAs - //DBG_871X("asoc check by DELBA/ADDBA! (pstapriv->expire_to=%d s)(psta->expire_to=%d s), [%02x, %d]\n", pstapriv->expire_to*2, psta->expire_to*2, psta->htpriv.agg_enable_bitmap, psta->under_exist_checking); - - if ( psta->expire_to <= (pstapriv->expire_to - 50 ) ) { - DBG_871X("asoc expire by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2); - psta->under_exist_checking = 0; - psta->expire_to = 0; - } else if ( psta->expire_to <= (pstapriv->expire_to - 3) && (psta->under_exist_checking==0)) { - DBG_871X("asoc check by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2); - psta->under_exist_checking = 1; - //tear down TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset - } - } -#endif //CONFIG_80211N_HT -#endif // CONFIG_TX_MCAST2UNI -#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK - - if (psta->expire_to <= 0) - { - #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - if (padapter->registrypriv.wifi_spec == 1) - { - psta->expire_to = pstapriv->expire_to; - continue; - } - - if (psta->state & WIFI_SLEEP_STATE) { - if (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) { - //to check if alive by another methods if staion is at ps mode. - psta->expire_to = pstapriv->expire_to; - psta->state |= WIFI_STA_ALIVE_CHK_STATE; - - //DBG_871X("alive chk, sta:" MAC_FMT " is at ps mode!\n", MAC_ARG(psta->hwaddr)); - - //to update bcn with tim_bitmap for this station - pstapriv->tim_bitmap |= BIT(psta->aid); - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - - if(!pmlmeext->active_keep_alive_check) - continue; - } - } - - if (pmlmeext->active_keep_alive_check) { - int stainfo_offset; - - stainfo_offset = rtw_stainfo_offset(pstapriv, psta); - if (stainfo_offset_valid(stainfo_offset)) { - chk_alive_list[chk_alive_num++] = stainfo_offset; - } - - continue; - } - #endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ - - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - - DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); - updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING); - } - else - { - /* TODO: Aging mechanism to digest frames in sleep_q to avoid running out of xmitframe */ - if (psta->sleepq_len > (NR_XMITFRAME/pstapriv->asoc_list_cnt) - && padapter->xmitpriv.free_xmitframe_cnt < ((NR_XMITFRAME/pstapriv->asoc_list_cnt)/2) - ){ - DBG_871X("%s sta:"MAC_FMT", sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\n", __func__ - , MAC_ARG(psta->hwaddr) - , psta->sleepq_len, padapter->xmitpriv.free_xmitframe_cnt, pstapriv->asoc_list_cnt); - wakeup_sta_to_xmit(padapter, psta); - } - } - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - -#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK -if (chk_alive_num) { - - u8 backup_oper_channel=0; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - /* switch to correct channel of current network before issue keep-alive frames */ - if (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) { - backup_oper_channel = rtw_get_oper_ch(padapter); - SelectChannel(padapter, pmlmeext->cur_channel); - } - - /* issue null data to check sta alive*/ - for (i = 0; i < chk_alive_num; i++) { - - int ret = _FAIL; - - psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); - if(!(psta->state &_FW_LINKED)) - continue; - - if (psta->state & WIFI_SLEEP_STATE) - ret = issue_nulldata(padapter, psta->hwaddr, 0, 1, 50); - else - ret = issue_nulldata(padapter, psta->hwaddr, 0, 3, 50); - - psta->keep_alive_trycnt++; - if (ret == _SUCCESS) - { - DBG_871X("asoc check, sta(" MAC_FMT ") is alive\n", MAC_ARG(psta->hwaddr)); - psta->expire_to = pstapriv->expire_to; - psta->keep_alive_trycnt = 0; - continue; - } - else if (psta->keep_alive_trycnt <= 3) - { - DBG_871X("ack check for asoc expire, keep_alive_trycnt=%d\n", psta->keep_alive_trycnt); - psta->expire_to = 1; - continue; - } - - psta->keep_alive_trycnt = 0; - - DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - if (rtw_is_list_empty(&psta->asoc_list)==_FALSE) { - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING); - } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - } - - if (backup_oper_channel>0) /* back to the original operation channel */ - SelectChannel(padapter, backup_oper_channel); -} -#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ - - associated_clients_update(padapter, updated); -} - -void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level) -{ - int i; - u8 rf_type; - u32 init_rate=0; - unsigned char sta_band = 0, raid, shortGIrate = _FALSE; - unsigned char limit; - unsigned int tx_ra_bitmap=0; - struct ht_priv *psta_ht = NULL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - -#ifdef CONFIG_80211N_HT - if(psta) - psta_ht = &psta->htpriv; - else - return; -#endif //CONFIG_80211N_HT - - if(!(psta->state & _FW_LINKED)) - return; - - //b/g mode ra_bitmap - for (i=0; ibssrateset); i++) - { - if (psta->bssrateset[i]) - tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); - } -#ifdef CONFIG_80211N_HT - //n mode ra_bitmap - if(psta_ht->ht_option) - { - rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - if(rf_type == RF_2T2R) - limit=16;// 2R - else - limit=8;// 1R - - for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) - tx_ra_bitmap |= BIT(i+12); - } - - //max short GI rate - shortGIrate = psta_ht->sgi; - } -#endif //CONFIG_80211N_HT - -#if 0//gtest - if(get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R) - { - //is this a 2r STA? - if((pstat->tx_ra_bitmap & 0x0ff00000) != 0 && !(priv->pshare->has_2r_sta & BIT(pstat->aid))) - { - priv->pshare->has_2r_sta |= BIT(pstat->aid); - if(rtw_read16(padapter, 0x102501f6) != 0xffff) - { - rtw_write16(padapter, 0x102501f6, 0xffff); - reset_1r_sta_RA(priv, 0xffff); - Switch_1SS_Antenna(priv, 3); - } - } - else// bg or 1R STA? - { - if((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len && priv->pshare->has_2r_sta == 0) - { - if(rtw_read16(padapter, 0x102501f6) != 0x7777) - { // MCS7 SGI - rtw_write16(padapter, 0x102501f6,0x7777); - reset_1r_sta_RA(priv, 0x7777); - Switch_1SS_Antenna(priv, 2); - } - } - } - - } - - if ((pstat->rssi_level < 1) || (pstat->rssi_level > 3)) - { - if (pstat->rssi >= priv->pshare->rf_ft_var.raGoDownUpper) - pstat->rssi_level = 1; - else if ((pstat->rssi >= priv->pshare->rf_ft_var.raGoDown20MLower) || - ((priv->pshare->is_40m_bw) && (pstat->ht_cap_len) && - (pstat->rssi >= priv->pshare->rf_ft_var.raGoDown40MLower) && - (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_SUPPORT_CH_WDTH_)))) - pstat->rssi_level = 2; - else - pstat->rssi_level = 3; - } - - // rate adaptive by rssi - if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len) - { - if ((get_rf_mimo_mode(priv) == MIMO_1T2R) || (get_rf_mimo_mode(priv) == MIMO_1T1R)) - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x100f0000; - break; - case 2: - pstat->tx_ra_bitmap &= 0x100ff000; - break; - case 3: - if (priv->pshare->is_40m_bw) - pstat->tx_ra_bitmap &= 0x100ff005; - else - pstat->tx_ra_bitmap &= 0x100ff001; - - break; - } - } - else - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x1f0f0000; - break; - case 2: - pstat->tx_ra_bitmap &= 0x1f0ff000; - break; - case 3: - if (priv->pshare->is_40m_bw) - pstat->tx_ra_bitmap &= 0x000ff005; - else - pstat->tx_ra_bitmap &= 0x000ff001; - - break; - } - - // Don't need to mask high rates due to new rate adaptive parameters - //if (pstat->is_broadcom_sta) // use MCS12 as the highest rate vs. Broadcom sta - // pstat->tx_ra_bitmap &= 0x81ffffff; - - // NIC driver will report not supporting MCS15 and MCS14 in asoc req - //if (pstat->is_rtl8190_sta && !pstat->is_2t_mimo_sta) - // pstat->tx_ra_bitmap &= 0x83ffffff; // if Realtek 1x2 sta, don't use MCS15 and MCS14 - } - } - else if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) && isErpSta(pstat)) - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x00000f00; - break; - case 2: - pstat->tx_ra_bitmap &= 0x00000ff0; - break; - case 3: - pstat->tx_ra_bitmap &= 0x00000ff5; - break; - } - } - else - { - pstat->tx_ra_bitmap &= 0x0000000d; - } - - // disable tx short GI when station cannot rx MCS15(AP is 2T2R) - // disable tx short GI when station cannot rx MCS7 (AP is 1T2R or 1T1R) - // if there is only 1r STA and we are 2T2R, DO NOT mask SGI rate - if ((!(pstat->tx_ra_bitmap & 0x8000000) && (priv->pshare->has_2r_sta > 0) && (get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)) || - (!(pstat->tx_ra_bitmap & 0x80000) && (get_rf_mimo_mode(padapter) != RTL8712_RF_2T2R))) - { - pstat->tx_ra_bitmap &= ~BIT(28); - } -#endif - - if ( pcur_network->Configuration.DSConfig > 14 ) { - // 5G band - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_5N | WIRELESS_11A; - else - sta_band |= WIRELESS_11A; - } else { - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; - else if (tx_ra_bitmap & 0xff0) - sta_band |= WIRELESS_11G |WIRELESS_11B; - else - sta_band |= WIRELESS_11B; - } - - psta->wireless_mode = sta_band; - - raid = networktype_to_raid(sta_band); - init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; - - if (psta->aid < NUM_STA) - { - u8 arg = 0; - - arg = psta->mac_id&0x1f; - - arg |= BIT(7);//support entry 2~31 - - if (shortGIrate==_TRUE) - arg |= BIT(5); - - tx_ra_bitmap |= ((raid<<28)&0xf0000000); - - DBG_871X("%s=> mac_id:%d , raid:%d , bitmap=0x%x, arg=0x%x\n", - __FUNCTION__ , psta->mac_id, raid ,tx_ra_bitmap, arg); - - //bitmap[0:27] = tx_rate_bitmap - //bitmap[28:31]= Rate Adaptive id - //arg[0:4] = macid - //arg[5] = Short GI - rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, rssi_level); - - - if (shortGIrate==_TRUE) - init_rate |= BIT(6); - - //set ra_id, init_rate - psta->raid = raid; - psta->init_rate = init_rate; - - } - else - { - DBG_871X("station aid %d exceed the max number\n", psta->aid); - } - -} - -static void update_bmc_sta(_adapter *padapter) -{ - _irqL irqL; - u32 init_rate=0; - unsigned char network_type, raid; - int i, supportRateNum = 0; - unsigned int tx_ra_bitmap=0; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); - - if(psta) - { - psta->aid = 0;//default set to 0 - //psta->mac_id = psta->aid+4; - psta->mac_id = psta->aid + 1; - - psta->qos_option = 0; -#ifdef CONFIG_80211N_HT - psta->htpriv.ht_option = _FALSE; -#endif //CONFIG_80211N_HT - - psta->ieee8021x_blocked = 0; - - _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); - - //psta->dot118021XPrivacy = _NO_PRIVACY_;//!!! remove it, because it has been set before this. - - - - //prepare for add_RATid - supportRateNum = rtw_get_rateset_len((u8*)&pcur_network->SupportedRates); - network_type = rtw_check_network_type((u8*)&pcur_network->SupportedRates, supportRateNum, 1); - - _rtw_memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum); - psta->bssratelen = supportRateNum; - - //b/g mode ra_bitmap - for (i=0; ibssrateset[i]) - tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); - } - - if ( pcur_network->Configuration.DSConfig > 14 ) { - //force to A mode. 5G doesn't support CCK rates - network_type = WIRELESS_11A; - tx_ra_bitmap = 0x150; // 6, 12, 24 Mbps - } else { - //force to b mode - network_type = WIRELESS_11B; - tx_ra_bitmap = 0xf; - } - - //tx_ra_bitmap = update_basic_rate(pcur_network->SupportedRates, supportRateNum); - - raid = networktype_to_raid(network_type); - init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; - - //DBG_871X("Add id %d val %08x to ratr for bmc sta\n", psta->aid, tx_ra_bitmap); - //ap mode - rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE); - - //if(pHalData->fw_ractrl == _TRUE) - { - u8 arg = 0; - - arg = psta->mac_id&0x1f; - - arg |= BIT(7); - - //if (shortGIrate==_TRUE) - // arg |= BIT(5); - - tx_ra_bitmap |= ((raid<<28)&0xf0000000); - - DBG_871X("update_bmc_sta, mask=0x%x, arg=0x%x\n", tx_ra_bitmap, arg); - - //bitmap[0:27] = tx_rate_bitmap - //bitmap[28:31]= Rate Adaptive id - //arg[0:4] = macid - //arg[5] = Short GI - rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, 0); - - } - - //set ra_id, init_rate - psta->raid = raid; - psta->init_rate = init_rate; - - rtw_stassoc_hw_rpt(padapter, psta); - - _enter_critical_bh(&psta->lock, &irqL); - psta->state = _FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - } - else - { - DBG_871X("add_RATid_bmc_sta error!\n"); - } - -} - -//notes: -//AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode -//MAC_ID = AID+1 for sta in ap/adhoc mode -//MAC_ID = 1 for bc/mc for sta/ap/adhoc -//MAC_ID = 0 for bssid for sta/ap/adhoc -//CAM_ID = //0~3 for default key, cmd_id=macid + 3, macid=aid+1; - -void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); -#ifdef CONFIG_80211N_HT - struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; - struct ht_priv *phtpriv_sta = &psta->htpriv; -#endif //CONFIG_80211N_HT - //set intf_tag to if1 - //psta->intf_tag = 0; - - //psta->mac_id = psta->aid+4; - psta->mac_id = psta->aid+1; - DBG_871X("%s\n",__FUNCTION__); - - //ap mode - rtw_hal_set_odm_var(padapter,HAL_ODM_STA_INFO,psta,_TRUE); - - if(psecuritypriv->dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) - psta->ieee8021x_blocked = _TRUE; - else - psta->ieee8021x_blocked = _FALSE; - - - //update sta's cap - - //ERP - VCS_update(padapter, psta); -#ifdef CONFIG_80211N_HT - //HT related cap - if(phtpriv_sta->ht_option) - { - //check if sta supports rx ampdu - phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; - - //check if sta support s Short GI - if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) - { - phtpriv_sta->sgi = _TRUE; - } - - // bwmode - if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) - { - //phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_40; - phtpriv_sta->bwmode = pmlmeext->cur_bwmode; - phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; - - } - - psta->qos_option = _TRUE; - - } - else - { - phtpriv_sta->ampdu_enable = _FALSE; - - phtpriv_sta->sgi = _FALSE; - phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; - phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - } - - //Rx AMPDU - send_delba(padapter, 0, psta->hwaddr);// recipient - - //TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - phtpriv_sta->agg_enable_bitmap = 0x0;//reset - phtpriv_sta->candidate_tid_bitmap = 0x0;//reset -#endif //CONFIG_80211N_HT - - //todo: init other variables - - _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); - - - //add ratid - //add_RATid(padapter, psta);//move to ap_sta_info_defer_update() - - - _enter_critical_bh(&psta->lock, &irqL); - psta->state |= _FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - -} - -static void update_hw_ht_param(_adapter *padapter) -{ - unsigned char max_AMPDU_len; - unsigned char min_MPDU_spacing; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - DBG_871X("%s\n", __FUNCTION__); - - - //handle A-MPDU parameter field - /* - AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k - AMPDU_para [4:2]:Min MPDU Start Spacing - */ - max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; - - min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; - - rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); - - rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); - - // - // Config SM Power Save setting - // - pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2; - if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) - { - /*u8 i; - //update the MCS rates - for (i = 0; i < 16; i++) - { - pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; - }*/ - DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__); - } - - // - // Config current HT Protection mode. - // - //pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; - -} - -static void start_bss_network(_adapter *padapter, u8 *pbuf) -{ - u8 *p; - u8 val8, cur_channel, cur_bwmode, cur_ch_offset; - u16 bcn_interval; - u32 acparm; - int ie_len; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv* psecuritypriv=&(padapter->securitypriv); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); - struct HT_info_element *pht_info=NULL; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); -#endif //CONFIG_P2P - - //DBG_871X("%s\n", __FUNCTION__); - - bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; - cur_channel = pnetwork->Configuration.DSConfig; - cur_bwmode = HT_CHANNEL_WIDTH_20;; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - - //check if there is wps ie, - //if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, - //and at first time the security ie ( RSN/WPA IE) will not include in beacon. - if(NULL == rtw_get_wps_ie(pnetwork->IEs+_FIXED_IE_LENGTH_, pnetwork->IELength-_FIXED_IE_LENGTH_, NULL, NULL)) - { - pmlmeext->bstart_bss = _TRUE; - } - - //todo: update wmm, ht cap - //pmlmeinfo->WMM_enable; - //pmlmeinfo->HT_enable; - if(pmlmepriv->qospriv.qos_option) - pmlmeinfo->WMM_enable = _TRUE; -#ifdef CONFIG_80211N_HT - if(pmlmepriv->htpriv.ht_option) - { - pmlmeinfo->WMM_enable = _TRUE; - pmlmeinfo->HT_enable = _TRUE; - //pmlmeinfo->HT_info_enable = _TRUE; - //pmlmeinfo->HT_caps_enable = _TRUE; - - update_hw_ht_param(padapter); - } -#endif //#CONFIG_80211N_HT - - - if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time - { - //WEP Key will be set before this function, do not clear CAM. - if ((psecuritypriv->dot11PrivacyAlgrthm != _WEP40_) && (psecuritypriv->dot11PrivacyAlgrthm != _WEP104_)) - flush_all_cam_entry(padapter); //clear CAM - } - - //set MSR to AP_Mode - Set_MSR(padapter, _HW_STATE_AP_); - - //Set BSSID REG - rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pnetwork->MacAddress); - - //Set EDCA param reg -#ifdef CONFIG_CONCURRENT_MODE - acparm = 0x005ea42b; -#else - acparm = 0x002F3217; // VO -#endif - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); - acparm = 0x005E4317; // VI - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); - //acparm = 0x00105320; // BE - acparm = 0x005ea42b; - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); - acparm = 0x0000A444; // BK - rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); - - //Set Security - val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; - rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - - //Beacon Control related register - rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); - - - UpdateBrateTbl(padapter, pnetwork->SupportedRates); - rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates); - - if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time - { - //u32 initialgain; - - //initialgain = 0x1e; - - - //disable dynamic functions, such as high power, DIG - //Save_DM_Func_Flag(padapter); - //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - -#ifdef CONFIG_CONCURRENT_MODE - if(padapter->adapter_type > PRIMARY_ADAPTER) - { - if(rtw_buddy_adapter_up(padapter)) - { - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - - //turn on all dynamic functions on PRIMARY_ADAPTER, dynamic functions only runs at PRIMARY_ADAPTER - Switch_DM_Func(pbuddy_adapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); - - //rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); - } - } - else -#endif - { - //turn on all dynamic functions - Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); - - //rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); - } - - } -#ifdef CONFIG_80211N_HT - //set channel, bwmode - p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if( p && ie_len) - { - pht_info = (struct HT_info_element *)(p+2); - - if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) - { - //switch to the 40M Hz mode - //pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; - cur_bwmode = HT_CHANNEL_WIDTH_40; - switch (pht_info->infos[0] & 0x3) - { - case 1: - //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - break; - - case 3: - //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - break; - - default: - //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - break; - } - - } - - } -#endif //CONFIG_80211N_HT -#ifdef CONFIG_DUALMAC_CONCURRENT - dc_set_ap_channel_bandwidth(padapter, cur_channel, cur_ch_offset, cur_bwmode); -#else - //TODO: need to judge the phy parameters on concurrent mode for single phy - //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); -#ifdef CONFIG_CONCURRENT_MODE - if(!check_buddy_fwstate(padapter, _FW_LINKED|_FW_UNDER_LINKING|_FW_UNDER_SURVEY)) - { - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); - } - else if(check_buddy_fwstate(padapter, _FW_LINKED)==_TRUE)//only second adapter can enter AP Mode - { - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - //To sync cur_channel/cur_bwmode/cur_ch_offset with primary adapter - DBG_871X("primary iface is at linked state, sync cur_channel/cur_bwmode/cur_ch_offset\n"); - DBG_871X("primary adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset); - DBG_871X("second adapter, CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); - - cur_channel = pbuddy_mlmeext->cur_channel; - if(cur_bwmode == HT_CHANNEL_WIDTH_40) - { - if(pht_info) - pht_info->infos[0] &= ~(BIT(0)|BIT(1)); - - if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) - { - cur_ch_offset = pbuddy_mlmeext->cur_ch_offset; - - //to update cur_ch_offset value in beacon - if(pht_info) - { - switch(cur_ch_offset) - { - case HAL_PRIME_CHNL_OFFSET_LOWER: - pht_info->infos[0] |= 0x1; - break; - case HAL_PRIME_CHNL_OFFSET_UPPER: - pht_info->infos[0] |= 0x3; - break; - case HAL_PRIME_CHNL_OFFSET_DONT_CARE: - default: - break; - } - } - - } - else if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20) - { - cur_bwmode = HT_CHANNEL_WIDTH_20; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - if(cur_channel>0 && cur_channel<5) - { - if(pht_info) - pht_info->infos[0] |= 0x1; - - cur_bwmode = HT_CHANNEL_WIDTH_40; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - } - - if(cur_channel>7 && cur_channel<(14+1)) - { - if(pht_info) - pht_info->infos[0] |= 0x3; - - cur_bwmode = HT_CHANNEL_WIDTH_40; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - } - - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); - } - - } - - // to update channel value in beacon - pnetwork->Configuration.DSConfig = cur_channel; - p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if(p && ie_len>0) - *(p + 2) = cur_channel; - - if(pht_info) - pht_info->primary_channel = cur_channel; - } -#else - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); -#endif //CONFIG_CONCURRENT_MODE - - DBG_871X("CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); - - // - pmlmeext->cur_channel = cur_channel; - pmlmeext->cur_bwmode = cur_bwmode; - pmlmeext->cur_ch_offset = cur_ch_offset; -#endif //CONFIG_DUALMAC_CONCURRENT - pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type; - - //update cur_wireless_mode - update_wireless_mode(padapter); - - //udpate capability after cur_wireless_mode updated - update_capinfo(padapter, rtw_get_capability((WLAN_BSSID_EX *)pnetwork)); - - //let pnetwork_mlmeext == pnetwork_mlme. - _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); - -#ifdef CONFIG_P2P - _rtw_memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.Ssid, pnetwork->Ssid.SsidLength); - pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.SsidLength; -#endif //CONFIG_P2P - - if(_TRUE == pmlmeext->bstart_bss) - { - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - -#ifndef CONFIG_INTERRUPT_BASED_TXBCN //other case will tx beacon when bcn interrupt coming in. -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - //issue beacon frame - if(send_beacon(padapter)==_FAIL) - { - DBG_871X("issue_beacon, fail!\n"); - } -#endif -#endif //!CONFIG_INTERRUPT_BASED_TXBCN - - } - - - //update bc/mc sta_info - update_bmc_sta(padapter); - - //pmlmeext->bstart_bss = _TRUE; - -} - -int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) -{ - int ret=_SUCCESS; - u8 *p; - u8 *pHT_caps_ie=NULL; - u8 *pHT_info_ie=NULL; - struct sta_info *psta = NULL; - u16 cap, ht_cap=_FALSE; - uint ie_len = 0; - int group_cipher, pairwise_cipher; - u8 channel, network_type, supportRate[NDIS_802_11_LENGTH_RATES_EX]; - int supportRateNum = 0; - u8 OUI1[] = {0x00, 0x50, 0xf2,0x01}; - u8 wps_oui[4]={0x0,0x50,0xf2,0x04}; - u8 WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pbss_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 *ie = pbss_network->IEs; - - - /* SSID */ - /* Supported rates */ - /* DS Params */ - /* WLAN_EID_COUNTRY */ - /* ERP Information element */ - /* Extended supported rates */ - /* WPA/WPA2 */ - /* Wi-Fi Wireless Multimedia Extensions */ - /* ht_capab, ht_oper */ - /* WPS IE */ - - DBG_871X("%s, len=%d\n", __FUNCTION__, len); - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) - return _FAIL; - - - if(len>MAX_IE_SZ) - return _FAIL; - - pbss_network->IELength = len; - - _rtw_memset(ie, 0, MAX_IE_SZ); - - _rtw_memcpy(ie, pbuf, pbss_network->IELength); - - - if(pbss_network->InfrastructureMode!=Ndis802_11APMode) - return _FAIL; - - pbss_network->Rssi = 0; - - _rtw_memcpy(pbss_network->MacAddress, myid(&(padapter->eeprompriv)), ETH_ALEN); - - //beacon interval - p = rtw_get_beacon_interval_from_ie(ie);//ie + 8; // 8: TimeStamp, 2: Beacon Interval 2:Capability - //pbss_network->Configuration.BeaconPeriod = le16_to_cpu(*(unsigned short*)p); - pbss_network->Configuration.BeaconPeriod = RTW_GET_LE16(p); - - //capability - //cap = *(unsigned short *)rtw_get_capability_from_ie(ie); - //cap = le16_to_cpu(cap); - cap = RTW_GET_LE16(ie); - - //SSID - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->IELength -_BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - _rtw_memset(&pbss_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); - _rtw_memcpy(pbss_network->Ssid.Ssid, (p + 2), ie_len); - pbss_network->Ssid.SsidLength = ie_len; - } - - //chnnel - channel = 0; - pbss_network->Configuration.Length = 0; - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - channel = *(p + 2); - - pbss_network->Configuration.DSConfig = channel; - - - _rtw_memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX); - // get supported rates - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if (p != NULL) - { - _rtw_memcpy(supportRate, p+2, ie_len); - supportRateNum = ie_len; - } - - //get ext_supported rates - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_); - if (p != NULL) - { - _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); - supportRateNum += ie_len; - - } - - network_type = rtw_check_network_type(supportRate, supportRateNum, channel); - - rtw_set_supported_rate(pbss_network->SupportedRates, network_type); - - - //parsing ERP_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - ERP_IE_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)p); - } - - //update privacy/security - if (cap & BIT(4)) - pbss_network->Privacy = 1; - else - pbss_network->Privacy = 0; - - psecuritypriv->wpa_psk = 0; - - //wpa2 - group_cipher = 0; pairwise_cipher = 0; - psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; - psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - if(rtw_parse_wpa2_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - - psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x - psecuritypriv->wpa_psk |= BIT(1); - - psecuritypriv->wpa2_group_cipher = group_cipher; - psecuritypriv->wpa2_pairwise_cipher = pairwise_cipher; -#if 0 - switch(group_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa2_group_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa2_group_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa2_group_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa2_group_cipher = _WEP104_; - break; - } - - switch(pairwise_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa2_pairwise_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa2_pairwise_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa2_pairwise_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa2_pairwise_cipher = _WEP104_; - break; - } -#endif - } - - } - - //wpa - ie_len = 0; - group_cipher = 0; pairwise_cipher = 0; - psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; - psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; - for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) - { - p = rtw_get_ie(p, _SSN_IE_1_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); - if ((p) && (_rtw_memcmp(p+2, OUI1, 4))) - { - if(rtw_parse_wpa_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - - psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x - - psecuritypriv->wpa_psk |= BIT(0); - - psecuritypriv->wpa_group_cipher = group_cipher; - psecuritypriv->wpa_pairwise_cipher = pairwise_cipher; - -#if 0 - switch(group_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa_group_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa_group_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa_group_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa_group_cipher = _WEP104_; - break; - } - - switch(pairwise_cipher) - { - case WPA_CIPHER_NONE: - psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; - break; - case WPA_CIPHER_WEP40: - psecuritypriv->wpa_pairwise_cipher = _WEP40_; - break; - case WPA_CIPHER_TKIP: - psecuritypriv->wpa_pairwise_cipher = _TKIP_; - break; - case WPA_CIPHER_CCMP: - psecuritypriv->wpa_pairwise_cipher = _AES_; - break; - case WPA_CIPHER_WEP104: - psecuritypriv->wpa_pairwise_cipher = _WEP104_; - break; - } -#endif - } - - break; - - } - - if ((p == NULL) || (ie_len == 0)) - { - break; - } - - } - - //wmm - ie_len = 0; - pmlmepriv->qospriv.qos_option = 0; - if(pregistrypriv->wmm_enable) - { - for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) - { - p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); - if((p) && _rtw_memcmp(p+2, WMM_PARA_IE, 6)) - { - pmlmepriv->qospriv.qos_option = 1; - - *(p+8) |= BIT(7);//QoS Info, support U-APSD - - /* disable all ACM bits since the WMM admission control is not supported */ - *(p + 10) &= ~BIT(4); /* BE */ - *(p + 14) &= ~BIT(4); /* BK */ - *(p + 18) &= ~BIT(4); /* VI */ - *(p + 22) &= ~BIT(4); /* VO */ - - break; - } - - if ((p == NULL) || (ie_len == 0)) - { - break; - } - } - } -#ifdef CONFIG_80211N_HT - //parsing HT_CAP_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - u8 rf_type; - - struct rtw_ieee80211_ht_cap *pht_cap = (struct rtw_ieee80211_ht_cap *)(p+2); - - pHT_caps_ie=p; - - - ht_cap = _TRUE; - network_type |= WIRELESS_11_24N; - - - rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - - if((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) || - (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP)) - { - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2)); - } - else - { - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00); - } - - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & 0x03); //set Max Rx AMPDU size to 64K - - if(rf_type == RF_1T1R) - { - pht_cap->supp_mcs_set[0] = 0xff; - pht_cap->supp_mcs_set[1] = 0x0; - } - - _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len); - - } - - //parsing HT_INFO_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); - if(p && ie_len>0) - { - pHT_info_ie=p; - } -#endif //CONFIG_80211N_HT - switch(network_type) - { - case WIRELESS_11B: - pbss_network->NetworkTypeInUse = Ndis802_11DS; - break; - case WIRELESS_11G: - case WIRELESS_11BG: - case WIRELESS_11G_24N: - case WIRELESS_11BG_24N: - pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; - break; - case WIRELESS_11A: - pbss_network->NetworkTypeInUse = Ndis802_11OFDM5; - break; - default : - pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; - break; - } - - pmlmepriv->cur_network.network_type = network_type; - -#ifdef CONFIG_80211N_HT - pmlmepriv->htpriv.ht_option = _FALSE; - - if( (psecuritypriv->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) || - (psecuritypriv->wpa_pairwise_cipher&WPA_CIPHER_TKIP)) - { - //todo: - //ht_cap = _FALSE; - } - - //ht_cap - if(pregistrypriv->ht_enable && ht_cap==_TRUE) - { - pmlmepriv->htpriv.ht_option = _TRUE; - pmlmepriv->qospriv.qos_option = 1; - - if(pregistrypriv->ampdu_enable==1) - { - pmlmepriv->htpriv.ampdu_enable = _TRUE; - } - - HT_caps_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_caps_ie); - - HT_info_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_info_ie); - } -#endif - - - pbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pbss_network); - - //issue beacon to start bss network - start_bss_network(padapter, (u8*)pbss_network); - - - //alloc sta_info for ap itself - psta = rtw_get_stainfo(&padapter->stapriv, pbss_network->MacAddress); - if(!psta) - { - psta = rtw_alloc_stainfo(&padapter->stapriv, pbss_network->MacAddress); - if (psta == NULL) - { - return _FAIL; - } - } - psta->state |= WIFI_AP_STATE; //Aries, add,fix bug of flush_cam_entry at STOP AP mode , 0724 - rtw_indicate_connect( padapter); - - pmlmepriv->cur_network.join_res = _TRUE;//for check if already set beacon - - //update bc/mc sta_info - //update_bmc_sta(padapter); - - return ret; - -} - -void rtw_set_macaddr_acl(_adapter *padapter, int mode) -{ - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - - DBG_871X("%s, mode=%d\n", __func__, mode); - - pacl_list->mode = mode; -} - -int rtw_acl_add_sta(_adapter *padapter, u8 *addr) -{ - _irqL irqL; - _list *plist, *phead; - u8 added = _FALSE; - int i, ret=0; - struct rtw_wlan_acl_node *paclnode; - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - _queue *pacl_node_q =&pacl_list->acl_node_q; - - DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr)); - - if((NUM_ACL-1) < pacl_list->num) - return (-1); - - - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - - phead = get_list_head(pacl_node_q); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); - plist = get_next(plist); - - if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN)) - { - if(paclnode->valid == _TRUE) - { - added = _TRUE; - DBG_871X("%s, sta has been added\n", __func__); - break; - } - } - } - - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - - if(added == _TRUE) - return ret; - - - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - - for(i=0; i< NUM_ACL; i++) - { - paclnode = &pacl_list->aclnode[i]; - - if(paclnode->valid == _FALSE) - { - _rtw_init_listhead(&paclnode->list); - - _rtw_memcpy(paclnode->addr, addr, ETH_ALEN); - - paclnode->valid = _TRUE; - - rtw_list_insert_tail(&paclnode->list, get_list_head(pacl_node_q)); - - pacl_list->num++; - - break; - } - } - - DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num); - - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - return ret; -} - -int rtw_acl_remove_sta(_adapter *padapter, u8 *addr) -{ - _irqL irqL; - _list *plist, *phead; - int i, ret=0; - struct rtw_wlan_acl_node *paclnode; - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - _queue *pacl_node_q =&pacl_list->acl_node_q; - - DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr)); - - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - - phead = get_list_head(pacl_node_q); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); - plist = get_next(plist); - - if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN)) - { - if(paclnode->valid == _TRUE) - { - paclnode->valid = _FALSE; - - rtw_list_delete(&paclnode->list); - - pacl_list->num--; - } - } - } - - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num); - - return ret; - -} - -#ifdef CONFIG_NATIVEAP_MLME - -static void update_bcn_fixed_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_erpinfo_ie(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); - unsigned char *p, *ie = pnetwork->IEs; - u32 len = 0; - - DBG_871X("%s, ERP_enable=%d\n", __FUNCTION__, pmlmeinfo->ERP_enable); - - if(!pmlmeinfo->ERP_enable) - return; - - //parsing ERP_IE - p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if(p && len>0) - { - PNDIS_802_11_VARIABLE_IEs pIE = (PNDIS_802_11_VARIABLE_IEs)p; - - if (pmlmepriv->num_sta_non_erp == 1) - pIE->data[0] |= RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION; - else - pIE->data[0] &= ~(RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION); - - if(pmlmepriv->num_sta_no_short_preamble > 0) - pIE->data[0] |= RTW_ERP_INFO_BARKER_PREAMBLE_MODE; - else - pIE->data[0] &= ~(RTW_ERP_INFO_BARKER_PREAMBLE_MODE); - - ERP_IE_handler(padapter, pIE); - } - -} - -static void update_bcn_htcap_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_htinfo_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_rsn_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wpa_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wmm_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wps_ie(_adapter *padapter) -{ - u8 *pwps_ie=NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie=NULL; - uint wps_ielen=0, wps_offset, remainder_ielen; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); - unsigned char *ie = pnetwork->IEs; - u32 ielen = pnetwork->IELength; - - - DBG_871X("%s\n", __FUNCTION__); - - pwps_ie = rtw_get_wps_ie(ie+_FIXED_IE_LENGTH_, ielen-_FIXED_IE_LENGTH_, NULL, &wps_ielen); - - if(pwps_ie==NULL || wps_ielen==0) - return; - - wps_offset = (uint)(pwps_ie-ie); - - premainder_ie = pwps_ie + wps_ielen; - - remainder_ielen = ielen - wps_offset - wps_ielen; - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - - pwps_ie_src = pmlmepriv->wps_beacon_ie; - if(pwps_ie_src == NULL) - return; - - - wps_ielen = (uint)pwps_ie_src[1];//to get ie data len - if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) - { - _rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen+2); - pwps_ie += (wps_ielen+2); - - if(pbackup_remainder_ie) - _rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen); - - //update IELength - pnetwork->IELength = wps_offset + (wps_ielen+2) + remainder_ielen; - } - - if(pbackup_remainder_ie) - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - -} - -static void update_bcn_p2p_ie(_adapter *padapter) -{ - -} - -static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui) -{ - DBG_871X("%s\n", __FUNCTION__); - - if(_rtw_memcmp(RTW_WPA_OUI, oui, 4)) - { - update_bcn_wpa_ie(padapter); - } - else if(_rtw_memcmp(WMM_OUI, oui, 4)) - { - update_bcn_wmm_ie(padapter); - } - else if(_rtw_memcmp(WPS_OUI, oui, 4)) - { - update_bcn_wps_ie(padapter); - } - else if(_rtw_memcmp(P2P_OUI, oui, 4)) - { - update_bcn_p2p_ie(padapter); - } - else - { - DBG_871X("unknown OUI type!\n"); - } - - -} - -void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv; - struct mlme_ext_priv *pmlmeext; - //struct mlme_ext_info *pmlmeinfo; - - //DBG_871X("%s\n", __FUNCTION__); - - if(!padapter) - return; - - pmlmepriv = &(padapter->mlmepriv); - pmlmeext = &(padapter->mlmeextpriv); - //pmlmeinfo = &(pmlmeext->mlmext_info); - - if(_FALSE == pmlmeext->bstart_bss) - return; - - _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); - - switch(ie_id) - { - case 0xFF: - - update_bcn_fixed_ie(padapter);//8: TimeStamp, 2: Beacon Interval 2:Capability - - break; - - case _TIM_IE_: - - update_BCNTIM(padapter); - - break; - - case _ERPINFO_IE_: - - update_bcn_erpinfo_ie(padapter); - - break; - - case _HT_CAPABILITY_IE_: - - update_bcn_htcap_ie(padapter); - - break; - - case _RSN_IE_2_: - - update_bcn_rsn_ie(padapter); - - break; - - case _HT_ADD_INFO_IE_: - - update_bcn_htinfo_ie(padapter); - - break; - - case _VENDOR_SPECIFIC_IE_: - - update_bcn_vendor_spec_ie(padapter, oui); - - break; - - default: - break; - } - - pmlmepriv->update_bcn = _TRUE; - - _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); - -#ifndef CONFIG_INTERRUPT_BASED_TXBCN -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - if(tx) - { - //send_beacon(padapter);//send_beacon must execute on TSR level - set_tx_beacon_cmd(padapter); - } -#else - { - //PCI will issue beacon when BCN interrupt occurs. - } -#endif -#endif //!CONFIG_INTERRUPT_BASED_TXBCN - -} - -#ifdef CONFIG_80211N_HT - -/* -op_mode -Set to 0 (HT pure) under the followign conditions - - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or - - all STAs in the BSS are 20 MHz HT in 20 MHz BSS -Set to 1 (HT non-member protection) if there may be non-HT STAs - in both the primary and the secondary channel -Set to 2 if only HT STAs are associated in BSS, - however and at least one 20 MHz HT STA is associated -Set to 3 (HT mixed mode) when one or more non-HT STAs are associated - (currently non-GF HT station is considered as non-HT STA also) -*/ -static int rtw_ht_operation_update(_adapter *padapter) -{ - u16 cur_op_mode, new_op_mode; - int op_mode_changes = 0; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; - - if(pmlmepriv->htpriv.ht_option == _TRUE) - return 0; - - //if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) - // return 0; - - DBG_871X("%s current operation mode=0x%X\n", - __FUNCTION__, pmlmepriv->ht_op_mode); - - if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) - && pmlmepriv->num_sta_ht_no_gf) { - pmlmepriv->ht_op_mode |= - HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; - op_mode_changes++; - } else if ((pmlmepriv->ht_op_mode & - HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && - pmlmepriv->num_sta_ht_no_gf == 0) { - pmlmepriv->ht_op_mode &= - ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; - op_mode_changes++; - } - - if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && - (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) { - pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; - op_mode_changes++; - } else if ((pmlmepriv->ht_op_mode & - HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && - (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) { - pmlmepriv->ht_op_mode &= - ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; - op_mode_changes++; - } - - /* Note: currently we switch to the MIXED op mode if HT non-greenfield - * station is associated. Probably it's a theoretical case, since - * it looks like all known HT STAs support greenfield. - */ - new_op_mode = 0; - if (pmlmepriv->num_sta_no_ht || - (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)) - new_op_mode = OP_MODE_MIXED; - else if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH) - && pmlmepriv->num_sta_ht_20mhz) - new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED; - else if (pmlmepriv->olbc_ht) - new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS; - else - new_op_mode = OP_MODE_PURE; - - cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; - if (cur_op_mode != new_op_mode) { - pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK; - pmlmepriv->ht_op_mode |= new_op_mode; - op_mode_changes++; - } - - DBG_871X("%s new operation mode=0x%X changes=%d\n", - __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes); - - return op_mode_changes; - -} - -#endif /* CONFIG_80211N_HT */ - -void associated_clients_update(_adapter *padapter, u8 updated) -{ - //update associcated stations cap. - if(updated == _TRUE) - { - _irqL irqL; - _list *phead, *plist; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //check asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - VCS_update(padapter, psta); - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - } - -} - -/* called > TSR LEVEL for USB or SDIO Interface*/ -void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta) -{ - u8 beacon_updated = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - -#if 0 - if (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && - !psta->no_short_preamble_set) { - psta->no_short_preamble_set = 1; - pmlmepriv->num_sta_no_short_preamble++; - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 1)) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - - if(!(psta->flags & WLAN_STA_SHORT_PREAMBLE)) - { - if(!psta->no_short_preamble_set) - { - psta->no_short_preamble_set = 1; - - pmlmepriv->num_sta_no_short_preamble++; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 1)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - - } - } - else - { - if(psta->no_short_preamble_set) - { - psta->no_short_preamble_set = 0; - - pmlmepriv->num_sta_no_short_preamble--; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 0)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - - } - } - -#if 0 - if (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) { - psta->nonerp_set = 1; - pmlmepriv->num_sta_non_erp++; - if (pmlmepriv->num_sta_non_erp == 1) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - if(psta->flags & WLAN_STA_NONERP) - { - if(!psta->nonerp_set) - { - psta->nonerp_set = 1; - - pmlmepriv->num_sta_non_erp++; - - if (pmlmepriv->num_sta_non_erp == 1) - { - beacon_updated = _TRUE; - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - } - - } - else - { - if(psta->nonerp_set) - { - psta->nonerp_set = 0; - - pmlmepriv->num_sta_non_erp--; - - if (pmlmepriv->num_sta_non_erp == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - } - - } - - -#if 0 - if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) && - !psta->no_short_slot_time_set) { - psta->no_short_slot_time_set = 1; - pmlmepriv->num_sta_no_short_slot_time++; - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 1)) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - if(!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT)) - { - if(!psta->no_short_slot_time_set) - { - psta->no_short_slot_time_set = 1; - - pmlmepriv->num_sta_no_short_slot_time++; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 1)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - - } - } - else - { - if(psta->no_short_slot_time_set) - { - psta->no_short_slot_time_set = 0; - - pmlmepriv->num_sta_no_short_slot_time--; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 0)) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - } - } - -#ifdef CONFIG_80211N_HT - - if (psta->flags & WLAN_STA_HT) - { - u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info); - - DBG_871X("HT: STA " MAC_FMT " HT Capabilities " - "Info: 0x%04x\n", MAC_ARG(psta->hwaddr), ht_capab); - - if (psta->no_ht_set) { - psta->no_ht_set = 0; - pmlmepriv->num_sta_no_ht--; - } - - if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) { - if (!psta->no_ht_gf_set) { - psta->no_ht_gf_set = 1; - pmlmepriv->num_sta_ht_no_gf++; - } - DBG_871X("%s STA " MAC_FMT " - no " - "greenfield, num of non-gf stations %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_ht_no_gf); - } - - if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) { - if (!psta->ht_20mhz_set) { - psta->ht_20mhz_set = 1; - pmlmepriv->num_sta_ht_20mhz++; - } - DBG_871X("%s STA " MAC_FMT " - 20 MHz HT, " - "num of 20MHz HT STAs %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_ht_20mhz); - } - - } - else - { - if (!psta->no_ht_set) { - psta->no_ht_set = 1; - pmlmepriv->num_sta_no_ht++; - } - if(pmlmepriv->htpriv.ht_option == _TRUE) { - DBG_871X("%s STA " MAC_FMT - " - no HT, num of non-HT stations %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_no_ht); - } - } - - if (rtw_ht_operation_update(padapter) > 0) - { - update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); - } - -#endif /* CONFIG_80211N_HT */ - - //update associcated stations cap. - associated_clients_update(padapter, beacon_updated); - - DBG_871X("%s, updated=%d\n", __func__, beacon_updated); - -} - -u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta) -{ - u8 beacon_updated = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - if(!psta) - return beacon_updated; - - if (psta->no_short_preamble_set) { - psta->no_short_preamble_set = 0; - pmlmepriv->num_sta_no_short_preamble--; - if (pmlmeext->cur_wireless_mode > WIRELESS_11B - && pmlmepriv->num_sta_no_short_preamble == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - } - - if (psta->nonerp_set) { - psta->nonerp_set = 0; - pmlmepriv->num_sta_non_erp--; - if (pmlmepriv->num_sta_non_erp == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - } - - if (psta->no_short_slot_time_set) { - psta->no_short_slot_time_set = 0; - pmlmepriv->num_sta_no_short_slot_time--; - if (pmlmeext->cur_wireless_mode > WIRELESS_11B - && pmlmepriv->num_sta_no_short_slot_time == 0) - { - beacon_updated = _TRUE; - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - } - -#ifdef CONFIG_80211N_HT - - if (psta->no_ht_gf_set) { - psta->no_ht_gf_set = 0; - pmlmepriv->num_sta_ht_no_gf--; - } - - if (psta->no_ht_set) { - psta->no_ht_set = 0; - pmlmepriv->num_sta_no_ht--; - } - - if (psta->ht_20mhz_set) { - psta->ht_20mhz_set = 0; - pmlmepriv->num_sta_ht_20mhz--; - } - - if (rtw_ht_operation_update(padapter) > 0) - { - update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); - } - -#endif /* CONFIG_80211N_HT */ - - //update associcated stations cap. - //associated_clients_update(padapter, beacon_updated); //move it to avoid deadlock - - DBG_871X("%s, updated=%d\n", __func__, beacon_updated); - - return beacon_updated; - -} - -u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason) -{ - _irqL irqL; - u8 beacon_updated = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct sta_priv *pstapriv = &padapter->stapriv; - - if(!psta) - return beacon_updated; - - if (active == _TRUE) - { -#ifdef CONFIG_80211N_HT - //tear down Rx AMPDU - send_delba(padapter, 0, psta->hwaddr);// recipient - - //tear down TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - -#endif //CONFIG_80211N_HT - - issue_deauth(padapter, psta->hwaddr, reason); - } - - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset - - - //report_del_sta_event(padapter, psta->hwaddr, reason); - - //clear cam entry / key - //clear_cam_entry(padapter, (psta->mac_id + 3)); - rtw_clearstakey_cmd(padapter, (u8*)psta, (u8)(psta->mac_id + 3), _TRUE); - - - _enter_critical_bh(&psta->lock, &irqL); - psta->state &= ~_FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - #ifdef CONFIG_IOCTL_CFG80211 - if (1) { - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); - #else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - /* will call rtw_cfg80211_indicate_sta_disassoc() in cmd_thread for old API context */ - #endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - } else - #endif //CONFIG_IOCTL_CFG80211 - { - rtw_indicate_sta_disassoc_event(padapter, psta); - } - - report_del_sta_event(padapter, psta->hwaddr, reason); - - beacon_updated = bss_cap_update_on_sta_leave(padapter, psta); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - - return beacon_updated; - -} - -int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset) -{ - _irqL irqL; - _list *phead, *plist; - int ret=0; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - return ret; - - DBG_871X(FUNC_NDEV_FMT" with ch:%u, offset:%u\n", - FUNC_NDEV_ARG(padapter->pnetdev), new_ch, ch_offset); - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - /* for each sta in asoc_queue */ - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - plist = get_next(plist); - - issue_action_spct_ch_switch(padapter, psta->hwaddr, new_ch, ch_offset); - psta->expire_to = ((pstapriv->expire_to * 2) > 5) ? 5 : (pstapriv->expire_to * 2); - } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - issue_action_spct_ch_switch(padapter, bc_addr, new_ch, ch_offset); - - return ret; -} - -int rtw_sta_flush(_adapter *padapter) -{ - _irqL irqL; - _list *phead, *plist; - int ret=0; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - u8 chk_alive_num = 0; - char chk_alive_list[NUM_STA]; - int i; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev)); - - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - return ret; - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { - int stainfo_offset; - - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - plist = get_next(plist); - - /* Remove sta from asoc_list */ - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - - /* Keep sta for ap_free_sta() beyond this asoc_list loop */ - stainfo_offset = rtw_stainfo_offset(pstapriv, psta); - if (stainfo_offset_valid(stainfo_offset)) { - chk_alive_list[chk_alive_num++] = stainfo_offset; - } - } - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - - /* For each sta in chk_alive_list, call ap_free_sta */ - for (i = 0; i < chk_alive_num; i++) { - psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); - ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING); - } - - issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING); - - associated_clients_update(padapter, _TRUE); - - return ret; - -} - -/* called > TSR LEVEL for USB or SDIO Interface*/ -void sta_info_update(_adapter *padapter, struct sta_info *psta) -{ - int flags = psta->flags; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - - //update wmm cap. - if(WLAN_STA_WME&flags) - psta->qos_option = 1; - else - psta->qos_option = 0; - - if(pmlmepriv->qospriv.qos_option == 0) - psta->qos_option = 0; - - -#ifdef CONFIG_80211N_HT - //update 802.11n ht cap. - if(WLAN_STA_HT&flags) - { - psta->htpriv.ht_option = _TRUE; - psta->qos_option = 1; - } - else - { - psta->htpriv.ht_option = _FALSE; - } - - if(pmlmepriv->htpriv.ht_option == _FALSE) - psta->htpriv.ht_option = _FALSE; -#endif - - - update_sta_info_apmode(padapter, psta); - - -} - -/* called >= TSR LEVEL for USB or SDIO Interface*/ -void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta) -{ - if(psta->state & _FW_LINKED) - { - //add ratid - add_RATid(padapter, psta, 0);//DM_RATR_STA_INIT - } -} - -/* restore hw setting from sw data structures */ -void rtw_ap_restore_network(_adapter *padapter) -{ - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv * pstapriv = &padapter->stapriv; - struct sta_info *psta; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - _irqL irqL; - _list *phead, *plist; - u8 chk_alive_num = 0; - char chk_alive_list[NUM_STA]; - int i; - - rtw_setopmode_cmd(padapter, Ndis802_11APMode); - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - start_bss_network(padapter, (u8*)&mlmepriv->cur_network.network); - - if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || - (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) - { - /* restore group key, WEP keys is restored in ips_leave() */ - rtw_set_key(padapter, psecuritypriv, psecuritypriv->dot118021XGrpKeyid, 0); - } - - /* per sta pairwise key and settings */ - if((padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_) && - (padapter->securitypriv.dot11PrivacyAlgrthm != _AES_)) { - return; - } - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { - int stainfo_offset; - - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - plist = get_next(plist); - - stainfo_offset = rtw_stainfo_offset(pstapriv, psta); - if (stainfo_offset_valid(stainfo_offset)) { - chk_alive_list[chk_alive_num++] = stainfo_offset; - } - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - for (i = 0; i < chk_alive_num; i++) { - psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); - - if (psta == NULL) { - DBG_871X(FUNC_ADPT_FMT" sta_info is null\n", FUNC_ADPT_ARG(padapter)); - } - else if(psta->state &_FW_LINKED) - { - Update_RA_Entry(padapter, psta); - //pairwise key - rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); - } - } - -} - -void start_ap_mode(_adapter *padapter) -{ - int i; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - - pmlmepriv->update_bcn = _FALSE; - - //init_mlme_ap_info(padapter); - pmlmeext->bstart_bss = _FALSE; - - pmlmepriv->num_sta_non_erp = 0; - - pmlmepriv->num_sta_no_short_slot_time = 0; - - pmlmepriv->num_sta_no_short_preamble = 0; - - pmlmepriv->num_sta_ht_no_gf = 0; -#ifdef CONFIG_80211N_HT - pmlmepriv->num_sta_no_ht = 0; -#endif //CONFIG_80211N_HT - pmlmepriv->num_sta_ht_20mhz = 0; - - pmlmepriv->olbc = _FALSE; - - pmlmepriv->olbc_ht = _FALSE; - -#ifdef CONFIG_80211N_HT - pmlmepriv->ht_op_mode = 0; -#endif - - for(i=0; ista_aid[i] = NULL; - - pmlmepriv->wps_beacon_ie = NULL; - pmlmepriv->wps_probe_resp_ie = NULL; - pmlmepriv->wps_assoc_resp_ie = NULL; - - pmlmepriv->p2p_beacon_ie = NULL; - pmlmepriv->p2p_probe_resp_ie = NULL; - - - //for ACL - _rtw_init_listhead(&(pacl_list->acl_node_q.queue)); - pacl_list->num = 0; - pacl_list->mode = 0; - for(i = 0; i < NUM_ACL; i++) - { - _rtw_init_listhead(&pacl_list->aclnode[i].list); - pacl_list->aclnode[i].valid = _FALSE; - } - -} - -void stop_ap_mode(_adapter *padapter) -{ - _irqL irqL; - _list *phead, *plist; - struct rtw_wlan_acl_node *paclnode; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - _queue *pacl_node_q =&pacl_list->acl_node_q; - - pmlmepriv->update_bcn = _FALSE; - pmlmeext->bstart_bss = _FALSE; - //_rtw_spinlock_free(&pmlmepriv->bcn_update_lock); - - //reset and init security priv , this can refine with rtw_reset_securitypriv - _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); - padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; - padapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; - - //for ACL - _enter_critical_bh(&(pacl_node_q->lock), &irqL); - phead = get_list_head(pacl_node_q); - plist = get_next(phead); - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); - plist = get_next(plist); - - if(paclnode->valid == _TRUE) - { - paclnode->valid = _FALSE; - - rtw_list_delete(&paclnode->list); - - pacl_list->num--; - } - } - _exit_critical_bh(&(pacl_node_q->lock), &irqL); - - DBG_871X("%s, free acl_node_queue, num=%d\n", __func__, pacl_list->num); - - rtw_sta_flush(padapter); - - //free_assoc_sta_resources - rtw_free_all_stainfo(padapter); - - psta = rtw_get_bcmc_stainfo(padapter); - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - rtw_init_bcmc_stainfo(padapter); - - rtw_free_mlme_priv_ie_data(pmlmepriv); - -} - -#endif //CONFIG_NATIVEAP_MLME -#endif //CONFIG_AP_MODE - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_AP_C_ + +#include +#include +#include +#include + + +#ifdef CONFIG_AP_MODE + +extern unsigned char RTW_WPA_OUI[]; +extern unsigned char WMM_OUI[]; +extern unsigned char WPS_OUI[]; +extern unsigned char P2P_OUI[]; +extern unsigned char WFD_OUI[]; + +void init_mlme_ap_info(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + + + _rtw_spinlock_init(&pmlmepriv->bcn_update_lock); + + //for ACL + _rtw_init_queue(&pacl_list->acl_node_q); + + //pmlmeext->bstart_bss = _FALSE; + + start_ap_mode(padapter); +} + +void free_mlme_ap_info(_adapter *padapter) +{ + _irqL irqL; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //stop_ap_mode(padapter); + + pmlmepriv->update_bcn = _FALSE; + pmlmeext->bstart_bss = _FALSE; + + rtw_sta_flush(padapter); + + pmlmeinfo->state = _HW_STATE_NOLINK_; + + //free_assoc_sta_resources + rtw_free_all_stainfo(padapter); + + //free bc/mc sta_info + psta = rtw_get_bcmc_stainfo(padapter); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + _rtw_spinlock_free(&pmlmepriv->bcn_update_lock); + +} + +static void update_BCNTIM(_adapter *padapter) +{ + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); + unsigned char *pie = pnetwork_mlmeext->IEs; + + //DBG_871X("%s\n", __FUNCTION__); + + //update TIM IE + //if(pstapriv->tim_bitmap) + if(_TRUE) + { + u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; + u16 tim_bitmap_le; + uint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen; + + tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap); + + p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_); + if (p != NULL && tim_ielen>0) + { + tim_ielen += 2; + + premainder_ie = p+tim_ielen; + + tim_ie_offset = (sint)(p -pie); + + remainder_ielen = pnetwork_mlmeext->IELength - tim_ie_offset - tim_ielen; + + //append TIM IE from dst_ie offset + dst_ie = p; + } + else + { + tim_ielen = 0; + + //calucate head_len + offset = _FIXED_IE_LENGTH_; + + /* get ssid_ie len */ + p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SSID_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + offset += tmp_len+2; + + // get supported rates len + p = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + { + offset += tmp_len+2; + } + + //DS Parameter Set IE, len=3 + offset += 3; + + premainder_ie = pie + offset; + + remainder_ielen = pnetwork_mlmeext->IELength - offset - tim_ielen; + + //append TIM IE from offset + dst_ie = pie + offset; + + } + + + if(remainder_ielen>0) + { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if(pbackup_remainder_ie && premainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + *dst_ie++=_TIM_IE_; + + if((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fc)) + tim_ielen = 5; + else + tim_ielen = 4; + + *dst_ie++= tim_ielen; + + *dst_ie++=0;//DTIM count + *dst_ie++=1;//DTIM peroid + + if(pstapriv->tim_bitmap&BIT(0))//for bc/mc frames + *dst_ie++ = BIT(0);//bitmap ctrl + else + *dst_ie++ = 0; + + if(tim_ielen==4) + { + *dst_ie++ = *(u8*)&tim_bitmap_le; + } + else if(tim_ielen==5) + { + _rtw_memcpy(dst_ie, &tim_bitmap_le, 2); + dst_ie+=2; + } + + //copy remainder IE + if(pbackup_remainder_ie) + { + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); + + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + } + + offset = (uint)(dst_ie - pie); + pnetwork_mlmeext->IELength = offset + remainder_ielen; + + } + +#ifndef CONFIG_INTERRUPT_BASED_TXBCN +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + set_tx_beacon_cmd(padapter); +#endif +#endif //!CONFIG_INTERRUPT_BASED_TXBCN + + +} + +void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len) +{ + PNDIS_802_11_VARIABLE_IEs pIE; + u8 bmatch = _FALSE; + u8 *pie = pnetwork->IEs; + u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; + u32 i, offset, ielen, ie_offset, remainder_ielen = 0; + + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); + + if (pIE->ElementID > index) + { + break; + } + else if(pIE->ElementID == index) // already exist the same IE + { + p = (u8 *)pIE; + ielen = pIE->Length; + bmatch = _TRUE; + break; + } + + p = (u8 *)pIE; + ielen = pIE->Length; + i += (pIE->Length + 2); + } + + if (p != NULL && ielen>0) + { + ielen += 2; + + premainder_ie = p+ielen; + + ie_offset = (sint)(p -pie); + + remainder_ielen = pnetwork->IELength - ie_offset - ielen; + + if(bmatch) + dst_ie = p; + else + dst_ie = (p+ielen); + } + + if(remainder_ielen>0) + { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if(pbackup_remainder_ie && premainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + *dst_ie++=index; + *dst_ie++=len; + + _rtw_memcpy(dst_ie, data, len); + dst_ie+=len; + + //copy remainder IE + if(pbackup_remainder_ie) + { + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); + + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + } + + offset = (uint)(dst_ie - pie); + pnetwork->IELength = offset + remainder_ielen; +} + +void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index) +{ + u8 *p, *dst_ie, *premainder_ie=NULL, *pbackup_remainder_ie=NULL; + uint offset, ielen, ie_offset, remainder_ielen = 0; + u8 *pie = pnetwork->IEs; + + p = rtw_get_ie(pie + _FIXED_IE_LENGTH_, index, &ielen, pnetwork->IELength - _FIXED_IE_LENGTH_); + if (p != NULL && ielen>0) + { + ielen += 2; + + premainder_ie = p+ielen; + + ie_offset = (sint)(p -pie); + + remainder_ielen = pnetwork->IELength - ie_offset - ielen; + + dst_ie = p; + } + else { + return; + } + + if(remainder_ielen>0) + { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if(pbackup_remainder_ie && premainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + //copy remainder IE + if(pbackup_remainder_ie) + { + _rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen); + + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + } + + offset = (uint)(dst_ie - pie); + pnetwork->IELength = offset + remainder_ielen; +} + + +u8 chk_sta_is_alive(struct sta_info *psta); +u8 chk_sta_is_alive(struct sta_info *psta) +{ + u8 ret = _FALSE; + #ifdef DBG_EXPIRATION_CHK + DBG_871X("sta:"MAC_FMT", rssi:%d, rx:"STA_PKTS_FMT", expire_to:%u, %s%ssq_len:%u\n" + , MAC_ARG(psta->hwaddr) + , psta->rssi_stat.UndecoratedSmoothedPWDB + //, STA_RX_PKTS_ARG(psta) + , STA_RX_PKTS_DIFF_ARG(psta) + , psta->expire_to + , psta->state&WIFI_SLEEP_STATE?"PS, ":"" + , psta->state&WIFI_STA_ALIVE_CHK_STATE?"SAC, ":"" + , psta->sleepq_len + ); + #endif + + //if(sta_last_rx_pkts(psta) == sta_rx_pkts(psta)) + if((psta->sta_stats.last_rx_data_pkts + psta->sta_stats.last_rx_ctrl_pkts) == (psta->sta_stats.rx_data_pkts + psta->sta_stats.rx_ctrl_pkts)) + { + #if 0 + if(psta->state&WIFI_SLEEP_STATE) + ret = _TRUE; + #endif + } + else + { + ret = _TRUE; + } + + sta_update_last_rx_pkts(psta); + + return ret; +} + +void expire_timeout_chk(_adapter *padapter) +{ + _irqL irqL; + _list *phead, *plist; + u8 updated; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 chk_alive_num = 0; + char chk_alive_list[NUM_STA]; + int i; + + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); + + phead = &pstapriv->auth_list; + plist = get_next(phead); + + //check auth_queue + #ifdef DBG_EXPIRATION_CHK + if (rtw_end_of_queue_search(phead, plist) == _FALSE) { + DBG_871X(FUNC_NDEV_FMT" auth_list, cnt:%u\n" + , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->auth_list_cnt); + } + #endif + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, auth_list); + plist = get_next(plist); + + if(psta->expire_to>0) + { + psta->expire_to--; + if (psta->expire_to == 0) + { + rtw_list_delete(&psta->auth_list); + pstapriv->auth_list_cnt--; + + DBG_871X("auth expire %02X%02X%02X%02X%02X%02X\n", + psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); + + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + _enter_critical_bh(&pstapriv->auth_list_lock, &irqL); + } + } + + } + + _exit_critical_bh(&pstapriv->auth_list_lock, &irqL); + + psta = NULL; + + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //check asoc_queue + #ifdef DBG_EXPIRATION_CHK + if (rtw_end_of_queue_search(phead, plist) == _FALSE) { + DBG_871X(FUNC_NDEV_FMT" asoc_list, cnt:%u\n" + , FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->asoc_list_cnt); + } + #endif + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); + + if (chk_sta_is_alive(psta) || !psta->expire_to) { + psta->expire_to = pstapriv->expire_to; + psta->keep_alive_trycnt = 0; + #ifdef CONFIG_TX_MCAST2UNI + psta->under_exist_checking = 0; + #endif // CONFIG_TX_MCAST2UNI + } else { + psta->expire_to--; + } + +#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK +#ifdef CONFIG_TX_MCAST2UNI +#ifdef CONFIG_80211N_HT + if ( (psta->flags & WLAN_STA_HT) && (psta->htpriv.agg_enable_bitmap || psta->under_exist_checking) ) { + // check sta by delba(addba) for 11n STA + // ToDo: use CCX report to check for all STAs + //DBG_871X("asoc check by DELBA/ADDBA! (pstapriv->expire_to=%d s)(psta->expire_to=%d s), [%02x, %d]\n", pstapriv->expire_to*2, psta->expire_to*2, psta->htpriv.agg_enable_bitmap, psta->under_exist_checking); + + if ( psta->expire_to <= (pstapriv->expire_to - 50 ) ) { + DBG_871X("asoc expire by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2); + psta->under_exist_checking = 0; + psta->expire_to = 0; + } else if ( psta->expire_to <= (pstapriv->expire_to - 3) && (psta->under_exist_checking==0)) { + DBG_871X("asoc check by DELBA/ADDBA! (%d s)\n", (pstapriv->expire_to-psta->expire_to)*2); + psta->under_exist_checking = 1; + //tear down TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + } + } +#endif //CONFIG_80211N_HT +#endif // CONFIG_TX_MCAST2UNI +#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK + + if (psta->expire_to <= 0) + { + #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + if (padapter->registrypriv.wifi_spec == 1) + { + psta->expire_to = pstapriv->expire_to; + continue; + } + + if (psta->state & WIFI_SLEEP_STATE) { + if (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) { + //to check if alive by another methods if staion is at ps mode. + psta->expire_to = pstapriv->expire_to; + psta->state |= WIFI_STA_ALIVE_CHK_STATE; + + //DBG_871X("alive chk, sta:" MAC_FMT " is at ps mode!\n", MAC_ARG(psta->hwaddr)); + + //to update bcn with tim_bitmap for this station + pstapriv->tim_bitmap |= BIT(psta->aid); + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + + if(!pmlmeext->active_keep_alive_check) + continue; + } + } + + if (pmlmeext->active_keep_alive_check) { + int stainfo_offset; + + stainfo_offset = rtw_stainfo_offset(pstapriv, psta); + if (stainfo_offset_valid(stainfo_offset)) { + chk_alive_list[chk_alive_num++] = stainfo_offset; + } + + continue; + } + #endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ + + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + + DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); + updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING); + } + else + { + /* TODO: Aging mechanism to digest frames in sleep_q to avoid running out of xmitframe */ + if (psta->sleepq_len > (NR_XMITFRAME/pstapriv->asoc_list_cnt) + && padapter->xmitpriv.free_xmitframe_cnt < ((NR_XMITFRAME/pstapriv->asoc_list_cnt)/2) + ){ + DBG_871X("%s sta:"MAC_FMT", sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\n", __func__ + , MAC_ARG(psta->hwaddr) + , psta->sleepq_len, padapter->xmitpriv.free_xmitframe_cnt, pstapriv->asoc_list_cnt); + wakeup_sta_to_xmit(padapter, psta); + } + } + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + +#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK +if (chk_alive_num) { + + u8 backup_oper_channel=0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + /* switch to correct channel of current network before issue keep-alive frames */ + if (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) { + backup_oper_channel = rtw_get_oper_ch(padapter); + SelectChannel(padapter, pmlmeext->cur_channel); + } + + /* issue null data to check sta alive*/ + for (i = 0; i < chk_alive_num; i++) { + + int ret = _FAIL; + + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); + if(!(psta->state &_FW_LINKED)) + continue; + + if (psta->state & WIFI_SLEEP_STATE) + ret = issue_nulldata(padapter, psta->hwaddr, 0, 1, 50); + else + ret = issue_nulldata(padapter, psta->hwaddr, 0, 3, 50); + + psta->keep_alive_trycnt++; + if (ret == _SUCCESS) + { + DBG_871X("asoc check, sta(" MAC_FMT ") is alive\n", MAC_ARG(psta->hwaddr)); + psta->expire_to = pstapriv->expire_to; + psta->keep_alive_trycnt = 0; + continue; + } + else if (psta->keep_alive_trycnt <= 3) + { + DBG_871X("ack check for asoc expire, keep_alive_trycnt=%d\n", psta->keep_alive_trycnt); + psta->expire_to = 1; + continue; + } + + psta->keep_alive_trycnt = 0; + + DBG_871X("asoc expire "MAC_FMT", state=0x%x\n", MAC_ARG(psta->hwaddr), psta->state); + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + if (rtw_is_list_empty(&psta->asoc_list)==_FALSE) { + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING); + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + } + + if (backup_oper_channel>0) /* back to the original operation channel */ + SelectChannel(padapter, backup_oper_channel); +} +#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */ + + associated_clients_update(padapter, updated); +} + +void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level) +{ + int i; + u8 rf_type; + u32 init_rate=0; + unsigned char sta_band = 0, raid, shortGIrate = _FALSE; + unsigned char limit; + unsigned int tx_ra_bitmap=0; + struct ht_priv *psta_ht = NULL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + +#ifdef CONFIG_80211N_HT + if(psta) + psta_ht = &psta->htpriv; + else + return; +#endif //CONFIG_80211N_HT + + if(!(psta->state & _FW_LINKED)) + return; + + //b/g mode ra_bitmap + for (i=0; ibssrateset); i++) + { + if (psta->bssrateset[i]) + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); + } +#ifdef CONFIG_80211N_HT + //n mode ra_bitmap + if(psta_ht->ht_option) + { + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + if(rf_type == RF_2T2R) + limit=16;// 2R + else + limit=8;// 1R + + for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) + tx_ra_bitmap |= BIT(i+12); + } + + //max short GI rate + shortGIrate = psta_ht->sgi; + } +#endif //CONFIG_80211N_HT + +#if 0//gtest + if(get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R) + { + //is this a 2r STA? + if((pstat->tx_ra_bitmap & 0x0ff00000) != 0 && !(priv->pshare->has_2r_sta & BIT(pstat->aid))) + { + priv->pshare->has_2r_sta |= BIT(pstat->aid); + if(rtw_read16(padapter, 0x102501f6) != 0xffff) + { + rtw_write16(padapter, 0x102501f6, 0xffff); + reset_1r_sta_RA(priv, 0xffff); + Switch_1SS_Antenna(priv, 3); + } + } + else// bg or 1R STA? + { + if((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len && priv->pshare->has_2r_sta == 0) + { + if(rtw_read16(padapter, 0x102501f6) != 0x7777) + { // MCS7 SGI + rtw_write16(padapter, 0x102501f6,0x7777); + reset_1r_sta_RA(priv, 0x7777); + Switch_1SS_Antenna(priv, 2); + } + } + } + + } + + if ((pstat->rssi_level < 1) || (pstat->rssi_level > 3)) + { + if (pstat->rssi >= priv->pshare->rf_ft_var.raGoDownUpper) + pstat->rssi_level = 1; + else if ((pstat->rssi >= priv->pshare->rf_ft_var.raGoDown20MLower) || + ((priv->pshare->is_40m_bw) && (pstat->ht_cap_len) && + (pstat->rssi >= priv->pshare->rf_ft_var.raGoDown40MLower) && + (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_SUPPORT_CH_WDTH_)))) + pstat->rssi_level = 2; + else + pstat->rssi_level = 3; + } + + // rate adaptive by rssi + if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len) + { + if ((get_rf_mimo_mode(priv) == MIMO_1T2R) || (get_rf_mimo_mode(priv) == MIMO_1T1R)) + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x100f0000; + break; + case 2: + pstat->tx_ra_bitmap &= 0x100ff000; + break; + case 3: + if (priv->pshare->is_40m_bw) + pstat->tx_ra_bitmap &= 0x100ff005; + else + pstat->tx_ra_bitmap &= 0x100ff001; + + break; + } + } + else + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x1f0f0000; + break; + case 2: + pstat->tx_ra_bitmap &= 0x1f0ff000; + break; + case 3: + if (priv->pshare->is_40m_bw) + pstat->tx_ra_bitmap &= 0x000ff005; + else + pstat->tx_ra_bitmap &= 0x000ff001; + + break; + } + + // Don't need to mask high rates due to new rate adaptive parameters + //if (pstat->is_broadcom_sta) // use MCS12 as the highest rate vs. Broadcom sta + // pstat->tx_ra_bitmap &= 0x81ffffff; + + // NIC driver will report not supporting MCS15 and MCS14 in asoc req + //if (pstat->is_rtl8190_sta && !pstat->is_2t_mimo_sta) + // pstat->tx_ra_bitmap &= 0x83ffffff; // if Realtek 1x2 sta, don't use MCS15 and MCS14 + } + } + else if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) && isErpSta(pstat)) + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x00000f00; + break; + case 2: + pstat->tx_ra_bitmap &= 0x00000ff0; + break; + case 3: + pstat->tx_ra_bitmap &= 0x00000ff5; + break; + } + } + else + { + pstat->tx_ra_bitmap &= 0x0000000d; + } + + // disable tx short GI when station cannot rx MCS15(AP is 2T2R) + // disable tx short GI when station cannot rx MCS7 (AP is 1T2R or 1T1R) + // if there is only 1r STA and we are 2T2R, DO NOT mask SGI rate + if ((!(pstat->tx_ra_bitmap & 0x8000000) && (priv->pshare->has_2r_sta > 0) && (get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)) || + (!(pstat->tx_ra_bitmap & 0x80000) && (get_rf_mimo_mode(padapter) != RTL8712_RF_2T2R))) + { + pstat->tx_ra_bitmap &= ~BIT(28); + } +#endif + + if ( pcur_network->Configuration.DSConfig > 14 ) { + // 5G band + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_5N ; + + if (tx_ra_bitmap & 0xff0) + sta_band |= WIRELESS_11A; + + } else { + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_24N; + + if (tx_ra_bitmap & 0xff0) + sta_band |= WIRELESS_11G; + + if (tx_ra_bitmap & 0x0f) + sta_band |= WIRELESS_11B; + } + + psta->wireless_mode = sta_band; + + raid = networktype_to_raid(sta_band); + init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; + + if (psta->aid < NUM_STA) + { + u8 arg = 0; + + arg = psta->mac_id&0x1f; + + arg |= BIT(7);//support entry 2~31 + + if (shortGIrate==_TRUE) + arg |= BIT(5); + + tx_ra_bitmap |= ((raid<<28)&0xf0000000); + + DBG_871X("%s=> mac_id:%d , raid:%d , bitmap=0x%x, arg=0x%x\n", + __FUNCTION__ , psta->mac_id, raid ,tx_ra_bitmap, arg); + + //bitmap[0:27] = tx_rate_bitmap + //bitmap[28:31]= Rate Adaptive id + //arg[0:4] = macid + //arg[5] = Short GI + rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, rssi_level); + + + if (shortGIrate==_TRUE) + init_rate |= BIT(6); + + //set ra_id, init_rate + psta->raid = raid; + psta->init_rate = init_rate; + + } + else + { + DBG_871X("station aid %d exceed the max number\n", psta->aid); + } + +} + +void update_bmc_sta(_adapter *padapter) +{ + _irqL irqL; + u32 init_rate=0; + unsigned char network_type, raid; + int i, supportRateNum = 0; + unsigned int tx_ra_bitmap=0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); + + if(psta) + { + psta->aid = 0;//default set to 0 + //psta->mac_id = psta->aid+4; + psta->mac_id = psta->aid + 1; + + psta->qos_option = 0; +#ifdef CONFIG_80211N_HT + psta->htpriv.ht_option = _FALSE; +#endif //CONFIG_80211N_HT + + psta->ieee8021x_blocked = 0; + + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + + //psta->dot118021XPrivacy = _NO_PRIVACY_;//!!! remove it, because it has been set before this. + + + + //prepare for add_RATid + supportRateNum = rtw_get_rateset_len((u8*)&pcur_network->SupportedRates); + network_type = rtw_check_network_type((u8*)&pcur_network->SupportedRates, supportRateNum, 1); + + _rtw_memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum); + psta->bssratelen = supportRateNum; + + //b/g mode ra_bitmap + for (i=0; ibssrateset[i]) + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); + } + + if ( pcur_network->Configuration.DSConfig > 14 ) { + //force to A mode. 5G doesn't support CCK rates + network_type = WIRELESS_11A; + tx_ra_bitmap = 0x150; // 6, 12, 24 Mbps + } else { + //force to b mode + network_type = WIRELESS_11B; + tx_ra_bitmap = 0xf; + } + + //tx_ra_bitmap = update_basic_rate(pcur_network->SupportedRates, supportRateNum); + + raid = networktype_to_raid(network_type); + init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; + + //DBG_871X("Add id %d val %08x to ratr for bmc sta\n", psta->aid, tx_ra_bitmap); + //ap mode + rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE); + + //if(pHalData->fw_ractrl == _TRUE) + { + u8 arg = 0; + + arg = psta->mac_id&0x1f; + + arg |= BIT(7); + + //if (shortGIrate==_TRUE) + // arg |= BIT(5); + + tx_ra_bitmap |= ((raid<<28)&0xf0000000); + + DBG_871X("update_bmc_sta, mask=0x%x, arg=0x%x\n", tx_ra_bitmap, arg); + + //bitmap[0:27] = tx_rate_bitmap + //bitmap[28:31]= Rate Adaptive id + //arg[0:4] = macid + //arg[5] = Short GI + rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, 0); + + } + + //set ra_id, init_rate + psta->raid = raid; + psta->init_rate = init_rate; + + rtw_sta_media_status_rpt(padapter, psta, 1); + + _enter_critical_bh(&psta->lock, &irqL); + psta->state = _FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + } + else + { + DBG_871X("add_RATid_bmc_sta error!\n"); + } + +} + +//notes: +//AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode +//MAC_ID = AID+1 for sta in ap/adhoc mode +//MAC_ID = 1 for bc/mc for sta/ap/adhoc +//MAC_ID = 0 for bssid for sta/ap/adhoc +//CAM_ID = //0~3 for default key, cmd_id=macid + 3, macid=aid+1; + +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); +#ifdef CONFIG_80211N_HT + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; + struct ht_priv *phtpriv_sta = &psta->htpriv; +#endif //CONFIG_80211N_HT + //set intf_tag to if1 + //psta->intf_tag = 0; + + //psta->mac_id = psta->aid+4; + psta->mac_id = psta->aid+1; + DBG_871X("%s\n",__FUNCTION__); + + //ap mode + rtw_hal_set_odm_var(padapter,HAL_ODM_STA_INFO,psta,_TRUE); + + if(psecuritypriv->dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) + psta->ieee8021x_blocked = _TRUE; + else + psta->ieee8021x_blocked = _FALSE; + + + //update sta's cap + + //ERP + VCS_update(padapter, psta); +#ifdef CONFIG_80211N_HT + //HT related cap + if(phtpriv_sta->ht_option) + { + //check if sta supports rx ampdu + phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; + + //check if sta support s Short GI + if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) + { + phtpriv_sta->sgi = _TRUE; + } + + // bwmode + if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) + { + //phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_40; + phtpriv_sta->bwmode = pmlmeext->cur_bwmode; + phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; + + } + + psta->qos_option = _TRUE; + + } + else + { + phtpriv_sta->ampdu_enable = _FALSE; + + phtpriv_sta->sgi = _FALSE; + phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; + phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + } + + //Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + phtpriv_sta->agg_enable_bitmap = 0x0;//reset + phtpriv_sta->candidate_tid_bitmap = 0x0;//reset +#endif //CONFIG_80211N_HT + + //todo: init other variables + + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + + + //add ratid + //add_RATid(padapter, psta);//move to ap_sta_info_defer_update() + + + _enter_critical_bh(&psta->lock, &irqL); + psta->state |= _FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + +} + +static void update_hw_ht_param(_adapter *padapter) +{ + unsigned char max_AMPDU_len; + unsigned char min_MPDU_spacing; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + DBG_871X("%s\n", __FUNCTION__); + + + //handle A-MPDU parameter field + /* + AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k + AMPDU_para [4:2]:Min MPDU Start Spacing + */ + max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03; + + min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; + + rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); + + rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); + + // + // Config SM Power Save setting + // + pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2; + if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) + { + /*u8 i; + //update the MCS rates + for (i = 0; i < 16; i++) + { + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; + }*/ + DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__); + } + + // + // Config current HT Protection mode. + // + //pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; + +} + +static void start_bss_network(_adapter *padapter, u8 *pbuf) +{ + u8 *p; + u8 val8, cur_channel, cur_bwmode, cur_ch_offset; + u16 bcn_interval; + u32 acparm; + int ie_len; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv* psecuritypriv=&(padapter->securitypriv); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); + struct HT_info_element *pht_info=NULL; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif //CONFIG_P2P + + //DBG_871X("%s\n", __FUNCTION__); + + bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; + cur_channel = pnetwork->Configuration.DSConfig; + cur_bwmode = HT_CHANNEL_WIDTH_20;; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + + //check if there is wps ie, + //if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, + //and at first time the security ie ( RSN/WPA IE) will not include in beacon. + if(NULL == rtw_get_wps_ie(pnetwork->IEs+_FIXED_IE_LENGTH_, pnetwork->IELength-_FIXED_IE_LENGTH_, NULL, NULL)) + { + pmlmeext->bstart_bss = _TRUE; + } + + //todo: update wmm, ht cap + //pmlmeinfo->WMM_enable; + //pmlmeinfo->HT_enable; + if(pmlmepriv->qospriv.qos_option) + pmlmeinfo->WMM_enable = _TRUE; +#ifdef CONFIG_80211N_HT + if(pmlmepriv->htpriv.ht_option) + { + pmlmeinfo->WMM_enable = _TRUE; + pmlmeinfo->HT_enable = _TRUE; + //pmlmeinfo->HT_info_enable = _TRUE; + //pmlmeinfo->HT_caps_enable = _TRUE; + + update_hw_ht_param(padapter); + } +#endif //#CONFIG_80211N_HT + + + if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time + { + //WEP Key will be set before this function, do not clear CAM. + if ((psecuritypriv->dot11PrivacyAlgrthm != _WEP40_) && (psecuritypriv->dot11PrivacyAlgrthm != _WEP104_)) + flush_all_cam_entry(padapter); //clear CAM + } + + //set MSR to AP_Mode + Set_MSR(padapter, _HW_STATE_AP_); + + //Set BSSID REG + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pnetwork->MacAddress); + + //Set EDCA param reg +#ifdef CONFIG_CONCURRENT_MODE + acparm = 0x005ea42b; +#else + acparm = 0x002F3217; // VO +#endif + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); + acparm = 0x005E4317; // VI + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); + //acparm = 0x00105320; // BE + acparm = 0x005ea42b; + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + acparm = 0x0000A444; // BK + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); + + //Set Security + val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + //Beacon Control related register + rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); + + + UpdateBrateTbl(padapter, pnetwork->SupportedRates); + rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates); + + if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time + { + //u32 initialgain; + + //initialgain = 0x1e; + + + //disable dynamic functions, such as high power, DIG + //Save_DM_Func_Flag(padapter); + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + +#ifdef CONFIG_CONCURRENT_MODE + if(padapter->adapter_type > PRIMARY_ADAPTER) + { + if(rtw_buddy_adapter_up(padapter)) + { + _adapter *pbuddy_adapter = padapter->pbuddy_adapter; + + //turn on all dynamic functions on PRIMARY_ADAPTER, dynamic functions only runs at PRIMARY_ADAPTER + Switch_DM_Func(pbuddy_adapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); + + //rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + } + } + else +#endif + { + //turn on all dynamic functions + Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); + + //rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + } + + } +#ifdef CONFIG_80211N_HT + //set channel, bwmode + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if( p && ie_len) + { + pht_info = (struct HT_info_element *)(p+2); + + if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) + { + //switch to the 40M Hz mode + //pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; + cur_bwmode = HT_CHANNEL_WIDTH_40; + switch (pht_info->infos[0] & 0x3) + { + case 1: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case 3: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + + } + + } +#endif //CONFIG_80211N_HT +#ifdef CONFIG_DUALMAC_CONCURRENT + dc_set_ap_channel_bandwidth(padapter, cur_channel, cur_ch_offset, cur_bwmode); +#else + //TODO: need to judge the phy parameters on concurrent mode for single phy + //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); +#ifdef CONFIG_CONCURRENT_MODE + if(!check_buddy_fwstate(padapter, _FW_LINKED|_FW_UNDER_LINKING|_FW_UNDER_SURVEY)) + { + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); + } + else if(check_buddy_fwstate(padapter, _FW_LINKED)==_TRUE)//only second adapter can enter AP Mode + { + _adapter *pbuddy_adapter = padapter->pbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + + //To sync cur_channel/cur_bwmode/cur_ch_offset with primary adapter + DBG_871X("primary iface is at linked state, sync cur_channel/cur_bwmode/cur_ch_offset\n"); + DBG_871X("primary adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset); + DBG_871X("second adapter, CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); + + cur_channel = pbuddy_mlmeext->cur_channel; + if(cur_bwmode == HT_CHANNEL_WIDTH_40) + { + if(pht_info) + pht_info->infos[0] &= ~(BIT(0)|BIT(1)); + + if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) + { + cur_ch_offset = pbuddy_mlmeext->cur_ch_offset; + + //to update cur_ch_offset value in beacon + if(pht_info) + { + switch(cur_ch_offset) + { + case HAL_PRIME_CHNL_OFFSET_LOWER: + pht_info->infos[0] |= 0x1; + break; + case HAL_PRIME_CHNL_OFFSET_UPPER: + pht_info->infos[0] |= 0x3; + break; + case HAL_PRIME_CHNL_OFFSET_DONT_CARE: + default: + break; + } + } + + } + else if(pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20) + { + cur_bwmode = HT_CHANNEL_WIDTH_20; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + if(cur_channel>0 && cur_channel<5) + { + if(pht_info) + pht_info->infos[0] |= 0x1; + + cur_bwmode = HT_CHANNEL_WIDTH_40; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + } + + if(cur_channel>7 && cur_channel<(14+1)) + { + if(pht_info) + pht_info->infos[0] |= 0x3; + + cur_bwmode = HT_CHANNEL_WIDTH_40; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + } + + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); + } + + } + + // to update channel value in beacon + pnetwork->Configuration.DSConfig = cur_channel; + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if(p && ie_len>0) + *(p + 2) = cur_channel; + + if(pht_info) + pht_info->primary_channel = cur_channel; + } +#else + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); +#endif //CONFIG_CONCURRENT_MODE + + DBG_871X("CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); + + // + pmlmeext->cur_channel = cur_channel; + pmlmeext->cur_bwmode = cur_bwmode; + pmlmeext->cur_ch_offset = cur_ch_offset; +#endif //CONFIG_DUALMAC_CONCURRENT + pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type; + + //update cur_wireless_mode + update_wireless_mode(padapter); + + //udpate capability after cur_wireless_mode updated + update_capinfo(padapter, rtw_get_capability((WLAN_BSSID_EX *)pnetwork)); + + //let pnetwork_mlmeext == pnetwork_mlme. + _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); + +#ifdef CONFIG_P2P + _rtw_memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.Ssid, pnetwork->Ssid.SsidLength); + pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.SsidLength; +#endif //CONFIG_P2P + + if(_TRUE == pmlmeext->bstart_bss) + { + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + +#ifndef CONFIG_INTERRUPT_BASED_TXBCN //other case will tx beacon when bcn interrupt coming in. +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + //issue beacon frame + if(send_beacon(padapter)==_FAIL) + { + DBG_871X("issue_beacon, fail!\n"); + } +#endif +#endif //!CONFIG_INTERRUPT_BASED_TXBCN + + } + + + //update bc/mc sta_info + update_bmc_sta(padapter); + + //pmlmeext->bstart_bss = _TRUE; + +} + +int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) +{ + int ret=_SUCCESS; + u8 *p; + u8 *pHT_caps_ie=NULL; + u8 *pHT_info_ie=NULL; + struct sta_info *psta = NULL; + u16 cap, ht_cap=_FALSE; + uint ie_len = 0; + int group_cipher, pairwise_cipher; + u8 channel, network_type, supportRate[NDIS_802_11_LENGTH_RATES_EX]; + int supportRateNum = 0; + u8 OUI1[] = {0x00, 0x50, 0xf2,0x01}; + u8 wps_oui[4]={0x0,0x50,0xf2,0x04}; + u8 WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pbss_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *ie = pbss_network->IEs; + + + /* SSID */ + /* Supported rates */ + /* DS Params */ + /* WLAN_EID_COUNTRY */ + /* ERP Information element */ + /* Extended supported rates */ + /* WPA/WPA2 */ + /* Wi-Fi Wireless Multimedia Extensions */ + /* ht_capab, ht_oper */ + /* WPS IE */ + + DBG_871X("%s, len=%d\n", __FUNCTION__, len); + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) + return _FAIL; + + + if(len>MAX_IE_SZ) + return _FAIL; + + pbss_network->IELength = len; + + _rtw_memset(ie, 0, MAX_IE_SZ); + + _rtw_memcpy(ie, pbuf, pbss_network->IELength); + + + if(pbss_network->InfrastructureMode!=Ndis802_11APMode) + return _FAIL; + + pbss_network->Rssi = 0; + + _rtw_memcpy(pbss_network->MacAddress, myid(&(padapter->eeprompriv)), ETH_ALEN); + + //beacon interval + p = rtw_get_beacon_interval_from_ie(ie);//ie + 8; // 8: TimeStamp, 2: Beacon Interval 2:Capability + //pbss_network->Configuration.BeaconPeriod = le16_to_cpu(*(unsigned short*)p); + pbss_network->Configuration.BeaconPeriod = RTW_GET_LE16(p); + + //capability + //cap = *(unsigned short *)rtw_get_capability_from_ie(ie); + //cap = le16_to_cpu(cap); + cap = RTW_GET_LE16(ie); + + //SSID + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->IELength -_BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + _rtw_memset(&pbss_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(pbss_network->Ssid.Ssid, (p + 2), ie_len); + pbss_network->Ssid.SsidLength = ie_len; + } + + //chnnel + channel = 0; + pbss_network->Configuration.Length = 0; + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + channel = *(p + 2); + + pbss_network->Configuration.DSConfig = channel; + + + _rtw_memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX); + // get supported rates + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + { + _rtw_memcpy(supportRate, p+2, ie_len); + supportRateNum = ie_len; + } + + //get ext_supported rates + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_); + if (p != NULL) + { + _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); + supportRateNum += ie_len; + + } + + network_type = rtw_check_network_type(supportRate, supportRateNum, channel); + + rtw_set_supported_rate(pbss_network->SupportedRates, network_type); + + + //parsing ERP_IE + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + ERP_IE_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)p); + } + + //update privacy/security + if (cap & BIT(4)) + pbss_network->Privacy = 1; + else + pbss_network->Privacy = 0; + + psecuritypriv->wpa_psk = 0; + + //wpa2 + group_cipher = 0; pairwise_cipher = 0; + psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; + psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + if(rtw_parse_wpa2_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) + { + psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; + + psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x + psecuritypriv->wpa_psk |= BIT(1); + + psecuritypriv->wpa2_group_cipher = group_cipher; + psecuritypriv->wpa2_pairwise_cipher = pairwise_cipher; +#if 0 + switch(group_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa2_group_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa2_group_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa2_group_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa2_group_cipher = _WEP104_; + break; + } + + switch(pairwise_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa2_pairwise_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa2_pairwise_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa2_pairwise_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa2_pairwise_cipher = _WEP104_; + break; + } +#endif + } + + } + + //wpa + ie_len = 0; + group_cipher = 0; pairwise_cipher = 0; + psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; + psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; + for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) + { + p = rtw_get_ie(p, _SSN_IE_1_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if ((p) && (_rtw_memcmp(p+2, OUI1, 4))) + { + if(rtw_parse_wpa_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) + { + psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; + + psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x + + psecuritypriv->wpa_psk |= BIT(0); + + psecuritypriv->wpa_group_cipher = group_cipher; + psecuritypriv->wpa_pairwise_cipher = pairwise_cipher; + +#if 0 + switch(group_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa_group_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa_group_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa_group_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa_group_cipher = _WEP104_; + break; + } + + switch(pairwise_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa_pairwise_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa_pairwise_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa_pairwise_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa_pairwise_cipher = _WEP104_; + break; + } +#endif + } + + break; + + } + + if ((p == NULL) || (ie_len == 0)) + { + break; + } + + } + + //wmm + ie_len = 0; + pmlmepriv->qospriv.qos_option = 0; + if(pregistrypriv->wmm_enable) + { + for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) + { + p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if((p) && _rtw_memcmp(p+2, WMM_PARA_IE, 6)) + { + pmlmepriv->qospriv.qos_option = 1; + + *(p+8) |= BIT(7);//QoS Info, support U-APSD + + /* disable all ACM bits since the WMM admission control is not supported */ + *(p + 10) &= ~BIT(4); /* BE */ + *(p + 14) &= ~BIT(4); /* BK */ + *(p + 18) &= ~BIT(4); /* VI */ + *(p + 22) &= ~BIT(4); /* VO */ + + break; + } + + if ((p == NULL) || (ie_len == 0)) + { + break; + } + } + } +#ifdef CONFIG_80211N_HT + //parsing HT_CAP_IE + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + u8 rf_type; + + struct rtw_ieee80211_ht_cap *pht_cap = (struct rtw_ieee80211_ht_cap *)(p+2); + + pHT_caps_ie=p; + + + ht_cap = _TRUE; + network_type |= WIRELESS_11_24N; + + + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + + if((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) || + (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP)) + { + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2)); + } + else + { + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00); + } + + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & 0x03); //set Max Rx AMPDU size to 64K + + if(rf_type == RF_1T1R) + { + pht_cap->supp_mcs_set[0] = 0xff; + pht_cap->supp_mcs_set[1] = 0x0; + } + + _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len); + + } + + //parsing HT_INFO_IE + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + pHT_info_ie=p; + } +#endif //CONFIG_80211N_HT + switch(network_type) + { + case WIRELESS_11B: + pbss_network->NetworkTypeInUse = Ndis802_11DS; + break; + case WIRELESS_11G: + case WIRELESS_11BG: + case WIRELESS_11G_24N: + case WIRELESS_11BG_24N: + pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; + break; + case WIRELESS_11A: + pbss_network->NetworkTypeInUse = Ndis802_11OFDM5; + break; + default : + pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; + break; + } + + pmlmepriv->cur_network.network_type = network_type; + +#ifdef CONFIG_80211N_HT + pmlmepriv->htpriv.ht_option = _FALSE; + + if( (psecuritypriv->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) || + (psecuritypriv->wpa_pairwise_cipher&WPA_CIPHER_TKIP)) + { + //todo: + //ht_cap = _FALSE; + } + + //ht_cap + if(pregistrypriv->ht_enable && ht_cap==_TRUE) + { + pmlmepriv->htpriv.ht_option = _TRUE; + pmlmepriv->qospriv.qos_option = 1; + + if(pregistrypriv->ampdu_enable==1) + { + pmlmepriv->htpriv.ampdu_enable = _TRUE; + } + + HT_caps_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_caps_ie); + + HT_info_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_info_ie); + } +#endif + + + pbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pbss_network); + + //issue beacon to start bss network + start_bss_network(padapter, (u8*)pbss_network); + + + //alloc sta_info for ap itself + psta = rtw_get_stainfo(&padapter->stapriv, pbss_network->MacAddress); + if(!psta) + { + psta = rtw_alloc_stainfo(&padapter->stapriv, pbss_network->MacAddress); + if (psta == NULL) + { + return _FAIL; + } + } + psta->state |= WIFI_AP_STATE; //Aries, add,fix bug of flush_cam_entry at STOP AP mode , 0724 + rtw_indicate_connect( padapter); + + pmlmepriv->cur_network.join_res = _TRUE;//for check if already set beacon + + //update bc/mc sta_info + //update_bmc_sta(padapter); + + return ret; + +} + +void rtw_set_macaddr_acl(_adapter *padapter, int mode) +{ + struct sta_priv *pstapriv = &padapter->stapriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + + DBG_871X("%s, mode=%d\n", __func__, mode); + + pacl_list->mode = mode; +} + +int rtw_acl_add_sta(_adapter *padapter, u8 *addr) +{ + _irqL irqL; + _list *plist, *phead; + u8 added = _FALSE; + int i, ret=0; + struct rtw_wlan_acl_node *paclnode; + struct sta_priv *pstapriv = &padapter->stapriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + _queue *pacl_node_q =&pacl_list->acl_node_q; + + DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr)); + + if((NUM_ACL-1) < pacl_list->num) + return (-1); + + + _enter_critical_bh(&(pacl_node_q->lock), &irqL); + + phead = get_list_head(pacl_node_q); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); + plist = get_next(plist); + + if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN)) + { + if(paclnode->valid == _TRUE) + { + added = _TRUE; + DBG_871X("%s, sta has been added\n", __func__); + break; + } + } + } + + _exit_critical_bh(&(pacl_node_q->lock), &irqL); + + + if(added == _TRUE) + return ret; + + + _enter_critical_bh(&(pacl_node_q->lock), &irqL); + + for(i=0; i< NUM_ACL; i++) + { + paclnode = &pacl_list->aclnode[i]; + + if(paclnode->valid == _FALSE) + { + _rtw_init_listhead(&paclnode->list); + + _rtw_memcpy(paclnode->addr, addr, ETH_ALEN); + + paclnode->valid = _TRUE; + + rtw_list_insert_tail(&paclnode->list, get_list_head(pacl_node_q)); + + pacl_list->num++; + + break; + } + } + + DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num); + + _exit_critical_bh(&(pacl_node_q->lock), &irqL); + + return ret; +} + +int rtw_acl_remove_sta(_adapter *padapter, u8 *addr) +{ + _irqL irqL; + _list *plist, *phead; + int i, ret=0; + struct rtw_wlan_acl_node *paclnode; + struct sta_priv *pstapriv = &padapter->stapriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + _queue *pacl_node_q =&pacl_list->acl_node_q; + + DBG_871X("%s(acl_num=%d)=" MAC_FMT "\n", __func__, pacl_list->num, MAC_ARG(addr)); + + _enter_critical_bh(&(pacl_node_q->lock), &irqL); + + phead = get_list_head(pacl_node_q); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); + plist = get_next(plist); + + if(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN)) + { + if(paclnode->valid == _TRUE) + { + paclnode->valid = _FALSE; + + rtw_list_delete(&paclnode->list); + + pacl_list->num--; + } + } + } + + _exit_critical_bh(&(pacl_node_q->lock), &irqL); + + DBG_871X("%s, acl_num=%d\n", __func__, pacl_list->num); + + return ret; + +} + +#ifdef CONFIG_NATIVEAP_MLME + +static void update_bcn_fixed_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_erpinfo_ie(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); + unsigned char *p, *ie = pnetwork->IEs; + u32 len = 0; + + DBG_871X("%s, ERP_enable=%d\n", __FUNCTION__, pmlmeinfo->ERP_enable); + + if(!pmlmeinfo->ERP_enable) + return; + + //parsing ERP_IE + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if(p && len>0) + { + PNDIS_802_11_VARIABLE_IEs pIE = (PNDIS_802_11_VARIABLE_IEs)p; + + if (pmlmepriv->num_sta_non_erp == 1) + pIE->data[0] |= RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION; + else + pIE->data[0] &= ~(RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION); + + if(pmlmepriv->num_sta_no_short_preamble > 0) + pIE->data[0] |= RTW_ERP_INFO_BARKER_PREAMBLE_MODE; + else + pIE->data[0] &= ~(RTW_ERP_INFO_BARKER_PREAMBLE_MODE); + + ERP_IE_handler(padapter, pIE); + } + +} + +static void update_bcn_htcap_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_htinfo_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_rsn_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wpa_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wmm_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wps_ie(_adapter *padapter) +{ + u8 *pwps_ie=NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie=NULL; + uint wps_ielen=0, wps_offset, remainder_ielen; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); + unsigned char *ie = pnetwork->IEs; + u32 ielen = pnetwork->IELength; + + + DBG_871X("%s\n", __FUNCTION__); + + pwps_ie = rtw_get_wps_ie(ie+_FIXED_IE_LENGTH_, ielen-_FIXED_IE_LENGTH_, NULL, &wps_ielen); + + if(pwps_ie==NULL || wps_ielen==0) + return; + + wps_offset = (uint)(pwps_ie-ie); + + premainder_ie = pwps_ie + wps_ielen; + + remainder_ielen = ielen - wps_offset - wps_ielen; + + if(remainder_ielen>0) + { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if(pbackup_remainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + + pwps_ie_src = pmlmepriv->wps_beacon_ie; + if(pwps_ie_src == NULL) + return; + + + wps_ielen = (uint)pwps_ie_src[1];//to get ie data len + if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) + { + _rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen+2); + pwps_ie += (wps_ielen+2); + + if(pbackup_remainder_ie) + _rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen); + + //update IELength + pnetwork->IELength = wps_offset + (wps_ielen+2) + remainder_ielen; + } + + if(pbackup_remainder_ie) + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + +} + +static void update_bcn_p2p_ie(_adapter *padapter) +{ + +} + +static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui) +{ + DBG_871X("%s\n", __FUNCTION__); + + if(_rtw_memcmp(RTW_WPA_OUI, oui, 4)) + { + update_bcn_wpa_ie(padapter); + } + else if(_rtw_memcmp(WMM_OUI, oui, 4)) + { + update_bcn_wmm_ie(padapter); + } + else if(_rtw_memcmp(WPS_OUI, oui, 4)) + { + update_bcn_wps_ie(padapter); + } + else if(_rtw_memcmp(P2P_OUI, oui, 4)) + { + update_bcn_p2p_ie(padapter); + } + else + { + DBG_871X("unknown OUI type!\n"); + } + + +} + +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv; + struct mlme_ext_priv *pmlmeext; + //struct mlme_ext_info *pmlmeinfo; + + //DBG_871X("%s\n", __FUNCTION__); + + if(!padapter) + return; + + pmlmepriv = &(padapter->mlmepriv); + pmlmeext = &(padapter->mlmeextpriv); + //pmlmeinfo = &(pmlmeext->mlmext_info); + + if(_FALSE == pmlmeext->bstart_bss) + return; + + _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + + switch(ie_id) + { + case 0xFF: + + update_bcn_fixed_ie(padapter);//8: TimeStamp, 2: Beacon Interval 2:Capability + + break; + + case _TIM_IE_: + + update_BCNTIM(padapter); + + break; + + case _ERPINFO_IE_: + + update_bcn_erpinfo_ie(padapter); + + break; + + case _HT_CAPABILITY_IE_: + + update_bcn_htcap_ie(padapter); + + break; + + case _RSN_IE_2_: + + update_bcn_rsn_ie(padapter); + + break; + + case _HT_ADD_INFO_IE_: + + update_bcn_htinfo_ie(padapter); + + break; + + case _VENDOR_SPECIFIC_IE_: + + update_bcn_vendor_spec_ie(padapter, oui); + + break; + + default: + break; + } + + pmlmepriv->update_bcn = _TRUE; + + _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + +#ifndef CONFIG_INTERRUPT_BASED_TXBCN +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + if(tx) + { + //send_beacon(padapter);//send_beacon must execute on TSR level + set_tx_beacon_cmd(padapter); + } +#else + { + //PCI will issue beacon when BCN interrupt occurs. + } +#endif +#endif //!CONFIG_INTERRUPT_BASED_TXBCN + +} + +#ifdef CONFIG_80211N_HT + +/* +op_mode +Set to 0 (HT pure) under the followign conditions + - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or + - all STAs in the BSS are 20 MHz HT in 20 MHz BSS +Set to 1 (HT non-member protection) if there may be non-HT STAs + in both the primary and the secondary channel +Set to 2 if only HT STAs are associated in BSS, + however and at least one 20 MHz HT STA is associated +Set to 3 (HT mixed mode) when one or more non-HT STAs are associated + (currently non-GF HT station is considered as non-HT STA also) +*/ +static int rtw_ht_operation_update(_adapter *padapter) +{ + u16 cur_op_mode, new_op_mode; + int op_mode_changes = 0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; + + if(pmlmepriv->htpriv.ht_option == _TRUE) + return 0; + + //if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) + // return 0; + + DBG_871X("%s current operation mode=0x%X\n", + __FUNCTION__, pmlmepriv->ht_op_mode); + + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) + && pmlmepriv->num_sta_ht_no_gf) { + pmlmepriv->ht_op_mode |= + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; + op_mode_changes++; + } else if ((pmlmepriv->ht_op_mode & + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && + pmlmepriv->num_sta_ht_no_gf == 0) { + pmlmepriv->ht_op_mode &= + ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; + op_mode_changes++; + } + + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && + (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) { + pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; + op_mode_changes++; + } else if ((pmlmepriv->ht_op_mode & + HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && + (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) { + pmlmepriv->ht_op_mode &= + ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; + op_mode_changes++; + } + + /* Note: currently we switch to the MIXED op mode if HT non-greenfield + * station is associated. Probably it's a theoretical case, since + * it looks like all known HT STAs support greenfield. + */ + new_op_mode = 0; + if (pmlmepriv->num_sta_no_ht || + (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)) + new_op_mode = OP_MODE_MIXED; + else if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH) + && pmlmepriv->num_sta_ht_20mhz) + new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED; + else if (pmlmepriv->olbc_ht) + new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS; + else + new_op_mode = OP_MODE_PURE; + + cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; + if (cur_op_mode != new_op_mode) { + pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK; + pmlmepriv->ht_op_mode |= new_op_mode; + op_mode_changes++; + } + + DBG_871X("%s new operation mode=0x%X changes=%d\n", + __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes); + + return op_mode_changes; + +} + +#endif /* CONFIG_80211N_HT */ + +void associated_clients_update(_adapter *padapter, u8 updated) +{ + //update associcated stations cap. + if(updated == _TRUE) + { + _irqL irqL; + _list *phead, *plist; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //check asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + VCS_update(padapter, psta); + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + } + +} + +/* called > TSR LEVEL for USB or SDIO Interface*/ +void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta) +{ + u8 beacon_updated = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + +#if 0 + if (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && + !psta->no_short_preamble_set) { + psta->no_short_preamble_set = 1; + pmlmepriv->num_sta_no_short_preamble++; + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 1)) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + + if(!(psta->flags & WLAN_STA_SHORT_PREAMBLE)) + { + if(!psta->no_short_preamble_set) + { + psta->no_short_preamble_set = 1; + + pmlmepriv->num_sta_no_short_preamble++; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 1)) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + } + } + else + { + if(psta->no_short_preamble_set) + { + psta->no_short_preamble_set = 0; + + pmlmepriv->num_sta_no_short_preamble--; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 0)) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + } + } + +#if 0 + if (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) { + psta->nonerp_set = 1; + pmlmepriv->num_sta_non_erp++; + if (pmlmepriv->num_sta_non_erp == 1) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + if(psta->flags & WLAN_STA_NONERP) + { + if(!psta->nonerp_set) + { + psta->nonerp_set = 1; + + pmlmepriv->num_sta_non_erp++; + + if (pmlmepriv->num_sta_non_erp == 1) + { + beacon_updated = _TRUE; + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + } + + } + else + { + if(psta->nonerp_set) + { + psta->nonerp_set = 0; + + pmlmepriv->num_sta_non_erp--; + + if (pmlmepriv->num_sta_non_erp == 0) + { + beacon_updated = _TRUE; + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + } + + } + + +#if 0 + if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) && + !psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 1; + pmlmepriv->num_sta_no_short_slot_time++; + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 1)) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + if(!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT)) + { + if(!psta->no_short_slot_time_set) + { + psta->no_short_slot_time_set = 1; + + pmlmepriv->num_sta_no_short_slot_time++; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 1)) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + } + } + else + { + if(psta->no_short_slot_time_set) + { + psta->no_short_slot_time_set = 0; + + pmlmepriv->num_sta_no_short_slot_time--; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 0)) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + } + +#ifdef CONFIG_80211N_HT + + if (psta->flags & WLAN_STA_HT) + { + u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info); + + DBG_871X("HT: STA " MAC_FMT " HT Capabilities " + "Info: 0x%04x\n", MAC_ARG(psta->hwaddr), ht_capab); + + if (psta->no_ht_set) { + psta->no_ht_set = 0; + pmlmepriv->num_sta_no_ht--; + } + + if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) { + if (!psta->no_ht_gf_set) { + psta->no_ht_gf_set = 1; + pmlmepriv->num_sta_ht_no_gf++; + } + DBG_871X("%s STA " MAC_FMT " - no " + "greenfield, num of non-gf stations %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_ht_no_gf); + } + + if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) { + if (!psta->ht_20mhz_set) { + psta->ht_20mhz_set = 1; + pmlmepriv->num_sta_ht_20mhz++; + } + DBG_871X("%s STA " MAC_FMT " - 20 MHz HT, " + "num of 20MHz HT STAs %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_ht_20mhz); + } + + } + else + { + if (!psta->no_ht_set) { + psta->no_ht_set = 1; + pmlmepriv->num_sta_no_ht++; + } + if(pmlmepriv->htpriv.ht_option == _TRUE) { + DBG_871X("%s STA " MAC_FMT + " - no HT, num of non-HT stations %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_no_ht); + } + } + + if (rtw_ht_operation_update(padapter) > 0) + { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + } + +#endif /* CONFIG_80211N_HT */ + + //update associcated stations cap. + associated_clients_update(padapter, beacon_updated); + + DBG_871X("%s, updated=%d\n", __func__, beacon_updated); + +} + +u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta) +{ + u8 beacon_updated = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + if(!psta) + return beacon_updated; + + if (psta->no_short_preamble_set) { + psta->no_short_preamble_set = 0; + pmlmepriv->num_sta_no_short_preamble--; + if (pmlmeext->cur_wireless_mode > WIRELESS_11B + && pmlmepriv->num_sta_no_short_preamble == 0) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + + if (psta->nonerp_set) { + psta->nonerp_set = 0; + pmlmepriv->num_sta_non_erp--; + if (pmlmepriv->num_sta_non_erp == 0) + { + beacon_updated = _TRUE; + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + } + + if (psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 0; + pmlmepriv->num_sta_no_short_slot_time--; + if (pmlmeext->cur_wireless_mode > WIRELESS_11B + && pmlmepriv->num_sta_no_short_slot_time == 0) + { + beacon_updated = _TRUE; + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + +#ifdef CONFIG_80211N_HT + + if (psta->no_ht_gf_set) { + psta->no_ht_gf_set = 0; + pmlmepriv->num_sta_ht_no_gf--; + } + + if (psta->no_ht_set) { + psta->no_ht_set = 0; + pmlmepriv->num_sta_no_ht--; + } + + if (psta->ht_20mhz_set) { + psta->ht_20mhz_set = 0; + pmlmepriv->num_sta_ht_20mhz--; + } + + if (rtw_ht_operation_update(padapter) > 0) + { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + } + +#endif /* CONFIG_80211N_HT */ + + //update associcated stations cap. + //associated_clients_update(padapter, beacon_updated); //move it to avoid deadlock + + DBG_871X("%s, updated=%d\n", __func__, beacon_updated); + + return beacon_updated; + +} + +u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason) +{ + _irqL irqL; + u8 beacon_updated = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + + if(!psta) + return beacon_updated; + + if (active == _TRUE) + { +#ifdef CONFIG_80211N_HT + //tear down Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //tear down TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + +#endif //CONFIG_80211N_HT + + issue_deauth(padapter, psta->hwaddr, reason); + } + + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + + + //report_del_sta_event(padapter, psta->hwaddr, reason); + + //clear cam entry / key + //clear_cam_entry(padapter, (psta->mac_id + 3)); + rtw_clearstakey_cmd(padapter, (u8*)psta, (u8)(psta->mac_id + 3), _TRUE); + + + _enter_critical_bh(&psta->lock, &irqL); + psta->state &= ~_FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + #ifdef CONFIG_IOCTL_CFG80211 + if (1) { + #ifdef COMPAT_KERNEL_RELEASE + rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + rtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason); + #else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + /* will call rtw_cfg80211_indicate_sta_disassoc() in cmd_thread for old API context */ + #endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + } else + #endif //CONFIG_IOCTL_CFG80211 + { + rtw_indicate_sta_disassoc_event(padapter, psta); + } + + report_del_sta_event(padapter, psta->hwaddr, reason); + + beacon_updated = bss_cap_update_on_sta_leave(padapter, psta); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + + return beacon_updated; + +} + +int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset) +{ + _irqL irqL; + _list *phead, *plist; + int ret=0; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + return ret; + + DBG_871X(FUNC_NDEV_FMT" with ch:%u, offset:%u\n", + FUNC_NDEV_ARG(padapter->pnetdev), new_ch, ch_offset); + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + /* for each sta in asoc_queue */ + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); + + issue_action_spct_ch_switch(padapter, psta->hwaddr, new_ch, ch_offset); + psta->expire_to = ((pstapriv->expire_to * 2) > 5) ? 5 : (pstapriv->expire_to * 2); + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + issue_action_spct_ch_switch(padapter, bc_addr, new_ch, ch_offset); + + return ret; +} + +int rtw_sta_flush(_adapter *padapter) +{ + _irqL irqL; + _list *phead, *plist; + int ret=0; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + u8 chk_alive_num = 0; + char chk_alive_list[NUM_STA]; + int i; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev)); + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + return ret; + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + int stainfo_offset; + + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); + + /* Remove sta from asoc_list */ + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + + /* Keep sta for ap_free_sta() beyond this asoc_list loop */ + stainfo_offset = rtw_stainfo_offset(pstapriv, psta); + if (stainfo_offset_valid(stainfo_offset)) { + chk_alive_list[chk_alive_num++] = stainfo_offset; + } + } + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + + /* For each sta in chk_alive_list, call ap_free_sta */ + for (i = 0; i < chk_alive_num; i++) { + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); + ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING); + } + + issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING); + + associated_clients_update(padapter, _TRUE); + + return ret; + +} + +/* called > TSR LEVEL for USB or SDIO Interface*/ +void sta_info_update(_adapter *padapter, struct sta_info *psta) +{ + int flags = psta->flags; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + + //update wmm cap. + if(WLAN_STA_WME&flags) + psta->qos_option = 1; + else + psta->qos_option = 0; + + if(pmlmepriv->qospriv.qos_option == 0) + psta->qos_option = 0; + + +#ifdef CONFIG_80211N_HT + //update 802.11n ht cap. + if(WLAN_STA_HT&flags) + { + psta->htpriv.ht_option = _TRUE; + psta->qos_option = 1; + } + else + { + psta->htpriv.ht_option = _FALSE; + } + + if(pmlmepriv->htpriv.ht_option == _FALSE) + psta->htpriv.ht_option = _FALSE; +#endif + + + update_sta_info_apmode(padapter, psta); + + +} + +/* called >= TSR LEVEL for USB or SDIO Interface*/ +void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta) +{ + if(psta->state & _FW_LINKED) + { + //add ratid + add_RATid(padapter, psta, 0);//DM_RATR_STA_INIT + } +} +/* restore hw setting from sw data structures */ +void rtw_ap_restore_network(_adapter *padapter) +{ + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv * pstapriv = &padapter->stapriv; + struct sta_info *psta; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + _irqL irqL; + _list *phead, *plist; + u8 chk_alive_num = 0; + char chk_alive_list[NUM_STA]; + int i; + + rtw_setopmode_cmd(padapter, Ndis802_11APMode,_FALSE); + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + start_bss_network(padapter, (u8*)&mlmepriv->cur_network.network); + + if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) + { + /* restore group key, WEP keys is restored in ips_leave() */ + rtw_set_key(padapter, psecuritypriv, psecuritypriv->dot118021XGrpKeyid, 0,_FALSE); + } + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + int stainfo_offset; + + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); + + stainfo_offset = rtw_stainfo_offset(pstapriv, psta); + if (stainfo_offset_valid(stainfo_offset)) { + chk_alive_list[chk_alive_num++] = stainfo_offset; + } + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + for (i = 0; i < chk_alive_num; i++) { + psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]); + + if (psta == NULL) { + DBG_871X(FUNC_ADPT_FMT" sta_info is null\n", FUNC_ADPT_ARG(padapter)); + } + else if(psta->state &_FW_LINKED) + { + Update_RA_Entry(padapter, psta); + //pairwise key + /* per sta pairwise key and settings */ + if( (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) + { + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE,_FALSE); + } + } + } + +} + +void start_ap_mode(_adapter *padapter) +{ + int i; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + + pmlmepriv->update_bcn = _FALSE; + + //init_mlme_ap_info(padapter); + pmlmeext->bstart_bss = _FALSE; + + pmlmepriv->num_sta_non_erp = 0; + + pmlmepriv->num_sta_no_short_slot_time = 0; + + pmlmepriv->num_sta_no_short_preamble = 0; + + pmlmepriv->num_sta_ht_no_gf = 0; +#ifdef CONFIG_80211N_HT + pmlmepriv->num_sta_no_ht = 0; +#endif //CONFIG_80211N_HT + pmlmepriv->num_sta_ht_20mhz = 0; + + pmlmepriv->olbc = _FALSE; + + pmlmepriv->olbc_ht = _FALSE; + +#ifdef CONFIG_80211N_HT + pmlmepriv->ht_op_mode = 0; +#endif + + for(i=0; ista_aid[i] = NULL; + + pmlmepriv->wps_beacon_ie = NULL; + pmlmepriv->wps_probe_resp_ie = NULL; + pmlmepriv->wps_assoc_resp_ie = NULL; + + pmlmepriv->p2p_beacon_ie = NULL; + pmlmepriv->p2p_probe_resp_ie = NULL; + + + //for ACL + _rtw_init_listhead(&(pacl_list->acl_node_q.queue)); + pacl_list->num = 0; + pacl_list->mode = 0; + for(i = 0; i < NUM_ACL; i++) + { + _rtw_init_listhead(&pacl_list->aclnode[i].list); + pacl_list->aclnode[i].valid = _FALSE; + } + +} + +void stop_ap_mode(_adapter *padapter) +{ + _irqL irqL; + _list *phead, *plist; + struct rtw_wlan_acl_node *paclnode; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; + _queue *pacl_node_q =&pacl_list->acl_node_q; + + pmlmepriv->update_bcn = _FALSE; + pmlmeext->bstart_bss = _FALSE; + //_rtw_spinlock_free(&pmlmepriv->bcn_update_lock); + + //reset and init security priv , this can refine with rtw_reset_securitypriv + _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; + padapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; + + //for ACL + _enter_critical_bh(&(pacl_node_q->lock), &irqL); + phead = get_list_head(pacl_node_q); + plist = get_next(phead); + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + paclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list); + plist = get_next(plist); + + if(paclnode->valid == _TRUE) + { + paclnode->valid = _FALSE; + + rtw_list_delete(&paclnode->list); + + pacl_list->num--; + } + } + _exit_critical_bh(&(pacl_node_q->lock), &irqL); + + DBG_871X("%s, free acl_node_queue, num=%d\n", __func__, pacl_list->num); + + rtw_sta_flush(padapter); + + //free_assoc_sta_resources + rtw_free_all_stainfo(padapter); + + psta = rtw_get_bcmc_stainfo(padapter); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + rtw_init_bcmc_stainfo(padapter); + + rtw_free_mlme_priv_ie_data(pmlmepriv); + +} + +#endif //CONFIG_NATIVEAP_MLME +#endif //CONFIG_AP_MODE + diff --git a/drivers/net/wireless/rtl8723as/core/rtw_bt_mp.c b/drivers/net/wireless/rtl8723as/core/rtw_bt_mp.c index 8b2afecc7b62..e3e0f3d95fec 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_bt_mp.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_bt_mp.c @@ -1,1734 +1,1735 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - - -#include "rtw_bt_mp.h" -#include -#include - -#ifdef CONFIG_RTL8723A - -void MPh2c_timeout_handle(void *FunctionContext) -{ - _adapter *pAdapter = (_adapter *)FunctionContext; - PMPT_CONTEXT pMptCtx=&pAdapter->mppriv.MptCtx; - - DBG_8192C("[MPT], MPh2c_timeout_handle \n"); - - pMptCtx->bMPh2c_timeout=_TRUE; - - _rtw_up_sema(&pMptCtx->MPh2c_Sema); - - //_cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer); - - return; -} -u32 WaitC2Hevent( PADAPTER pAdapter,BOOLEAN *C2H_event ,u32 delay_time) -{ - PMPT_CONTEXT pMptCtx=&(pAdapter->mppriv.MptCtx); - pMptCtx->bMPh2c_timeout=_FALSE; - - _set_timer( &pMptCtx->MPh2c_timeout_timer, delay_time ); - - _rtw_down_sema(&pMptCtx->MPh2c_Sema); - - if( pMptCtx->bMPh2c_timeout == _TRUE ) - { - C2H_event =_FALSE; - - return _FALSE; - } - - return _TRUE; - -} - -BT_CTRL_STATUS -mptbt_CheckC2hFrame( - PADAPTER Adapter, - PBT_H2C pH2c, - PBT_EXT_C2H pExtC2h - ) -{ - BT_CTRL_STATUS c2hStatus = BT_STATUS_C2H_SUCCESS; - - //DBG_8192C("[MPT], MPT rsp C2H hex: %x %x %x %x %x %x \n"), pExtC2h , pExtC2h+1 ,pExtC2h+2 ,pExtC2h+3 ,pExtC2h+4 ,pExtC2h+5); - - DBG_8192C("[MPT], statusCode = 0x%x\n", pExtC2h->statusCode); - DBG_8192C("[MPT], retLen = %d\n", pExtC2h->retLen); - DBG_8192C("[MPT], opCodeVer : req/rsp=%d/%d\n", pH2c->opCodeVer, pExtC2h->opCodeVer); - DBG_8192C("[MPT], reqNum : req/rsp=%d/%d\n", pH2c->reqNum, pExtC2h->reqNum); - if(pExtC2h->reqNum != pH2c->reqNum) - { - c2hStatus = BT_STATUS_C2H_REQNUM_MISMATCH; - DBG_8192C("[MPT], Error!! C2H reqNum Mismatch!!\n"); - } - else if(pExtC2h->opCodeVer != pH2c->opCodeVer) - { - c2hStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; - DBG_8192C("[MPT], Error!! OPCode version L mismatch!!\n"); - } - - return c2hStatus; -} - -extern s32 FillH2CCmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer); - -BT_CTRL_STATUS -mptbt_SendH2c( - PADAPTER Adapter, - PBT_H2C pH2c, - u2Byte h2cCmdLen - ) -{ - //KIRQL OldIrql = KeGetCurrentIrql(); - BT_CTRL_STATUS h2cStatus=BT_STATUS_H2C_SUCCESS; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - u1Byte i; - - DBG_8192C("[MPT], mptbt_SendH2c()=========>\n"); - - //PlatformResetEvent(&pMptCtx->MptH2cRspEvent); - //PlatformResetEvent(&pMptCtx->MptBtC2hEvent); - -// if(OldIrql == PASSIVE_LEVEL) -// { - //RTPRINT_DATA(FMPBT, FMPBT_H2C_CONTENT, ("[MPT], MPT H2C hex: \n"), pH2c, h2cCmdLen); - - for(i=0; ih2cReqNum++; - pMptCtx->h2cReqNum %= 16; - - if(WaitC2Hevent(Adapter, &pMptCtx->MptH2cRspEvent, 100)) - { - DBG_8192C("[MPT], Received WiFi MptH2cRspEvent!!!\n"); - if(WaitC2Hevent(Adapter, &pMptCtx->MptBtC2hEvent, 400)) - { - DBG_8192C("[MPT], Received MptBtC2hEvent!!!\n"); - break; - } - else - { - DBG_8192C("[MPT], Error!!BT MptBtC2hEvent timeout!!\n"); - h2cStatus = BT_STATUS_H2C_BT_NO_RSP; - } - } - else - { - DBG_8192C("[MPT], Error!!WiFi MptH2cRspEvent timeout!!\n"); - h2cStatus = BT_STATUS_H2C_TIMTOUT; - } - } -// } -// else -// { -// RT_ASSERT(FALSE, ("[MPT], mptbt_SendH2c() can only run under PASSIVE_LEVEL!!\n")); -// h2cStatus = BT_STATUS_WRONG_LEVEL; -// } - - DBG_8192C("[MPT], mptbt_SendH2c()<=========\n"); - return h2cStatus; -} - - - -BT_CTRL_STATUS -mptbt_CheckBtRspStatus( - PADAPTER Adapter, - PBT_EXT_C2H pExtC2h - ) -{ - BT_CTRL_STATUS retStatus=BT_OP_STATUS_SUCCESS; - - switch(pExtC2h->statusCode) - { - case BT_OP_STATUS_SUCCESS: - retStatus = BT_STATUS_BT_OP_SUCCESS; - DBG_8192C("[MPT], BT status : BT_STATUS_SUCCESS\n"); - break; - case BT_OP_STATUS_VERSION_MISMATCH: - retStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; - DBG_8192C("[MPT], BT status : BT_STATUS_OPCODE_L_VERSION_MISMATCH\n"); - break; - case BT_OP_STATUS_UNKNOWN_OPCODE: - retStatus = BT_STATUS_UNKNOWN_OPCODE_L; - DBG_8192C("[MPT], BT status : BT_STATUS_UNKNOWN_OPCODE_L\n"); - break; - case BT_OP_STATUS_ERROR_PARAMETER: - retStatus = BT_STATUS_PARAMETER_FORMAT_ERROR_L; - DBG_8192C("[MPT], BT status : BT_STATUS_PARAMETER_FORMAT_ERROR_L\n"); - break; - default: - retStatus = BT_STATUS_UNKNOWN_STATUS_L; - DBG_8192C("[MPT], BT status : BT_STATUS_UNKNOWN_STATUS_L\n"); - break; - } - - return retStatus; -} - - - -BT_CTRL_STATUS -mptbt_BtFwOpCodeProcess( - PADAPTER Adapter, - u1Byte btFwOpCode, - u1Byte opCodeVer, - pu1Byte pH2cPar, - u1Byte h2cParaLen - ) -{ - u1Byte H2C_Parameter[6] ={0}; - PBT_H2C pH2c=(PBT_H2C)&H2C_Parameter[0]; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; - u2Byte paraLen=0,i; - BT_CTRL_STATUS h2cStatus=BT_STATUS_H2C_SUCCESS, c2hStatus=BT_STATUS_C2H_SUCCESS; - BT_CTRL_STATUS retStatus=BT_STATUS_H2C_BT_NO_RSP; - - pH2c->opCode = btFwOpCode; - pH2c->opCodeVer = opCodeVer; - pH2c->reqNum = pMptCtx->h2cReqNum; - //PlatformMoveMemory(&pH2c->buf[0], pH2cPar, h2cParaLen); - //_rtw_memcpy(&pH2c->buf[0], pH2cPar, h2cParaLen); - _rtw_memcpy(pH2c->buf, pH2cPar, h2cParaLen); - - DBG_8192C("[MPT], pH2c->opCode=%d\n", pH2c->opCode); - DBG_8192C("[MPT], pH2c->opCodeVer=%d\n", pH2c->opCodeVer); - DBG_8192C("[MPT], pH2c->reqNum=%d\n", pH2c->reqNum); - DBG_8192C("[MPT], h2c parameter length=%d\n", h2cParaLen); - if(h2cParaLen) - { - DBG_8192C("[MPT], parameters(hex): \n"); - for(i=0;ibuf[i]); - } - } - - h2cStatus = mptbt_SendH2c(Adapter, pH2c, h2cParaLen+2); - if(BT_STATUS_H2C_SUCCESS == h2cStatus) - { - // if reach here, it means H2C get the correct c2h response, - c2hStatus = mptbt_CheckC2hFrame(Adapter, pH2c, pExtC2h); - if(BT_STATUS_C2H_SUCCESS == c2hStatus) - { - retStatus = mptbt_CheckBtRspStatus(Adapter, pExtC2h); - } - else - { - DBG_8192C("[MPT], Error!! C2H failed for pH2c->opCode=%d\n", pH2c->opCode); - // check c2h status error, return error status code to upper layer. - retStatus = c2hStatus; - } - } - else - { - DBG_8192C("[MPT], Error!! H2C failed for pH2c->opCode=%d\n", pH2c->opCode); - // check h2c status error, return error status code to upper layer. - retStatus = h2cStatus; - } - - return retStatus; -} - - - - -u2Byte -mptbt_BtReady( - PADAPTER Adapter, - PBT_REQ_CMD pBtReq, - PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; - u1Byte i; - u1Byte btFwVer=0, bdAddr[6]={0}; - u2Byte btRealFwVer=0; - pu2Byte pu2Tmp=NULL; - - // - // check upper layer parameters - // - - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - - pBtRsp->pParamStart[0] = MP_BT_NOT_READY; - paraLen = 10; - // - // execute lower layer opcodes - // - - // Get BT FW version - // fill h2c parameters - btOpcode = BT_LO_OP_GET_BT_VERSION; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - else - { - pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; - btRealFwVer = *pu2Tmp; - btFwVer = pExtC2h->buf[1]; - DBG_8192C("[MPT], btRealFwVer=0x%x, btFwVer=0x%x\n", btRealFwVer, btFwVer); - } - - // Get BD Address - // fill h2c parameters - btOpcode = BT_LO_OP_GET_BD_ADDR_L; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - else - { - bdAddr[5] = pExtC2h->buf[0]; - bdAddr[4] = pExtC2h->buf[1]; - bdAddr[3] = pExtC2h->buf[2]; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_GET_BD_ADDR_H; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - else - { - bdAddr[2] = pExtC2h->buf[0]; - bdAddr[1] = pExtC2h->buf[1]; - bdAddr[0] = pExtC2h->buf[2]; - } - DBG_8192C("[MPT], Local BDAddr:"); - for(i=0; i<6; i++) - { - DBG_8192C(" 0x%x ", bdAddr[i]); - } - pBtRsp->status = BT_STATUS_SUCCESS; - pBtRsp->pParamStart[0] = MP_BT_READY; - pu2Tmp = (pu2Byte)&pBtRsp->pParamStart[1]; - *pu2Tmp = btRealFwVer; - pBtRsp->pParamStart[3] = btFwVer; - for(i=0; i<6; i++) - { - pBtRsp->pParamStart[4+i] = bdAddr[5-i]; - } - - return paraLen; -} - -void mptbt_close_WiFiRF(PADAPTER Adapter) -{ - PHY_SetBBReg(Adapter, 0x824, 0xF, 0x0); - PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x0); - PHY_SetRFReg(Adapter, RF90_PATH_A, 0x0, 0xF0000, 0x0); -} - -void mptbt_open_WiFiRF(PADAPTER Adapter) -{ - PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x3); - PHY_SetBBReg(Adapter, 0x824, 0xF, 0x2); - PHY_SetRFReg(Adapter, RF90_PATH_A, 0x0, 0xF0000, 0x3); -} - -u4Byte mptbt_switch_RF(PADAPTER Adapter, u1Byte Enter) -{ - u2Byte tmp_2byte = 0; - - //Enter test mode - if (Enter) { - ////1>. close WiFi RF - mptbt_close_WiFiRF(Adapter); - - ////2>. change ant switch to BT - tmp_2byte = rtw_read16(Adapter, 0x860); - tmp_2byte = tmp_2byte | BIT(9); - tmp_2byte = tmp_2byte & (~BIT(8)); - rtw_write16(Adapter, 0x860, tmp_2byte); - rtw_write16(Adapter, 0x870, 0x300); - } else { - ////1>. Open WiFi RF - mptbt_open_WiFiRF(Adapter); - - ////2>. change ant switch back - tmp_2byte = rtw_read16(Adapter, 0x860); - tmp_2byte = tmp_2byte | BIT(8); - tmp_2byte = tmp_2byte & (~BIT(9)); - rtw_write16(Adapter, 0x860, tmp_2byte); - rtw_write16(Adapter, 0x870, 0x300); - } - - return 0; -} - -u2Byte -mptbt_BtSetMode( - PADAPTER Adapter, - PBT_REQ_CMD pBtReq, - PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte btModeToSet=0; - - // - // check upper layer parameters - // - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // 2. check upper layer parameter length - if(1 == pBtReq->paraLength) - { - btModeToSet = pBtReq->pParamStart[0]; - DBG_8192C("[MPT], BtTestMode=%d \n", btModeToSet); - } - else - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - - // 1. fill h2c parameters - // check bt mode - btOpcode = BT_LO_OP_SET_BT_MODE; - if(btModeToSet >= MP_BT_MODE_MAX) - { - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - mptbt_switch_RF(Adapter, 1); - - h2cParaBuf[0] = btModeToSet; - h2cParaLen = 1; - // 2. execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // 3. construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS == retStatus) - { - pBtRsp->status = BT_STATUS_SUCCESS; - } - else - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - } - - return paraLen; -} - - -VOID -MPTBT_FwC2hBtMpCtrl( - PADAPTER Adapter, - pu1Byte tmpBuf, - u1Byte length - ) -{ - u32 i; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)tmpBuf; - - if(Adapter->bBTFWReady == _FALSE || Adapter->registrypriv.mp_mode == 0 ) - { - DBG_8192C("[MPT], %s,bBTFWReady == _FALSE\n",__func__); - return; - } - //cancel_timeout for h2c handle - _cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer); - - DBG_8192C("[MPT], MPTBT_FwC2hBtMpCtrl(), hex: \n"); - for(i=0;i<=length;i++) - { - //DBG_8192C("[MPT], MPTBT_FwC2hBtMpCtrl(), hex: \n",tmpBuf[i], length); - DBG_8192C(" 0x%x ",tmpBuf[i]); - } - DBG_8192C("\n [MPT], pExtC2h->extendId=0x%x\n", pExtC2h->extendId); - - switch(pExtC2h->extendId) - { - case EXT_C2H_WIFI_FW_ACTIVE_RSP: - DBG_8192C("[MPT], EXT_C2H_WIFI_FW_ACTIVE_RSP\n"); - DBG_8192C("[MPT], pExtC2h->buf hex: \n"); - if( length > 32 || length < 3 ) - break ; - for(i=0;i<=(length-3);i++) - DBG_8192C(" 0x%x ",pExtC2h->buf[i]); - //PlatformSetEvent(&pMptCtx->MptH2cRspEvent); - pMptCtx->MptH2cRspEvent=_TRUE; - _rtw_up_sema(&pMptCtx->MPh2c_Sema); - break; - case EXT_C2H_TRIG_BY_BT_FW: - DBG_8192C("[MPT], EXT_C2H_TRIG_BY_BT_FW\n"); - //PlatformMoveMemory(&pMptCtx->c2hBuf[0], tmpBuf, length); - _rtw_memcpy(&pMptCtx->c2hBuf[0], tmpBuf, length); - DBG_8192C("[MPT], pExtC2h->statusCode=0x%x\n", pExtC2h->statusCode); - DBG_8192C("[MPT], pExtC2h->retLen=0x%x\n", pExtC2h->retLen); - DBG_8192C("[MPT], pExtC2h->opCodeVer=0x%x\n", pExtC2h->opCodeVer); - DBG_8192C("[MPT], pExtC2h->reqNum=0x%x\n", pExtC2h->reqNum); - DBG_8192C("[MPT], pExtC2h->buf hex: \n"); - for(i=0;i<=(length-3);i++) - DBG_8192C(" 0x%x ",pExtC2h->buf[0]); - //PlatformSetEvent(&pMptCtx->MptBtC2hEvent); - pMptCtx->MptBtC2hEvent=_TRUE; - _rtw_up_sema(&pMptCtx->MPh2c_Sema); - break; - default: - break; - } - - - -} - - -u2Byte -mptbt_BtGetGeneral( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode, bdAddr[6]={0}; - u1Byte btOpcodeVer=0; - u1Byte getType=0, i; - u2Byte getParaLen=0, validParaLen=0; - u1Byte regType=0, reportType=0; - u4Byte regAddr=0, regValue=0; - pu4Byte pu4Tmp; - pu2Byte pu2Tmp; - pu1Byte pu1Tmp; - - // - // check upper layer parameters - // - - // check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // check upper layer parameter length - if(pBtReq->paraLength < 1) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - getParaLen = pBtReq->paraLength - 1; - getType = pBtReq->pParamStart[0]; - - DBG_8192C("[MPT], getType=%d, getParaLen=%d\n", getType, getParaLen); - - // check parameter first - switch(getType) - { - case BT_GGET_REG: - DBG_8192C("[MPT], [BT_GGET_REG]\n"); - validParaLen = 5; - if(getParaLen == validParaLen) - { - btOpcode = BT_LO_OP_READ_REG; - regType = pBtReq->pParamStart[1]; - pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; - regAddr = *pu4Tmp; - DBG_8192C("[MPT], BT_GGET_REG regType=0x%x, regAddr=0x%x!!\n", - regType, regAddr); - if(regType >= BT_REG_MAX) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - if( ((BT_REG_RF==regType)&&(regAddr>0x7f)) || - ((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) || - ((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) || - ((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) || - ((BT_REG_LE==regType)&&(regAddr>0xfff)) ) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - } - } - break; - case BT_GGET_STATUS: - DBG_8192C("[MPT], [BT_GGET_STATUS]\n"); - validParaLen = 0; - break; - case BT_GGET_REPORT: - DBG_8192C("[MPT], [BT_GGET_REPORT]\n"); - validParaLen = 1; - if(getParaLen == validParaLen) - { - reportType = pBtReq->pParamStart[1]; - DBG_8192C("[MPT], BT_GGET_REPORT reportType=0x%x!!\n", reportType); - if(reportType >= BT_REPORT_MAX) - { - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - } - break; - default: - { - DBG_8192C("[MPT], Error!! getType=%d, out of range\n", getType); - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - break; - } - if(getParaLen != validParaLen) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d for BT_GET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", - getParaLen, getType, validParaLen); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - if(BT_GGET_REG == getType) - { - // fill h2c parameters - // here we should write reg value first then write the address, adviced by Austin - btOpcode = BT_LO_OP_READ_REG; - h2cParaBuf[0] = regType; - h2cParaBuf[1] = pBtReq->pParamStart[2]; - h2cParaBuf[2] = pBtReq->pParamStart[3]; - h2cParaLen = 3; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; - regValue = *pu2Tmp; - DBG_8192C("[MPT], read reg regType=0x%x, regAddr=0x%x, regValue=0x%x\n", - regType, regAddr, regValue); - - pu4Tmp = (pu4Byte)&pBtRsp->pParamStart[0]; - *pu4Tmp = regValue; - paraLen = 4; - } - else if(BT_GGET_STATUS == getType) - { - btOpcode = BT_LO_OP_GET_BT_STATUS; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - DBG_8192C("[MPT], read bt status, testMode=0x%x, testStatus=0x%x\n", - pBtRsp->pParamStart[0], pBtRsp->pParamStart[1]); - paraLen = 2; - } - else if(BT_GGET_REPORT == getType) - { - switch(reportType) - { - case BT_REPORT_RX_PACKET_CNT: - { - DBG_8192C("[MPT], [Rx Packet Counts]\n"); - btOpcode = BT_LO_OP_GET_RX_PKT_CNT_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - - btOpcode = BT_LO_OP_GET_RX_PKT_CNT_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[2] = pExtC2h->buf[0]; - pBtRsp->pParamStart[3] = pExtC2h->buf[1]; - paraLen = 4; - } - break; - case BT_REPORT_RX_ERROR_BITS: - { - DBG_8192C("[MPT], [Rx Error Bits]\n"); - btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - - btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[2] = pExtC2h->buf[0]; - pBtRsp->pParamStart[3] = pExtC2h->buf[1]; - paraLen = 4; - } - break; - case BT_REPORT_RSSI: - { - DBG_8192C("[MPT], [RSSI]\n"); - btOpcode = BT_LO_OP_GET_RSSI; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - paraLen = 2; - } - break; - case BT_REPORT_CFO_HDR_QUALITY: - { - DBG_8192C("[MPT], [CFO & Header Quality]\n"); - btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[0] = pExtC2h->buf[0]; - pBtRsp->pParamStart[1] = pExtC2h->buf[1]; - - btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - pBtRsp->pParamStart[2] = pExtC2h->buf[0]; - pBtRsp->pParamStart[3] = pExtC2h->buf[1]; - paraLen = 4; - } - break; - case BT_REPORT_CONNECT_TARGET_BD_ADDR: - { - DBG_8192C("[MPT], [Connected Target BD ADDR]\n"); - btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_L; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - bdAddr[5] = pExtC2h->buf[0]; - bdAddr[4] = pExtC2h->buf[1]; - bdAddr[3] = pExtC2h->buf[2]; - - btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_H; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - bdAddr[2] = pExtC2h->buf[0]; - bdAddr[1] = pExtC2h->buf[1]; - bdAddr[0] = pExtC2h->buf[2]; - - DBG_8192C("[MPT], Connected Target BDAddr:%s", bdAddr); - for(i=0; i<6; i++) - { - pBtRsp->pParamStart[i] = bdAddr[5-i]; - } - paraLen = 6; - } - break; - default: - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - break; - } - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - - -u2Byte -mptbt_BtSetGeneral( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte setType=0; - u2Byte setParaLen=0, validParaLen=0; - u1Byte regType=0, bdAddr[6]={0}, calVal=0; - u4Byte regAddr=0, regValue=0; - pu4Byte pu4Tmp; - pu2Byte pu2Tmp; - pu1Byte pu1Tmp; - - // - // check upper layer parameters - // - - // check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // check upper layer parameter length - if(pBtReq->paraLength < 1) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - setParaLen = pBtReq->paraLength - 1; - setType = pBtReq->pParamStart[0]; - - DBG_8192C("[MPT], setType=%d, setParaLen=%d\n", setType, setParaLen); - - // check parameter first - switch(setType) - { - case BT_GSET_REG: - DBG_8192C ("[MPT], [BT_GSET_REG]\n"); - validParaLen = 9; - if(setParaLen == validParaLen) - { - btOpcode = BT_LO_OP_WRITE_REG_VALUE; - regType = pBtReq->pParamStart[1]; - pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; - regAddr = *pu4Tmp; - pu4Tmp = (pu4Byte)&pBtReq->pParamStart[6]; - regValue = *pu4Tmp; - DBG_8192C("[MPT], BT_GSET_REG regType=0x%x, regAddr=0x%x, regValue=0x%x!!\n", - regType, regAddr, regValue); - if(regType >= BT_REG_MAX) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - if( ((BT_REG_RF==regType)&&(regAddr>0x7f)) || - ((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) || - ((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) || - ((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) || - ((BT_REG_LE==regType)&&(regAddr>0xfff)) ) - { - pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - } - } - break; - case BT_GSET_RESET: - DBG_8192C("[MPT], [BT_GSET_RESET]\n"); - validParaLen = 0; - break; - case BT_GSET_TARGET_BD_ADDR: - DBG_8192C("[MPT], [BT_GSET_TARGET_BD_ADDR]\n"); - validParaLen = 6; - if(setParaLen == validParaLen) - { - btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; - if( (pBtReq->pParamStart[1]==0) && - (pBtReq->pParamStart[2]==0) && - (pBtReq->pParamStart[3]==0) && - (pBtReq->pParamStart[4]==0) && - (pBtReq->pParamStart[5]==0) && - (pBtReq->pParamStart[6]==0) ) - { - DBG_8192C("[MPT], Error!! targetBDAddr=all zero\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - if( (pBtReq->pParamStart[1]==0xff) && - (pBtReq->pParamStart[2]==0xff) && - (pBtReq->pParamStart[3]==0xff) && - (pBtReq->pParamStart[4]==0xff) && - (pBtReq->pParamStart[5]==0xff) && - (pBtReq->pParamStart[6]==0xff) ) - { - DBG_8192C("[MPT], Error!! targetBDAddr=all 0xf\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - bdAddr[0] = pBtReq->pParamStart[6]; - bdAddr[1] = pBtReq->pParamStart[5]; - bdAddr[2] = pBtReq->pParamStart[4]; - bdAddr[3] = pBtReq->pParamStart[3]; - bdAddr[4] = pBtReq->pParamStart[2]; - bdAddr[5] = pBtReq->pParamStart[1]; - DBG_8192C ("[MPT], target BDAddr:%x,%x,%x,%x,%x,%x\n", - bdAddr[0],bdAddr[1],bdAddr[2],bdAddr[3],bdAddr[4],bdAddr[5]); - } - break; - case BT_GSET_TX_PWR_FINETUNE: - DBG_8192C("[MPT], [BT_GSET_TX_PWR_FINETUNE]\n"); - validParaLen = 1; - if(setParaLen == validParaLen) - { - btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; - calVal = pBtReq->pParamStart[1]; - if( (calVal<1) || (calVal>9) ) - { - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - DBG_8192C ("[MPT], calVal=%d\n", calVal); - } - break; - case BT_SET_TRACKING_INTERVAL: - DBG_871X("[MPT], [BT_SET_TRACKING_INTERVAL] setParaLen =%d \n",setParaLen); - - validParaLen = 1; - if(setParaLen == validParaLen) - calVal = pBtReq->pParamStart[1]; - break; - case BT_SET_THERMAL_METER: - DBG_871X("[MPT], [BT_SET_THERMAL_METER] setParaLen =%d \n",setParaLen); - validParaLen = 1; - if(setParaLen == validParaLen) - calVal = pBtReq->pParamStart[1]; - break; - case BT_ENABLE_CFO_TRACKING: - DBG_871X("[MPT], [BT_ENABLE_CFO_TRACKING] setParaLen =%d \n",setParaLen); - validParaLen = 1; - if(setParaLen == validParaLen) - calVal = pBtReq->pParamStart[1]; - break; - case BT_GSET_UPDATE_BT_PATCH: - if(IS_HARDWARE_TYPE_8723AE(Adapter) && Adapter->bFWReady) - { - u1Byte i; - DBG_8192C ("[MPT], write regs for load patch\n"); - //BTFwPatch8723A(Adapter); - PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x2d); - rtw_msleep_os(50); - PlatformEFIOWrite4Byte(Adapter, 0x68, 0xa005000c); - rtw_msleep_os(50); - PlatformEFIOWrite4Byte(Adapter, 0x68, 0xb005000c); - rtw_msleep_os(50); - PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x29); - for(i=0; i<12; i++) - rtw_msleep_os(100); -//#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) -// BTFwPatch8723A(Adapter); -//#endif - DBG_8192C("[MPT], load BT FW Patch finished!!!\n"); - } - break; - default: - { - DBG_8192C ("[MPT], Error!! setType=%d, out of range\n", setType); - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - break; - } - if(setParaLen != validParaLen) - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d for BT_SET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", - setParaLen, setType, validParaLen); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - if(BT_GSET_REG == setType) - { - // fill h2c parameters - // here we should write reg value first then write the address, adviced by Austin - btOpcode = BT_LO_OP_WRITE_REG_VALUE; - h2cParaBuf[0] = pBtReq->pParamStart[6]; - h2cParaBuf[1] = pBtReq->pParamStart[7]; - h2cParaBuf[2] = pBtReq->pParamStart[8]; - h2cParaLen = 3; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // write reg address - btOpcode = BT_LO_OP_WRITE_REG_ADDR; - h2cParaBuf[0] = regType; - h2cParaBuf[1] = pBtReq->pParamStart[2]; - h2cParaBuf[2] = pBtReq->pParamStart[3]; - h2cParaLen = 3; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_GSET_RESET == setType) - { - btOpcode = BT_LO_OP_RESET; - h2cParaLen = 0; - // execute h2c and check respond c2h from bt fw is correct or not - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_GSET_TARGET_BD_ADDR == setType) - { - // fill h2c parameters - btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_L; - h2cParaBuf[0] = pBtReq->pParamStart[1]; - h2cParaBuf[1] = pBtReq->pParamStart[2]; - h2cParaBuf[2] = pBtReq->pParamStart[3]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; - h2cParaBuf[0] = pBtReq->pParamStart[4]; - h2cParaBuf[1] = pBtReq->pParamStart[5]; - h2cParaBuf[2] = pBtReq->pParamStart[6]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_GSET_TX_PWR_FINETUNE == setType) - { - // fill h2c parameters - btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; - h2cParaBuf[0] = calVal; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_SET_TRACKING_INTERVAL == setType) - { - // BT_LO_OP_SET_TRACKING_INTERVAL = 0x22, - // BT_LO_OP_SET_THERMAL_METER = 0x23, - // BT_LO_OP_ENABLE_CFO_TRACKING = 0x24, - btOpcode = BT_LO_OP_SET_TRACKING_INTERVAL; - h2cParaBuf[0] = calVal; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_SET_THERMAL_METER == setType) - { - btOpcode = BT_LO_OP_SET_THERMAL_METER; - h2cParaBuf[0] = calVal; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - else if(BT_ENABLE_CFO_TRACKING == setType) - { - btOpcode = BT_LO_OP_ENABLE_CFO_TRACKING; - h2cParaBuf[0] = calVal; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - - -u2Byte -mptbt_BtSetTxRxPars( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - PBT_TXRX_PARAMETERS pTxRxPars=(PBT_TXRX_PARAMETERS)&pBtReq->pParamStart[0]; - u2Byte lenTxRx=sizeof(BT_TXRX_PARAMETERS); - u1Byte i; - u1Byte bdAddr[6]={0}; - - // - // check upper layer parameters - // - - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // 2. check upper layer parameter length - if(pBtReq->paraLength == sizeof(BT_TXRX_PARAMETERS)) - { - DBG_8192C ("[MPT], pTxRxPars->txrxChannel=0x%x \n", pTxRxPars->txrxChannel); - DBG_8192C ("[MPT], pTxRxPars->txrxTxPktCnt=0x%8x \n", pTxRxPars->txrxTxPktCnt); - DBG_8192C ("[MPT], pTxRxPars->txrxTxPktInterval=0x%x \n", pTxRxPars->txrxTxPktInterval); - DBG_8192C ("[MPT], pTxRxPars->txrxPayloadType=0x%x \n", pTxRxPars->txrxPayloadType); - DBG_8192C ("[MPT], pTxRxPars->txrxPktType=0x%x \n", pTxRxPars->txrxPktType); - DBG_8192C ("[MPT], pTxRxPars->txrxPayloadLen=0x%x \n", pTxRxPars->txrxPayloadLen); - DBG_8192C ("[MPT], pTxRxPars->txrxPktHeader=0x%x \n", pTxRxPars->txrxPktHeader); - DBG_8192C ("[MPT], pTxRxPars->txrxWhitenCoeff=0x%x \n", pTxRxPars->txrxWhitenCoeff); - bdAddr[0] = pTxRxPars->txrxBdaddr[5]; - bdAddr[1] = pTxRxPars->txrxBdaddr[4]; - bdAddr[2] = pTxRxPars->txrxBdaddr[3]; - bdAddr[3] = pTxRxPars->txrxBdaddr[2]; - bdAddr[4] = pTxRxPars->txrxBdaddr[1]; - bdAddr[5] = pTxRxPars->txrxBdaddr[0]; - DBG_8192C ("[MPT], pTxRxPars->txrxBdaddr: %s", &bdAddr[0]); - DBG_8192C ("[MPT], pTxRxPars->txrxTxGainIndex=0x%x \n", pTxRxPars->txrxTxGainIndex); - } - else - { - DBG_8192C ("[MPT], Error!! pBtReq->paraLength=%d, correct Len=%d\n", pBtReq->paraLength, lenTxRx); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_HEADER; - if(pTxRxPars->txrxPktHeader > 0x3ffff) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPktHeader=0x%x is out of range, (should be between 0x0~0x3ffff)\n", pTxRxPars->txrxPktHeader); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = (u1Byte)(pTxRxPars->txrxPktHeader&0xff); - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff00)>>8); - h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff0000)>>16); - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_TYPE_LEN; - { - u2Byte payloadLenLimit=0; - switch(pTxRxPars->txrxPktType) - { - case MP_BT_PKT_DH1: - payloadLenLimit = 27*8; - break; - case MP_BT_PKT_DH3: - payloadLenLimit = 183*8; - break; - case MP_BT_PKT_DH5: - payloadLenLimit = 339*8; - break; - case MP_BT_PKT_2DH1: - payloadLenLimit = 54*8; - break; - case MP_BT_PKT_2DH3: - payloadLenLimit = 367*8; - break; - case MP_BT_PKT_2DH5: - payloadLenLimit = 679*8; - break; - case MP_BT_PKT_3DH1: - payloadLenLimit = 83*8; - break; - case MP_BT_PKT_3DH3: - payloadLenLimit = 552*8; - break; - case MP_BT_PKT_3DH5: - payloadLenLimit = 1021*8; - break; - case MP_BT_PKT_LE: - payloadLenLimit = 39*8; - break; - default: - { - DBG_8192C ("[MPT], Error!! Unknown pTxRxPars->txrxPktType=0x%x\n", pTxRxPars->txrxPktType); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - break; - } - - if(pTxRxPars->txrxPayloadLen > payloadLenLimit) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPayloadLen=0x%x, (should smaller than %d)\n", - pTxRxPars->txrxPayloadLen, payloadLenLimit); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - - h2cParaBuf[0] = pTxRxPars->txrxPktType; - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff)); - h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff00)>>8); - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_CNT_L_PL_TYPE; - if(pTxRxPars->txrxPayloadType > MP_BT_PAYLOAD_MAX) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPayloadType=0x%x, (should be between 0~4)\n", pTxRxPars->txrxPayloadType); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff)); - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff00)>>8); - h2cParaBuf[2] = pTxRxPars->txrxPayloadType; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_PKT_CNT_H_PKT_INTV; - if(pTxRxPars->txrxTxPktInterval > 15) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxTxPktInterval=0x%x, (should be between 0~15)\n", pTxRxPars->txrxTxPktInterval); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff0000)>>16); - h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff000000)>>24); - h2cParaBuf[2] = pTxRxPars->txrxTxPktInterval; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_WHITENCOEFF; - { - h2cParaBuf[0] = pTxRxPars->txrxWhitenCoeff; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_CHNL_TX_GAIN; - if( (pTxRxPars->txrxChannel > 78) || - (pTxRxPars->txrxTxGainIndex > 7) ) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxChannel=0x%x, (should be between 0~78)\n", pTxRxPars->txrxChannel); - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxTxGainIndex=0x%x, (should be between 0~7)\n", pTxRxPars->txrxTxGainIndex); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = pTxRxPars->txrxChannel; - h2cParaBuf[1] = pTxRxPars->txrxTxGainIndex; - h2cParaLen = 2; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - // fill h2c parameters - btOpcode = BT_LO_OP_SET_BD_ADDR_L; - if( (pTxRxPars->txrxBdaddr[0]==0) && - (pTxRxPars->txrxBdaddr[1]==0) && - (pTxRxPars->txrxBdaddr[2]==0) && - (pTxRxPars->txrxBdaddr[3]==0) && - (pTxRxPars->txrxBdaddr[4]==0) && - (pTxRxPars->txrxBdaddr[5]==0) ) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxBdaddr=all zero\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - if( (pTxRxPars->txrxBdaddr[0]==0xff) && - (pTxRxPars->txrxBdaddr[1]==0xff) && - (pTxRxPars->txrxBdaddr[2]==0xff) && - (pTxRxPars->txrxBdaddr[3]==0xff) && - (pTxRxPars->txrxBdaddr[4]==0xff) && - (pTxRxPars->txrxBdaddr[5]==0xff) ) - { - DBG_8192C ("[MPT], Error!! pTxRxPars->txrxBdaddr=all 0xf\n"); - pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - - { - h2cParaBuf[0] = pTxRxPars->txrxBdaddr[0]; - h2cParaBuf[1] = pTxRxPars->txrxBdaddr[1]; - h2cParaBuf[2] = pTxRxPars->txrxBdaddr[2]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - btOpcode = BT_LO_OP_SET_BD_ADDR_H; - { - h2cParaBuf[0] = pTxRxPars->txrxBdaddr[3]; - h2cParaBuf[1] = pTxRxPars->txrxBdaddr[4]; - h2cParaBuf[2] = pTxRxPars->txrxBdaddr[5]; - h2cParaLen = 3; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - // ckeck bt return status. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - - -u2Byte -mptbt_BtTestCtrl( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte testCtrl=0; - - // - // check upper layer parameters - // - - // 1. check upper layer opcode version - if(pBtReq->opCodeVer != 1) - { - DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); - pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; - return paraLen; - } - // 2. check upper layer parameter length - if(1 == pBtReq->paraLength) - { - testCtrl = pBtReq->pParamStart[0]; - DBG_8192C("[MPT], testCtrl=%d \n", testCtrl); - } - else - { - DBG_8192C("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); - pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; - return paraLen; - } - - // - // execute lower layer opcodes - // - - // 1. fill h2c parameters - // check bt mode - btOpcode = BT_LO_OP_TEST_CTRL; - if(testCtrl >= MP_BT_TEST_MAX) - { - DBG_8192C("[MPT], Error!! testCtrl=0x%x, (should be between smaller or equal to 0x%x)\n", - testCtrl, MP_BT_TEST_MAX-1); - pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; - return paraLen; - } - else - { - h2cParaBuf[0] = testCtrl; - h2cParaLen = 1; - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - } - - // 3. construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - - -u2Byte -mptbt_TestBT( - IN PADAPTER Adapter, - IN PBT_REQ_CMD pBtReq, - IN PBT_RSP_CMD pBtRsp - ) -{ - - u1Byte h2cParaBuf[6] ={0}; - u1Byte h2cParaLen=0; - u2Byte paraLen=0; - u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; - u1Byte btOpcode; - u1Byte btOpcodeVer=0; - u1Byte testCtrl=0; - - // 1. fill h2c parameters - btOpcode = 0x11; - h2cParaBuf[0] = 0x11; - h2cParaBuf[1] = 0x0; - h2cParaBuf[2] = 0x0; - h2cParaBuf[3] = 0x0; - h2cParaBuf[4] = 0x0; - h2cParaLen = 1; - // retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); - retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, h2cParaBuf, h2cParaLen); - - - // 3. construct respond status code and data. - if(BT_STATUS_BT_OP_SUCCESS != retStatus) - { - pBtRsp->status = ((btOpcode<<8)|retStatus); - DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); - return paraLen; - } - - pBtRsp->status = BT_STATUS_SUCCESS; - return paraLen; -} - -VOID -mptbt_BtControlProcess( - PADAPTER Adapter, - PVOID pInBuf - ) -{ - u1Byte H2C_Parameter[6] ={0}; - PBT_H2C pH2c=(PBT_H2C)&H2C_Parameter[0]; - PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); - PBT_REQ_CMD pBtReq=(PBT_REQ_CMD)pInBuf; - PBT_RSP_CMD pBtRsp=(PBT_RSP_CMD)&pMptCtx->mptOutBuf[0]; - u1Byte i; - - DBG_8192C("[MPT], mptbt_BtControlProcess()=========>\n"); - - DBG_8192C("[MPT], input opCodeVer=%d\n", pBtReq->opCodeVer); - DBG_8192C("[MPT], input OpCode=%d\n", pBtReq->OpCode); - DBG_8192C("[MPT], paraLength=%d \n", pBtReq->paraLength); - if(pBtReq->paraLength) - { - //DBG_8192C("[MPT], parameters(hex):0x%x %d \n",&pBtReq->pParamStart[0], pBtReq->paraLength); - } - - // The following we should maintain the User OP codes sent by upper layer - - pBtRsp->status = BT_STATUS_SUCCESS; - pMptCtx->mptOutLen = 4; //length of (BT_RSP_CMD.status+BT_RSP_CMD.paraLength) - pBtRsp->paraLength = 0x0; - - _rtw_memset((PVOID)&pMptCtx->mptOutBuf[0], '\0',100); - - switch(pBtReq->OpCode) - { - case BT_UP_OP_BT_READY: - DBG_8192C("[MPT], OPcode : [BT_READY]\n"); - pBtRsp->paraLength = mptbt_BtReady(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_SET_MODE: - DBG_8192C("[MPT], OPcode : [BT_SET_MODE]\n"); - pBtRsp->paraLength = mptbt_BtSetMode(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_SET_TX_RX_PARAMETER: - DBG_8192C("[MPT], OPcode : [BT_SET_TXRX_PARAMETER]\n"); - pBtRsp->paraLength = mptbt_BtSetTxRxPars(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_SET_GENERAL: - DBG_8192C("[MPT], OPcode : [BT_SET_GENERAL]\n"); - pBtRsp->paraLength = mptbt_BtSetGeneral(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_GET_GENERAL: - DBG_8192C("[MPT], OPcode : [BT_GET_GENERAL]\n"); - pBtRsp->paraLength = mptbt_BtGetGeneral(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_BT_TEST_CTRL: - DBG_8192C("[MPT], OPcode : [BT_TEST_CTRL]\n"); - pBtRsp->paraLength = mptbt_BtTestCtrl(Adapter, pBtReq, pBtRsp); - break; - case BT_UP_OP_TEST_BT: - DBG_8192C("[MPT], OPcode : [TEST_BT]\n"); - pBtRsp->paraLength = mptbt_TestBT(Adapter, pBtReq, pBtRsp); - break; - default: - DBG_8192C("[MPT], Error!! OPcode : UNDEFINED!!!!\n"); - pBtRsp->status = BT_STATUS_UNKNOWN_OPCODE_U; - pBtRsp->paraLength = 0x0; - break; - } - - DBG_8192C("pBtRsp->paraLength =%d \n",pBtRsp->paraLength); - - pMptCtx->mptOutLen += pBtRsp->paraLength; - - DBG_8192C("\n [MPT], OUT to DLL pMptCtx->mptOutLen=%d ,pBtRsp->paraLength =%d ",pMptCtx->mptOutLen,pBtRsp->paraLength); - - DBG_8192C("\n [MPT], mptbt_BtControlProcess()<=========\n"); -} - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#include "rtw_bt_mp.h" +#include +#include + +#ifdef CONFIG_RTL8723A + +void MPh2c_timeout_handle(void *FunctionContext) +{ + _adapter *pAdapter = (_adapter *)FunctionContext; + PMPT_CONTEXT pMptCtx=&pAdapter->mppriv.MptCtx; + + DBG_8192C("[MPT], MPh2c_timeout_handle \n"); + + pMptCtx->bMPh2c_timeout=_TRUE; + + _rtw_up_sema(&pMptCtx->MPh2c_Sema); + + //_cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer); + + return; +} +u32 WaitC2Hevent( PADAPTER pAdapter,BOOLEAN *C2H_event ,u32 delay_time) +{ + PMPT_CONTEXT pMptCtx=&(pAdapter->mppriv.MptCtx); + pMptCtx->bMPh2c_timeout=_FALSE; + DBG_8192C("WaitC2Hevent _set_timer \n"); + _set_timer( &pMptCtx->MPh2c_timeout_timer, delay_time ); + + _rtw_down_sema(&pMptCtx->MPh2c_Sema); + + if( pMptCtx->bMPh2c_timeout == _TRUE ) + { + C2H_event =_FALSE; + DBG_8192C("WaitC2Hevent bMPh2c_timeout _TRUE \n"); + return _FALSE; + } + + return _TRUE; + +} + +BT_CTRL_STATUS +mptbt_CheckC2hFrame( + PADAPTER Adapter, + PBT_H2C pH2c, + PBT_EXT_C2H pExtC2h + ) +{ + BT_CTRL_STATUS c2hStatus = BT_STATUS_C2H_SUCCESS; + + //DBG_8192C("[MPT], MPT rsp C2H hex: %x %x %x %x %x %x \n"), pExtC2h , pExtC2h+1 ,pExtC2h+2 ,pExtC2h+3 ,pExtC2h+4 ,pExtC2h+5); + + DBG_8192C("[MPT], statusCode = 0x%x\n", pExtC2h->statusCode); + DBG_8192C("[MPT], retLen = %d\n", pExtC2h->retLen); + DBG_8192C("[MPT], opCodeVer : req/rsp=%d/%d\n", pH2c->opCodeVer, pExtC2h->opCodeVer); + DBG_8192C("[MPT], reqNum : req/rsp=%d/%d\n", pH2c->reqNum, pExtC2h->reqNum); + if(pExtC2h->reqNum != pH2c->reqNum) + { + c2hStatus = BT_STATUS_C2H_REQNUM_MISMATCH; + DBG_8192C("[MPT], Error!! C2H reqNum Mismatch!!\n"); + } + else if(pExtC2h->opCodeVer != pH2c->opCodeVer) + { + c2hStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; + DBG_8192C("[MPT], Error!! OPCode version L mismatch!!\n"); + } + + return c2hStatus; +} + +extern s32 FillH2CCmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer); + +BT_CTRL_STATUS +mptbt_SendH2c( + PADAPTER Adapter, + PBT_H2C pH2c, + u2Byte h2cCmdLen + ) +{ + //KIRQL OldIrql = KeGetCurrentIrql(); + BT_CTRL_STATUS h2cStatus=BT_STATUS_H2C_SUCCESS; + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + u1Byte i; + + DBG_8192C("[MPT], mptbt_SendH2c()=========>\n"); + + //PlatformResetEvent(&pMptCtx->MptH2cRspEvent); + //PlatformResetEvent(&pMptCtx->MptBtC2hEvent); + +// if(OldIrql == PASSIVE_LEVEL) +// { + //RTPRINT_DATA(FMPBT, FMPBT_H2C_CONTENT, ("[MPT], MPT H2C hex: \n"), pH2c, h2cCmdLen); + + for(i=0; ih2cReqNum++; + pMptCtx->h2cReqNum %= 16; + + if(WaitC2Hevent(Adapter, &pMptCtx->MptH2cRspEvent, 200)) + { + DBG_8192C("[MPT], Received WiFi MptH2cRspEvent!!!\n"); + if(WaitC2Hevent(Adapter, &pMptCtx->MptBtC2hEvent, 800)) + { + DBG_8192C("[MPT], Received BT MptBtC2hEvent!!!\n"); + break; + } + else + { + DBG_8192C("[MPT], Error!!BT MptBtC2hEvent timeout!!\n"); + h2cStatus = BT_STATUS_H2C_BT_NO_RSP; + } + } + else + { + DBG_8192C("[MPT], Error!!WiFi MptH2cRspEvent timeout!!\n"); + h2cStatus = BT_STATUS_H2C_TIMTOUT; + } + } +// } +// else +// { +// RT_ASSERT(FALSE, ("[MPT], mptbt_SendH2c() can only run under PASSIVE_LEVEL!!\n")); +// h2cStatus = BT_STATUS_WRONG_LEVEL; +// } + + DBG_8192C("[MPT], mptbt_SendH2c()<=========\n"); + return h2cStatus; +} + + + +BT_CTRL_STATUS +mptbt_CheckBtRspStatus( + PADAPTER Adapter, + PBT_EXT_C2H pExtC2h + ) +{ + BT_CTRL_STATUS retStatus=BT_OP_STATUS_SUCCESS; + + switch(pExtC2h->statusCode) + { + case BT_OP_STATUS_SUCCESS: + retStatus = BT_STATUS_BT_OP_SUCCESS; + DBG_8192C("[MPT], BT status : BT_STATUS_SUCCESS\n"); + break; + case BT_OP_STATUS_VERSION_MISMATCH: + retStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH; + DBG_8192C("[MPT], BT status : BT_STATUS_OPCODE_L_VERSION_MISMATCH\n"); + break; + case BT_OP_STATUS_UNKNOWN_OPCODE: + retStatus = BT_STATUS_UNKNOWN_OPCODE_L; + DBG_8192C("[MPT], BT status : BT_STATUS_UNKNOWN_OPCODE_L\n"); + break; + case BT_OP_STATUS_ERROR_PARAMETER: + retStatus = BT_STATUS_PARAMETER_FORMAT_ERROR_L; + DBG_8192C("[MPT], BT status : BT_STATUS_PARAMETER_FORMAT_ERROR_L\n"); + break; + default: + retStatus = BT_STATUS_UNKNOWN_STATUS_L; + DBG_8192C("[MPT], BT status : BT_STATUS_UNKNOWN_STATUS_L\n"); + break; + } + + return retStatus; +} + + + +BT_CTRL_STATUS +mptbt_BtFwOpCodeProcess( + PADAPTER Adapter, + u1Byte btFwOpCode, + u1Byte opCodeVer, + pu1Byte pH2cPar, + u1Byte h2cParaLen + ) +{ + u1Byte H2C_Parameter[6] ={0}; + PBT_H2C pH2c=(PBT_H2C)&H2C_Parameter[0]; + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; + u2Byte paraLen=0,i; + BT_CTRL_STATUS h2cStatus=BT_STATUS_H2C_SUCCESS, c2hStatus=BT_STATUS_C2H_SUCCESS; + BT_CTRL_STATUS retStatus=BT_STATUS_H2C_BT_NO_RSP; + + pH2c->opCode = btFwOpCode; + pH2c->opCodeVer = opCodeVer; + pH2c->reqNum = pMptCtx->h2cReqNum; + //PlatformMoveMemory(&pH2c->buf[0], pH2cPar, h2cParaLen); + //_rtw_memcpy(&pH2c->buf[0], pH2cPar, h2cParaLen); + _rtw_memcpy(pH2c->buf, pH2cPar, h2cParaLen); + + DBG_8192C("[MPT], pH2c->opCode=%d\n", pH2c->opCode); + DBG_8192C("[MPT], pH2c->opCodeVer=%d\n", pH2c->opCodeVer); + DBG_8192C("[MPT], pH2c->reqNum=%d\n", pH2c->reqNum); + DBG_8192C("[MPT], h2c parameter length=%d\n", h2cParaLen); + if(h2cParaLen) + { + DBG_8192C("[MPT], parameters(hex): \n"); + for(i=0;ibuf[i]); + } + } + + h2cStatus = mptbt_SendH2c(Adapter, pH2c, h2cParaLen+2); + if(BT_STATUS_H2C_SUCCESS == h2cStatus) + { + // if reach here, it means H2C get the correct c2h response, + c2hStatus = mptbt_CheckC2hFrame(Adapter, pH2c, pExtC2h); + if(BT_STATUS_C2H_SUCCESS == c2hStatus) + { + retStatus = mptbt_CheckBtRspStatus(Adapter, pExtC2h); + } + else + { + DBG_8192C("[MPT], Error!! C2H failed for pH2c->opCode=%d\n", pH2c->opCode); + // check c2h status error, return error status code to upper layer. + retStatus = c2hStatus; + } + } + else + { + DBG_8192C("[MPT], Error!! H2C failed for pH2c->opCode=%d\n", pH2c->opCode); + // check h2c status error, return error status code to upper layer. + retStatus = h2cStatus; + } + + return retStatus; +} + + + + +u2Byte +mptbt_BtReady( + PADAPTER Adapter, + PBT_REQ_CMD pBtReq, + PBT_RSP_CMD pBtRsp + ) +{ + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; + u1Byte i; + u1Byte btFwVer=0, bdAddr[6]={0}; + u2Byte btRealFwVer=0; + pu2Byte pu2Tmp=NULL; + + // + // check upper layer parameters + // + + // 1. check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + + pBtRsp->pParamStart[0] = MP_BT_NOT_READY; + paraLen = 10; + // + // execute lower layer opcodes + // + + // Get BT FW version + // fill h2c parameters + btOpcode = BT_LO_OP_GET_BT_VERSION; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + else + { + pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; + btRealFwVer = *pu2Tmp; + btFwVer = pExtC2h->buf[1]; + DBG_8192C("[MPT], btRealFwVer=0x%x, btFwVer=0x%x\n", btRealFwVer, btFwVer); + } + + // Get BD Address + // fill h2c parameters + btOpcode = BT_LO_OP_GET_BD_ADDR_L; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + else + { + bdAddr[5] = pExtC2h->buf[0]; + bdAddr[4] = pExtC2h->buf[1]; + bdAddr[3] = pExtC2h->buf[2]; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_GET_BD_ADDR_H; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + else + { + bdAddr[2] = pExtC2h->buf[0]; + bdAddr[1] = pExtC2h->buf[1]; + bdAddr[0] = pExtC2h->buf[2]; + } + DBG_8192C("[MPT], Local BDAddr:"); + for(i=0; i<6; i++) + { + DBG_8192C(" 0x%x ", bdAddr[i]); + } + pBtRsp->status = BT_STATUS_SUCCESS; + pBtRsp->pParamStart[0] = MP_BT_READY; + pu2Tmp = (pu2Byte)&pBtRsp->pParamStart[1]; + *pu2Tmp = btRealFwVer; + pBtRsp->pParamStart[3] = btFwVer; + for(i=0; i<6; i++) + { + pBtRsp->pParamStart[4+i] = bdAddr[5-i]; + } + + return paraLen; +} + +void mptbt_close_WiFiRF(PADAPTER Adapter) +{ + PHY_SetBBReg(Adapter, 0x824, 0xF, 0x0); + PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x0); + PHY_SetRFReg(Adapter, RF90_PATH_A, 0x0, 0xF0000, 0x0); +} + +void mptbt_open_WiFiRF(PADAPTER Adapter) +{ + PHY_SetBBReg(Adapter, 0x824, 0x700000, 0x3); + PHY_SetBBReg(Adapter, 0x824, 0xF, 0x2); + PHY_SetRFReg(Adapter, RF90_PATH_A, 0x0, 0xF0000, 0x3); +} + +u4Byte mptbt_switch_RF(PADAPTER Adapter, u1Byte Enter) +{ + u2Byte tmp_2byte = 0; + + //Enter test mode + if (Enter) { + ////1>. close WiFi RF + mptbt_close_WiFiRF(Adapter); + + ////2>. change ant switch to BT + tmp_2byte = rtw_read16(Adapter, 0x860); + tmp_2byte = tmp_2byte | BIT(9); + tmp_2byte = tmp_2byte & (~BIT(8)); + rtw_write16(Adapter, 0x860, tmp_2byte); + rtw_write16(Adapter, 0x870, 0x300); + } else { + ////1>. Open WiFi RF + mptbt_open_WiFiRF(Adapter); + + ////2>. change ant switch back + tmp_2byte = rtw_read16(Adapter, 0x860); + tmp_2byte = tmp_2byte | BIT(8); + tmp_2byte = tmp_2byte & (~BIT(9)); + rtw_write16(Adapter, 0x860, tmp_2byte); + rtw_write16(Adapter, 0x870, 0x300); + } + + return 0; +} + +u2Byte +mptbt_BtSetMode( + PADAPTER Adapter, + PBT_REQ_CMD pBtReq, + PBT_RSP_CMD pBtRsp + ) +{ + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + u1Byte btModeToSet=0; + + // + // check upper layer parameters + // + // 1. check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + // 2. check upper layer parameter length + if(1 == pBtReq->paraLength) + { + btModeToSet = pBtReq->pParamStart[0]; + DBG_8192C("[MPT], BtTestMode=%d \n", btModeToSet); + } + else + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + // + // execute lower layer opcodes + // + + // 1. fill h2c parameters + // check bt mode + btOpcode = BT_LO_OP_SET_BT_MODE; + if(btModeToSet >= MP_BT_MODE_MAX) + { + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + mptbt_switch_RF(Adapter, 1); + + h2cParaBuf[0] = btModeToSet; + h2cParaLen = 1; + // 2. execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // 3. construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS == retStatus) + { + pBtRsp->status = BT_STATUS_SUCCESS; + } + else + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + } + + return paraLen; +} + + +VOID +MPTBT_FwC2hBtMpCtrl( + PADAPTER Adapter, + pu1Byte tmpBuf, + u1Byte length + ) +{ + u32 i; + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)tmpBuf; + + if(Adapter->bBTFWReady == _FALSE || Adapter->registrypriv.mp_mode == 0 ) + { + DBG_8192C("[MPT], %s,bBTFWReady == _FALSE\n",__func__); + return; + } + //cancel_timeout for h2c handle + _cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer); + + DBG_8192C("[MPT], MPTBT_FwC2hBtMpCtrl(), hex: \n"); + for(i=0;i<=length;i++) + { + //DBG_8192C("[MPT], MPTBT_FwC2hBtMpCtrl(), hex: \n",tmpBuf[i], length); + DBG_8192C(" 0x%x ",tmpBuf[i]); + } + DBG_8192C("\n [MPT], pExtC2h->extendId=0x%x\n", pExtC2h->extendId); + + switch(pExtC2h->extendId) + { + case EXT_C2H_WIFI_FW_ACTIVE_RSP: + DBG_8192C("[MPT], EXT_C2H_WIFI_FW_ACTIVE_RSP\n"); + DBG_8192C("[MPT], pExtC2h->buf hex: \n"); + if( length > 32 || length < 3 ) + break ; + for(i=0;i<=(length-3);i++) + DBG_8192C(" 0x%x ",pExtC2h->buf[i]); + //PlatformSetEvent(&pMptCtx->MptH2cRspEvent); + pMptCtx->MptH2cRspEvent=_TRUE; + _rtw_up_sema(&pMptCtx->MPh2c_Sema); + break; + case EXT_C2H_TRIG_BY_BT_FW: + DBG_8192C("[MPT], EXT_C2H_TRIG_BY_BT_FW\n"); + //PlatformMoveMemory(&pMptCtx->c2hBuf[0], tmpBuf, length); + _rtw_memcpy(&pMptCtx->c2hBuf[0], tmpBuf, length); + DBG_8192C("[MPT], pExtC2h->statusCode=0x%x\n", pExtC2h->statusCode); + DBG_8192C("[MPT], pExtC2h->retLen=0x%x\n", pExtC2h->retLen); + DBG_8192C("[MPT], pExtC2h->opCodeVer=0x%x\n", pExtC2h->opCodeVer); + DBG_8192C("[MPT], pExtC2h->reqNum=0x%x\n", pExtC2h->reqNum); + DBG_8192C("[MPT], pExtC2h->buf hex: \n"); + for(i=0;i<=(length-3);i++) + DBG_8192C(" 0x%x ",pExtC2h->buf[0]); + //PlatformSetEvent(&pMptCtx->MptBtC2hEvent); + pMptCtx->MptBtC2hEvent=_TRUE; + _rtw_up_sema(&pMptCtx->MPh2c_Sema); + break; + default: + DBG_8192C("[MPT], EXT_C2H Target not found,pExtC2h->extendId =%d ,pExtC2h->reqNum=%d\n",pExtC2h->extendId,pExtC2h->reqNum); + break; + } + + + +} + + +u2Byte +mptbt_BtGetGeneral( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp + ) +{ + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + PBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0]; + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode, bdAddr[6]={0}; + u1Byte btOpcodeVer=0; + u1Byte getType=0, i; + u2Byte getParaLen=0, validParaLen=0; + u1Byte regType=0, reportType=0; + u4Byte regAddr=0, regValue=0; + pu4Byte pu4Tmp; + pu2Byte pu2Tmp; + pu1Byte pu1Tmp; + + // + // check upper layer parameters + // + + // check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + // check upper layer parameter length + if(pBtReq->paraLength < 1) + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + getParaLen = pBtReq->paraLength - 1; + getType = pBtReq->pParamStart[0]; + + DBG_8192C("[MPT], getType=%d, getParaLen=%d\n", getType, getParaLen); + + // check parameter first + switch(getType) + { + case BT_GGET_REG: + DBG_8192C("[MPT], [BT_GGET_REG]\n"); + validParaLen = 5; + if(getParaLen == validParaLen) + { + btOpcode = BT_LO_OP_READ_REG; + regType = pBtReq->pParamStart[1]; + pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; + regAddr = *pu4Tmp; + DBG_8192C("[MPT], BT_GGET_REG regType=0x%x, regAddr=0x%x!!\n", + regType, regAddr); + if(regType >= BT_REG_MAX) + { + pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + if( ((BT_REG_RF==regType)&&(regAddr>0x7f)) || + ((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) || + ((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) || + ((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) || + ((BT_REG_LE==regType)&&(regAddr>0xfff)) ) + { + pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + } + } + break; + case BT_GGET_STATUS: + DBG_8192C("[MPT], [BT_GGET_STATUS]\n"); + validParaLen = 0; + break; + case BT_GGET_REPORT: + DBG_8192C("[MPT], [BT_GGET_REPORT]\n"); + validParaLen = 1; + if(getParaLen == validParaLen) + { + reportType = pBtReq->pParamStart[1]; + DBG_8192C("[MPT], BT_GGET_REPORT reportType=0x%x!!\n", reportType); + if(reportType >= BT_REPORT_MAX) + { + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + } + break; + default: + { + DBG_8192C("[MPT], Error!! getType=%d, out of range\n", getType); + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + break; + } + if(getParaLen != validParaLen) + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d for BT_GET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", + getParaLen, getType, validParaLen); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + // + // execute lower layer opcodes + // + if(BT_GGET_REG == getType) + { + // fill h2c parameters + // here we should write reg value first then write the address, adviced by Austin + btOpcode = BT_LO_OP_READ_REG; + h2cParaBuf[0] = regType; + h2cParaBuf[1] = pBtReq->pParamStart[2]; + h2cParaBuf[2] = pBtReq->pParamStart[3]; + h2cParaLen = 3; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + pu2Tmp = (pu2Byte)&pExtC2h->buf[0]; + regValue = *pu2Tmp; + DBG_8192C("[MPT], read reg regType=0x%x, regAddr=0x%x, regValue=0x%x\n", + regType, regAddr, regValue); + + pu4Tmp = (pu4Byte)&pBtRsp->pParamStart[0]; + *pu4Tmp = regValue; + paraLen = 4; + } + else if(BT_GGET_STATUS == getType) + { + btOpcode = BT_LO_OP_GET_BT_STATUS; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + DBG_8192C("[MPT], read bt status, testMode=0x%x, testStatus=0x%x\n", + pBtRsp->pParamStart[0], pBtRsp->pParamStart[1]); + paraLen = 2; + } + else if(BT_GGET_REPORT == getType) + { + switch(reportType) + { + case BT_REPORT_RX_PACKET_CNT: + { + DBG_8192C("[MPT], [Rx Packet Counts]\n"); + btOpcode = BT_LO_OP_GET_RX_PKT_CNT_L; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + + btOpcode = BT_LO_OP_GET_RX_PKT_CNT_H; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[2] = pExtC2h->buf[0]; + pBtRsp->pParamStart[3] = pExtC2h->buf[1]; + paraLen = 4; + } + break; + case BT_REPORT_RX_ERROR_BITS: + { + DBG_8192C("[MPT], [Rx Error Bits]\n"); + btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_L; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + + btOpcode = BT_LO_OP_GET_RX_ERROR_BITS_H; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[2] = pExtC2h->buf[0]; + pBtRsp->pParamStart[3] = pExtC2h->buf[1]; + paraLen = 4; + } + break; + case BT_REPORT_RSSI: + { + DBG_8192C("[MPT], [RSSI]\n"); + btOpcode = BT_LO_OP_GET_RSSI; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + paraLen = 2; + } + break; + case BT_REPORT_CFO_HDR_QUALITY: + { + DBG_8192C("[MPT], [CFO & Header Quality]\n"); + btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_L; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[0] = pExtC2h->buf[0]; + pBtRsp->pParamStart[1] = pExtC2h->buf[1]; + + btOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_H; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + pBtRsp->pParamStart[2] = pExtC2h->buf[0]; + pBtRsp->pParamStart[3] = pExtC2h->buf[1]; + paraLen = 4; + } + break; + case BT_REPORT_CONNECT_TARGET_BD_ADDR: + { + DBG_8192C("[MPT], [Connected Target BD ADDR]\n"); + btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_L; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + bdAddr[5] = pExtC2h->buf[0]; + bdAddr[4] = pExtC2h->buf[1]; + bdAddr[3] = pExtC2h->buf[2]; + + btOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_H; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + bdAddr[2] = pExtC2h->buf[0]; + bdAddr[1] = pExtC2h->buf[1]; + bdAddr[0] = pExtC2h->buf[2]; + + DBG_8192C("[MPT], Connected Target BDAddr:%s", bdAddr); + for(i=0; i<6; i++) + { + pBtRsp->pParamStart[i] = bdAddr[5-i]; + } + paraLen = 6; + } + break; + default: + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + break; + } + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + + +u2Byte +mptbt_BtSetGeneral( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp + ) +{ + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + u1Byte setType=0; + u2Byte setParaLen=0, validParaLen=0; + u1Byte regType=0, bdAddr[6]={0}, calVal=0; + u4Byte regAddr=0, regValue=0; + pu4Byte pu4Tmp; + pu2Byte pu2Tmp; + pu1Byte pu1Tmp; + + // + // check upper layer parameters + // + + // check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + // check upper layer parameter length + if(pBtReq->paraLength < 1) + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d (should larger than 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + setParaLen = pBtReq->paraLength - 1; + setType = pBtReq->pParamStart[0]; + + DBG_8192C("[MPT], setType=%d, setParaLen=%d\n", setType, setParaLen); + + // check parameter first + switch(setType) + { + case BT_GSET_REG: + DBG_8192C ("[MPT], [BT_GSET_REG]\n"); + validParaLen = 9; + if(setParaLen == validParaLen) + { + btOpcode = BT_LO_OP_WRITE_REG_VALUE; + regType = pBtReq->pParamStart[1]; + pu4Tmp = (pu4Byte)&pBtReq->pParamStart[2]; + regAddr = *pu4Tmp; + pu4Tmp = (pu4Byte)&pBtReq->pParamStart[6]; + regValue = *pu4Tmp; + DBG_8192C("[MPT], BT_GSET_REG regType=0x%x, regAddr=0x%x, regValue=0x%x!!\n", + regType, regAddr, regValue); + if(regType >= BT_REG_MAX) + { + pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + if( ((BT_REG_RF==regType)&&(regAddr>0x7f)) || + ((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) || + ((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) || + ((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) || + ((BT_REG_LE==regType)&&(regAddr>0xfff)) ) + { + pBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + } + } + break; + case BT_GSET_RESET: + DBG_8192C("[MPT], [BT_GSET_RESET]\n"); + validParaLen = 0; + break; + case BT_GSET_TARGET_BD_ADDR: + DBG_8192C("[MPT], [BT_GSET_TARGET_BD_ADDR]\n"); + validParaLen = 6; + if(setParaLen == validParaLen) + { + btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; + if( (pBtReq->pParamStart[1]==0) && + (pBtReq->pParamStart[2]==0) && + (pBtReq->pParamStart[3]==0) && + (pBtReq->pParamStart[4]==0) && + (pBtReq->pParamStart[5]==0) && + (pBtReq->pParamStart[6]==0) ) + { + DBG_8192C("[MPT], Error!! targetBDAddr=all zero\n"); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + if( (pBtReq->pParamStart[1]==0xff) && + (pBtReq->pParamStart[2]==0xff) && + (pBtReq->pParamStart[3]==0xff) && + (pBtReq->pParamStart[4]==0xff) && + (pBtReq->pParamStart[5]==0xff) && + (pBtReq->pParamStart[6]==0xff) ) + { + DBG_8192C("[MPT], Error!! targetBDAddr=all 0xf\n"); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + bdAddr[0] = pBtReq->pParamStart[6]; + bdAddr[1] = pBtReq->pParamStart[5]; + bdAddr[2] = pBtReq->pParamStart[4]; + bdAddr[3] = pBtReq->pParamStart[3]; + bdAddr[4] = pBtReq->pParamStart[2]; + bdAddr[5] = pBtReq->pParamStart[1]; + DBG_8192C ("[MPT], target BDAddr:%x,%x,%x,%x,%x,%x\n", + bdAddr[0],bdAddr[1],bdAddr[2],bdAddr[3],bdAddr[4],bdAddr[5]); + } + break; + case BT_GSET_TX_PWR_FINETUNE: + DBG_8192C("[MPT], [BT_GSET_TX_PWR_FINETUNE]\n"); + validParaLen = 1; + if(setParaLen == validParaLen) + { + btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; + calVal = pBtReq->pParamStart[1]; + if( (calVal<1) || (calVal>9) ) + { + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + DBG_8192C ("[MPT], calVal=%d\n", calVal); + } + break; + case BT_SET_TRACKING_INTERVAL: + DBG_871X("[MPT], [BT_SET_TRACKING_INTERVAL] setParaLen =%d \n",setParaLen); + + validParaLen = 1; + if(setParaLen == validParaLen) + calVal = pBtReq->pParamStart[1]; + break; + case BT_SET_THERMAL_METER: + DBG_871X("[MPT], [BT_SET_THERMAL_METER] setParaLen =%d \n",setParaLen); + validParaLen = 1; + if(setParaLen == validParaLen) + calVal = pBtReq->pParamStart[1]; + break; + case BT_ENABLE_CFO_TRACKING: + DBG_871X("[MPT], [BT_ENABLE_CFO_TRACKING] setParaLen =%d \n",setParaLen); + validParaLen = 1; + if(setParaLen == validParaLen) + calVal = pBtReq->pParamStart[1]; + break; + case BT_GSET_UPDATE_BT_PATCH: + if(IS_HARDWARE_TYPE_8723AE(Adapter) && Adapter->bFWReady) + { + u1Byte i; + DBG_8192C ("[MPT], write regs for load patch\n"); + //BTFwPatch8723A(Adapter); + PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x2d); + rtw_msleep_os(50); + PlatformEFIOWrite4Byte(Adapter, 0x68, 0xa005000c); + rtw_msleep_os(50); + PlatformEFIOWrite4Byte(Adapter, 0x68, 0xb005000c); + rtw_msleep_os(50); + PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x29); + for(i=0; i<12; i++) + rtw_msleep_os(100); +//#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) +// BTFwPatch8723A(Adapter); +//#endif + DBG_8192C("[MPT], load BT FW Patch finished!!!\n"); + } + break; + default: + { + DBG_8192C ("[MPT], Error!! setType=%d, out of range\n", setType); + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + break; + } + if(setParaLen != validParaLen) + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d for BT_SET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\n", + setParaLen, setType, validParaLen); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + // + // execute lower layer opcodes + // + if(BT_GSET_REG == setType) + { + // fill h2c parameters + // here we should write reg value first then write the address, adviced by Austin + btOpcode = BT_LO_OP_WRITE_REG_VALUE; + h2cParaBuf[0] = pBtReq->pParamStart[6]; + h2cParaBuf[1] = pBtReq->pParamStart[7]; + h2cParaBuf[2] = pBtReq->pParamStart[8]; + h2cParaLen = 3; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // write reg address + btOpcode = BT_LO_OP_WRITE_REG_ADDR; + h2cParaBuf[0] = regType; + h2cParaBuf[1] = pBtReq->pParamStart[2]; + h2cParaBuf[2] = pBtReq->pParamStart[3]; + h2cParaLen = 3; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + else if(BT_GSET_RESET == setType) + { + btOpcode = BT_LO_OP_RESET; + h2cParaLen = 0; + // execute h2c and check respond c2h from bt fw is correct or not + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + else if(BT_GSET_TARGET_BD_ADDR == setType) + { + // fill h2c parameters + btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_L; + h2cParaBuf[0] = pBtReq->pParamStart[1]; + h2cParaBuf[1] = pBtReq->pParamStart[2]; + h2cParaBuf[2] = pBtReq->pParamStart[3]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + btOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H; + h2cParaBuf[0] = pBtReq->pParamStart[4]; + h2cParaBuf[1] = pBtReq->pParamStart[5]; + h2cParaBuf[2] = pBtReq->pParamStart[6]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + else if(BT_GSET_TX_PWR_FINETUNE == setType) + { + // fill h2c parameters + btOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION; + h2cParaBuf[0] = calVal; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + else if(BT_SET_TRACKING_INTERVAL == setType) + { + // BT_LO_OP_SET_TRACKING_INTERVAL = 0x22, + // BT_LO_OP_SET_THERMAL_METER = 0x23, + // BT_LO_OP_ENABLE_CFO_TRACKING = 0x24, + btOpcode = BT_LO_OP_SET_TRACKING_INTERVAL; + h2cParaBuf[0] = calVal; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + else if(BT_SET_THERMAL_METER == setType) + { + btOpcode = BT_LO_OP_SET_THERMAL_METER; + h2cParaBuf[0] = calVal; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + else if(BT_ENABLE_CFO_TRACKING == setType) + { + btOpcode = BT_LO_OP_ENABLE_CFO_TRACKING; + h2cParaBuf[0] = calVal; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + + +u2Byte +mptbt_BtSetTxRxPars( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp + ) +{ + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + PBT_TXRX_PARAMETERS pTxRxPars=(PBT_TXRX_PARAMETERS)&pBtReq->pParamStart[0]; + u2Byte lenTxRx=sizeof(BT_TXRX_PARAMETERS); + u1Byte i; + u1Byte bdAddr[6]={0}; + + // + // check upper layer parameters + // + + // 1. check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + // 2. check upper layer parameter length + if(pBtReq->paraLength == sizeof(BT_TXRX_PARAMETERS)) + { + DBG_8192C ("[MPT], pTxRxPars->txrxChannel=0x%x \n", pTxRxPars->txrxChannel); + DBG_8192C ("[MPT], pTxRxPars->txrxTxPktCnt=0x%8x \n", pTxRxPars->txrxTxPktCnt); + DBG_8192C ("[MPT], pTxRxPars->txrxTxPktInterval=0x%x \n", pTxRxPars->txrxTxPktInterval); + DBG_8192C ("[MPT], pTxRxPars->txrxPayloadType=0x%x \n", pTxRxPars->txrxPayloadType); + DBG_8192C ("[MPT], pTxRxPars->txrxPktType=0x%x \n", pTxRxPars->txrxPktType); + DBG_8192C ("[MPT], pTxRxPars->txrxPayloadLen=0x%x \n", pTxRxPars->txrxPayloadLen); + DBG_8192C ("[MPT], pTxRxPars->txrxPktHeader=0x%x \n", pTxRxPars->txrxPktHeader); + DBG_8192C ("[MPT], pTxRxPars->txrxWhitenCoeff=0x%x \n", pTxRxPars->txrxWhitenCoeff); + bdAddr[0] = pTxRxPars->txrxBdaddr[5]; + bdAddr[1] = pTxRxPars->txrxBdaddr[4]; + bdAddr[2] = pTxRxPars->txrxBdaddr[3]; + bdAddr[3] = pTxRxPars->txrxBdaddr[2]; + bdAddr[4] = pTxRxPars->txrxBdaddr[1]; + bdAddr[5] = pTxRxPars->txrxBdaddr[0]; + DBG_8192C ("[MPT], pTxRxPars->txrxBdaddr: %s", &bdAddr[0]); + DBG_8192C ("[MPT], pTxRxPars->txrxTxGainIndex=0x%x \n", pTxRxPars->txrxTxGainIndex); + } + else + { + DBG_8192C ("[MPT], Error!! pBtReq->paraLength=%d, correct Len=%d\n", pBtReq->paraLength, lenTxRx); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + // + // execute lower layer opcodes + // + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_PKT_HEADER; + if(pTxRxPars->txrxPktHeader > 0x3ffff) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPktHeader=0x%x is out of range, (should be between 0x0~0x3ffff)\n", pTxRxPars->txrxPktHeader); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + h2cParaBuf[0] = (u1Byte)(pTxRxPars->txrxPktHeader&0xff); + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff00)>>8); + h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff0000)>>16); + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_PKT_TYPE_LEN; + { + u2Byte payloadLenLimit=0; + switch(pTxRxPars->txrxPktType) + { + case MP_BT_PKT_DH1: + payloadLenLimit = 27*8; + break; + case MP_BT_PKT_DH3: + payloadLenLimit = 183*8; + break; + case MP_BT_PKT_DH5: + payloadLenLimit = 339*8; + break; + case MP_BT_PKT_2DH1: + payloadLenLimit = 54*8; + break; + case MP_BT_PKT_2DH3: + payloadLenLimit = 367*8; + break; + case MP_BT_PKT_2DH5: + payloadLenLimit = 679*8; + break; + case MP_BT_PKT_3DH1: + payloadLenLimit = 83*8; + break; + case MP_BT_PKT_3DH3: + payloadLenLimit = 552*8; + break; + case MP_BT_PKT_3DH5: + payloadLenLimit = 1021*8; + break; + case MP_BT_PKT_LE: + payloadLenLimit = 39*8; + break; + default: + { + DBG_8192C ("[MPT], Error!! Unknown pTxRxPars->txrxPktType=0x%x\n", pTxRxPars->txrxPktType); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + break; + } + + if(pTxRxPars->txrxPayloadLen > payloadLenLimit) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPayloadLen=0x%x, (should smaller than %d)\n", + pTxRxPars->txrxPayloadLen, payloadLenLimit); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + + h2cParaBuf[0] = pTxRxPars->txrxPktType; + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff)); + h2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff00)>>8); + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_PKT_CNT_L_PL_TYPE; + if(pTxRxPars->txrxPayloadType > MP_BT_PAYLOAD_MAX) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxPayloadType=0x%x, (should be between 0~4)\n", pTxRxPars->txrxPayloadType); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff)); + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff00)>>8); + h2cParaBuf[2] = pTxRxPars->txrxPayloadType; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_PKT_CNT_H_PKT_INTV; + if(pTxRxPars->txrxTxPktInterval > 15) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxTxPktInterval=0x%x, (should be between 0~15)\n", pTxRxPars->txrxTxPktInterval); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + h2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff0000)>>16); + h2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff000000)>>24); + h2cParaBuf[2] = pTxRxPars->txrxTxPktInterval; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_WHITENCOEFF; + { + h2cParaBuf[0] = pTxRxPars->txrxWhitenCoeff; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_CHNL_TX_GAIN; + if( (pTxRxPars->txrxChannel > 78) || + (pTxRxPars->txrxTxGainIndex > 7) ) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxChannel=0x%x, (should be between 0~78)\n", pTxRxPars->txrxChannel); + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxTxGainIndex=0x%x, (should be between 0~7)\n", pTxRxPars->txrxTxGainIndex); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + h2cParaBuf[0] = pTxRxPars->txrxChannel; + h2cParaBuf[1] = pTxRxPars->txrxTxGainIndex; + h2cParaLen = 2; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + // fill h2c parameters + btOpcode = BT_LO_OP_SET_BD_ADDR_L; + if( (pTxRxPars->txrxBdaddr[0]==0) && + (pTxRxPars->txrxBdaddr[1]==0) && + (pTxRxPars->txrxBdaddr[2]==0) && + (pTxRxPars->txrxBdaddr[3]==0) && + (pTxRxPars->txrxBdaddr[4]==0) && + (pTxRxPars->txrxBdaddr[5]==0) ) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxBdaddr=all zero\n"); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + if( (pTxRxPars->txrxBdaddr[0]==0xff) && + (pTxRxPars->txrxBdaddr[1]==0xff) && + (pTxRxPars->txrxBdaddr[2]==0xff) && + (pTxRxPars->txrxBdaddr[3]==0xff) && + (pTxRxPars->txrxBdaddr[4]==0xff) && + (pTxRxPars->txrxBdaddr[5]==0xff) ) + { + DBG_8192C ("[MPT], Error!! pTxRxPars->txrxBdaddr=all 0xf\n"); + pBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + + { + h2cParaBuf[0] = pTxRxPars->txrxBdaddr[0]; + h2cParaBuf[1] = pTxRxPars->txrxBdaddr[1]; + h2cParaBuf[2] = pTxRxPars->txrxBdaddr[2]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + btOpcode = BT_LO_OP_SET_BD_ADDR_H; + { + h2cParaBuf[0] = pTxRxPars->txrxBdaddr[3]; + h2cParaBuf[1] = pTxRxPars->txrxBdaddr[4]; + h2cParaBuf[2] = pTxRxPars->txrxBdaddr[5]; + h2cParaLen = 3; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + // ckeck bt return status. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C ("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + + +u2Byte +mptbt_BtTestCtrl( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp + ) +{ + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + u1Byte testCtrl=0; + + // + // check upper layer parameters + // + + // 1. check upper layer opcode version + if(pBtReq->opCodeVer != 1) + { + DBG_8192C("[MPT], Error!! Upper OP code version not match!!!\n"); + pBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH; + return paraLen; + } + // 2. check upper layer parameter length + if(1 == pBtReq->paraLength) + { + testCtrl = pBtReq->pParamStart[0]; + DBG_8192C("[MPT], testCtrl=%d \n", testCtrl); + } + else + { + DBG_8192C("[MPT], Error!! wrong parameter length=%d (should be 1)\n", pBtReq->paraLength); + pBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U; + return paraLen; + } + + // + // execute lower layer opcodes + // + + // 1. fill h2c parameters + // check bt mode + btOpcode = BT_LO_OP_TEST_CTRL; + if(testCtrl >= MP_BT_TEST_MAX) + { + DBG_8192C("[MPT], Error!! testCtrl=0x%x, (should be between smaller or equal to 0x%x)\n", + testCtrl, MP_BT_TEST_MAX-1); + pBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U; + return paraLen; + } + else + { + h2cParaBuf[0] = testCtrl; + h2cParaLen = 1; + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + } + + // 3. construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + + +u2Byte +mptbt_TestBT( + IN PADAPTER Adapter, + IN PBT_REQ_CMD pBtReq, + IN PBT_RSP_CMD pBtRsp + ) +{ + + u1Byte h2cParaBuf[6] ={0}; + u1Byte h2cParaLen=0; + u2Byte paraLen=0; + u1Byte retStatus=BT_STATUS_BT_OP_SUCCESS; + u1Byte btOpcode; + u1Byte btOpcodeVer=0; + u1Byte testCtrl=0; + + // 1. fill h2c parameters + btOpcode = 0x11; + h2cParaBuf[0] = 0x11; + h2cParaBuf[1] = 0x0; + h2cParaBuf[2] = 0x0; + h2cParaBuf[3] = 0x0; + h2cParaBuf[4] = 0x0; + h2cParaLen = 1; + // retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen); + retStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, h2cParaBuf, h2cParaLen); + + + // 3. construct respond status code and data. + if(BT_STATUS_BT_OP_SUCCESS != retStatus) + { + pBtRsp->status = ((btOpcode<<8)|retStatus); + DBG_8192C("[MPT], Error!! status code=0x%x \n", pBtRsp->status); + return paraLen; + } + + pBtRsp->status = BT_STATUS_SUCCESS; + return paraLen; +} + +VOID +mptbt_BtControlProcess( + PADAPTER Adapter, + PVOID pInBuf + ) +{ + u1Byte H2C_Parameter[6] ={0}; + PBT_H2C pH2c=(PBT_H2C)&H2C_Parameter[0]; + PMPT_CONTEXT pMptCtx=&(Adapter->mppriv.MptCtx); + PBT_REQ_CMD pBtReq=(PBT_REQ_CMD)pInBuf; + PBT_RSP_CMD pBtRsp=(PBT_RSP_CMD)&pMptCtx->mptOutBuf[0]; + u1Byte i; + + DBG_8192C("[MPT], mptbt_BtControlProcess()=========>\n"); + + DBG_8192C("[MPT], input opCodeVer=%d\n", pBtReq->opCodeVer); + DBG_8192C("[MPT], input OpCode=%d\n", pBtReq->OpCode); + DBG_8192C("[MPT], paraLength=%d \n", pBtReq->paraLength); + if(pBtReq->paraLength) + { + //DBG_8192C("[MPT], parameters(hex):0x%x %d \n",&pBtReq->pParamStart[0], pBtReq->paraLength); + } + + // The following we should maintain the User OP codes sent by upper layer + + pBtRsp->status = BT_STATUS_SUCCESS; + pMptCtx->mptOutLen = 4; //length of (BT_RSP_CMD.status+BT_RSP_CMD.paraLength) + pBtRsp->paraLength = 0x0; + + _rtw_memset((PVOID)&pMptCtx->mptOutBuf[0], '\0',100); + + switch(pBtReq->OpCode) + { + case BT_UP_OP_BT_READY: + DBG_8192C("[MPT], OPcode : [BT_READY]\n"); + pBtRsp->paraLength = mptbt_BtReady(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_SET_MODE: + DBG_8192C("[MPT], OPcode : [BT_SET_MODE]\n"); + pBtRsp->paraLength = mptbt_BtSetMode(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_SET_TX_RX_PARAMETER: + DBG_8192C("[MPT], OPcode : [BT_SET_TXRX_PARAMETER]\n"); + pBtRsp->paraLength = mptbt_BtSetTxRxPars(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_SET_GENERAL: + DBG_8192C("[MPT], OPcode : [BT_SET_GENERAL]\n"); + pBtRsp->paraLength = mptbt_BtSetGeneral(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_GET_GENERAL: + DBG_8192C("[MPT], OPcode : [BT_GET_GENERAL]\n"); + pBtRsp->paraLength = mptbt_BtGetGeneral(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_BT_TEST_CTRL: + DBG_8192C("[MPT], OPcode : [BT_TEST_CTRL]\n"); + pBtRsp->paraLength = mptbt_BtTestCtrl(Adapter, pBtReq, pBtRsp); + break; + case BT_UP_OP_TEST_BT: + DBG_8192C("[MPT], OPcode : [TEST_BT]\n"); + pBtRsp->paraLength = mptbt_TestBT(Adapter, pBtReq, pBtRsp); + break; + default: + DBG_8192C("[MPT], Error!! OPcode : UNDEFINED!!!!\n"); + pBtRsp->status = BT_STATUS_UNKNOWN_OPCODE_U; + pBtRsp->paraLength = 0x0; + break; + } + + DBG_8192C("pBtRsp->paraLength =%d \n",pBtRsp->paraLength); + + pMptCtx->mptOutLen += pBtRsp->paraLength; + + DBG_8192C("\n [MPT], OUT to DLL pMptCtx->mptOutLen=%d ,pBtRsp->paraLength =%d ",pMptCtx->mptOutLen,pBtRsp->paraLength); + + DBG_8192C("\n [MPT], mptbt_BtControlProcess()<=========\n"); +} + +#endif + diff --git a/drivers/net/wireless/rtl8723as/core/rtw_cmd.c b/drivers/net/wireless/rtl8723as/core/rtw_cmd.c index 75d1e766c698..5da4fb23be54 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_cmd.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_cmd.c @@ -182,6 +182,7 @@ _func_enter_; rtw_mfree(c2h, 16); } } + rtw_cbuf_free(pevtpriv->c2h_queue); #endif RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("-_rtw_free_evt_priv \n")); @@ -309,7 +310,7 @@ int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) #ifdef SUPPORT_HW_RFOFF_DETECTED //To decide allow or not - if( (pcmdpriv->padapter->pwrctrlpriv.bHWPwrPindetect) + if( (adapter_to_pwrctl(pcmdpriv->padapter)->bHWPwrPindetect) &&(!pcmdpriv->padapter->registrypriv.usbss_enable) ) { @@ -426,6 +427,18 @@ _func_enter_; _func_exit_; } + +void rtw_stop_cmd_thread(_adapter *adapter) +{ + if(adapter->cmdThread && adapter->cmdpriv.cmdthd_running == _TRUE + && adapter->cmdpriv.stop_req == 0) + { + adapter->cmdpriv.stop_req = 1; + _rtw_up_sema(&adapter->cmdpriv.cmd_queue_sema); + _rtw_down_sema(&adapter->cmdpriv.terminate_cmdthread_sema); + } +} + thread_return rtw_cmd_thread(thread_context context) { u8 ret; @@ -443,6 +456,7 @@ _func_enter_; pcmdbuf = pcmdpriv->cmd_buf; prspbuf = pcmdpriv->rsp_buf; + pcmdpriv->stop_req = 0; pcmdpriv->cmdthd_running=_TRUE; _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema); @@ -450,16 +464,29 @@ _func_enter_; while(1) { - if (_rtw_down_sema(&pcmdpriv->cmd_queue_sema) == _FAIL) + if (_rtw_down_sema(&pcmdpriv->cmd_queue_sema) == _FAIL) { + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" _rtw_down_sema(&pcmdpriv->cmd_queue_sema) return _FAIL, break\n", FUNC_ADPT_ARG(padapter)); break; + } if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved == _TRUE)) { - DBG_871X("%s: DriverStopped(%d) SurpriseRemoved(%d) break at line %d\n", + DBG_871X_LEVEL(_drv_always_, "%s: DriverStopped(%d) SurpriseRemoved(%d) break at line %d\n", __FUNCTION__, padapter->bDriverStopped, padapter->bSurpriseRemoved, __LINE__); break; } + if (pcmdpriv->stop_req) { + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" stop_req:%u, break\n", FUNC_ADPT_ARG(padapter), pcmdpriv->stop_req); + break; + } + + if(rtw_is_list_empty(&(pcmdpriv->cmd_queue.queue))) + { + //DBG_871X("%s: cmd queue is empty!\n", __func__); + continue; + } + #ifdef CONFIG_LPS_LCLK if (rtw_register_cmd_alive(padapter) != _SUCCESS) { @@ -472,7 +499,7 @@ _func_enter_; _next: if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) { - DBG_871X("%s: DriverStopped(%d) SurpriseRemoved(%d) break at line %d\n", + DBG_871X_LEVEL(_drv_always_, "%s: DriverStopped(%d) SurpriseRemoved(%d) break at line %d\n", __FUNCTION__, padapter->bDriverStopped, padapter->bSurpriseRemoved, __LINE__); break; } @@ -774,7 +801,7 @@ _func_enter_; #ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE if((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE) - _set_timer(&pmlmepriv->scan_to_timer, SURVEY_TO * ( 38 + ( 38 / RTW_SCAN_NUM_OF_CH ) * RTW_STAY_AP_CH_MILLISECOND ) + 1000 ); + _set_timer(&pmlmepriv->scan_to_timer, SURVEY_TO * ( padapter->mlmeextpriv.max_chan_nums + ( padapter->mlmeextpriv.max_chan_nums / RTW_SCAN_NUM_OF_CH ) * RTW_STAY_AP_CH_MILLISECOND ) + 1000 ); else #endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE _set_timer(&pmlmepriv->scan_to_timer, SCANNING_TIMEOUT); @@ -1302,11 +1329,11 @@ _func_enter_; pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->network.IEs, pnetwork->network.IELength); if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_TENDA) - padapter->pwrctrlpriv.smart_ps = 0; + adapter_to_pwrctl(padapter)->smart_ps = 0; else - padapter->pwrctrlpriv.smart_ps = padapter->registrypriv.smart_ps; + adapter_to_pwrctl(padapter)->smart_ps = padapter->registrypriv.smart_ps; - DBG_871X("%s: smart_ps=%d\n", __func__, padapter->pwrctrlpriv.smart_ps); + DBG_871X("%s: smart_ps=%d\n", __func__, adapter_to_pwrctl(padapter)->smart_ps); #if 0 psecuritypriv->supplicant_ie[0]=(u8)psecnetwork->IELength; @@ -1400,7 +1427,7 @@ _func_exit_; return res; } -u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype) +u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype, bool enqueue) { struct cmd_obj* ph2c; struct setopmode_parm* psetop; @@ -1409,25 +1436,29 @@ u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE net u8 res=_SUCCESS; _func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FALSE; - goto exit; - } psetop = (struct setopmode_parm*)rtw_zmalloc(sizeof(struct setopmode_parm)); - if(psetop==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res=_FALSE; + if(psetop==NULL){ + res=_FAIL; goto exit; } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_); psetop->mode = (u8)networktype; + + if(enqueue){ + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + rtw_mfree((u8 *)psetop, sizeof(*psetop)); + res= _FAIL; + goto exit; + } - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - + init_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } + else{ + setopmode_hdl(padapter, (u8 *)psetop); + rtw_mfree((u8 *)psetop, sizeof(*psetop)); + } exit: _func_exit_; @@ -1435,7 +1466,7 @@ _func_exit_; return res; } -u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key) +u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key, bool enqueue) { struct cmd_obj* ph2c; struct set_stakey_parm *psetstakey_para; @@ -1449,40 +1480,21 @@ u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key) _func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if ( ph2c == NULL){ - res= _FAIL; - goto exit; - } - psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); - if(psetstakey_para==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + if(psetstakey_para==NULL){ res=_FAIL; goto exit; } - - psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp)); - if(psetstakey_rsp == NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); - res=_FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); - ph2c->rsp = (u8 *) psetstakey_rsp; - ph2c->rspsz = sizeof(struct set_stakey_rsp); - + _rtw_memcpy(psetstakey_para->addr, sta->hwaddr,ETH_ALEN); - + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)){ #ifdef CONFIG_TDLS if(sta->tdls_sta_state&TDLS_LINKED_STATE) psetstakey_para->algorithm=(u8)sta->dot118021XPrivacy; else #endif //CONFIG_TDLS - psetstakey_para->algorithm =(unsigned char) psecuritypriv->dot11PrivacyAlgrthm; + psetstakey_para->algorithm =(unsigned char) psecuritypriv->dot11PrivacyAlgrthm; }else{ GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, _FALSE); } @@ -1494,15 +1506,40 @@ _func_enter_; else #endif //CONFIG_TDLS _rtw_memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16); - } else { + } + else { _rtw_memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16); - } + } //jeff: set this becasue at least sw key is ready padapter->securitypriv.busetkipkey=_TRUE; - res = rtw_enqueue_cmd(pcmdpriv, ph2c); + if(enqueue) + { + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if ( ph2c == NULL){ + rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); + res= _FAIL; + goto exit; + } + psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp)); + if(psetstakey_rsp == NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); + res=_FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); + ph2c->rsp = (u8 *) psetstakey_rsp; + ph2c->rspsz = sizeof(struct set_stakey_rsp); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } + else{ + set_stakey_hdl(padapter, (u8 *)psetstakey_para); + rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); + } exit: _func_exit_; @@ -1727,6 +1764,86 @@ _func_exit_; return res; } +//add for CONFIG_IEEE80211W, none 11w can use it +u8 rtw_reset_securitypriv_cmd(_adapter*padapter) +{ + struct cmd_obj* ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = RESET_SECURITYPRIV; + pdrvextra_cmd_parm->type_size = 0; + pdrvextra_cmd_parm->pbuf = (u8 *)padapter; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + + //rtw_enqueue_cmd(pcmdpriv, ph2c); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; + +} + +u8 rtw_free_assoc_resources_cmd(_adapter*padapter) +{ + struct cmd_obj* ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = FREE_ASSOC_RESOURCES; + pdrvextra_cmd_parm->type_size = 0; + pdrvextra_cmd_parm->pbuf = (u8 *)padapter; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + + //rtw_enqueue_cmd(pcmdpriv, ph2c); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; + +} u8 rtw_dynamic_chk_wk_cmd(_adapter*padapter) { @@ -2007,12 +2124,60 @@ _func_exit_; return res; } +#ifdef CONFIG_DETECT_C2H_BY_POLLING +u8 rtw_event_polling_cmd(_adapter*padapter) +{ + struct cmd_obj* ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + +#if defined(CONFIG_CONCURRENT_MODE) + if (padapter->adapter_type != PRIMARY_ADAPTER) + { + return _FAIL; + } +#endif + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = EVENT_POLLING_CID; + pdrvextra_cmd_parm->type_size = 0; + pdrvextra_cmd_parm->pbuf = (u8 *)padapter; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + + //rtw_enqueue_cmd(pcmdpriv, ph2c); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + + _func_exit_; + + return res; +} +#endif + static void traffic_status_watchdog(_adapter *padapter) { #ifdef CONFIG_LPS u8 bEnterPS; #endif - u16 BusyThreshold = 100; + u16 BusyThreshold = 200;// 100; u8 bBusyTraffic = _FALSE, bTxBusyTraffic = _FALSE, bRxBusyTraffic = _FALSE; u8 bHigherBusyTraffic = _FALSE, bHigherBusyRxTraffic = _FALSE, bHigherBusyTxTraffic = _FALSE; #ifdef CONFIG_FTP_PROTECT @@ -2023,23 +2188,19 @@ static void traffic_status_watchdog(_adapter *padapter) struct tdls_info *ptdlsinfo = &(padapter->tdlsinfo); #endif //CONFIG_TDLS + RT_LINK_DETECT_T * link_detect = &pmlmepriv->LinkDetectInfo; + // // Determine if our traffic is busy now // if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) /*&& !MgntInitAdapterInProgress(pMgntInfo)*/) { - -#ifdef CONFIG_BT_COEXIST - if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 50 || - pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 50 ) -#else // !CONFIG_BT_COEXIST // if we raise bBusyTraffic in last watchdog, using lower threshold. if (pmlmepriv->LinkDetectInfo.bBusyTraffic) - BusyThreshold = 75; + BusyThreshold =180; // 75; if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold || pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold ) -#endif // !CONFIG_BT_COEXIST { bBusyTraffic = _TRUE; @@ -2076,7 +2237,25 @@ static void traffic_status_watchdog(_adapter *padapter) rtw_unlock_suspend(); } #endif //CONFIG_KEEP_FTP_TRANSMIT - + +#ifdef CONFIG_TRAFFIC_PROTECT +#define TX_ACTIVE_TH 2 +#define RX_ACTIVE_TH 1 +#define TRAFFIC_PROTECT_PERIOD_MS 4500 + + if (link_detect->NumTxOkInPeriod > TX_ACTIVE_TH + || link_detect->NumRxUnicastOkInPeriod > RX_ACTIVE_TH) { + + DBG_871X_LEVEL(_drv_info_, FUNC_ADPT_FMT" acqiure wake_lock for %u ms(tx:%d,rx_unicast:%d)\n", + FUNC_ADPT_ARG(padapter), + TRAFFIC_PROTECT_PERIOD_MS, + link_detect->NumTxOkInPeriod, + link_detect->NumRxUnicastOkInPeriod); + + rtw_lock_suspend_timeout(TRAFFIC_PROTECT_PERIOD_MS); + } +#endif + #ifdef CONFIG_TDLS #ifdef CONFIG_TDLS_AUTOSETUP if( ( ptdlsinfo->watchdog_count % TDLS_WATCHDOG_PERIOD ) == 0 ) //10 * 2sec, periodically sending @@ -2176,7 +2355,7 @@ void dynamic_chk_wk_hdl(_adapter *padapter, u8 *pbuf, int sz) void lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type); void lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); u8 mstatus; @@ -2211,7 +2390,7 @@ _func_enter_; //DBG_871X("LPS_CTRL_CONNECT \n"); mstatus = 1;//connect // Reset LPS Setting - padapter->pwrctrlpriv.LpsIdleCount = 0; + pwrpriv->LpsIdleCount = 0; rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); #ifdef CONFIG_BT_COEXIST BT_WifiMediaStatusNotify(padapter, mstatus); @@ -2263,7 +2442,7 @@ u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue) struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - //struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + //struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); u8 res = _SUCCESS; _func_enter_; @@ -2271,6 +2450,11 @@ _func_enter_; //if(!pwrctrlpriv->bLeisurePs) // return res; +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->iface_type != IFACE_PORT0) + return res; +#endif + if(enqueue) { ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); @@ -2410,6 +2594,17 @@ void power_saving_wk_hdl(_adapter *padapter, u8 *pbuf, int sz) rtw_ps_processor(padapter); } +//add for CONFIG_IEEE80211W, none 11w can use it +void reset_securitypriv_hdl(_adapter *padapter) +{ + rtw_reset_securitypriv(padapter); +} + +void free_assoc_resources_hdl(_adapter *padapter) +{ + rtw_free_assoc_resources(padapter, 1); +} + #ifdef CONFIG_P2P u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType ) { @@ -2683,6 +2878,51 @@ static void c2h_wk_callback(_workitem *work) } #endif +#ifdef CONFIG_DETECT_C2H_BY_POLLING +void event_polling_hdl(_adapter *padapter, u8 *pbuf, int sz) +{ + c2h_id_filter ccx_id_filter = rtw_hal_c2h_id_filter_ccx(padapter); + u8 check_c2hcmd, check_ccx; + + //check_c2hcmd = rtw_read8(padapter, REG_C2HEVT_CLEAR); + //check_ccx= rtw_read8(padapter, REG_C2HEVT_MSG_NORMAL); + + rtw_hal_get_hwreg(padapter, HW_VAR_C2HEVT_CLEAR, (u8 *)(&check_c2hcmd)); + rtw_hal_get_hwreg(padapter, HW_VAR_C2HEVT_MSG_NORMAL, (u8 *)(&check_ccx)); + + if (check_c2hcmd != 0) + { + struct c2h_evt_hdr *c2h_evt; + + if (check_c2hcmd != 0xFF) + { + c2h_evt_clear(padapter); + } + else if (ccx_id_filter(check_ccx & 0x0F) == _FALSE) + { + if ((c2h_evt = (struct c2h_evt_hdr *)rtw_zmalloc(16)) != NULL) { + if (c2h_evt_read(padapter, (u8 *)c2h_evt) == _SUCCESS) { + rtw_hal_c2h_handler(padapter, c2h_evt); + } + rtw_mfree((u8*)c2h_evt, 16); + } else { + /* Error handling for malloc fail */ + if (rtw_cbuf_push(padapter->evtpriv.c2h_queue, (void*)NULL) != _SUCCESS) + DBG_871X("%s rtw_cbuf_push fail\n", __func__); + _set_workitem(&padapter->evtpriv.c2h_wk); + } + } + else + { + if (padapter->xmitpriv.ack_tx == _FALSE) + { + c2h_evt_clear(padapter); + } + } + } +} +#endif + u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf) { struct drvextra_cmd_parm *pdrvextra_cmd; @@ -2735,11 +2975,21 @@ u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf) intel_widi_wk_hdl(padapter, pdrvextra_cmd->type_size, pdrvextra_cmd->pbuf); break; #endif //CONFIG_INTEL_WIDI - + //add for CONFIG_IEEE80211W, none 11w can use it + case RESET_SECURITYPRIV: + reset_securitypriv_hdl(padapter); + break; + case FREE_ASSOC_RESOURCES: + free_assoc_resources_hdl(padapter); + break; case C2H_WK_CID: c2h_evt_hdl(padapter, (struct c2h_evt_hdr *)pdrvextra_cmd->pbuf, NULL); break; - +#ifdef CONFIG_DETECT_C2H_BY_POLLING + case EVENT_POLLING_CID: + event_polling_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); + break; +#endif default: break; } diff --git a/drivers/net/wireless/rtl8723as/core/rtw_debug.c b/drivers/net/wireless/rtl8723as/core/rtw_debug.c index 509ed8106410..d2fc13c061b9 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_debug.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_debug.c @@ -76,6 +76,20 @@ int proc_get_drv_version(char *page, char **start, return len; } +#ifdef DBG_MEM_ALLOC +int proc_get_mstat(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + int len = 0; + + len += _rtw_mstat_dump(page+len, count-len); + *eof = 1; + + return len; +} +#endif /* DBG_MEM_ALLOC */ + int proc_get_write_reg(char *page, char **start, off_t offset, int count, int *eof, void *data) @@ -1121,6 +1135,31 @@ int proc_get_best_channel(char *page, char **start, return len; } + +int proc_set_best_channel(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct net_device *dev = (struct net_device *)data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + char tmp[32]; + + if(count < 1) + return -EFAULT; + + if(buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) + { + int i; + for(i = 0; pmlmeext->channel_set[i].ChannelNum != 0; i++) + { + pmlmeext->channel_set[i].rx_count = 0; + } + + DBG_871X("set %s\n", "Clean Best Channel Count"); + } + + return count; +} #endif /* CONFIG_FIND_BEST_CHANNEL */ #ifdef CONFIG_BT_COEXIST #define _bt_dbg_off_ 0 @@ -1214,5 +1253,118 @@ int proc_set_sreset(struct file *file, const char *buffer, unsigned long count, } #endif /* DBG_CONFIG_ERROR_DETECT */ +int proc_get_odm_dbg_comp(char *page, char **start, off_t offset, int count, int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + int len = 0; + + len += _rtw_odm_dbg_comp_msg(adapter, page, count); + + *eof = 1; + return len; +} + +int proc_set_odm_dbg_comp(struct file *file, const char *buffer, unsigned long count, void *data) +{ + struct net_device *dev = (struct net_device *)data; + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + char tmp[32]; + + u64 dbg_comp; + + if (count < 1) + return -EFAULT; + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + + int num = sscanf(tmp, "%llx", &dbg_comp); + + if (num != 1) + return count; + + rtw_odm_dbg_comp_set(adapter, dbg_comp); + } + + return count; +} + +int proc_get_odm_dbg_level(char *page, char **start, off_t offset, int count, int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + int len = 0; + + len += _rtw_odm_dbg_level_msg(adapter, page, count); + + *eof = 1; + return len; +} + +int proc_set_odm_dbg_level(struct file *file, const char *buffer, unsigned long count, void *data) +{ + struct net_device *dev = (struct net_device *)data; + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + char tmp[32]; + + u32 dbg_level; + + if (count < 1) + return -EFAULT; + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + + int num = sscanf(tmp, "%u", &dbg_level); + + if (num != 1) + return count; + + rtw_odm_dbg_level_set(adapter, dbg_level); + } + + return count; +} + +int proc_get_odm_adaptivity(char *page, char **start, off_t offset, int count, int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + int len = 0; + + len += _rtw_odm_adaptivity_parm_msg(padapter, page, count); + + *eof = 1; + return len; +} + +int proc_set_odm_adaptivity(struct file *file, const char *buffer, unsigned long count, void *data) +{ + struct net_device *dev = (struct net_device *)data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + char tmp[32]; + u32 TH_L2H_ini; + s8 TH_EDCCA_HL_diff; + u32 IGI_Base; + int ForceEDCCA; + u8 AdapEn_RSSI; + u8 IGI_LowerBound; + + if (count < 1) + return -EFAULT; + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + + int num = sscanf(tmp, "%x %hhd %x %d %hhu %hhu", + &TH_L2H_ini, &TH_EDCCA_HL_diff, &IGI_Base, &ForceEDCCA, &AdapEn_RSSI, &IGI_LowerBound); + + if (num != 6) + return count; + + rtw_odm_adaptivity_parm_set(padapter, (s8)TH_L2H_ini, TH_EDCCA_HL_diff, (s8)IGI_Base, (bool)ForceEDCCA, AdapEn_RSSI, IGI_LowerBound); + } + + return count; +} + #endif diff --git a/drivers/net/wireless/rtl8723as/core/rtw_ieee80211.c b/drivers/net/wireless/rtl8723as/core/rtw_ieee80211.c index ea353d4cfe2a..af32123cbcc0 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_ieee80211.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_ieee80211.c @@ -886,6 +886,28 @@ u8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen) return match; } +u8 *rtw_get_wps_ie_from_scan_queue(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen, u8 frame_type) +{ + u8* wps = NULL; + + DBG_871X( "[%s] frame_type = %d\n", __FUNCTION__, frame_type ); + switch( frame_type ) + { + case 1: + case 3: + { // Beacon or Probe Response + wps = rtw_get_wps_ie(in_ie + _PROBERSP_IE_OFFSET_, in_len - _PROBERSP_IE_OFFSET_, wps_ie, wps_ielen); + break; + } + case 2: + { // Probe Request + wps = rtw_get_wps_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , wps_ie, wps_ielen); + break; + } + } + return wps; +} + /** * rtw_get_wps_ie - Search WPS IE from a series of IEs * @in_ie: Address of IEs to search @@ -1331,32 +1353,37 @@ void rtw_macaddr_cfg(u8 *mac_addr) DBG_871X("rtw_macaddr_cfg MAC Address = "MAC_FMT"\n", MAC_ARG(mac_addr)); } -void dump_ies(u8 *buf, u32 buf_len) { +void dump_ies(u8 *buf, u32 buf_len) +{ u8* pos = (u8*)buf; u8 id, len; - + while(pos-buf<=buf_len){ id = *pos; len = *(pos+1); DBG_871X("%s ID:%u, LEN:%u\n", __FUNCTION__, id, len); + dump_wps_ie(pos, len); #ifdef CONFIG_P2P dump_p2p_ie(pos, len); + #ifdef CONFIG_WFD + dump_wfd_ie(pos, len); + #endif #endif - dump_wps_ie(pos, len); pos+=(2+len); - } + } } -void dump_wps_ie(u8 *ie, u32 ie_len) { +void dump_wps_ie(u8 *ie, u32 ie_len) +{ u8* pos = (u8*)ie; u16 id; u16 len; u8 *wps_ie; uint wps_ielen; - + wps_ie = rtw_get_wps_ie(ie, ie_len, NULL, &wps_ielen); if(wps_ie != ie || wps_ielen == 0) return; @@ -1369,10 +1396,81 @@ void dump_wps_ie(u8 *ie, u32 ie_len) { DBG_871X("%s ID:0x%04x, LEN:%u\n", __FUNCTION__, id, len); pos+=(4+len); - } + } } #ifdef CONFIG_P2P +/** + * rtw_get_p2p_merged_len - Get merged ie length from muitiple p2p ies. + * @in_ie: Pointer of the first p2p ie + * @in_len: Total len of muiltiple p2p ies + * Returns: Length of merged p2p ie length + */ +u32 rtw_get_p2p_merged_ies_len(u8 *in_ie, u32 in_len) +{ + PNDIS_802_11_VARIABLE_IEs pIE; + u8 OUI[4] = { 0x50, 0x6f, 0x9a, 0x09 }; + int i=0; + int j=0, len=0; + + while( i < in_len) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(in_ie+ i); + + if( pIE->ElementID == _VENDOR_SPECIFIC_IE_ && _rtw_memcmp(pIE->data, OUI, 4) ) + { + len += pIE->Length-4; // 4 is P2P OUI length, don't count it in this loop + } + + i += (pIE->Length + 2); + } + + return len + 4; // Append P2P OUI length at last. +} + +/** + * rtw_p2p_merge_ies - Merge muitiple p2p ies into one + * @in_ie: Pointer of the first p2p ie + * @in_len: Total len of muiltiple p2p ies + * @merge_ie: Pointer of merged ie + * Returns: Length of merged p2p ie + */ +int rtw_p2p_merge_ies(u8 *in_ie, u32 in_len, u8 *merge_ie) +{ + PNDIS_802_11_VARIABLE_IEs pIE; + u8 len = 0; + u8 OUI[4] = { 0x50, 0x6f, 0x9a, 0x09 }; + u8 ELOUI[6] = { 0xDD, 0x00, 0x50, 0x6f, 0x9a, 0x09 }; //EID;Len;OUI, Len would copy at the end of function + int i=0; + + if( merge_ie != NULL) + { + //Set first P2P OUI + _rtw_memcpy(merge_ie, ELOUI, 6); + merge_ie += 6; + + while( i < in_len) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(in_ie+ i); + + // Take out the rest of P2P OUIs + if( pIE->ElementID == _VENDOR_SPECIFIC_IE_ && _rtw_memcmp(pIE->data, OUI, 4) ) + { + _rtw_memcpy( merge_ie, pIE->data +4, pIE->Length -4); + len += pIE->Length-4; + merge_ie += pIE->Length-4; + } + + i += (pIE->Length + 2); + } + + return len + 4; // 4 is for P2P OUI + + } + + return 0; +} + void dump_p2p_ie(u8 *ie, u32 ie_len) { u8* pos = (u8*)ie; u8 id; @@ -1396,6 +1494,28 @@ void dump_p2p_ie(u8 *ie, u32 ie_len) { } } +u8 *rtw_get_p2p_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen, u8 frame_type) +{ + u8* p2p = NULL; + + DBG_871X( "[%s] frame_type = %d\n", __FUNCTION__, frame_type ); + switch( frame_type ) + { + case 1: + case 3: + { // Beacon or Probe Response + p2p = rtw_get_p2p_ie(in_ie + _PROBERSP_IE_OFFSET_, in_len - _PROBERSP_IE_OFFSET_, p2p_ie, p2p_ielen); + break; + } + case 2: + { // Probe Request + p2p = rtw_get_p2p_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , p2p_ie, p2p_ielen); + break; + } + } + return p2p; +} + /** * rtw_get_p2p_ie - Search P2P IE from a series of IEs * @in_ie: Address of IEs to search @@ -1640,6 +1760,29 @@ void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id) #endif //CONFIG_P2P #ifdef CONFIG_WFD +void dump_wfd_ie(u8 *ie, u32 ie_len) +{ + u8* pos = (u8*)ie; + u8 id; + u16 len; + + u8 *wfd_ie; + uint wfd_ielen; + + if(rtw_get_wfd_ie(ie, ie_len, NULL, &wfd_ielen) == _FALSE) + return; + + pos+=6; + while(pos-ie < ie_len){ + id = *pos; + len = RTW_GET_BE16(pos+1); + + DBG_871X("%s ID:%u, LEN:%u\n", __FUNCTION__, id, len); + + pos+=(3+len); + } +} + int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen) { int match; @@ -1699,6 +1842,30 @@ int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen) } +int rtw_get_wfd_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen, u8 frame_type) +{ + int match; + + match=_FALSE; + + DBG_871X( "[%s] frame_type = %d\n", __FUNCTION__, frame_type ); + switch( frame_type ) + { + case 1: + case 3: + { // Beacon or Probe Response + match = rtw_get_wfd_ie(in_ie + _PROBERSP_IE_OFFSET_, in_len - _PROBERSP_IE_OFFSET_, wfd_ie, wfd_ielen); + break; + } + case 2: + { // Probe Request + match = rtw_get_wfd_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , wfd_ie, wfd_ielen); + break; + } + } + return match; +} + // attr_content: The output buffer, contains the "body field" of WFD attribute. // attr_contentlen: The data length of the "body field" of WFD attribute. int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen) diff --git a/drivers/net/wireless/rtl8723as/core/rtw_io.c b/drivers/net/wireless/rtl8723as/core/rtw_io.c index 83cd2fbbd395..26797830ffc3 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_io.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_io.c @@ -384,6 +384,32 @@ int rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(struct _io_ops *po return _SUCCESS; } +/* +* Increase and check if the continual_io_error of this @param dvobjprive is larger than MAX_CONTINUAL_IO_ERR +* @return _TRUE: +* @return _FALSE: +*/ +int rtw_inc_and_chk_continual_io_error(struct dvobj_priv *dvobj) +{ + int ret = _FALSE; + int value; + if( (value=ATOMIC_INC_RETURN(&dvobj->continual_io_error)) > MAX_CONTINUAL_IO_ERR) { + DBG_871X("[dvobj:%p][ERROR] continual_io_error:%d > %d\n", dvobj, value, MAX_CONTINUAL_IO_ERR); + ret = _TRUE; + } else { + //DBG_871X("[dvobj:%p] continual_io_error:%d\n", dvobj, value); + } + return ret; +} + +/* +* Set the continual_io_error of this @param dvobjprive to 0 +*/ +void rtw_reset_continual_io_error(struct dvobj_priv *dvobj) +{ + ATOMIC_SET(&dvobj->continual_io_error, 0); +} + #ifdef DBG_IO u16 read_sniff_ranges[][2] = { diff --git a/drivers/net/wireless/rtl8723as/core/rtw_ioctl_set.c b/drivers/net/wireless/rtl8723as/core/rtw_ioctl_set.c index 4df2e4e19425..d2d07d7ef386 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_ioctl_set.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_ioctl_set.c @@ -47,6 +47,20 @@ extern void indicate_wx_scan_complete_event(_adapter *padapter); (addr[4] == 0xff) && (addr[5] == 0xff) ) ? _TRUE : _FALSE \ ) +u8 rtw_validate_bssid(u8 *bssid) +{ + u8 ret = _TRUE; + + if (is_zero_mac_addr(bssid) + || is_broadcast_mac_addr(bssid) + || is_multicast_mac_addr(bssid) + ) { + ret = _FALSE; + } + + return ret; +} + u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid) { u8 i; @@ -60,6 +74,7 @@ _func_enter_; goto exit; } +#ifdef CONFIG_VALIDATE_SSID for(i = 0; i < ssid->SsidLength; i++) { //wifi, printable ascii code must be supported @@ -69,6 +84,7 @@ _func_enter_; break; } } +#endif /* CONFIG_VALIDATE_SSID */ exit: @@ -374,24 +390,10 @@ _func_enter_; } handle_tkip_countermeasure: - //should we add something here...? - -#ifdef PLATFORM_LINUX - if (padapter->securitypriv.btkip_countermeasure == _TRUE) { - cur_time = rtw_get_current_time(); - - if( (cur_time - padapter->securitypriv.btkip_countermeasure_time) > 60 * HZ ) - { - padapter->securitypriv.btkip_countermeasure = _FALSE; - padapter->securitypriv.btkip_countermeasure_time = 0; - } - else - { - status = _FAIL; - goto release_mlme_lock; - } + if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) { + status = _FAIL; + goto release_mlme_lock; } -#endif _rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN); pmlmepriv->assoc_by_bssid=_TRUE; @@ -506,56 +508,15 @@ _func_enter_; } handle_tkip_countermeasure: -#ifdef PLATFORM_WINDOWS - if (padapter->securitypriv.btkip_countermeasure==_TRUE) - { - LARGE_INTEGER sys_time; - u32 diff_time,cur_time ; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_ssid:padapter->securitypriv.btkip_countermeasure==_TRUE\n")); - NdisGetCurrentSystemTime(&sys_time); - cur_time=(u32)(sys_time.QuadPart/10); // In micro-second. - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_ssid:cur_time=0x%x\n",cur_time)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_ssid:psecuritypriv->last_mic_err_time=0x%x\n",padapter->securitypriv.btkip_countermeasure_time)); - diff_time = cur_time -padapter->securitypriv.btkip_countermeasure_time; // In micro-second. - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_ssid:diff_time=0x%x\n",diff_time)); - - if (diff_time > 60000000) { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_ssid(): countermeasure time >60s.\n")); - padapter->securitypriv.btkip_countermeasure=_FALSE; - // Update MIC error time. - padapter->securitypriv.btkip_countermeasure_time=0; - } else { - // can't join in 60 seconds. - status = _FAIL; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_ssid(): countermeasure time <60s.\n")); - goto release_mlme_lock; - } - } -#endif - -#ifdef PLATFORM_LINUX - if (padapter->securitypriv.btkip_countermeasure == _TRUE) { - cur_time = rtw_get_current_time(); - - if( (cur_time - padapter->securitypriv.btkip_countermeasure_time) > 60 * HZ ) - { - padapter->securitypriv.btkip_countermeasure = _FALSE; - padapter->securitypriv.btkip_countermeasure_time = 0; - } - else - { - status = _FAIL; - goto release_mlme_lock; - } + if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) { + status = _FAIL; + goto release_mlme_lock; } -#endif - #ifdef CONFIG_VALIDATE_SSID if (rtw_validate_ssid(ssid) == _FALSE) { status = _FAIL; goto release_mlme_lock; } - #endif _rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID)); pmlmepriv->assoc_by_bssid=_FALSE; @@ -580,6 +541,79 @@ _func_exit_; } +u8 rtw_set_802_11_connect(_adapter* padapter, u8 *bssid, NDIS_802_11_SSID *ssid) +{ + _irqL irqL; + u8 status = _SUCCESS; + u32 cur_time = 0; + bool bssid_valid = _TRUE; + bool ssid_valid = _TRUE; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + if (!ssid || rtw_validate_ssid(ssid) == _FALSE) + ssid_valid = _FALSE; + + if (!bssid || rtw_validate_bssid(bssid) == _FALSE) + bssid_valid = _FALSE; + + if (ssid_valid == _FALSE && bssid_valid == _FALSE) { + DBG_871X(FUNC_ADPT_FMT" ssid:%p, ssid_valid:%d, bssid:%p, bssid_valid:%d\n", + FUNC_ADPT_ARG(padapter), ssid, ssid_valid, bssid, bssid_valid); + status = _FAIL; + goto exit; + } + + if(padapter->hw_init_completed==_FALSE){ + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, + ("set_ssid: hw_init_completed==_FALSE=>exit!!!\n")); + status = _FAIL; + goto exit; + } + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" fw_state=0x%08x\n", + FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv)); + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { + goto handle_tkip_countermeasure; + } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { + goto release_mlme_lock; + } + +handle_tkip_countermeasure: + if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) { + status = _FAIL; + goto release_mlme_lock; + } + + if (ssid && ssid_valid) + _rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID)); + + if (bssid && bssid_valid) { + _rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN); + pmlmepriv->assoc_by_bssid = _TRUE; + } + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { + pmlmepriv->to_join = _TRUE; + } + else { + status = rtw_do_join(padapter); + } + +release_mlme_lock: + _exit_critical_bh(&pmlmepriv->lock, &irqL); + +exit: + +_func_exit_; + + return status; +} + u8 rtw_set_802_11_infrastructure_mode(_adapter* padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype) { @@ -683,7 +717,8 @@ _func_enter_; rtw_disassoc_cmd(padapter, 0, _TRUE); rtw_indicate_disconnect(padapter); - rtw_free_assoc_resources(padapter, 1); + //modify for CONFIG_IEEE80211W, none 11w can use it + rtw_free_assoc_resources_cmd(padapter); rtw_pwr_wakeup(padapter); } @@ -832,7 +867,7 @@ _func_enter_; psecuritypriv->dot11DefKey[keyid].skey[9],psecuritypriv->dot11DefKey[keyid].skey[10],psecuritypriv->dot11DefKey[keyid].skey[11], psecuritypriv->dot11DefKey[keyid].skey[12])); - res=rtw_set_key(padapter,psecuritypriv, keyid, 1); + res=rtw_set_key(padapter,psecuritypriv, keyid, 1,_TRUE); if(res==_FAIL) ret= _FALSE; @@ -864,7 +899,7 @@ _func_enter_; _rtw_memset(&psecuritypriv->dot11DefKey[keyindex], 0, 16); - res=rtw_set_key(padapter,psecuritypriv,keyindex, 0); + res=rtw_set_key(padapter,psecuritypriv,keyindex, 0,_TRUE); psecuritypriv->dot11DefKeylen[keyindex]=0; @@ -1180,7 +1215,7 @@ _func_enter_; RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("reset group key")); - res=rtw_set_key(padapter,&padapter->securitypriv, key->KeyIndex, 1); + res=rtw_set_key(padapter,&padapter->securitypriv, key->KeyIndex, 1,_TRUE); if(res==_FAIL) ret= _FAIL; @@ -1230,11 +1265,11 @@ _func_enter_; //Set key to CAM through H2C command if(bgrouptkey)//never go to here { - res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _FALSE); + res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _FALSE, _TRUE); RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(group)\n")); } else{ - res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _TRUE); + res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _TRUE, _TRUE); RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\n")); } @@ -1441,6 +1476,8 @@ int rtw_set_country(_adapter *adapter, const char *country_code) channel_plan = RT_CHANNEL_DOMAIN_MKK; else if(0 == strcmp(country_code, "CN")) channel_plan = RT_CHANNEL_DOMAIN_CHINA; + else if(0 == strcmp(country_code, "IN")) + channel_plan = RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN; else DBG_871X("%s unknown country_code:%s\n", __FUNCTION__, country_code); diff --git a/drivers/net/wireless/rtl8723as/core/rtw_led.c b/drivers/net/wireless/rtl8723as/core/rtw_led.c index f8de4329ff45..7710f324c3a0 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_led.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_led.c @@ -1,2422 +1,2422 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include - -// -// Description: -// Callback function of LED BlinkTimer, -// it just schedules to corresponding BlinkWorkItem/led_blink_hdl -// -void BlinkTimerCallback(void *data) -{ - PLED_871x pLed = (PLED_871x)data; - _adapter *padapter = pLed->padapter; - - //DBG_871X("%s\n", __FUNCTION__); - - if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) - { - //DBG_871X("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->bDriverStopped); - return; - } - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - #ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD - rtw_led_blink_cmd(padapter, pLed); - #else - _set_workitem(&(pLed->BlinkWorkItem)); - #endif -#elif defined(CONFIG_PCI_HCI) - BlinkHandler(pLed); -#endif - -} - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) -// -// Description: -// Callback function of LED BlinkWorkItem. -// We dispatch acture LED blink action according to LedStrategy. -// -void BlinkWorkItemCallback(struct work_struct *work) -{ - PLED_871x pLed = container_of(work, LED_871x, BlinkWorkItem); - BlinkHandler(pLed); -} -#endif - -// -// Description: -// Reset status of LED_871x object. -// -void ResetLedStatus(PLED_871x pLed) { - - pLed->CurrLedState = RTW_LED_OFF; // Current LED state. - pLed->bLedOn = _FALSE; // true if LED is ON, false if LED is OFF. - - pLed->bLedBlinkInProgress = _FALSE; // true if it is blinking, false o.w.. - pLed->bLedWPSBlinkInProgress = _FALSE; - - pLed->BlinkTimes = 0; // Number of times to toggle led state for blinking. - pLed->BlinkingLedState = LED_UNKNOWN; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - pLed->bLedNoLinkBlinkInProgress = _FALSE; - pLed->bLedLinkBlinkInProgress = _FALSE; - pLed->bLedStartToLinkBlinkInProgress = _FALSE; - pLed->bLedScanBlinkInProgress = _FALSE; -#endif -} - - // -// Description: -// Initialize an LED_871x object. -// -void -InitLed871x( - _adapter *padapter, - PLED_871x pLed, - LED_PIN_871x LedPin - ) -{ - pLed->padapter = padapter; - pLed->LedPin = LedPin; - - ResetLedStatus(pLed); - - _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed); - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed); -#endif -} - - -// -// Description: -// DeInitialize an LED_871x object. -// -void -DeInitLed871x( - PLED_871x pLed - ) -{ -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - _cancel_workitem_sync(&(pLed->BlinkWorkItem)); -#endif - _cancel_timer_ex(&(pLed->BlinkTimer)); - ResetLedStatus(pLed); -} - - -// -// Description: -// Implementation of LED blinking behavior. -// It toggle off LED and schedule corresponding timer if necessary. -// -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - -void SwLedOn(_adapter *padapter, PLED_871x pLed); -void SwLedOff(_adapter *padapter, PLED_871x pLed); - -#define CONFIG_LED_REMOVE_HAL - -void -SwLedBlink( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - // Determine if we shall change LED state again. - pLed->BlinkTimes--; - switch(pLed->CurrLedState) - { - - case LED_BLINK_NORMAL: - if(pLed->BlinkTimes == 0) - { - bStopBlinking = _TRUE; - } - break; - - case LED_BLINK_StartToBlink: - if( check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) - { - bStopBlinking = _TRUE; - } - if( check_fwstate(pmlmepriv, _FW_LINKED) && - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) ) - { - bStopBlinking = _TRUE; - } - else if(pLed->BlinkTimes == 0) - { - bStopBlinking = _TRUE; - } - break; - - case LED_BLINK_WPS: - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - break; - - - default: - bStopBlinking = _TRUE; - break; - - } - - if(bStopBlinking) - { - //if( padapter->pwrctrlpriv.cpwm >= PS_STATE_S2) - if(0) - { - SwLedOff(padapter, pLed); - } - else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (pLed->bLedOn == _FALSE)) - { - SwLedOn(padapter, pLed); - } - else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && pLed->bLedOn == _TRUE) - { - SwLedOff(padapter, pLed); - } - - pLed->BlinkTimes = 0; - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - // Assign LED state to toggle. - if( pLed->BlinkingLedState == RTW_LED_ON ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - // Schedule a timer to toggle LED state. - switch( pLed->CurrLedState ) - { - case LED_BLINK_NORMAL: - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - break; - - case LED_BLINK_SLOWLY: - case LED_BLINK_StartToBlink: - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - break; - - case LED_BLINK_WPS: - { - if( pLed->BlinkingLedState == RTW_LED_ON ) - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - else - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - } - break; - - default: - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - break; - } - } -} - -void -SwLedBlink1( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; -#ifndef CONFIG_LED_REMOVE_HAL - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); -#endif - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - PLED_871x pLed1 = &(ledpriv->SwLed1); - u8 bStopBlinking = _FALSE; - -#ifndef CONFIG_LED_REMOVE_HAL - if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) - pLed = &(ledpriv->SwLed1); -#endif - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - -#ifndef CONFIG_LED_REMOVE_HAL - if(pHalData->EEPROMCustomerID == RT_CID_DEFAULT) - { - if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - if(!pLed1->bSWLedCtrl) - { - SwLedOn(padapter, pLed1); - pLed1->bSWLedCtrl = _TRUE; - } - else if(!pLed1->bLedOn) - SwLedOn(padapter, pLed1); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn on pLed1\n")); - } - else - { - if(!pLed1->bSWLedCtrl) - { - SwLedOff(padapter, pLed1); - pLed1->bSWLedCtrl = _TRUE; - } - else if(pLed1->bLedOn) - SwLedOff(padapter, pLed1); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn off pLed1\n")); - } - } - -#endif - - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - ResetLedStatus(pLed); - return; - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SLOWLY: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - break; - - case LED_BLINK_NORMAL: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - break; - - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->BlinkTimes = 0; - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - break; - - case LED_BLINK_WPS_STOP: //WPS success - if(pLed->BlinkingLedState == RTW_LED_ON) - bStopBlinking = _FALSE; - else - bStopBlinking = _TRUE; - - if(bStopBlinking) - { - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - - pLed->bLedWPSBlinkInProgress = _FALSE; - } - else - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - } - break; - - default: - break; - } - -} - -void -SwLedBlink2( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); - - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); - - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - default: - break; - } - -} - -void -SwLedBlink3( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - if(pLed->CurrLedState != LED_BLINK_WPS_STOP) - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if( !pLed->bLedOn ) - SwLedOn(padapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedOn ) - SwLedOff(padapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - - if( !pLed->bLedOn ) - SwLedOn(padapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - - if( pLed->bLedOn ) - SwLedOff(padapter, pLed); - - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - break; - - case LED_BLINK_WPS_STOP: //WPS success - if(pLed->BlinkingLedState == RTW_LED_ON) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - bStopBlinking = _FALSE; - } - else - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedWPSBlinkInProgress = _FALSE; - } - break; - - - default: - break; - } - -} - - -void -SwLedBlink4( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - PLED_871x pLed1 = &(ledpriv->SwLed1); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - if(!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) - { - pLed1->BlinkingLedState = RTW_LED_OFF; - pLed1->CurrLedState = RTW_LED_OFF; - SwLedOff(padapter, pLed1); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SLOWLY: - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - break; - - case LED_BLINK_StartToBlink: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _FALSE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->bLedNoLinkBlinkInProgress = _FALSE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_BLINK_WPS_STOP: //WPS authentication fail - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - break; - - case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap - pLed->BlinkTimes--; - if(pLed->BlinkTimes == 0) - { - if(pLed->bLedOn) - { - pLed->BlinkTimes = 1; - } - else - { - bStopBlinking = _TRUE; - } - } - - if(bStopBlinking) - { - pLed->BlinkTimes = 10; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState)); - - -} - -void -SwLedBlink5( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SCAN: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if(pLed->bLedOn) - SwLedOff(padapter, pLed); - } - else - { pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if(!pLed->bLedOn) - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - - case LED_BLINK_TXRX: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if(pLed->bLedOn) - SwLedOff(padapter, pLed); - } - else - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if(!pLed->bLedOn) - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState)); - - -} - -void -SwLedBlink6( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == RTW_LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink6\n")); -} - -static void -SwLedControlMode0( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - PLED_871x pLed = &(ledpriv->SwLed1); - - // Decide led state - switch(LedAction) - { - case LED_CTL_TX: - case LED_CTL_RX: - if( pLed->bLedBlinkInProgress == _FALSE ) - { - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_NORMAL; - pLed->BlinkTimes = 2; - - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_CTL_START_TO_LINK: - if( pLed->bLedBlinkInProgress == _FALSE ) - { - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_StartToBlink; - pLed->BlinkTimes = 24; - - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->CurrLedState = LED_BLINK_StartToBlink; - } - break; - - case LED_CTL_LINK: - pLed->CurrLedState = RTW_LED_ON; - if( pLed->bLedBlinkInProgress == _FALSE ) - { - SwLedOn(padapter, pLed); - } - break; - - case LED_CTL_NO_LINK: - pLed->CurrLedState = RTW_LED_OFF; - if( pLed->bLedBlinkInProgress == _FALSE ) - { - SwLedOff(padapter, pLed); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - if(pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - SwLedOff(padapter, pLed); - break; - - case LED_CTL_START_WPS: - if( pLed->bLedBlinkInProgress == _FALSE || pLed->CurrLedState == RTW_LED_ON) - { - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_WPS; - pLed->BlinkTimes = 20; - - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - } - } - break; - - case LED_CTL_STOP_WPS: - if(pLed->bLedBlinkInProgress) - { - pLed->CurrLedState = RTW_LED_OFF; - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - break; - - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); - -} - - //ALPHA, added by chiyoko, 20090106 -static void -SwLedControlMode1( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ -#ifndef CONFIG_LED_REMOVE_HAL - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); -#endif - struct led_priv *ledpriv = &(padapter->ledpriv); - PLED_871x pLed = &(ledpriv->SwLed0); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - -#ifndef CONFIG_LED_REMOVE_HAL - if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) - pLed = &(ledpriv->SwLed1); -#endif - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - break; - - case LED_CTL_LINK: - if( pLed->bLedLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - } - break; - - case LED_CTL_SITE_SURVEY: - if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress ==_FALSE) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - - case LED_CTL_STOP_WPS: - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - } - else - { - pLed->bLedWPSBlinkInProgress = _TRUE; - } - - pLed->CurrLedState = LED_BLINK_WPS_STOP; - if(pLed->bLedOn) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_STOP_WPS_FAIL: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedNoLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - SwLedOff(padapter, pLed); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); -} - - //Arcadyan/Sitecom , added by chiyoko, 20090216 -static void -SwLedControlMode2( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_871x pLed = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_SITE_SURVEY: - if(pmlmepriv->LinkDetectInfo.bBusyTraffic) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_LINK: - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_STOP_WPS: - pLed->bLedWPSBlinkInProgress = _FALSE; - if(padapter->pwrctrlpriv.rf_pwrstate != rf_on) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - break; - - case LED_CTL_STOP_WPS_FAIL: - pLed->bLedWPSBlinkInProgress = _FALSE; - if(padapter->pwrctrlpriv.rf_pwrstate != rf_on) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - break; - - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - if(!IS_LED_BLINKING(pLed)) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); -} - - //COREGA, added by chiyoko, 20090316 - static void - SwLedControlMode3( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_871x pLed = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_SITE_SURVEY: - if(pmlmepriv->LinkDetectInfo.bBusyTraffic) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_LINK: - if(IS_LED_WPS_BLINKING(pLed)) - return; - - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_STOP_WPS: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - else - { - pLed->bLedWPSBlinkInProgress = _TRUE; - } - - pLed->CurrLedState = LED_BLINK_WPS_STOP; - if(pLed->bLedOn) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - - break; - - case LED_CTL_STOP_WPS_FAIL: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - if(!IS_LED_BLINKING(pLed)) - { - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); -} - - - //Edimax-Belkin, added by chiyoko, 20090413 -static void -SwLedControlMode4( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_871x pLed = &(ledpriv->SwLed0); - PLED_871x pLed1 = &(ledpriv->SwLed1); - - switch(LedAction) - { - case LED_CTL_START_TO_LINK: - if(pLed1->bLedWPSBlinkInProgress) - { - pLed1->bLedWPSBlinkInProgress = _FALSE; - _cancel_timer_ex(&(pLed1->BlinkTimer)); - - pLed1->BlinkingLedState = RTW_LED_OFF; - pLed1->CurrLedState = RTW_LED_OFF; - - if(pLed1->bLedOn) - _set_timer(&(pLed->BlinkTimer), 0); - } - - if( pLed->bLedStartToLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedNoLinkBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - - pLed->bLedStartToLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_StartToBlink; - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - } - break; - - case LED_CTL_LINK: - case LED_CTL_NO_LINK: - //LED1 settings - if(LedAction == LED_CTL_LINK) - { - if(pLed1->bLedWPSBlinkInProgress) - { - pLed1->bLedWPSBlinkInProgress = _FALSE; - _cancel_timer_ex(&(pLed1->BlinkTimer)); - - pLed1->BlinkingLedState = RTW_LED_OFF; - pLed1->CurrLedState = RTW_LED_OFF; - - if(pLed1->bLedOn) - _set_timer(&(pLed->BlinkTimer), 0); - } - } - - if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - break; - - case LED_CTL_SITE_SURVEY: - if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress ==_FALSE) - { - if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed1->bLedWPSBlinkInProgress) - { - pLed1->bLedWPSBlinkInProgress = _FALSE; - _cancel_timer_ex(&(pLed1->BlinkTimer)); - - pLed1->BlinkingLedState = RTW_LED_OFF; - pLed1->CurrLedState = RTW_LED_OFF; - - if(pLed1->bLedOn) - _set_timer(&(pLed->BlinkTimer), 0); - } - - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = RTW_LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - } - break; - - case LED_CTL_STOP_WPS: //WPS connect success - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - - break; - - case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - - //LED1 settings - if(pLed1->bLedWPSBlinkInProgress) - _cancel_timer_ex(&(pLed1->BlinkTimer)); - else - pLed1->bLedWPSBlinkInProgress = _TRUE; - - pLed1->CurrLedState = LED_BLINK_WPS_STOP; - if( pLed1->bLedOn ) - pLed1->BlinkingLedState = RTW_LED_OFF; - else - pLed1->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - - break; - - case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - - //LED1 settings - if(pLed1->bLedWPSBlinkInProgress) - _cancel_timer_ex(&(pLed1->BlinkTimer)); - else - pLed1->bLedWPSBlinkInProgress = _TRUE; - - pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP; - pLed1->BlinkTimes = 10; - if( pLed1->bLedOn ) - pLed1->BlinkingLedState = RTW_LED_OFF; - else - pLed1->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - - if( pLed->bLedNoLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedStartToLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedStartToLinkBlinkInProgress = _FALSE; - } - - if( pLed1->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed1->BlinkTimer)); - pLed1->bLedWPSBlinkInProgress = _FALSE; - } - - pLed1->BlinkingLedState = LED_UNKNOWN; - SwLedOff(padapter, pLed); - SwLedOff(padapter, pLed1); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); -} - - - - //Sercomm-Belkin, added by chiyoko, 20090415 -static void -SwLedControlMode5( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ -#ifndef CONFIG_LED_REMOVE_HAL - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); -#endif - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_871x pLed = &(ledpriv->SwLed0); - -#ifndef CONFIG_LED_REMOVE_HAL - if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) - pLed = &(ledpriv->SwLed1); -#endif - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_NO_LINK: - case LED_CTL_LINK: //solid blue - pLed->CurrLedState = RTW_LED_ON; - pLed->BlinkingLedState = RTW_LED_ON; - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_SITE_SURVEY: - if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SCAN; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress ==_FALSE) - { - if(pLed->CurrLedState == LED_BLINK_SCAN) - { - return; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_TXRX; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = RTW_LED_OFF; - else - pLed->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = RTW_LED_OFF; - pLed->BlinkingLedState = RTW_LED_OFF; - - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - SwLedOff(padapter, pLed); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); -} - - //WNC-Corega, added by chiyoko, 20090902 -static void -SwLedControlMode6( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_871x pLed0 = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_LINK: - case LED_CTL_NO_LINK: - _cancel_timer_ex(&(pLed0->BlinkTimer)); - pLed0->CurrLedState = RTW_LED_ON; - pLed0->BlinkingLedState = RTW_LED_ON; - _set_timer(&(pLed0->BlinkTimer), 0); - break; - - case LED_CTL_POWER_OFF: - SwLedOff(padapter, pLed0); - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("ledcontrol 6 Led %d\n", pLed0->CurrLedState)); -} - -// -// Description: -// Handler function of LED Blinking. -// We dispatch acture LED blink action according to LedStrategy. -// -void BlinkHandler(PLED_871x pLed) -{ - _adapter *padapter = pLed->padapter; - struct led_priv *ledpriv = &(padapter->ledpriv); - - //DBG_871X("%s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); - - if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) - { - //DBG_871X("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->bDriverStopped); - return; - } - - switch(ledpriv->LedStrategy) - { - case SW_LED_MODE0: - SwLedBlink(pLed); - break; - - case SW_LED_MODE1: - SwLedBlink1(pLed); - break; - - case SW_LED_MODE2: - SwLedBlink2(pLed); - break; - - case SW_LED_MODE3: - SwLedBlink3(pLed); - break; - - case SW_LED_MODE4: - SwLedBlink4(pLed); - break; - - case SW_LED_MODE5: - SwLedBlink5(pLed); - break; - - case SW_LED_MODE6: - SwLedBlink6(pLed); - break; - - default: - //RT_TRACE(COMP_LED, DBG_LOUD, ("BlinkWorkItemCallback 0x%x \n", pHalData->LedStrategy)); - //SwLedBlink(pLed); - break; - } -} - -void -LedControl871x( - _adapter *padapter, - LED_CTL_MODE LedAction - ) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - - if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE) - ||(padapter->hw_init_completed == _FALSE) ) - { - return; - } - - - if( ledpriv->bRegUseLed == _FALSE) - return; - - //if (!priv->up) - // return; - - //if(priv->bInHctTest) - // return; - - if( (padapter->pwrctrlpriv.rf_pwrstate != rf_on && - padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) && - (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || - LedAction == LED_CTL_SITE_SURVEY || - LedAction == LED_CTL_LINK || - LedAction == LED_CTL_NO_LINK || - LedAction == LED_CTL_POWER_ON) ) - { - return; - } - - switch(ledpriv->LedStrategy) - { - case SW_LED_MODE0: - //SwLedControlMode0(padapter, LedAction); - break; - - case SW_LED_MODE1: - SwLedControlMode1(padapter, LedAction); - break; - case SW_LED_MODE2: - SwLedControlMode2(padapter, LedAction); - break; - - case SW_LED_MODE3: - SwLedControlMode3(padapter, LedAction); - break; - - case SW_LED_MODE4: - SwLedControlMode4(padapter, LedAction); - break; - - case SW_LED_MODE5: - SwLedControlMode5(padapter, LedAction); - break; - - case SW_LED_MODE6: - SwLedControlMode6(padapter, LedAction); - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("LedStrategy:%d, LedAction %d\n", ledpriv->LedStrategy,LedAction)); -} - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#include + +// +// Description: +// Callback function of LED BlinkTimer, +// it just schedules to corresponding BlinkWorkItem/led_blink_hdl +// +void BlinkTimerCallback(void *data) +{ + PLED_871x pLed = (PLED_871x)data; + _adapter *padapter = pLed->padapter; + + //DBG_871X("%s\n", __FUNCTION__); + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + //DBG_871X("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->bDriverStopped); + return; + } + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) + #ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD + rtw_led_blink_cmd(padapter, pLed); + #else + _set_workitem(&(pLed->BlinkWorkItem)); + #endif +#elif defined(CONFIG_PCI_HCI) + BlinkHandler(pLed); +#endif + +} + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) +// +// Description: +// Callback function of LED BlinkWorkItem. +// We dispatch acture LED blink action according to LedStrategy. +// +void BlinkWorkItemCallback(struct work_struct *work) +{ + PLED_871x pLed = container_of(work, LED_871x, BlinkWorkItem); + BlinkHandler(pLed); +} +#endif + +// +// Description: +// Reset status of LED_871x object. +// +void ResetLedStatus(PLED_871x pLed) { + + pLed->CurrLedState = RTW_LED_OFF; // Current LED state. + pLed->bLedOn = _FALSE; // true if LED is ON, false if LED is OFF. + + pLed->bLedBlinkInProgress = _FALSE; // true if it is blinking, false o.w.. + pLed->bLedWPSBlinkInProgress = _FALSE; + + pLed->BlinkTimes = 0; // Number of times to toggle led state for blinking. + pLed->BlinkingLedState = LED_UNKNOWN; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) + pLed->bLedNoLinkBlinkInProgress = _FALSE; + pLed->bLedLinkBlinkInProgress = _FALSE; + pLed->bLedStartToLinkBlinkInProgress = _FALSE; + pLed->bLedScanBlinkInProgress = _FALSE; +#endif +} + + // +// Description: +// Initialize an LED_871x object. +// +void +InitLed871x( + _adapter *padapter, + PLED_871x pLed, + LED_PIN_871x LedPin + ) +{ + pLed->padapter = padapter; + pLed->LedPin = LedPin; + + ResetLedStatus(pLed); + + _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed); + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) + _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed); +#endif +} + + +// +// Description: +// DeInitialize an LED_871x object. +// +void +DeInitLed871x( + PLED_871x pLed + ) +{ +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + _cancel_workitem_sync(&(pLed->BlinkWorkItem)); +#endif + _cancel_timer_ex(&(pLed->BlinkTimer)); + ResetLedStatus(pLed); +} + + +// +// Description: +// Implementation of LED blinking behavior. +// It toggle off LED and schedule corresponding timer if necessary. +// +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + +void SwLedOn(_adapter *padapter, PLED_871x pLed); +void SwLedOff(_adapter *padapter, PLED_871x pLed); + +#define CONFIG_LED_REMOVE_HAL + +void +SwLedBlink( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + // Determine if we shall change LED state again. + pLed->BlinkTimes--; + switch(pLed->CurrLedState) + { + + case LED_BLINK_NORMAL: + if(pLed->BlinkTimes == 0) + { + bStopBlinking = _TRUE; + } + break; + + case LED_BLINK_StartToBlink: + if( check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) + { + bStopBlinking = _TRUE; + } + if( check_fwstate(pmlmepriv, _FW_LINKED) && + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) ) + { + bStopBlinking = _TRUE; + } + else if(pLed->BlinkTimes == 0) + { + bStopBlinking = _TRUE; + } + break; + + case LED_BLINK_WPS: + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + break; + + + default: + bStopBlinking = _TRUE; + break; + + } + + if(bStopBlinking) + { + //if(adapter_to_pwrctl(padapter)->cpwm >= PS_STATE_S2) + if(0) + { + SwLedOff(padapter, pLed); + } + else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (pLed->bLedOn == _FALSE)) + { + SwLedOn(padapter, pLed); + } + else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && pLed->bLedOn == _TRUE) + { + SwLedOff(padapter, pLed); + } + + pLed->BlinkTimes = 0; + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + // Assign LED state to toggle. + if( pLed->BlinkingLedState == RTW_LED_ON ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + // Schedule a timer to toggle LED state. + switch( pLed->CurrLedState ) + { + case LED_BLINK_NORMAL: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + break; + + case LED_BLINK_SLOWLY: + case LED_BLINK_StartToBlink: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + break; + + case LED_BLINK_WPS: + { + if( pLed->BlinkingLedState == RTW_LED_ON ) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + else + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + break; + + default: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + break; + } + } +} + +void +SwLedBlink1( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; +#ifndef CONFIG_LED_REMOVE_HAL + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#endif + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + PLED_871x pLed1 = &(ledpriv->SwLed1); + u8 bStopBlinking = _FALSE; + +#ifndef CONFIG_LED_REMOVE_HAL + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); +#endif + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + +#ifndef CONFIG_LED_REMOVE_HAL + if(pHalData->EEPROMCustomerID == RT_CID_DEFAULT) + { + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + if(!pLed1->bSWLedCtrl) + { + SwLedOn(padapter, pLed1); + pLed1->bSWLedCtrl = _TRUE; + } + else if(!pLed1->bLedOn) + SwLedOn(padapter, pLed1); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn on pLed1\n")); + } + else + { + if(!pLed1->bSWLedCtrl) + { + SwLedOff(padapter, pLed1); + pLed1->bSWLedCtrl = _TRUE; + } + else if(pLed1->bLedOn) + SwLedOff(padapter, pLed1); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn off pLed1\n")); + } + } + +#endif + + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + ResetLedStatus(pLed); + return; + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_NORMAL: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->BlinkTimes = 0; + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + break; + + case LED_BLINK_WPS_STOP: //WPS success + if(pLed->BlinkingLedState == RTW_LED_ON) + bStopBlinking = _FALSE; + else + bStopBlinking = _TRUE; + + if(bStopBlinking) + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + + pLed->bLedWPSBlinkInProgress = _FALSE; + } + else + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + } + break; + + default: + break; + } + +} + +void +SwLedBlink2( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + default: + break; + } + +} + +void +SwLedBlink3( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + if(pLed->CurrLedState != LED_BLINK_WPS_STOP) + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if( !pLed->bLedOn ) + SwLedOn(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedOn ) + SwLedOff(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + + if( !pLed->bLedOn ) + SwLedOn(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + + if( pLed->bLedOn ) + SwLedOff(padapter, pLed); + + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + break; + + case LED_BLINK_WPS_STOP: //WPS success + if(pLed->BlinkingLedState == RTW_LED_ON) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + bStopBlinking = _FALSE; + } + else + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedWPSBlinkInProgress = _FALSE; + } + break; + + + default: + break; + } + +} + + +void +SwLedBlink4( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + PLED_871x pLed1 = &(ledpriv->SwLed1); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + if(!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) + { + pLed1->BlinkingLedState = RTW_LED_OFF; + pLed1->CurrLedState = RTW_LED_OFF; + SwLedOff(padapter, pLed1); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_StartToBlink: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _FALSE; + } + + if(bStopBlinking) + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedNoLinkBlinkInProgress = _FALSE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_BLINK_WPS_STOP: //WPS authentication fail + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + break; + + case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap + pLed->BlinkTimes--; + if(pLed->BlinkTimes == 0) + { + if(pLed->bLedOn) + { + pLed->BlinkTimes = 1; + } + else + { + bStopBlinking = _TRUE; + } + } + + if(bStopBlinking) + { + pLed->BlinkTimes = 10; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState)); + + +} + +void +SwLedBlink5( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SCAN: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if(pLed->bLedOn) + SwLedOff(padapter, pLed); + } + else + { pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if(!pLed->bLedOn) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + + case LED_BLINK_TXRX: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if(pLed->bLedOn) + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if(!pLed->bLedOn) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState)); + + +} + +void +SwLedBlink6( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == RTW_LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink6\n")); +} + +static void +SwLedControlMode0( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + PLED_871x pLed = &(ledpriv->SwLed1); + + // Decide led state + switch(LedAction) + { + case LED_CTL_TX: + case LED_CTL_RX: + if( pLed->bLedBlinkInProgress == _FALSE ) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_NORMAL; + pLed->BlinkTimes = 2; + + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_CTL_START_TO_LINK: + if( pLed->bLedBlinkInProgress == _FALSE ) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_StartToBlink; + pLed->BlinkTimes = 24; + + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->CurrLedState = LED_BLINK_StartToBlink; + } + break; + + case LED_CTL_LINK: + pLed->CurrLedState = RTW_LED_ON; + if( pLed->bLedBlinkInProgress == _FALSE ) + { + SwLedOn(padapter, pLed); + } + break; + + case LED_CTL_NO_LINK: + pLed->CurrLedState = RTW_LED_OFF; + if( pLed->bLedBlinkInProgress == _FALSE ) + { + SwLedOff(padapter, pLed); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + if(pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + SwLedOff(padapter, pLed); + break; + + case LED_CTL_START_WPS: + if( pLed->bLedBlinkInProgress == _FALSE || pLed->CurrLedState == RTW_LED_ON) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_WPS; + pLed->BlinkTimes = 20; + + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + } + break; + + case LED_CTL_STOP_WPS: + if(pLed->bLedBlinkInProgress) + { + pLed->CurrLedState = RTW_LED_OFF; + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + break; + + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); + +} + + //ALPHA, added by chiyoko, 20090106 +static void +SwLedControlMode1( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ +#ifndef CONFIG_LED_REMOVE_HAL + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#endif + struct led_priv *ledpriv = &(padapter->ledpriv); + PLED_871x pLed = &(ledpriv->SwLed0); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +#ifndef CONFIG_LED_REMOVE_HAL + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); +#endif + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + if( pLed->bLedLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + + case LED_CTL_STOP_WPS: + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + } + else + { + pLed->bLedWPSBlinkInProgress = _TRUE; + } + + pLed->CurrLedState = LED_BLINK_WPS_STOP; + if(pLed->bLedOn) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_STOP_WPS_FAIL: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedNoLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + SwLedOff(padapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + //Arcadyan/Sitecom , added by chiyoko, 20090216 +static void +SwLedControlMode2( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_SITE_SURVEY: + if(pmlmepriv->LinkDetectInfo.bBusyTraffic) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_STOP_WPS: + pLed->bLedWPSBlinkInProgress = _FALSE; + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + break; + + case LED_CTL_STOP_WPS_FAIL: + pLed->bLedWPSBlinkInProgress = _FALSE; + if(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + break; + + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if(!IS_LED_BLINKING(pLed)) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); +} + + //COREGA, added by chiyoko, 20090316 + static void + SwLedControlMode3( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_SITE_SURVEY: + if(pmlmepriv->LinkDetectInfo.bBusyTraffic) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + if(IS_LED_WPS_BLINKING(pLed)) + return; + + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_STOP_WPS: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + else + { + pLed->bLedWPSBlinkInProgress = _TRUE; + } + + pLed->CurrLedState = LED_BLINK_WPS_STOP; + if(pLed->bLedOn) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + + break; + + case LED_CTL_STOP_WPS_FAIL: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if(!IS_LED_BLINKING(pLed)) + { + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); +} + + + //Edimax-Belkin, added by chiyoko, 20090413 +static void +SwLedControlMode4( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + PLED_871x pLed1 = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_START_TO_LINK: + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = RTW_LED_OFF; + pLed1->CurrLedState = RTW_LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + + if( pLed->bLedStartToLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedNoLinkBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + + pLed->bLedStartToLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_StartToBlink; + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + } + break; + + case LED_CTL_LINK: + case LED_CTL_NO_LINK: + //LED1 settings + if(LedAction == LED_CTL_LINK) + { + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = RTW_LED_OFF; + pLed1->CurrLedState = RTW_LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + } + + if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = RTW_LED_OFF; + pLed1->CurrLedState = RTW_LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = RTW_LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + } + break; + + case LED_CTL_STOP_WPS: //WPS connect success + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + break; + + case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + //LED1 settings + if(pLed1->bLedWPSBlinkInProgress) + _cancel_timer_ex(&(pLed1->BlinkTimer)); + else + pLed1->bLedWPSBlinkInProgress = _TRUE; + + pLed1->CurrLedState = LED_BLINK_WPS_STOP; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = RTW_LED_OFF; + else + pLed1->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + + break; + + case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + //LED1 settings + if(pLed1->bLedWPSBlinkInProgress) + _cancel_timer_ex(&(pLed1->BlinkTimer)); + else + pLed1->bLedWPSBlinkInProgress = _TRUE; + + pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP; + pLed1->BlinkTimes = 10; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = RTW_LED_OFF; + else + pLed1->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + + if( pLed->bLedNoLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedStartToLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedStartToLinkBlinkInProgress = _FALSE; + } + + if( pLed1->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed1->BlinkTimer)); + pLed1->bLedWPSBlinkInProgress = _FALSE; + } + + pLed1->BlinkingLedState = LED_UNKNOWN; + SwLedOff(padapter, pLed); + SwLedOff(padapter, pLed1); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + + + //Sercomm-Belkin, added by chiyoko, 20090415 +static void +SwLedControlMode5( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ +#ifndef CONFIG_LED_REMOVE_HAL + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#endif + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + +#ifndef CONFIG_LED_REMOVE_HAL + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); +#endif + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_NO_LINK: + case LED_CTL_LINK: //solid blue + pLed->CurrLedState = RTW_LED_ON; + pLed->BlinkingLedState = RTW_LED_ON; + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SCAN; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_BLINK_SCAN) + { + return; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_TXRX; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = RTW_LED_OFF; + else + pLed->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = RTW_LED_OFF; + pLed->BlinkingLedState = RTW_LED_OFF; + + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + SwLedOff(padapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + //WNC-Corega, added by chiyoko, 20090902 +static void +SwLedControlMode6( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed0 = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_LINK: + case LED_CTL_NO_LINK: + _cancel_timer_ex(&(pLed0->BlinkTimer)); + pLed0->CurrLedState = RTW_LED_ON; + pLed0->BlinkingLedState = RTW_LED_ON; + _set_timer(&(pLed0->BlinkTimer), 0); + break; + + case LED_CTL_POWER_OFF: + SwLedOff(padapter, pLed0); + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("ledcontrol 6 Led %d\n", pLed0->CurrLedState)); +} + +// +// Description: +// Handler function of LED Blinking. +// We dispatch acture LED blink action according to LedStrategy. +// +void BlinkHandler(PLED_871x pLed) +{ + _adapter *padapter = pLed->padapter; + struct led_priv *ledpriv = &(padapter->ledpriv); + + //DBG_871X("%s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + //DBG_871X("%s bSurpriseRemoved:%d, bDriverStopped:%d\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->bDriverStopped); + return; + } + + switch(ledpriv->LedStrategy) + { + case SW_LED_MODE0: + SwLedBlink(pLed); + break; + + case SW_LED_MODE1: + SwLedBlink1(pLed); + break; + + case SW_LED_MODE2: + SwLedBlink2(pLed); + break; + + case SW_LED_MODE3: + SwLedBlink3(pLed); + break; + + case SW_LED_MODE4: + SwLedBlink4(pLed); + break; + + case SW_LED_MODE5: + SwLedBlink5(pLed); + break; + + case SW_LED_MODE6: + SwLedBlink6(pLed); + break; + + default: + //RT_TRACE(COMP_LED, DBG_LOUD, ("BlinkWorkItemCallback 0x%x \n", pHalData->LedStrategy)); + //SwLedBlink(pLed); + break; + } +} + +void +LedControl871x( + _adapter *padapter, + LED_CTL_MODE LedAction + ) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE) + ||(padapter->hw_init_completed == _FALSE) ) + { + return; + } + + + if( ledpriv->bRegUseLed == _FALSE) + return; + + //if (!priv->up) + // return; + + //if(priv->bInHctTest) + // return; + + if( (adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && + adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS) && + (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || + LedAction == LED_CTL_SITE_SURVEY || + LedAction == LED_CTL_LINK || + LedAction == LED_CTL_NO_LINK || + LedAction == LED_CTL_POWER_ON) ) + { + return; + } + + switch(ledpriv->LedStrategy) + { + case SW_LED_MODE0: + //SwLedControlMode0(padapter, LedAction); + break; + + case SW_LED_MODE1: + SwLedControlMode1(padapter, LedAction); + break; + case SW_LED_MODE2: + SwLedControlMode2(padapter, LedAction); + break; + + case SW_LED_MODE3: + SwLedControlMode3(padapter, LedAction); + break; + + case SW_LED_MODE4: + SwLedControlMode4(padapter, LedAction); + break; + + case SW_LED_MODE5: + SwLedControlMode5(padapter, LedAction); + break; + + case SW_LED_MODE6: + SwLedControlMode6(padapter, LedAction); + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("LedStrategy:%d, LedAction %d\n", ledpriv->LedStrategy,LedAction)); +} + +#endif + diff --git a/drivers/net/wireless/rtl8723as/core/rtw_mlme.c b/drivers/net/wireless/rtl8723as/core/rtw_mlme.c index a827c0221b36..b5e1807c69d7 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_mlme.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_mlme.c @@ -119,7 +119,7 @@ static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen) { if(*ppie) { - _rtw_mfree(*ppie, *plen); + rtw_mfree(*ppie, *plen); *plen = 0; *ppie=NULL; } @@ -628,7 +628,7 @@ inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b) && _rtw_memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength)==_TRUE; } -int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst) +int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst, u8 feature) { u16 s_cap, d_cap; @@ -658,6 +658,14 @@ _func_enter_; _func_exit_; +#ifdef CONFIG_P2P + if ((feature == 1) && // 1: P2P supported + (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN) == _TRUE) + ) { + return _TRUE; + } +#endif + return ((src->Ssid.SsidLength == dst->Ssid.SsidLength) && // (src->Configuration.DSConfig == dst->Configuration.DSConfig) && ( (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN)) == _TRUE) && @@ -723,10 +731,10 @@ _func_enter_; rtw_hal_antdiv_rssi_compared(padapter, dst, src); //this will update src.Rssi, need consider again #endif - #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 + #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1 if(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { - DBG_871X("%s %s("MAC_FMT", ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n" - , __FUNCTION__ + DBG_871X(FUNC_ADPT_FMT" %s("MAC_FMT", ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n" + , FUNC_ADPT_ARG(padapter) , src->Ssid.Ssid, MAC_ARG(src->MacAddress), src->Configuration.DSConfig ,ss_ori, sq_ori, rssi_ori ,ss_smp, sq_smp, rssi_smp @@ -735,7 +743,7 @@ _func_enter_; #endif /* The rule below is 1/5 for sample value, 4/5 for history value */ - if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) { + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src, 0)) { /* Take the recvpriv's value for the connected AP*/ ss_final = padapter->recvpriv.signal_strength; sq_final = padapter->recvpriv.signal_qual; @@ -759,24 +767,27 @@ _func_enter_; } - if (update_ie) + if (update_ie) { + dst->Reserved[0] = src->Reserved[0]; + dst->Reserved[1] = src->Reserved[1]; _rtw_memcpy((u8 *)dst, (u8 *)src, get_WLAN_BSSID_EX_sz(src)); + } dst->PhyInfo.SignalStrength = ss_final; dst->PhyInfo.SignalQuality = sq_final; dst->Rssi = rssi_final; - #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 + #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1 if(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { - DBG_871X("%s %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\n" - , __FUNCTION__ + DBG_871X(FUNC_ADPT_FMT" %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\n" + , FUNC_ADPT_ARG(padapter) , dst->Ssid.Ssid, MAC_ARG(dst->MacAddress), dst->PhyInfo.SignalStrength, dst->PhyInfo.SignalQuality, dst->Rssi); } #endif #if 0 // old codes, may be useful one day... // DBG_871X("update_network: rssi=0x%lx dst->Rssi=%d ,dst->Rssi=0x%lx , src->Rssi=0x%lx",(dst->Rssi+src->Rssi)/2,dst->Rssi,dst->Rssi,src->Rssi); - if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src, 0)) { //DBG_871X("b:ssid=%s update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Ssid.Ssid,src->Rssi,padapter->recvpriv.signal); @@ -825,7 +836,7 @@ _func_enter_; } #endif - if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork))) + if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork, 0))) { //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"Same Network\n"); @@ -854,9 +865,13 @@ void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target) _list *plist, *phead; ULONG bssid_ex_sz; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct wifidirect_info *pwdinfo= &(adapter->wdinfo); _queue *queue = &(pmlmepriv->scanned_queue); struct wlan_network *pnetwork = NULL; struct wlan_network *oldest = NULL; + int target_find = 0; + u8 feature = 0; _func_enter_; @@ -864,6 +879,11 @@ _func_enter_; phead = get_list_head(queue); plist = get_next(phead); +#ifdef CONFIG_P2P + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + feature = 1; // p2p enable +#endif + while(1) { if (rtw_end_of_queue_search(phead,plist)== _TRUE) @@ -878,8 +898,10 @@ _func_enter_; #endif } - if (is_same_network(&(pnetwork->network), target)) + if (is_same_network(&(pnetwork->network), target, feature)) { + target_find = 1; break; + } if ((oldest == ((struct wlan_network *)0)) || time_after(oldest->last_scanned, pnetwork->last_scanned)) @@ -892,7 +914,8 @@ _func_enter_; /* If we didn't find a match, then get a new network slot to initialize * with this beacon's information */ - if (rtw_end_of_queue_search(phead,plist)== _TRUE) { + //if (rtw_end_of_queue_search(phead,plist)== _TRUE) { + if (!target_find) { if (_rtw_queue_empty(&(pmlmepriv->free_bss_pool)) == _TRUE) { /* If there are no more slots, expire the oldest */ @@ -955,8 +978,15 @@ _func_enter_; pnetwork->last_scanned = rtw_get_current_time(); //target.Reserved[0]==1, means that scaned network is a bcn frame. - if((pnetwork->network.IELength>target->IELength) && (target->Reserved[0]==1)) + // probe resp(3) > beacon(1) > probe req(2) + if ((target->Reserved[0] != 2) && + (target->Reserved[0] >= pnetwork->network.Reserved[0]) + ) { + update_ie = _TRUE; + } + else { update_ie = _FALSE; + } update_network(&(pnetwork->network), target,adapter, update_ie); } @@ -1026,8 +1056,20 @@ int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork) } if (adapter->registrypriv.wifi_spec == 1) //for correct flow of 8021X to do.... { + u8 *p=NULL; + uint ie_len=0; + if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0)) bselected = _FALSE; + + if ( psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK) { + p = rtw_get_ie(pnetwork->network.IEs + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pnetwork->network.IELength - _BEACON_IE_OFFSET_)); + if (p && ie_len>0) { + bselected = _TRUE; + } else { + bselected = _FALSE; + } + } } @@ -1129,7 +1171,7 @@ _func_enter_; pnetwork->Ssid.SsidLength = 0; } rtw_add_network(adapter, pnetwork); - } + } exit: @@ -1145,6 +1187,7 @@ _func_exit_; void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf) { _irqL irqL; + u8 timer_cancelled = _FALSE; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); #ifdef CONFIG_MLME_EXT @@ -1156,7 +1199,6 @@ void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf) _func_enter_; _enter_critical_bh(&pmlmepriv->lock, &irqL); - if(pmlmepriv->wps_probe_req_ie) { u32 free_len = pmlmepriv->wps_probe_req_ie_len; @@ -1169,9 +1211,10 @@ _func_enter_; if (check_fwstate(pmlmepriv,_FW_UNDER_SURVEY)) { - u8 timer_cancelled; - - _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); + //u8 timer_cancelled; + + timer_cancelled = _TRUE; + //_cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); } @@ -1179,6 +1222,13 @@ _func_enter_; RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("nic status =%x, survey done event comes too late!\n", get_fwstate(pmlmepriv))); } + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + if(timer_cancelled) + _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); + + + _enter_critical_bh(&pmlmepriv->lock, &irqL); #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS rtw_set_signal_stat_timer(&adapter->recvpriv); @@ -1293,7 +1343,7 @@ _func_enter_; { struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; if(pmlmeext->sitesurvey_res.bss_cnt == 0){ - rtw_hal_sreset_reset(adapter); + //rtw_hal_sreset_reset(adapter); } } #endif @@ -1413,6 +1463,32 @@ _func_enter_; if(pwlan) { pwlan->fixed = _FALSE; +#ifdef CONFIG_P2P + if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) + { + u32 p2p_ielen=0; + u8 *p2p_ie; + //u16 capability; + u8 *pcap = NULL; + u32 capability_len=0; + + //DBG_871X("free disconnecting network\n"); + //rtw_free_network_nolock(pmlmepriv, pwlan); + + if((p2p_ie=rtw_get_p2p_ie(pwlan->network.IEs+_FIXED_IE_LENGTH_, pwlan->network.IELength-_FIXED_IE_LENGTH_, NULL, &p2p_ielen))) + { + pcap = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, NULL, &capability_len); + if(pcap && capability_len==2) + { + u16 cap = *(u16*)pcap ; + *(u16*)pcap = cap&0x00ff;//clear group capability when free this network + } + } + + rtw_set_scan_deny(adapter, 2000); + //rtw_clear_scan_deny(adapter); + } +#endif //CONFIG_P2P } else { @@ -1429,7 +1505,7 @@ _func_enter_; if(lock_scanned_queue) _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - pmlmepriv->key_mask = 0; + adapter->securitypriv.key_mask = 0; _func_exit_; @@ -1536,7 +1612,7 @@ _func_enter_; rtw_os_indicate_disconnect(padapter); //set ips_deny_time to avoid enter IPS before LPS leave - padapter->pwrctrlpriv.ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(3000); + adapter_to_pwrctl(padapter)->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(3000); _clr_fwstate_(pmlmepriv, _FW_LINKED); @@ -1551,9 +1627,6 @@ _func_enter_; #endif // CONFIG_P2P_PS #ifdef CONFIG_LPS -#ifdef CONFIG_WOWLAN - if(padapter->pwrctrlpriv.wowlan_mode==_FALSE) -#endif //CONFIG_WOWLAN rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1); #endif @@ -1587,7 +1660,7 @@ void rtw_scan_abort(_adapter *adapter) if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { if (!adapter->bDriverStopped && !adapter->bSurpriseRemoved) DBG_871X(FUNC_NDEV_FMT"waiting for scan_abort time out!\n", FUNC_NDEV_ARG(adapter->pnetdev)); - #ifdef CONFIG_PLATFORM_MSTAR_TITANIA12 + #ifdef CONFIG_PLATFORM_MSTAR //_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); set_survey_timer(pmlmeext, 0); _set_timer(&pmlmepriv->scan_to_timer, 50); @@ -1642,7 +1715,10 @@ static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wl _rtw_memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof (union Keytype)); _rtw_memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof (union Keytype)); - _rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48)); + _rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48)); +#ifdef CONFIG_IEEE80211W + _rtw_memset((u8 *)&psta->dot11wtxpn, 0, sizeof (union pn48)); +#endif //CONFIG_IEEE80211W _rtw_memset((u8 *)&psta->dot11rxpn, 0, sizeof (union pn48)); } @@ -1732,9 +1808,9 @@ static void rtw_joinbss_update_network(_adapter *padapter, struct wlan_network * //the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) padapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength); #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 - DBG_871X("%s signal_strength:%3u, rssi:%3d, signal_qual:%3u" + DBG_871X(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u" "\n" - , __FUNCTION__ + , FUNC_ADPT_ARG(padapter) , padapter->recvpriv.signal_strength , padapter->recvpriv.rssi , padapter->recvpriv.signal_qual @@ -1911,15 +1987,16 @@ _func_enter_; } //s4. indicate connect - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - rtw_indicate_connect(adapter); - } - else - { - //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); - } + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + pmlmepriv->cur_network_scanned = ptarget_wlan; + rtw_indicate_connect(adapter); + } + else + { + //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); + } //s5. Cancle assoc_timer @@ -2057,10 +2134,10 @@ u8 search_max_mac_id(_adapter *padapter) } -//FOR AP ,AD-HOC mode -void rtw_stassoc_hw_rpt(_adapter *adapter,struct sta_info *psta) +//FOR STA, AP ,AD-HOC mode +void rtw_sta_media_status_rpt(_adapter *adapter,struct sta_info *psta, u32 mstatus) { - u16 media_status; + u16 media_status_rpt; if(psta==NULL) return; @@ -2070,8 +2147,8 @@ void rtw_stassoc_hw_rpt(_adapter *adapter,struct sta_info *psta) rtw_hal_set_hwreg(adapter,HW_VAR_TX_RPT_MAX_MACID, (u8*)&macid); } #endif - media_status = (psta->mac_id<<8)|1; // MACID|OPMODE:1 connect - rtw_hal_set_hwreg(adapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status); + media_status_rpt = (u16)((psta->mac_id<<8)|mstatus); // MACID|OPMODE:1 connect + rtw_hal_set_hwreg(adapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status_rpt); } void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf) @@ -2094,13 +2171,18 @@ _func_enter_; psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); if(psta) { -#ifdef CONFIG_IOCTL_CFG80211 - #ifdef COMPAT_KERNEL_RELEASE - - #elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) u8 *passoc_req = NULL; - u32 assoc_req_len; + u32 assoc_req_len = 0; + + rtw_sta_media_status_rpt(adapter, psta, 1); + +#ifndef CONFIG_AUTO_AP_MODE + + ap_sta_info_defer_update(adapter, psta); + //report to upper layer + DBG_871X("indicate_sta_assoc_event to upper layer - hostapd\n"); +#ifdef CONFIG_IOCTL_CFG80211 _enter_critical_bh(&psta->lock, &irqL); if(psta->passoc_req && psta->assoc_req_len>0) { @@ -2110,7 +2192,7 @@ _func_enter_; assoc_req_len = psta->assoc_req_len; _rtw_memcpy(passoc_req, psta->passoc_req, assoc_req_len); - _rtw_mfree(psta->passoc_req , psta->assoc_req_len); + rtw_mfree(psta->passoc_req , psta->assoc_req_len); psta->passoc_req = NULL; psta->assoc_req_len = 0; } @@ -2120,23 +2202,18 @@ _func_enter_; if(passoc_req && assoc_req_len>0) { rtw_cfg80211_indicate_sta_assoc(adapter, passoc_req, assoc_req_len); - - _rtw_mfree(passoc_req, assoc_req_len); - } - #endif //(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) -#endif //CONFIG_IOCTL_CFG80211 - - //bss_cap_update_on_sta_join(adapter, psta); - //sta_info_update(adapter, psta); - ap_sta_info_defer_update(adapter, psta); - - rtw_stassoc_hw_rpt(adapter,psta); - - } + rtw_mfree(passoc_req, assoc_req_len); + } +#else //!CONFIG_IOCTL_CFG80211 + rtw_indicate_sta_assoc_event(adapter, psta); +#endif //!CONFIG_IOCTL_CFG80211 +#endif //!CONFIG_AUTO_AP_MODE + } goto exit; } -#endif +#endif //defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + //for AD-HOC mode psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); if( psta != NULL) @@ -2162,7 +2239,7 @@ _func_enter_; //for ad-hoc mode rtw_hal_set_odm_var(adapter,HAL_ODM_STA_INFO,psta,_TRUE); - rtw_stassoc_hw_rpt(adapter,psta); + rtw_sta_media_status_rpt(adapter, psta, 1); if(adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm; @@ -2193,7 +2270,7 @@ _func_enter_; #ifdef CONFIG_RTL8711 //submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta - rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE); + rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE, _TRUE); #endif exit: @@ -2253,7 +2330,9 @@ _func_enter_; if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) { #ifdef CONFIG_LAYER2_ROAMING - if (rtw_to_roaming(adapter) > 0) + if(adapter->registrypriv.wifi_spec==1) + rtw_set_roaming(adapter, 0); /* don't roam */ + else if (rtw_to_roaming(adapter) > 0) pmlmepriv->to_roaming--; /* this stadel_event is caused by roaming, decrease to_roaming */ else if (rtw_to_roaming(adapter) == 0) rtw_set_roaming(adapter, adapter->registrypriv.max_roaming_times); @@ -2357,7 +2436,7 @@ _func_enter_; RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+rtw_cpwm_event_callback !!!\n")); #ifdef CONFIG_LPS_LCLK preportpwrstate = (struct reportpwrstate_parm*)pbuf; - preportpwrstate->state |= (u8)(padapter->pwrctrlpriv.cpwm_tog + 0x80); + preportpwrstate->state |= (u8)(adapter_to_pwrctl(padapter)->cpwm_tog + 0x80); cpwm_int_hdl(padapter, preportpwrstate); #endif @@ -2489,7 +2568,7 @@ void rtw_scan_timeout_handler (_adapter *adapter) static void rtw_auto_scan_handler(_adapter *padapter) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); //auto site survey per 60sec if(pmlmepriv->scan_interval >0) @@ -2549,7 +2628,12 @@ void rtw_dynamic_check_timer_handlder(_adapter *adapter) return; #if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) if(adapter->HalFunc.hal_checke_bt_hang) - adapter->HalFunc.hal_checke_bt_hang(adapter); + { +#ifdef CONFIG_CONCURRENT_MODE + if (adapter->adapter_type == PRIMARY_ADAPTER) +#endif + adapter->HalFunc.hal_checke_bt_hang(adapter); + } #endif if(adapter->hw_init_completed == _FALSE) return; @@ -2678,6 +2762,13 @@ void rtw_set_scan_deny(_adapter *adapter, u32 ms) } #endif +#ifdef CONFIG_DETECT_C2H_BY_POLLING +void rtw_event_polling_timer_hdl(_adapter *adapter) +{ + rtw_event_polling_cmd(adapter); +} +#endif + #if defined(IEEE80211_SCAN_RESULT_EXPIRE) #define RTW_SCAN_RESULT_EXPIRE IEEE80211_SCAN_RESULT_EXPIRE/HZ*1000 -1000 //3000 -1000 #else @@ -2953,7 +3044,7 @@ _func_enter_; if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { - if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) + if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network), 0) { //DBG_871X("select_and_join(1): _FW_LINKED and is same network, it needn't join again\n"); @@ -2987,7 +3078,7 @@ _func_enter_; if( (roaming_candidate == NULL ||roaming_candidate->network.Rssinetwork.Rssi ) && is_same_ess(&pnetwork->network, &pmlmepriv->cur_network.network) - //&&(!is_same_network(&pnetwork->network, &pmlmepriv->cur_network.network)) + //&&(!is_same_network(&pnetwork->network, &pmlmepriv->cur_network.network, 0)) && rtw_get_time_interval_ms((u32)pnetwork->last_scanned,cur_time) < 5000 ) { roaming_candidate = pnetwork; @@ -3030,7 +3121,7 @@ _func_enter_; if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { #if 0 - if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) + if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) { DBG_871X("select_and_join(2): _FW_LINKED and is same network, it needn't join again\n"); @@ -3141,7 +3232,7 @@ _func_exit_; } -sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx) +sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx, bool enqueue) { u8 keylen; struct cmd_obj *pcmd; @@ -3151,19 +3242,12 @@ sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint key sint res=_SUCCESS; _func_enter_; - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res= _FAIL; //try again - goto exit; - } + psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); - if(psetkeyparm==NULL){ - rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + if(psetkeyparm==NULL){ res= _FAIL; goto exit; } - _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); if(psecuritypriv->dot11AuthAlgrthm ==dot11AuthAlgrthm_8021X){ @@ -3178,20 +3262,13 @@ _func_enter_; psetkeyparm->keyid = (u8)keyid;//0~3 psetkeyparm->set_tx = set_tx; if (is_wep_enc(psetkeyparm->algorithm)) - pmlmepriv->key_mask |= BIT(psetkeyparm->keyid); + psecuritypriv->key_mask |= BIT(psetkeyparm->keyid); -#ifdef CONFIG_AUTOSUSPEND - if( _TRUE == adapter->pwrctrlpriv.bInternalAutoSuspend) - { - adapter->pwrctrlpriv.wepkeymask = pmlmepriv->key_mask; - DBG_871X("....AutoSuspend pwrctrlpriv.wepkeymask(%x)\n",adapter->pwrctrlpriv.wepkeymask); - } -#endif - DBG_871X("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid,pmlmepriv->key_mask); + DBG_871X("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid, psecuritypriv->key_mask); RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=%d psetkeyparm->keyid=(u8)keyid=%d \n",psetkeyparm->algorithm, keyid)); switch(psetkeyparm->algorithm){ - + case _WEP40_: keylen=5; _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); @@ -3201,7 +3278,7 @@ _func_enter_; _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); break; case _TKIP_: - keylen=16; + keylen=16; _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); psetkeyparm->grpkey=1; break; @@ -3213,23 +3290,35 @@ _func_enter_; default: RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key:psecuritypriv->dot11PrivacyAlgrthm = %x (must be 1 or 2 or 4 or 5)\n",psecuritypriv->dot11PrivacyAlgrthm)); res= _FAIL; + rtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm)); goto exit; } + + + if(enqueue){ + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + rtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm)); + res= _FAIL; //try again + goto exit; + } + + pcmd->cmdcode = _SetKey_CMD_; + pcmd->parmbuf = (u8 *)psetkeyparm; + pcmd->cmdsz = (sizeof(struct setkey_parm)); + pcmd->rsp = NULL; + pcmd->rspsz = 0; - - pcmd->cmdcode = _SetKey_CMD_; - pcmd->parmbuf = (u8 *)psetkeyparm; - pcmd->cmdsz = (sizeof(struct setkey_parm)); - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - - _rtw_init_listhead(&pcmd->list); - - //_rtw_init_sema(&(pcmd->cmd_sem), 0); + _rtw_init_listhead(&pcmd->list); - res = rtw_enqueue_cmd(pcmdpriv, pcmd); + //_rtw_init_sema(&(pcmd->cmd_sem), 0); + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + } + else{ + setkey_hdl(adapter, (u8 *)psetkeyparm); + rtw_mfree((u8 *) psetkeyparm, sizeof(struct setkey_parm)); + } exit: _func_exit_; return res; @@ -3389,6 +3478,14 @@ _func_enter_; { //copy RSN or SSN _rtw_memcpy(&out_ie[ielength], &psecuritypriv->supplicant_ie[0], psecuritypriv->supplicant_ie[1]+2); + /* debug for CONFIG_IEEE80211W + { + int jj; + printk("supplicant_ie_length=%d &&&&&&&&&&&&&&&&&&&\n", psecuritypriv->supplicant_ie[1]+2); + for(jj=0; jj < psecuritypriv->supplicant_ie[1]+2; jj++) + printk(" %02x ", psecuritypriv->supplicant_ie[jj]); + printk("\n"); + }*/ ielength+=psecuritypriv->supplicant_ie[1]+2; rtw_report_sec_ie(adapter, authmode, psecuritypriv->supplicant_ie); @@ -3655,7 +3752,7 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui p = rtw_get_ie(in_ie+12, _HT_ADD_INFO_IE_, &ielen, in_len-12); if(p && (ielen==sizeof(struct ieee80211_ht_addt_info))) { - out_len = *pout_len; + out_len = *pout_len; pframe = rtw_set_ie(out_ie+out_len, _HT_ADD_INFO_IE_, ielen, p+2 , pout_len); } diff --git a/drivers/net/wireless/rtl8723as/core/rtw_mlme_ext.c b/drivers/net/wireless/rtl8723as/core/rtw_mlme_ext.c index fbf4b0668014..79961ad7df62 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_mlme_ext.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_mlme_ext.c @@ -85,7 +85,14 @@ struct action_handler OnAction_tbl[]={ {RTW_WLAN_CATEGORY_RADIO_MEASUREMENT, "ACTION_RADIO_MEASUREMENT", &DoReserved}, {RTW_WLAN_CATEGORY_FT, "ACTION_FT", &DoReserved}, {RTW_WLAN_CATEGORY_HT, "ACTION_HT", &OnAction_ht}, +#ifdef CONFIG_IEEE80211W + {RTW_WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &OnAction_sa_query}, +#else {RTW_WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &DoReserved}, +#endif //CONFIG_IEEE80211W + //add for CONFIG_IEEE80211W + {RTW_WLAN_CATEGORY_UNPROTECTED_WNM, "ACTION_UNPROTECTED_WNM", &DoReserved}, + {RTW_WLAN_CATEGORY_SELF_PROTECTED, "ACTION_SELF_PROTECTED", &DoReserved}, {RTW_WLAN_CATEGORY_WMM, "ACTION_WMM", &OnAction_wmm}, {RTW_WLAN_CATEGORY_P2P, "ACTION_P2P", &OnAction_p2p}, }; @@ -307,7 +314,11 @@ static void init_mlme_ext_priv_value(_adapter* padapter) ATOMIC_SET(&pmlmeext->event_seq, 0); pmlmeext->mgnt_seq = 0;//reset to zero when disconnect at client mode - +#ifdef CONFIG_IEEE80211W + pmlmeext->sa_query_seq = 0; + pmlmeext->mgnt_80211w_IPN=0; + pmlmeext->mgnt_80211w_IPN_rx=0; +#endif //CONFIG_IEEE80211W pmlmeext->cur_channel = padapter->registrypriv.channel; pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; @@ -754,7 +765,7 @@ void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) } #else - _mgt_dispatcher(padapter, ptable, precv_frame); + _mgt_dispatcher(padapter, ptable, precv_frame); #endif @@ -764,27 +775,32 @@ void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) u32 p2p_listen_state_process(_adapter *padapter, unsigned char *da) { bool response = _TRUE; - + #ifdef CONFIG_IOCTL_CFG80211 - if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == _FALSE - || padapter->mlmepriv.wps_probe_resp_ie == NULL - || padapter->mlmepriv.p2p_probe_resp_ie == NULL - ) + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 ) { - DBG_871X("DON'T issue_probersp_p2p: p2p_enabled:%d, wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p\n", - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled, - padapter->mlmepriv.wps_probe_resp_ie, - padapter->mlmepriv.p2p_probe_resp_ie); - response = _FALSE; + if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == _FALSE + || padapter->mlmepriv.wps_probe_resp_ie == NULL + || padapter->mlmepriv.p2p_probe_resp_ie == NULL + ) + { + DBG_871X("DON'T issue_probersp_p2p: p2p_enabled:%d, wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p\n", + wdev_to_priv(padapter->rtw_wdev)->p2p_enabled, + padapter->mlmepriv.wps_probe_resp_ie, + padapter->mlmepriv.p2p_probe_resp_ie); + response = _FALSE; + } } -#else - - // do nothing if the device name is empty - if ( !padapter->wdinfo.device_name_len ) + else +#endif //CONFIG_IOCTL_CFG80211 + if( padapter->wdinfo.driver_interface == DRIVER_WEXT ) { - response = _FALSE; + // do nothing if the device name is empty + if ( !padapter->wdinfo.device_name_len ) + { + response = _FALSE; + } } -#endif if (response == _TRUE) issue_probersp_p2p( padapter, da); @@ -910,8 +926,8 @@ _continue: _issue_probersp: - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE && - pmlmepriv->cur_network.join_res == _TRUE) + if(((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE && + pmlmepriv->cur_network.join_res == _TRUE)) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { //DBG_871X("+issue_probersp during ap mode\n"); issue_probersp(padapter, get_sa(pframe), is_valid_p2p_probereq); @@ -986,7 +1002,7 @@ unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame) } } } -#endif +#endif //CONFIG_P2P if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) @@ -994,10 +1010,10 @@ unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame) report_survey_event(padapter, precv_frame); #ifdef CONFIG_CONCURRENT_MODE report_survey_event(padapter->pbuddy_adapter, precv_frame); -#endif +#endif //CONFIG_CONCURRENT_MODE #ifdef CONFIG_DUALMAC_CONCURRENT dc_report_survey_event(padapter, precv_frame); -#endif +#endif //CONFIG_DUALMAC_CONCURRENT return _SUCCESS; } @@ -1105,7 +1121,7 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) ret = rtw_check_bcn_info(padapter, pframe, len); if (!ret) { DBG_871X_LEVEL(_drv_always_, "ap has changed, disconnect now\n "); - receive_disconnect(padapter, pmlmeinfo->network.MacAddress , 65535); + receive_disconnect(padapter, pmlmeinfo->network.MacAddress , 0); return _SUCCESS; } //update WMM, ERP in the beacon @@ -2104,56 +2120,34 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) bss_cap_update_on_sta_join(padapter, pstat); sta_info_update(padapter, pstat); - //issue assoc rsp before notify station join event. + //.2 issue assoc rsp before notify station join event. if (frame_type == WIFI_ASSOCREQ) issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); else issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP); - //.2 - report to upper layer - DBG_871X("indicate_sta_join_event to upper layer - hostapd\n"); - #ifdef CONFIG_IOCTL_CFG80211 - if (1) { - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_indicate_sta_assoc(padapter, pframe, pkt_len); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_indicate_sta_assoc(padapter, pframe, pkt_len); - #else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - _enter_critical_bh(&pstat->lock, &irqL); - if(pstat->passoc_req) - { - rtw_mfree(pstat->passoc_req, pstat->assoc_req_len); - pstat->passoc_req = NULL; - pstat->assoc_req_len = 0; - } - - pstat->passoc_req = rtw_zmalloc(pkt_len); - if(pstat->passoc_req) - { - _rtw_memcpy(pstat->passoc_req, pframe, pkt_len); - pstat->assoc_req_len = pkt_len; - } - _exit_critical_bh(&pstat->lock, &irqL); - #endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) +#ifdef CONFIG_IOCTL_CFG80211 + _enter_critical_bh(&pstat->lock, &irqL); + if(pstat->passoc_req) + { + rtw_mfree(pstat->passoc_req, pstat->assoc_req_len); + pstat->passoc_req = NULL; + pstat->assoc_req_len = 0; } - else - #endif //CONFIG_IOCTL_CFG80211 + + pstat->passoc_req = rtw_zmalloc(pkt_len); + if(pstat->passoc_req) { - rtw_indicate_sta_assoc_event(padapter, pstat); + _rtw_memcpy(pstat->passoc_req, pframe, pkt_len); + pstat->assoc_req_len = pkt_len; } + _exit_critical_bh(&pstat->lock, &irqL); +#endif //CONFIG_IOCTL_CFG80211 //.3-(1) report sta add event report_add_sta_event(padapter, pstat->hwaddr, pstat->aid); -/* - //issue assoc rsp before notify station join event. - if (frame_type == WIFI_ASSOCREQ) - issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); - else - issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP); -*/ - -#endif +#endif //CONFIG_NATIVEAP_MLME } return _SUCCESS; @@ -2364,10 +2358,32 @@ unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) else #endif { - DBG_871X_LEVEL(_drv_always_, "sta recv deauth reason code(%d) sta:%pM\n", - reason, GetAddr3Ptr(pframe)); + int ignore_received_deauth = 0; + + // Commented by Albert 20130604 + // Before sending the auth frame to start the STA/GC mode connection with AP/GO, + // we will send the deauth first. + // However, the Win8.1 with BRCM Wi-Fi will send the deauth with reason code 6 to us after receieving our deauth. + // Added the following code to avoid this case. + if ( ( pmlmeinfo->state & WIFI_FW_AUTH_STATE ) || + ( pmlmeinfo->state & WIFI_FW_ASSOC_STATE ) ) + { + if ( reason == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA ) + { + ignore_received_deauth = 1; + } else if (WLAN_REASON_PREV_AUTH_NOT_VALID == reason) { + // TODO: 802.11r + ignore_received_deauth = 1; + } + } + + DBG_871X_LEVEL(_drv_always_, "sta recv deauth reason code(%d) sta:%pM, ignore = %d\n", + reason, GetAddr3Ptr(pframe), ignore_received_deauth); - receive_disconnect(padapter, GetAddr3Ptr(pframe) ,reason); + if ( 0 == ignore_received_deauth ) + { + receive_disconnect(padapter, GetAddr3Ptr(pframe) ,reason); + } } pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; return _SUCCESS; @@ -3835,13 +3851,60 @@ void issue_p2p_GO_confirm(_adapter *padapter, u8* raddr, u8 result) // Type: p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( pwdinfo->channel_list_attr_len ); + *(u16*) ( p2pie + p2pielen ) = 6; p2pielen += 2; + // Country String + p2pie[ p2pielen++ ] = 'X'; + p2pie[ p2pielen++ ] = 'X'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->channel_list_attr, pwdinfo->channel_list_attr_len ); - p2pielen += pwdinfo->channel_list_attr_len; + if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) ) + { + if ( pwdinfo->peer_operating_ch <= 14 ) + { + // Operating Class + p2pie[ p2pielen++ ] = 0x51; + } + else if ( ( pwdinfo->peer_operating_ch >= 36 ) && ( pwdinfo->peer_operating_ch <= 48 ) ) + { + // Operating Class + p2pie[ p2pielen++ ] = 0x73; + } + else + { + // Operating Class + p2pie[ p2pielen++ ] = 0x7c; + } + p2pie[ p2pielen++ ] = 1; + p2pie[ p2pielen++ ] = pwdinfo->peer_operating_ch; + } + else + { + if ( pwdinfo->operating_channel <= 14 ) + { + // Operating Class + p2pie[ p2pielen++ ] = 0x51; + } + else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) ) + { + // Operating Class + p2pie[ p2pielen++ ] = 0x73; + } + else + { + // Operating Class + p2pie[ p2pielen++ ] = 0x7c; + } + + // Channel Number + p2pie[ p2pielen++ ] = 1; + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // Use the listen channel as the operating channel + } if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) ) { @@ -4655,11 +4718,6 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) #ifdef CONFIG_WFD u32 wfdielen = 0; #endif //CONFIG_WFD -#ifdef CONFIG_IOCTL_CFG80211 - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - struct ieee80211_channel *ieee_ch = &pcfg80211_wdinfo->remain_on_ch_channel; - u8 listen_channel = (u8) ieee80211_frequency_to_channel(ieee_ch->center_freq); -#endif //CONFIG_IOCTL_CFG80211 #ifdef CONFIG_INTEL_WIDI u8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 }; #endif //CONFIG_INTEL_WIDI @@ -4725,20 +4783,10 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); // DS parameter set -#ifdef CONFIG_IOCTL_CFG80211 - if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && listen_channel !=0 ) - { - pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&listen_channel, &pattrib->pktlen); - } - else -#endif //CONFIG_IOCTL_CFG80211 - { - pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen); - } - + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen); #ifdef CONFIG_IOCTL_CFG80211 - if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) { if( pmlmepriv->wps_probe_resp_ie != NULL && pmlmepriv->p2p_probe_resp_ie != NULL ) { @@ -4781,7 +4829,8 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) #ifdef CONFIG_INTEL_WIDI // Commented by Kurt // Appended WiDi info. only if we did issued_probereq_widi(), and then we saved ven. ext. in pmlmepriv->sa_ext. - if( _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE ) + if( _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE + || pmlmepriv->num_p2p_sdt != 0 ) { //Sec dev type *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SEC_DEV_TYPE_LIST ); @@ -4803,9 +4852,12 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_WIDI_CONSUMER_SINK ); wpsielen += 2; - // Vendor Extension - _rtw_memcpy( wpsie + wpsielen, pmlmepriv->sa_ext, L2SDTA_SERVICE_VE_LEN ); - wpsielen += L2SDTA_SERVICE_VE_LEN; + if( _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE ) + { + // Vendor Extension + _rtw_memcpy( wpsie + wpsielen, pmlmepriv->sa_ext, L2SDTA_SERVICE_VE_LEN ); + wpsielen += L2SDTA_SERVICE_VE_LEN; + } } #endif //CONFIG_INTEL_WIDI @@ -4843,7 +4895,12 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) wpsielen += 2; // Value: - _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + if (pwdinfo->external_uuid == 0) { + _rtw_memset( wpsie + wpsielen, 0x0, 16 ); + _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + } else { + _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 ); + } wpsielen += 0x10; // Manufacturer @@ -4967,7 +5024,7 @@ void issue_probersp_p2p(_adapter *padapter, unsigned char *da) pattrib->pktlen += wfdielen; } #ifdef CONFIG_IOCTL_CFG80211 - else if (pmlmepriv->wfd_probe_resp_ie != NULL && pmlmepriv->wfd_probe_resp_ie_len>0) + else if (pmlmepriv->wfd_probe_resp_ie != NULL && pmlmepriv->wfd_probe_resp_ie_len>0) { //WFD IE _rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, pmlmepriv->wfd_probe_resp_ie_len); @@ -5069,7 +5126,7 @@ int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); #ifdef CONFIG_IOCTL_CFG80211 - if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) { if( pmlmepriv->wps_probe_req_ie != NULL && pmlmepriv->p2p_probe_req_ie != NULL ) { @@ -5121,7 +5178,12 @@ int _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack) wpsielen += 2; // Value: - _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + if (pwdinfo->external_uuid == 0) { + _rtw_memset( wpsie + wpsielen, 0x0, 16 ); + _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + } else { + _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 ); + } wpsielen += 0x10; // Config Method @@ -5430,6 +5492,8 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); u8 result = P2P_STATUS_SUCCESS; u8 empty_addr[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + u8 *merged_p2pie = NULL; + u32 merged_p2p_ielen = 0; #endif //CONFIG_P2P frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); @@ -5442,7 +5506,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) #ifdef CONFIG_P2P _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey ); #ifdef CONFIG_IOCTL_CFG80211 - if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211) { rtw_cfg80211_rx_p2p_action_public(padapter, pframe, len); } @@ -5499,6 +5563,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) ) { padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION; + _cancel_timer_ex(&(padapter->mlmepriv.listen_timer)); intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL); } #endif //CONFIG_INTEL_WIDI @@ -5530,6 +5595,11 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) if ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT ) { pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch; + #ifdef P2P_OP_CHECK_SOCIAL_CH + pwdinfo->p2p_info.operation_ch[ 1 ] = 1; //Check whether GO is operating in channel 1; + pwdinfo->p2p_info.operation_ch[ 2 ] = 6; //Check whether GO is operating in channel 6; + pwdinfo->p2p_info.operation_ch[ 3 ] = 11; //Check whether GO is operating in channel 11; + #endif //P2P_OP_CHECK_SOCIAL_CH pwdinfo->p2p_info.scan_op_ch_only = 1; _set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH ); } @@ -5559,6 +5629,11 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) if ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT ) { pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch; + #ifdef P2P_OP_CHECK_SOCIAL_CH + pwdinfo->p2p_info.operation_ch[ 1 ] = 1; //Check whether GO is operating in channel 1; + pwdinfo->p2p_info.operation_ch[ 2 ] = 6; //Check whether GO is operating in channel 6; + pwdinfo->p2p_info.operation_ch[ 3 ] = 11; //Check whether GO is operating in channel 11; + #endif //P2P_OP_CHECK_SOCIAL_CH pwdinfo->p2p_info.scan_op_ch_only = 1; _set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH ); } @@ -5580,11 +5655,24 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) struct group_id_info group_id; u8 invitation_flag = 0; - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen); + + merged_p2p_ielen = rtw_get_p2p_merged_ies_len(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_); + + merged_p2pie = rtw_malloc(merged_p2p_ielen); + if (merged_p2pie == NULL) + { + DBG_871X( "[%s] Malloc p2p ie fail\n", __FUNCTION__); + goto exit; + } + _rtw_memset(merged_p2pie, 0x00, merged_p2p_ielen); + + merged_p2p_ielen = rtw_p2p_merge_ies(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, merged_p2pie); + + rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen); if ( attr_contentlen ) { - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen); + rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen); // Commented by Albert 20120510 // Copy to the pwdinfo->p2p_peer_interface_addr. // So that the WFD UI ( or Sigma ) can get the peer interface address by using the following command. @@ -5604,7 +5692,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) // Re-invoke the persistent group. _rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) ); - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen); + rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen); if ( attr_contentlen ) { if ( _rtw_memcmp( group_id.go_device_addr, myid( &padapter->eeprompriv ), ETH_ALEN ) ) @@ -5620,18 +5708,24 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) if ( is_matched_in_profilelist( pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ] ) ) { u8 operatingch_info[5] = { 0x00 }; - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) ) + + if ( rtw_get_p2p_attr_content(merged_p2pie, merged_p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) ) { if( rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4] ) ) { // The operating channel is acceptable for this device. pwdinfo->rx_invitereq_info.operation_ch[0]= operatingch_info[4]; + #ifdef P2P_OP_CHECK_SOCIAL_CH + pwdinfo->rx_invitereq_info.operation_ch[1]= 1; //Check whether GO is operating in channel 1; + pwdinfo->rx_invitereq_info.operation_ch[2]= 6; //Check whether GO is operating in channel 6; + pwdinfo->rx_invitereq_info.operation_ch[3]= 11; //Check whether GO is operating in channel 11; + #endif //P2P_OP_CHECK_SOCIAL_CH pwdinfo->rx_invitereq_info.scan_op_ch_only = 1; _set_timer( &pwdinfo->reset_ch_sitesurvey, P2P_RESET_SCAN_CH ); rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH ); rtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT ); status_code = P2P_STATUS_SUCCESS; - } + } else { // The operating channel isn't supported by this device. @@ -5674,7 +5768,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) // Received the invitation to join a P2P group. _rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) ); - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen); + rtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen); if ( attr_contentlen ) { if ( _rtw_memcmp( group_id.go_device_addr, myid( &padapter->eeprompriv ), ETH_ALEN ) ) @@ -5714,11 +5808,13 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) pwdinfo->inviteresp_info.token = frame_body[ 7 ]; issue_p2p_invitation_response( padapter, GetAddr2Ptr(pframe), pwdinfo->inviteresp_info.token, status_code ); + _set_timer( &pwdinfo->restore_p2p_state_timer, 3000 ); } #ifdef CONFIG_INTEL_WIDI if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) ) { padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION; + _cancel_timer_ex(&(padapter->mlmepriv.listen_timer)); intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL); } #endif //CONFIG_INTEL_WIDI @@ -5804,6 +5900,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) ) { padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION; + _cancel_timer_ex(&(padapter->mlmepriv.listen_timer)); intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL); } #endif //CONFIG_INTEL_WIDI @@ -5824,7 +5921,14 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame) } } #endif //CONFIG_P2P - + +exit: + + if(merged_p2pie) + { + rtw_mfree(merged_p2pie, merged_p2p_ielen); + } + return _SUCCESS; } @@ -5904,6 +6008,45 @@ unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame) return _SUCCESS; } +#ifdef CONFIG_IEEE80211W +unsigned int OnAction_sa_query(_adapter *padapter, union recv_frame *precv_frame) +{ + u8 *pframe = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + unsigned short tid; + //Baron + + DBG_871X("OnAction_sa_query\n"); + + switch (pframe[WLAN_HDR_A3_LEN+1]) + { + case 0: //SA Query req + _rtw_memcpy(&tid, &pframe[WLAN_HDR_A3_LEN+2], sizeof(unsigned short)); + DBG_871X("OnAction_sa_query request,action=%d, tid=%04x\n", pframe[WLAN_HDR_A3_LEN+1], tid); + issue_action_SA_Query(padapter, GetAddr2Ptr(pframe), 1, tid); + break; + + case 1: //SA Query rsp + _cancel_timer_ex(&pmlmeext->sa_query_timer); + DBG_871X("OnAction_sa_query response,action=%d, tid=%04x, cahcel timer\n", pframe[WLAN_HDR_A3_LEN+1], pframe[WLAN_HDR_A3_LEN+2]); + break; + default: + break; + } + if(0) + { + int pp; + printk("pattrib->pktlen = %d =>", pattrib->pkt_len); + for(pp=0;pp< pattrib->pkt_len; pp++) + printk(" %02x ", pframe[pp]); + printk("\n"); + } + + return _SUCCESS; +} +#endif //CONFIG_IEEE80211W + unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame) { return _SUCCESS; @@ -5935,7 +6078,7 @@ unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame) return _SUCCESS; #ifdef CONFIG_IOCTL_CFG80211 - if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) { rtw_cfg80211_rx_action_p2p(padapter, pframe, len); return _SUCCESS; @@ -6087,7 +6230,7 @@ void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib) pattrib->raid = 5;//a/g mode pattrib->encrypt = _NO_PRIVACY_; - pattrib->bswenc = _FALSE; + pattrib->bswenc = _FALSE; pattrib->qos_en = _FALSE; pattrib->ht_en = _FALSE; @@ -6105,7 +6248,11 @@ void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe) { if(padapter->bSurpriseRemoved == _TRUE || padapter->bDriverStopped == _TRUE) + { + rtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(&padapter->xmitpriv, pmgntframe); return; + } rtw_hal_mgnt_xmit(padapter, pmgntframe); } @@ -6120,7 +6267,11 @@ s32 dump_mgntframe_and_wait(_adapter *padapter, struct xmit_frame *pmgntframe, i if(padapter->bSurpriseRemoved == _TRUE || padapter->bDriverStopped == _TRUE) + { + rtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(&padapter->xmitpriv, pmgntframe); return ret; + } rtw_sctx_init(&sctx, timeout_ms); pxmitbuf->sctx = &sctx; @@ -6147,10 +6298,14 @@ s32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntfram if (padapter->pbuddy_adapter && !padapter->isprimary) pxmitpriv = &(padapter->pbuddy_adapter->xmitpriv); #endif - + if(padapter->bSurpriseRemoved == _TRUE || padapter->bDriverStopped == _TRUE) + { + rtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(&padapter->xmitpriv, pmgntframe); return -1; + } _enter_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL); pxmitpriv->ack_tx = _TRUE; @@ -6288,7 +6443,7 @@ void issue_beacon(_adapter *padapter, int timeout_ms) remainder_ielen = cur_network->IELength - wps_offset - wpsielen; #ifdef CONFIG_IOCTL_CFG80211 - if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) { if(pmlmepriv->wps_beacon_ie && pmlmepriv->wps_beacon_ie_len>0) { @@ -6405,7 +6560,7 @@ void issue_beacon(_adapter *padapter, int timeout_ms) { u32 len; #ifdef CONFIG_IOCTL_CFG80211 - if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) { len = pmlmepriv->p2p_beacon_ie_len; if(pmlmepriv->p2p_beacon_ie && len>0) @@ -6434,7 +6589,7 @@ void issue_beacon(_adapter *padapter, int timeout_ms) { len = pmlmepriv->wfd_beacon_ie_len; _rtw_memcpy(pframe, pmlmepriv->wfd_beacon_ie, len); - } + } } #endif //CONFIG_IOCTL_CFG80211 pframe += len; @@ -6725,11 +6880,11 @@ void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probe } #ifdef CONFIG_P2P - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && is_valid_p2p_probereq) + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) /*&& is_valid_p2p_probereq*/) { u32 len; #ifdef CONFIG_IOCTL_CFG80211 - if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) { //if pwdinfo->role == P2P_ROLE_DEVICE will call issue_probersp_p2p() len = pmlmepriv->p2p_go_probe_resp_ie_len; @@ -7236,17 +7391,18 @@ void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *p } #ifdef CONFIG_P2P -#ifndef CONFIG_IOCTL_CFG80211 - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && (pstat->is_p2p_device == _TRUE)) + if( padapter->wdinfo.driver_interface == DRIVER_WEXT ) { - u32 len; + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && (pstat->is_p2p_device == _TRUE)) + { + u32 len; - len = build_assoc_resp_p2p_ie(pwdinfo, pframe, pstat->p2p_status_code); + len = build_assoc_resp_p2p_ie(pwdinfo, pframe, pstat->p2p_status_code); - pframe += len; - pattrib->pktlen += len; + pframe += len; + pattrib->pktlen += len; + } } -#endif //CONFIG_IOCTL_CFG80211 #ifdef CONFIG_WFD if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) #ifdef CONFIG_IOCTL_CFG80211 @@ -7564,7 +7720,7 @@ void issue_assocreq(_adapter *padapter) #ifdef CONFIG_P2P #ifdef CONFIG_IOCTL_CFG80211 - if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 ) { if(pmlmepriv->p2p_assoc_req_ie && pmlmepriv->p2p_assoc_req_ie_len>0) { @@ -8202,6 +8358,84 @@ void issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_of } +#ifdef CONFIG_IEEE80211W +void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short tid) +{ + u8 category = RTW_WLAN_CATEGORY_SA_QUERY; + u16 reason_code; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + u8 *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + struct registry_priv *pregpriv = &padapter->registrypriv; + + + DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + DBG_871X("%s: alloc_mgtxmitframe fail\n", __FUNCTION__); + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + if(raddr) + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + else + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); + pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); + + switch (action) + { + case 0: //SA Query req + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&pmlmeext->sa_query_seq, &pattrib->pktlen); + pmlmeext->sa_query_seq++; + //send sa query request to AP, AP should reply sa query response in 1 second + set_sa_query_timer(pmlmeext, 1000); + break; + + case 1: //SA Query rsp + tid = cpu_to_le16(tid); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&tid, &pattrib->pktlen); + break; + default: + break; + } + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); +} +#endif //CONFIG_IEEE80211W + void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status) { u8 category = RTW_WLAN_CATEGORY_BACK; @@ -8776,7 +9010,6 @@ void site_survey(_adapter *padapter) { pmlmeinfo->scan_cnt = 0; survey_channel = pbuddy_mlmeext->cur_channel; - ScanType = SCAN_ACTIVE; stay_buddy_ch = 1; } else @@ -8877,19 +9110,24 @@ void site_survey(_adapter *padapter) u8 cur_bwmode; u8 cur_ch_offset; - if(check_fwstate(pmlmepriv, _FW_LINKED)) + if (rtw_get_ch_setting_union(padapter, &cur_channel, &cur_bwmode, &cur_ch_offset) != 0) { - cur_channel = pmlmeext->cur_channel; - cur_bwmode = pmlmeext->cur_bwmode; - cur_ch_offset = pmlmeext->cur_ch_offset; + if (0) + DBG_871X(FUNC_ADPT_FMT" back to linked union - ch:%u, bw:%u, offset:%u\n", + FUNC_ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset); } - //else if((pbuddy_mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - else if(check_buddy_fwstate(padapter, _FW_LINKED)) // for AP or STA + #ifdef CONFIG_IOCTL_CFG80211 + else if(padapter->pbuddy_adapter + && pbuddy_adapter->wdinfo.driver_interface == DRIVER_CFG80211 + && wdev_to_priv(pbuddy_adapter->rtw_wdev)->p2p_enabled + && rtw_p2p_chk_state(&pbuddy_adapter->wdinfo, P2P_STATE_LISTEN) + ) { - cur_channel = pbuddy_mlmeext->cur_channel; + cur_channel = pbuddy_adapter->wdinfo.listen_channel; cur_bwmode = pbuddy_mlmeext->cur_bwmode; cur_ch_offset = pbuddy_mlmeext->cur_ch_offset; } + #endif else { cur_channel = pmlmeext->cur_channel; @@ -8954,12 +9192,13 @@ void site_survey(_adapter *padapter) if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)) { #ifdef CONFIG_CONCURRENT_MODE - #ifndef CONFIG_IOCTL_CFG80211 - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) + if( pwdinfo->driver_interface == DRIVER_WEXT ) { - _set_timer( &pwdinfo->ap_p2p_switch_timer, 500 ); - } - #endif //CONFIG_IOCTL_CFG80211 + if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) + { + _set_timer( &pwdinfo->ap_p2p_switch_timer, 500 ); + } + } rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); #else rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); @@ -8974,20 +9213,25 @@ void site_survey(_adapter *padapter) //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); { +#ifdef CONFIG_CONCURRENT_MODE + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); +#else #ifdef CONFIG_DUALMAC_CONCURRENT dc_set_channel_bwmode_survey_done(padapter); #else -#ifndef CONFIG_IOCTL_CFG80211 - if( rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) ) + if( pwdinfo->driver_interface == DRIVER_WEXT ) { - set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + if( rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) ) + { + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + } + else + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); } - else -#endif //CONFIG_IOCTL_CFG80211 -#ifdef CONFIG_CONCURRENT_MODE - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); -#else + else if( pwdinfo->driver_interface == DRIVER_CFG80211 ) + { set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + } #endif //CONFIG_DUALMAC_CONCURRENT #endif //CONFIG_CONCURRENT_MODE } @@ -9030,11 +9274,23 @@ void site_survey(_adapter *padapter) report_surveydone_event(padapter); - pmlmeext->chan_scan_time = SURVEY_TO; - pmlmeext->sitesurvey_res.state = SCAN_DISABLE; - - issue_action_BSSCoexistPacket(padapter); - issue_action_BSSCoexistPacket(padapter); +#if defined(CONFIG_BT_COEXIST) && defined(CONFIG_RTL8723A) + if ((BT_1Ant(padapter) == _TRUE) && (BT_GetBtState(padapter) > BT_INFO_STATE_NO_CONNECTION)) + { + pmlmeext->chan_scan_time = SURVEY_TO * 2; + } + else + { + pmlmeext->chan_scan_time = SURVEY_TO; + } +#else + pmlmeext->chan_scan_time = SURVEY_TO; +#endif + + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + + issue_action_BSSCoexistPacket(padapter); + issue_action_BSSCoexistPacket(padapter); issue_action_BSSCoexistPacket(padapter); } @@ -9089,12 +9345,12 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI ie_offset = _BEACON_IE_OFFSET_; } else { // FIXME : more type - if (subtype == WIFI_PROBEREQ) { - ie_offset = _PROBEREQ_IE_OFFSET_; - bssid->Reserved[0] = 2; - } else if (subtype == WIFI_PROBERSP) { + if (subtype == WIFI_PROBERSP) { ie_offset = _PROBERSP_IE_OFFSET_; bssid->Reserved[0] = 3; + } else if (subtype == WIFI_PROBEREQ) { + ie_offset = _PROBEREQ_IE_OFFSET_; + bssid->Reserved[0] = 2; } else { bssid->Reserved[0] = 0; ie_offset = _FIXED_IE_LENGTH_; @@ -9109,7 +9365,7 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI //get the signal strength //bssid->Rssi = precv_frame->u.hdr.attrib.SignalStrength; // 0-100 index. - bssid->Rssi = precv_frame->u.hdr.attrib.phy_info.RecvSignalPower; // in dBM.raw data + bssid->Rssi = precv_frame->u.hdr.attrib.phy_info.RecvSignalPower; // in dBM.raw data bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.phy_info.SignalQuality;//in percentage bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.phy_info.SignalStrength;//in percentage #ifdef CONFIG_ANTENNA_DIVERSITY @@ -9181,6 +9437,31 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI if (bssid->IELength < 12) return _FAIL; +#ifdef CONFIG_P2P + if (subtype == WIFI_PROBEREQ) { + u8 *p2p_ie; + u32 p2p_ielen; + // Set Listion Channel + if ((p2p_ie = rtw_get_p2p_ie(bssid->IEs, bssid->IELength, NULL, &p2p_ielen))) { + u32 attr_contentlen = 0; + u8 listen_ch[5] = { 0x00 }; + + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, listen_ch, &attr_contentlen); + bssid->Configuration.DSConfig = listen_ch[4]; + } + else { // use current channel + bssid->Configuration.DSConfig = rtw_get_oper_ch(padapter); + DBG_871X("%s()-%d: Cannot get p2p_ie. set DSconfig to op_ch(%d)\n", __FUNCTION__, __LINE__, bssid->Configuration.DSConfig); + } + + // FIXME + bssid->InfrastructureMode = Ndis802_11Infrastructure; + _rtw_memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN); + bssid->Privacy = 1; + return _SUCCESS; + } +#endif //CONFIG_P2P + // Checking for DSConfig p = rtw_get_ie(bssid->IEs + ie_offset, _DSSET_IE_, &len, bssid->IELength - ie_offset); @@ -9206,15 +9487,6 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI } } - if (subtype==WIFI_PROBEREQ) - { - // FIXME - bssid->InfrastructureMode = Ndis802_11Infrastructure; - _rtw_memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN); - bssid->Privacy = 1; - return _SUCCESS; - } - _rtw_memcpy(&bssid->Configuration.BeaconPeriod, rtw_get_beacon_interval_from_ie(bssid->IEs), 2); bssid->Configuration.BeaconPeriod = le32_to_cpu(bssid->Configuration.BeaconPeriod); @@ -9270,7 +9542,7 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI } #endif // CONFIG_INTEL_WIDI - #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) & 1 + #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) & 1 if(strcmp(bssid->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) { DBG_871X("Receiving %s("MAC_FMT", DSConfig:%u) from ch%u with ss:%3u, sq:%3u, RawRSSI:%3ld\n" , bssid->Ssid.Ssid, MAC_ARG(bssid->MacAddress), bssid->Configuration.DSConfig @@ -9346,6 +9618,8 @@ void start_create_ibss(_adapter* padapter) DBG_871X("start_create_ibss, invalid cap:%x\n", caps); return; } + //update bc/mc sta_info + update_bmc_sta(padapter); } @@ -9358,9 +9632,6 @@ void start_clnt_join(_adapter* padapter) WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); int beacon_timeout; - pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; - pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); - //update wireless mode update_wireless_mode(padapter); @@ -9369,23 +9640,6 @@ void start_clnt_join(_adapter* padapter) update_capinfo(padapter, caps); if (caps&cap_ESS) { - -#ifdef CONFIG_DUALMAC_CONCURRENT - if(dc_handle_join_request(padapter) == _FAIL) - { - DBG_871X("dc_handle_join_request fail !!!\n"); - return; - } - //switch channel - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); -#elif defined (CONFIG_CONCURRENT_MODE) - if(concurrent_chk_start_clnt_join(padapter) == _FAIL) - return; -#else //NON CONCURRENT_MODE - //switch channel - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); -#endif - Set_MSR(padapter, WIFI_FW_STATION_STATE); val8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; @@ -9399,8 +9653,48 @@ void start_clnt_join(_adapter* padapter) #endif rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - //switch channel - //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + #ifdef CONFIG_DEAUTH_BEFORE_CONNECT + // Because of AP's not receiving deauth before + // AP may: 1)not response auth or 2)deauth us after link is complete + // issue deauth before issuing auth to deal with the situation + + // Commented by Albert 2012/07/21 + // For the Win8 P2P connection, it will be hard to have a successful connection if this Wi-Fi doesn't connect to it. + { + #ifdef CONFIG_P2P + _queue *queue = &(padapter->mlmepriv.scanned_queue); + _list *head = get_list_head(queue); + _list *pos = get_next(head); + struct wlan_network *scanned = NULL; + u8 ie_offset = 0; + _irqL irqL; + bool has_p2p_ie = _FALSE; + + _enter_critical_bh(&(padapter->mlmepriv.scanned_queue.lock), &irqL); + + for (pos = get_next(head);!rtw_end_of_queue_search(head, pos); pos = get_next(pos)) { + + scanned = LIST_CONTAINOR(pos, struct wlan_network, list); + if(scanned==NULL) + rtw_warn_on(1); + + if (_rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE + && _rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE + ) { + ie_offset = (scanned->network.Reserved[0] == 2? 0:12); + if (rtw_get_p2p_ie(scanned->network.IEs+ie_offset, scanned->network.IELength-ie_offset, NULL, NULL)) + has_p2p_ie = _TRUE; + break; + } + } + + _exit_critical_bh(&(padapter->mlmepriv.scanned_queue.lock), &irqL); + + if (scanned == NULL || rtw_end_of_queue_search(head, pos) || has_p2p_ie == _FALSE) + #endif /* CONFIG_P2P */ + issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, 5, 100); + } + #endif /* CONFIG_DEAUTH_BEFORE_CONNECT */ //here wait for receiving the beacon to start auth //and enable a timer @@ -9410,6 +9704,20 @@ void start_clnt_join(_adapter* padapter) (REAUTH_TO * REAUTH_LIMIT) + (REASSOC_TO*REASSOC_LIMIT) +beacon_timeout); pmlmeinfo->state = WIFI_FW_AUTH_NULL | WIFI_FW_STATION_STATE; + + {//only for STA mode + u16 media_status; + u8 mac_id = 0; + + #ifdef CONFIG_CONCURRENT_MODE + if(PRIMARY_ADAPTER == padapter->adapter_type) + mac_id=0; + else + mac_id=2; + #endif + media_status = (mac_id<<8)|1; // MACID|OPMODE:1 connect + rtw_hal_set_hwreg(padapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status); + } } else if (caps&cap_IBSS) //adhoc client { @@ -9426,9 +9734,6 @@ void start_clnt_join(_adapter* padapter) val8 = 0xcf; rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - //switch channel - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - beacon_timing_control(padapter); pmlmeinfo->state = WIFI_FW_ADHOC_STATE; @@ -9460,15 +9765,6 @@ void start_clnt_auth(_adapter* padapter) pmlmeext->retry = 0; - // Because of AP's not receiving deauth before - // AP may: 1)not response auth or 2)deauth us after link is complete - // issue deauth before issuing auth to deal with the situation -#ifndef CONFIG_PLATFORM_RTK_DMP - // Commented by Albert 2012/07/21 - // For the Win8 P2P connection, it will be hard to have a successful connection if this Wi-Fi doesn't connect to it. - issue_deauth(padapter, (&(pmlmeinfo->network))->MacAddress, WLAN_REASON_DEAUTH_LEAVING); -#endif - DBG_871X_LEVEL(_drv_always_, "start auth\n"); issue_auth(padapter, NULL, 0); @@ -10159,6 +10455,8 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) u8 join_type; u16 media_status; + psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); + if(join_res < 0) { join_type = 1; @@ -10168,6 +10466,11 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) //restore to initial setting. update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode); + if (psta){//only for STA mode + media_status = (psta->mac_id<<8)|0; // MACID|OPMODE:1 connect + rtw_hal_set_hwreg(padapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status); + } + goto exit_mlmeext_joinbss_event_callback; } @@ -10181,6 +10484,8 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) update_bmc_sta_support_rate(padapter, psta_bmc->mac_id); Update_RA_Entry(padapter, psta_bmc); } + //update bc/mc sta_info + update_bmc_sta(padapter); } @@ -10210,7 +10515,7 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); #endif - psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); + if (psta) //only for infra. mode { pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; @@ -10222,11 +10527,7 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) //set per sta rate after updating HT cap. set_sta_rate(padapter, psta); - #if (RATE_ADAPTIVE_SUPPORT==1) //for 88E RA - rtw_hal_set_hwreg(padapter,HW_VAR_TX_RPT_MAX_MACID, (u8*)&psta->mac_id); - #endif - media_status = (psta->mac_id<<8)|1; // MACID|OPMODE: 1 means connect - rtw_hal_set_hwreg(padapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status); + rtw_sta_media_status_rpt(padapter, psta, 1); } join_type = 2; @@ -10403,8 +10704,8 @@ void _linked_rx_signal_strehgth_display(_adapter *padapter) #endif - rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); - DBG_871X("UndecoratedSmoothedPWDB:%d\n",UndecoratedSmoothedPWDB); + //rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); + //DBG_871X("UndecoratedSmoothedPWDB:%d\n",UndecoratedSmoothedPWDB); } @@ -10483,10 +10784,13 @@ void linked_status_chk(_adapter *padapter) rx_chk_limit = 8; #endif - #ifdef CONFIG_INTEL_WIDI - if (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_NONE) - rx_chk_limit = 1; - #endif + // Marked by Kurt 20130715 + // For WiDi 3.5 and latered on, they don't ask WiDi sink to do roaming, so we could not check rx limit that strictly. + // todo: To check why we under miracast session, rx_chk would be _FALSE + //#ifdef CONFIG_INTEL_WIDI + //if (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_NONE) + // rx_chk_limit = 1; + //#endif if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) { @@ -10861,6 +11165,27 @@ void addba_timer_hdl(struct sta_info *psta) #endif //CONFIG_80211N_HT } +#ifdef CONFIG_IEEE80211W +void sa_query_timer_hdl(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_priv * pmlmepriv = &padapter->mlmepriv; + _irqL irqL; + //disconnect + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + rtw_disassoc_cmd(padapter, 0, _TRUE); + rtw_indicate_disconnect(padapter); + rtw_free_assoc_resources(padapter, 1); + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + DBG_871X("SA query timeout disconnect\n"); +} +#endif //CONFIG_IEEE80211W + u8 NULL_hdl(_adapter *padapter, u8 *pbuf) { return H2C_SUCCESS; @@ -11037,6 +11362,9 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength); + pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; + pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); + //Check AP vendor to move rtw_joinbss_cmd() //pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->IEs, pnetwork->IELength); @@ -11135,6 +11463,20 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) //initialgain = 0x1E; //rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + /* check channel, bandwidth, offset and switch */ +#ifdef CONFIG_DUALMAC_CONCURRENT + if(dc_handle_join_request(padapter) == _FAIL) { + DBG_871X("dc_handle_join_request fail !!!\n"); + return H2C_SUCCESS; + } + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); +#else //NON CONFIG_DUALMAC_CONCURRENT + if(rtw_chk_start_clnt_join(padapter) == _FAIL) { + report_join_res(padapter, (-4)); + return H2C_SUCCESS; + } +#endif + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); join_type = 0; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); @@ -11290,8 +11632,10 @@ u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) if (pmlmeext->sitesurvey_res.state == SCAN_DISABLE) { +#ifdef CONFIG_CONCURRENT_MODE //for first time sitesurvey_cmd rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0); +#endif //CONFIG_CONCURRENT_MODE pmlmeext->sitesurvey_res.state = SCAN_START; pmlmeext->sitesurvey_res.bss_cnt = 0; @@ -11379,23 +11723,17 @@ u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); //config the initial gain under scaning, need to write the BB registers +#ifdef CONFIG_P2P #ifdef CONFIG_IOCTL_CFG80211 - if((wdev_to_priv(padapter->rtw_wdev))->p2p_enabled == _TRUE) - { + if((wdev_to_priv(padapter->rtw_wdev))->p2p_enabled == _TRUE && pwdinfo->driver_interface == DRIVER_CFG80211 ) initialgain = 0x30; - } - else - initialgain = 0x1E; -#else // go through the WEXT interface //CONFIG_IOCTL_CFG80211 -#ifdef CONFIG_P2P - if ( rtw_p2p_chk_state( pwdinfo, P2P_STATE_NONE ) ) - initialgain = 0x1E; else +#endif //CONFIG_IOCTL_CFG80211 + if ( !rtw_p2p_chk_state( pwdinfo, P2P_STATE_NONE ) ) initialgain = 0x28; -#else // CONFIG_P2P - initialgain = 0x1E; -#endif // CONFIG_P2P -#endif // CONFIG_IOCTL_CFG80211 + else +#endif //CONFIG_P2P + initialgain = 0x1e; rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); @@ -12461,108 +12799,6 @@ sint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state) } -int concurrent_chk_start_clnt_join(_adapter *padapter) -{ - int ret = _FAIL; - PADAPTER pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext; - struct mlme_ext_info *pbuddy_pmlmeinfo; - struct mlme_priv *pbuddy_mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - unsigned char cur_ch = pmlmeext->cur_channel; - unsigned char cur_bw = pmlmeext->cur_bwmode; - unsigned char cur_ch_offset = pmlmeext->cur_ch_offset; - - if(!rtw_buddy_adapter_up(padapter)) - { - goto start_join_set_ch_bw; - } - - pbuddy_adapter = padapter->pbuddy_adapter; - pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - pbuddy_pmlmeinfo = &(pbuddy_mlmeext->mlmext_info); - pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); - - if((pbuddy_pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)//for AP MODE - { - bool inform_ch_switch = _FALSE; - if(pmlmeext->cur_channel != pbuddy_mlmeext->cur_channel) - { - inform_ch_switch = _TRUE; - } - else if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) && - (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) && - (pmlmeext->cur_ch_offset != pbuddy_mlmeext->cur_ch_offset)) - { - inform_ch_switch = _TRUE; - } - else if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20) && - (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)) - { - inform_ch_switch = _FALSE; - cur_ch = pmlmeext->cur_channel; - cur_bw = pbuddy_mlmeext->cur_bwmode; - cur_ch_offset = pbuddy_mlmeext->cur_ch_offset; - } - - - if (inform_ch_switch) { - #ifdef CONFIG_SPCT_CH_SWITCH - if (1) { - rtw_ap_inform_ch_switch(pbuddy_adapter, pmlmeext->cur_channel , pmlmeext->cur_ch_offset); - } else - #endif - { - //issue deauth to all stas if if2 is at ap mode - rtw_sta_flush(pbuddy_adapter); - } - rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0); - } - } - else if(check_fwstate(pbuddy_mlmepriv, _FW_LINKED) == _TRUE && - check_fwstate(pbuddy_mlmepriv, WIFI_STATION_STATE) == _TRUE) //for Client Mode/p2p client - { -#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) - struct wifidirect_info *pbuddy_wdinfo = &(pbuddy_adapter->wdinfo); - if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) - { - goto start_join_set_ch_bw;//wlan0-sta mode has higher priority than p2p0-p2p client - } -#endif //CONFIG_P2P && CONFIG_IOCTL_CFG80211 - - if(pmlmeext->cur_channel != pbuddy_mlmeext->cur_channel) - { - DBG_871X("start_clnt_join(ch=%d), but channel mismatch with buddy(ch=%d) interface\n", - pmlmeext->cur_channel, pbuddy_mlmeext->cur_channel); - - report_join_res(padapter, (-4)); - - return ret; - } - - if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) && - (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) && - (pmlmeext->cur_ch_offset != pbuddy_mlmeext->cur_ch_offset)) - { - DBG_871X("start_clnt_join(bwmode=%d, ch_offset=%d), but bwmode & ch_offset mismatch with buddy(bwmode=%d, ch_offset=%d) interface\n", - pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset); - - report_join_res(padapter, (-4)); - - return ret; - } - - } - - -start_join_set_ch_bw: - - set_channel_bwmode(padapter, cur_ch, cur_ch_offset, cur_bw); - - return _SUCCESS; - -} - void concurrent_chk_joinbss_done(_adapter *padapter, int join_res) { struct mlme_ext_priv *pmlmeext; @@ -12573,15 +12809,16 @@ void concurrent_chk_joinbss_done(_adapter *padapter, int join_res) struct mlme_ext_info *pbuddy_mlmeinfo; WLAN_BSSID_EX *pbuddy_network_mlmeext; + pmlmeext = &padapter->mlmeextpriv; + pmlmeinfo = &(pmlmeext->mlmext_info); + + if(!rtw_buddy_adapter_up(padapter)) { set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); return; } - pmlmeext = &padapter->mlmeextpriv; - pmlmeinfo = &(pmlmeext->mlmext_info); - pbuddy_adapter = padapter->pbuddy_adapter; pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; @@ -12772,6 +13009,181 @@ void concurrent_chk_joinbss_done(_adapter *padapter, int join_res) } #endif //CONFIG_CONCURRENT_MODE +int rtw_chk_start_clnt_join(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + unsigned char cur_ch = pmlmeext->cur_channel; + unsigned char cur_bw = pmlmeext->cur_bwmode; + unsigned char cur_ch_offset = pmlmeext->cur_ch_offset; + bool chbw_allow = _TRUE; + bool connect_allow = _TRUE; + +#ifdef CONFIG_CONCURRENT_MODE + PADAPTER pbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext; + struct mlme_ext_info *pbuddy_pmlmeinfo; + struct mlme_priv *pbuddy_mlmepriv; + + if (!rtw_buddy_adapter_up(padapter)) { + goto start_join_set_ch_bw; + } + + pbuddy_adapter = padapter->pbuddy_adapter; + pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + pbuddy_pmlmeinfo = &(pbuddy_mlmeext->mlmext_info); + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); + + if((pbuddy_pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)//for AP MODE + { + DBG_871X("start_clnt_join: "ADPT_FMT"(ch=%d, bw=%d, ch_offset=%d)" + ", "ADPT_FMT" AP mode(ch=%d, bw=%d, ch_offset=%d)\n", + ADPT_ARG(padapter), pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset, + ADPT_ARG(pbuddy_adapter), pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset); + + if(pmlmeext->cur_channel != pbuddy_mlmeext->cur_channel) + { + chbw_allow = _FALSE; + } + else if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) && + (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) && + (pmlmeext->cur_ch_offset != pbuddy_mlmeext->cur_ch_offset)) + { + chbw_allow = _FALSE; + } + else if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20) && + (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)) + { + cur_ch = pmlmeext->cur_channel; + cur_bw = pbuddy_mlmeext->cur_bwmode; + cur_ch_offset = pbuddy_mlmeext->cur_ch_offset; + } + + DBG_871X("start_clnt_join: connect_allow:%d, chbw_allow:%d\n", connect_allow, chbw_allow); + if (chbw_allow == _FALSE) { + #ifdef CONFIG_SPCT_CH_SWITCH + if (1) { + rtw_ap_inform_ch_switch(pbuddy_adapter, pmlmeext->cur_channel , pmlmeext->cur_ch_offset); + } else + #endif + { + //issue deauth to all stas if if2 is at ap mode + rtw_sta_flush(pbuddy_adapter); + } + rtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0); + } + } + else if(check_fwstate(pbuddy_mlmepriv, _FW_LINKED) == _TRUE && + check_fwstate(pbuddy_mlmepriv, WIFI_STATION_STATE) == _TRUE) //for Client Mode/p2p client + { + DBG_871X("start_clnt_join: "ADPT_FMT"(ch=%d, bw=%d, ch_offset=%d)" + ", "ADPT_FMT" STA mode(ch=%d, bw=%d, ch_offset=%d)\n", + ADPT_ARG(padapter), pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset, + ADPT_ARG(pbuddy_adapter), pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset); + + if(pmlmeext->cur_channel != pbuddy_mlmeext->cur_channel) + { + chbw_allow = _FALSE; + } + else if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_20) && + (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40)) + { + cur_bw = HT_CHANNEL_WIDTH_40; + cur_ch_offset = pbuddy_mlmeext->cur_ch_offset; + } + else if((pmlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) && + (pbuddy_mlmeext->cur_bwmode == HT_CHANNEL_WIDTH_40) && + (pmlmeext->cur_ch_offset != pbuddy_mlmeext->cur_ch_offset)) + { + chbw_allow = _FALSE; + } + + connect_allow = chbw_allow; + + #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) + /* wlan0-sta mode has higher priority than p2p0-p2p client */ + if (!rtw_p2p_chk_state(&(pbuddy_adapter->wdinfo), P2P_STATE_NONE) + && pbuddy_adapter->wdinfo.driver_interface == DRIVER_CFG80211) + { + connect_allow = _TRUE; + } + #endif /* CONFIG_P2P && CONFIG_IOCTL_CFG80211 */ + + DBG_871X("start_clnt_join: connect_allow:%d, chbw_allow:%d\n", connect_allow, chbw_allow); + if (connect_allow == _TRUE && chbw_allow == _FALSE) { + /* disconnect buddy's connection */ + rtw_disassoc_cmd(pbuddy_adapter, 500, _FALSE); + rtw_indicate_disconnect(pbuddy_adapter); + rtw_free_assoc_resources(pbuddy_adapter, 1); + } + } + +start_join_set_ch_bw: +#endif /* CONFIG_CONCURRENT_MODE */ + + if (connect_allow == _TRUE) { + DBG_871X("start_join_set_ch_bw: ch=%d, bwmode=%d, ch_offset=%d\n", cur_ch, cur_bw, cur_ch_offset); + set_channel_bwmode(padapter, cur_ch, cur_ch_offset, cur_bw); + } + + return connect_allow == _TRUE ? _SUCCESS : _FAIL; +} + +/* Find union about ch, bw, ch_offset of all linked interfaces */ +int rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + _adapter *iface; + struct mlme_ext_priv *mlmeext; + int i; + u8 ch_ret = 0; + u8 bw_ret = HT_CHANNEL_WIDTH_20; + u8 offset_ret = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + int num = 0; + + if (ch) *ch = 0; + if (bw) *bw = HT_CHANNEL_WIDTH_20; + if (offset) *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + for (i = 0; iiface_nums; i++) { + iface = dvobj->padapters[i]; + mlmeext = &iface->mlmeextpriv; + + if (!check_fwstate(&iface->mlmepriv, _FW_LINKED)) + continue; + + if (num == 0) { + ch_ret = mlmeext->cur_channel; + bw_ret = mlmeext->cur_bwmode; + offset_ret = mlmeext->cur_ch_offset; + num++; + continue; + } + + if (ch_ret != mlmeext->cur_channel) { + num = 0; + break; + } + + if (bw_ret < mlmeext->cur_bwmode) { + bw_ret = mlmeext->cur_bwmode; + offset_ret = mlmeext->cur_ch_offset; + } else if (bw_ret == mlmeext->cur_bwmode && offset_ret != mlmeext->cur_ch_offset) { + num = 0; + break; + } + + num++; + } + + if (num) { + if (ch) *ch = ch_ret; + if (bw) *bw = bw_ret; + if (offset) *offset = offset_ret; + } + + return num; +} + u8 set_ch_hdl(_adapter *padapter, u8 *pbuf) { struct set_ch_parm *set_ch_parm; diff --git a/drivers/net/wireless/rtl8723as/core/rtw_mp.c b/drivers/net/wireless/rtl8723as/core/rtw_mp.c index a63604fcc61e..75f0da1ab224 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_mp.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_mp.c @@ -570,7 +570,7 @@ static void disable_dm(PADAPTER padapter) #endif HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct dm_priv *pdmpriv = &pHalData->dmpriv; - + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); //3 1. disable firmware dynamic mechanism // disable Power Training, Rate Adaptive @@ -590,7 +590,7 @@ static void disable_dm(PADAPTER padapter) // enable APK, LCK and IQK but disable power tracking #ifndef CONFIG_RTL8188E - pdmpriv->TxPowerTrackControl = _FALSE; + pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE; #endif Switch_DM_Func(padapter, DYNAMIC_RF_CALIBRATION, _TRUE); } @@ -600,7 +600,7 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct dm_priv *pdmpriv = &pHalData->dmpriv; - + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); //Switch_DM_Func(padapter, DYNAMIC_RF_CALIBRATION, bstart); if (bstart==1){ DBG_871X("in MPT_PwrCtlDM start \n"); @@ -608,10 +608,16 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart) pdmpriv->InitODMFlag |= ODM_RF_TX_PWR_TRACK ; pdmpriv->InitODMFlag |= ODM_RF_CALIBRATION ; pdmpriv->TxPowerTrackControl = _TRUE; +#ifndef CONFIG_RTL8188E + pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE; +#endif }else{ DBG_871X("in MPT_PwrCtlDM stop \n"); disable_dm(padapter); pdmpriv->TxPowerTrackControl = _FALSE; + #ifndef CONFIG_RTL8188E + pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE; + #endif } @@ -638,7 +644,6 @@ s32 mp_start_test(PADAPTER padapter) //3 disable dynamic mechanism disable_dm(padapter); - //3 0. update mp_priv if (padapter->registrypriv.rf_config == RF_819X_MAX_TYPE) { @@ -1316,16 +1321,17 @@ void SetPacketRx(PADAPTER pAdapter, u8 bStartRx) if(bStartRx) { - #ifdef CONFIG_RTL8723A - rtl8723a_InitAntenna_Selection(pAdapter); - #endif //CONFIG_RTL8723A - // Accept CRC error and destination address + // Accept CRC error and destination address #if 1 //ndef CONFIG_RTL8723A - pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS; - - pHalData->ReceiveConfig |= ACRC32; + //pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS; + //pHalData->ReceiveConfig |= ACRC32; + + pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | AMF | ADF | APP_FCS | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS; + + pHalData->ReceiveConfig |= (RCR_ACRC32|RCR_AAP); + rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); // Accept all data frames @@ -1488,8 +1494,13 @@ void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv) } else { - max_xmit_extbuf_size = 6000; - num_xmit_extbuf = 8; + #ifdef CONFIG_RTL8723A_SDIO + max_xmit_extbuf_size = 20000; + num_xmit_extbuf = 1; + #else + max_xmit_extbuf_size = 6000; + num_xmit_extbuf = 8; + #endif } pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; @@ -1506,8 +1517,13 @@ void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv) if(padapter->registrypriv.mp_mode ==0) { - max_xmit_extbuf_size = 6000; - num_xmit_extbuf = 8; + #ifdef CONFIG_RTL8723A_SDIO + max_xmit_extbuf_size = 20000; + num_xmit_extbuf = 1; + #else + max_xmit_extbuf_size = 6000; + num_xmit_extbuf = 8; + #endif } else { diff --git a/drivers/net/wireless/rtl8723as/core/rtw_mp_ioctl.c b/drivers/net/wireless/rtl8723as/core/rtw_mp_ioctl.c index 4771bc6a050a..95570d1e75e8 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_mp_ioctl.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_mp_ioctl.c @@ -1677,12 +1677,12 @@ _func_enter_; return NDIS_STATUS_INVALID_LENGTH; *poid_par_priv->bytes_rw = 8; - _rtw_memcpy(poid_par_priv->information_buf, &(Adapter->pwrctrlpriv.pwr_mode), 8); + _rtw_memcpy(poid_par_priv->information_buf, &(adapter_to_pwrctl(Adapter)->pwr_mode), 8); *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_pro_qry_pwrstate_hdl: pwr_mode=%d smart_ps=%d\n", - Adapter->pwrctrlpriv.pwr_mode, Adapter->pwrctrlpriv.smart_ps)); + adapter_to_pwrctl(Adapter)->pwr_mode, adapter_to_pwrctl(Adapter)->smart_ps)); _func_exit_; diff --git a/drivers/net/wireless/rtl8723as/core/rtw_odm.c b/drivers/net/wireless/rtl8723as/core/rtw_odm.c new file mode 100755 index 000000000000..b7176266e149 --- /dev/null +++ b/drivers/net/wireless/rtl8723as/core/rtw_odm.c @@ -0,0 +1,217 @@ +/****************************************************************************** + * + * Copyright(c) 2013 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#include +#ifdef CONFIG_RTL8192C +#include +#endif +#ifdef CONFIG_RTL8192D +#include +#endif +#ifdef CONFIG_RTL8723A +#include +#endif +#ifdef CONFIG_RTL8188E +#include +#endif + +const char *odm_comp_str[] = { + "ODM_COMP_DIG", + "ODM_COMP_RA_MASK", + "ODM_COMP_DYNAMIC_TXPWR", + "ODM_COMP_FA_CNT", + "ODM_COMP_RSSI_MONITOR", + "ODM_COMP_CCK_PD", + "ODM_COMP_ANT_DIV", + "ODM_COMP_PWR_SAVE", + "ODM_COMP_PWR_TRAIN", + "ODM_COMP_RATE_ADAPTIVE", + "ODM_COMP_PATH_DIV", + "ODM_COMP_PSD", + "ODM_COMP_DYNAMIC_PRICCA", + "ODM_COMP_RXHP", + NULL, + NULL, + "ODM_COMP_EDCA_TURBO", + "ODM_COMP_EARLY_MODE", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "ODM_COMP_TX_PWR_TRACK", + "ODM_COMP_RX_GAIN_TRACK", + "ODM_COMP_CALIBRATION", + NULL, + NULL, + NULL, + "ODM_COMP_COMMON", + "ODM_COMP_INIT", +}; + +#define RTW_ODM_COMP_MAX 32 + +const char *odm_ability_str[] = { + "ODM_BB_DIG", + "ODM_BB_RA_MASK", + "ODM_BB_DYNAMIC_TXPWR", + "ODM_BB_FA_CNT", + "ODM_BB_RSSI_MONITOR", + "ODM_BB_CCK_PD ", + "ODM_BB_ANT_DIV", + "ODM_BB_PWR_SAVE", + "ODM_BB_PWR_TRAIN", + "ODM_BB_RATE_ADAPTIVE", + "ODM_BB_PATH_DIV", + "ODM_BB_PSD", + "ODM_BB_RXHP", + "ODM_BB_ADAPTIVITY", + "ODM_BB_DYNAMIC_ATC", + NULL, + "ODM_MAC_EDCA_TURBO", + "ODM_MAC_EARLY_MODE", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "ODM_RF_TX_PWR_TRACK", + "ODM_RF_RX_GAIN_TRACK", + "ODM_RF_CALIBRATION", +}; + +#define RTW_ODM_ABILITY_MAX 27 + +const char *odm_dbg_level_str[] = { + NULL, + "ODM_DBG_OFF", + "ODM_DBG_SERIOUS", + "ODM_DBG_WARNING", + "ODM_DBG_LOUD", + "ODM_DBG_TRACE ", +}; + +#define RTW_ODM_DBG_LEVEL_NUM 6 + +int _rtw_odm_dbg_comp_msg(_adapter *adapter, char *buf, int len) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter); + DM_ODM_T *odm = &pHalData->odmpriv; + int cnt = 0; + u64 dbg_comp; + int i; + + rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_FLAG, &dbg_comp); + cnt += snprintf(buf+cnt, len-cnt, "odm.DebugComponents = 0x%016llx \n", dbg_comp); + for (i=0;iodmpriv; + int cnt = 0; + u32 dbg_level; + int i; + + rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_LEVEL, &dbg_level); + cnt += snprintf(buf+cnt, len-cnt, "odm.DebugDebugLevel = %u\n", dbg_level); + for (i=0;iodmpriv; + + return snprintf(buf, len, + "%10s %16s %8s %10s %11s %14s\n" + "0x%-8x %-16d 0x%-6x %-10d %-11u %-14u\n", + "TH_L2H_ini", "TH_EDCCA_HL_diff", "IGI_Base", "ForceEDCCA", "AdapEn_RSSI", "IGI_LowerBound", + (u8)odm->TH_L2H_ini, + odm->TH_EDCCA_HL_diff, + odm->IGI_Base, + odm->ForceEDCCA, + odm->AdapEn_RSSI, + odm->IGI_LowerBound + ); +} + +void rtw_odm_adaptivity_parm_msg(_adapter *adapter) +{ + char buf[256] = {0}; + + _rtw_odm_dbg_comp_msg(adapter, buf, 256); + DBG_871X_LEVEL(_drv_always_, "\n%s", buf); +} + +void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff, + s8 IGI_Base, bool ForceEDCCA, u8 AdapEn_RSSI, u8 IGI_LowerBound) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter); + DM_ODM_T *odm = &pHalData->odmpriv; + + odm->TH_L2H_ini = TH_L2H_ini; + odm->TH_EDCCA_HL_diff = TH_EDCCA_HL_diff; + odm->IGI_Base = IGI_Base; + odm->ForceEDCCA = ForceEDCCA; + odm->AdapEn_RSSI = AdapEn_RSSI; + odm->IGI_LowerBound = IGI_LowerBound; +} + diff --git a/drivers/net/wireless/rtl8723as/core/rtw_p2p.c b/drivers/net/wireless/rtl8723as/core/rtw_p2p.c index 0ed4b5e31065..348bdb88357c 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_p2p.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_p2p.c @@ -1888,7 +1888,18 @@ u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; u32 len=0, p2pielen = 0; #ifdef CONFIG_INTEL_WIDI + struct mlme_priv *pmlmepriv = &(pwdinfo->padapter->mlmepriv); u8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 }; + u8 widi_version = 0, i = 0; + + if( _rtw_memcmp( pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN ) == _FALSE ) + { + widi_version = 35; + } + else if( pmlmepriv->num_p2p_sdt != 0 ) + { + widi_version = 40; + } #endif //CONFIG_INTEL_WIDI // P2P OUI @@ -1977,10 +1988,14 @@ u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); #ifdef CONFIG_INTEL_WIDI - if( _rtw_memcmp( pwdinfo->padapter->mlmepriv.sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN ) == _FALSE ) + if( widi_version == 35 ) { RTW_PUT_LE16(p2pie + p2pielen, 21 + 8 + pwdinfo->device_name_len); } + else if( widi_version == 40 ) + { + RTW_PUT_LE16(p2pie + p2pielen, 21 + 8 * pmlmepriv->num_p2p_sdt + pwdinfo->device_name_len); + } else #endif //CONFIG_INTEL_WIDI RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); @@ -1997,25 +2012,48 @@ u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->supported_wps_cm); p2pielen += 2; - // Primary Device Type - // Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); - RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_MULIT_MEDIA); - p2pielen += 2; +#ifdef CONFIG_INTEL_WIDI + if( widi_version == 40 ) + { + // Primary Device Type + // Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); + RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_pdt_cid ); + p2pielen += 2; - // OUI - //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); - p2pielen += 4; + // OUI + //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); + p2pielen += 4; - // Sub Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); - RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_MEDIA_SERVER); - p2pielen += 2; + // Sub Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_pdt_scid); + p2pielen += 2; + } + else +#endif //CONFIG_INTEL_WIDI + { + // Primary Device Type + // Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_MULIT_MEDIA); + p2pielen += 2; + + // OUI + //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); + p2pielen += 4; + + // Sub Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_MEDIA_SERVER); + p2pielen += 2; + } // Number of Secondary Device Types #ifdef CONFIG_INTEL_WIDI - if( _rtw_memcmp( pwdinfo->padapter->mlmepriv.sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN ) == _FALSE ) + if( widi_version == 35 ) { p2pie[ p2pielen++ ] = 0x01; @@ -2028,6 +2066,21 @@ u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) RTW_PUT_BE16(p2pie + p2pielen, P2P_SCID_WIDI_CONSUMER_SINK); p2pielen += 2; } + else if( widi_version == 40 ) + { + p2pie[ p2pielen++ ] = pmlmepriv->num_p2p_sdt; + for( ; i < pmlmepriv->num_p2p_sdt; i++ ) + { + RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_sdt_cid[i]); + p2pielen += 2; + + RTW_PUT_BE32(p2pie + p2pielen, INTEL_DEV_TYPE_OUI); + p2pielen += 4; + + RTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_sdt_scid[i]); + p2pielen += 2; + } + } else #endif //CONFIG_INTEL_WIDI p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List @@ -2732,11 +2785,11 @@ u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe { u8 attr_content = 0x00; u32 attr_contentlen = 0; - u8 ch_content[50] = { 0x00 }; + u8 ch_content[100] = { 0x00 }; uint ch_cnt = 0; - u8 peer_ch_list[50] = { 0x00 }; + u8 peer_ch_list[100] = { 0x00 }; u8 peer_ch_num = 0; - u8 ch_list_inclusioned[50] = { 0x00 }; + u8 ch_list_inclusioned[100] = { 0x00 }; u8 ch_num_inclusioned = 0; u16 cap_attr; @@ -2934,12 +2987,12 @@ u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pfram u32 attr_contentlen = 0; u8 operatingch_info[5] = { 0x00 }; uint ch_cnt = 0; - u8 ch_content[50] = { 0x00 }; + u8 ch_content[100] = { 0x00 }; u8 groupid[ 38 ]; u16 cap_attr; - u8 peer_ch_list[50] = { 0x00 }; + u8 peer_ch_list[100] = { 0x00 }; u8 peer_ch_num = 0; - u8 ch_list_inclusioned[50] = { 0x00 }; + u8 ch_list_inclusioned[100] = { 0x00 }; u8 ch_num_inclusioned = 0; while ( p2p_ie ) // Found the P2P IE. @@ -3392,98 +3445,100 @@ _func_enter_; struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; pwdinfo->operating_channel = pbuddy_mlmeext->cur_channel; -#ifdef CONFIG_IOCTL_CFG80211 - DBG_871X("%s, switch ch back to buddy's cur_channel=%d\n", __func__, pbuddy_mlmeext->cur_channel); + if( pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + DBG_871X("%s, switch ch back to buddy's cur_channel=%d\n", __func__, pbuddy_mlmeext->cur_channel); - set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); - issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500); - -#else //CONFIG_IOCTL_CFG80211 - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) + issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500); + } + else if( pwdinfo->driver_interface == DRIVER_WEXT ) { - // Now, the driver stays on the AP's channel. - // If the pwdinfo->ext_listen_period = 0, that means the P2P listen state is not available on listen channel. - if ( pwdinfo->ext_listen_period > 0 ) + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) + { + // Now, the driver stays on the AP's channel. + // If the pwdinfo->ext_listen_period = 0, that means the P2P listen state is not available on listen channel. + if ( pwdinfo->ext_listen_period > 0 ) + { + DBG_8192C( "[%s] P2P_STATE_IDLE, ext_listen_period = %d\n", __FUNCTION__, pwdinfo->ext_listen_period ); + + if ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel ) + { + // Will switch to listen channel so that need to send the NULL data with PW bit to AP. + issue_nulldata(pbuddy_adapter, NULL, 1, 3, 500); + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + } + + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); + val8 = 1; + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + + // Todo: To check the value of pwdinfo->ext_listen_period is equal to 0 or not. + _set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period ); + } + } + else if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) || + rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL) || + ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _FALSE ) || + rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ) ) { - DBG_8192C( "[%s] P2P_STATE_IDLE, ext_listen_period = %d\n", __FUNCTION__, pwdinfo->ext_listen_period ); + // Now, the driver is in the listen state of P2P mode. + DBG_8192C( "[%s] P2P_STATE_IDLE, ext_listen_interval = %d\n", __FUNCTION__, pwdinfo->ext_listen_interval ); + // Commented by Albert 2012/11/01 + // If the AP's channel is the same as the listen channel, we should still be in the listen state + // Other P2P device is still able to find this device out even this device is in the AP's channel. + // So, configure this device to be able to receive the probe request frame and set it to listen state. if ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel ) { - // Will switch to listen channel so that need to send the NULL data with PW bit to AP. - issue_nulldata(pbuddy_adapter, NULL, 1, 3, 500); - set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); + val8 = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + rtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE); + issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500); } - rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - val8 = 1; - rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); - - // Todo: To check the value of pwdinfo->ext_listen_period is equal to 0 or not. - _set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period ); + // Todo: To check the value of pwdinfo->ext_listen_interval is equal to 0 or not. + _set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_interval ); } - } - else if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) || - rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL) || - ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _FALSE ) || - rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ) ) - { - // Now, the driver is in the listen state of P2P mode. - DBG_8192C( "[%s] P2P_STATE_IDLE, ext_listen_interval = %d\n", __FUNCTION__, pwdinfo->ext_listen_interval ); - - // Commented by Albert 2012/11/01 - // If the AP's channel is the same as the listen channel, we should still be in the listen state - // Other P2P device is still able to find this device out even this device is in the AP's channel. - // So, configure this device to be able to receive the probe request frame and set it to listen state. - if ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel ) + else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_OK)) { - set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); + // The driver had finished the P2P handshake successfully. val8 = 0; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); - rtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE); + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500); } - - // Todo: To check the value of pwdinfo->ext_listen_interval is equal to 0 or not. - _set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_interval ); - } - else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_OK)) - { - // The driver had finished the P2P handshake successfully. - val8 = 0; - rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); - set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); - issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500); - } - else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) - { - val8 = 1; - set_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); - issue_probereq_p2p(padapter, NULL); - _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); - } - else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _TRUE) - { - val8 = 1; - set_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); - issue_probereq_p2p(padapter, NULL); - _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); - } - else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) && pwdinfo->invitereq_info.benable == _TRUE) - { - /* - val8 = 1; - set_channel_bwmode(padapter, , HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); - issue_probereq_p2p(padapter, NULL); - _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); - */ + else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) + { + val8 = 1; + set_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + issue_probereq_p2p(padapter, NULL); + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); + } + else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _TRUE) + { + val8 = 1; + set_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + issue_probereq_p2p(padapter, NULL); + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); + } + else if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) && pwdinfo->invitereq_info.benable == _TRUE) + { + /* + val8 = 1; + set_channel_bwmode(padapter, , HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + issue_probereq_p2p(padapter, NULL); + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); + */ + } } -#endif //CONFIG_IOCTL_CFG80211 - } + } else { set_channel_bwmode( padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); @@ -3498,39 +3553,38 @@ static void ro_ch_handler(_adapter *padapter) { struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + u8 ch, bw, offset; _func_enter_; - { - -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - DBG_871X("%s, switch ch back to buddy's cur_channel=%d\n", __func__, pbuddy_mlmeext->cur_channel); - - set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); + if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) { + if (0) + DBG_871X(FUNC_ADPT_FMT" back to linked union - ch:%u, bw:%u, offset:%u\n", + FUNC_ADPT_ARG(padapter), ch, bw, offset); + } + else if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled && pwdinfo->listen_channel) { + ch = pwdinfo->listen_channel; + bw = HT_CHANNEL_WIDTH_20; + offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + if (0) + DBG_871X(FUNC_ADPT_FMT" back to listen ch - ch:%u, bw:%u, offset:%u\n", + FUNC_ADPT_ARG(padapter), ch, bw, offset); + } + else { + ch = pcfg80211_wdinfo->restore_channel; + bw = HT_CHANNEL_WIDTH_20; + offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + if (0) + DBG_871X(FUNC_ADPT_FMT" back to restore ch - ch:%u, bw:%u, offset:%u\n", + FUNC_ADPT_ARG(padapter), ch, bw, offset); + } - pmlmeext->cur_channel = pbuddy_mlmeext->cur_channel; - - }else -#endif //CONFIG_CONCURRENT_MODE - if( pcfg80211_wdinfo->restore_channel != pmlmeext->cur_channel ) - { - if ( !check_fwstate(&padapter->mlmepriv, _FW_LINKED ) ) - pmlmeext->cur_channel = pcfg80211_wdinfo->restore_channel; + set_channel_bwmode(padapter, ch, offset, bw); - set_channel_bwmode(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - } - - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); +#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); #endif - } pcfg80211_wdinfo->is_ro_ch = _FALSE; @@ -3558,6 +3612,162 @@ static void ro_ch_timer_process (void *FunctionContext) p2p_protocol_wk_cmd( adapter, P2P_RO_CH_WK); } +static void rtw_change_p2pie_op_ch(_adapter *padapter, const u8 *frame_body, u32 len, u8 ch) +{ + u8 *ies, *p2p_ie; + u32 ies_len, p2p_ielen; + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + + ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; + + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); + + while ( p2p_ie ) { + u32 attr_contentlen = 0; + u8 *pattr = NULL; + + //Check P2P_ATTR_OPERATING_CH + attr_contentlen = 0; + pattr = NULL; + if((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL) + { + *(pattr+4) = ch; + } + + //Get the next P2P IE + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen); + } +} + +static void rtw_change_p2pie_ch_list(_adapter *padapter, const u8 *frame_body, u32 len, u8 ch) +{ + u8 *ies, *p2p_ie; + u32 ies_len, p2p_ielen; + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + + ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; + + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); + + while (p2p_ie) { + u32 attr_contentlen = 0; + u8 *pattr = NULL; + + //Check P2P_ATTR_CH_LIST + if ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL) { + int i; + u32 num_of_ch; + u8 *pattr_temp = pattr + 3 ; + + attr_contentlen -= 3; + + while (attr_contentlen>0) { + num_of_ch = *(pattr_temp+1); + + for(i=0; ipbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + u8 buddy_ch = pbuddy_mlmeext->cur_channel; + + ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; + + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); + + while (p2p_ie) { + u32 attr_contentlen = 0; + u8 *pattr = NULL; + + //Check P2P_ATTR_CH_LIST + if ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL) { + int i; + u32 num_of_ch; + u8 *pattr_temp = pattr + 3 ; + + attr_contentlen -= 3; + + while (attr_contentlen>0) { + num_of_ch = *(pattr_temp+1); + + for(i=0; ipbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + u8 buddy_ch = pbuddy_mlmeext->cur_channel; + + ies = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_); + ies_len = len - _PUBLIC_ACTION_IE_OFFSET_; + + p2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen ); + + while (p2p_ie) { + u32 attr_contentlen = 0; + u8 *pattr = NULL; + + //Check P2P_ATTR_OPERATING_CH + attr_contentlen = 0; + pattr = NULL; + if((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL) { + if (*(pattr+4) == buddy_ch) { + DBG_871X(FUNC_ADPT_FMT" op_ch fit buddy_ch:%u\n", FUNC_ADPT_ARG(padapter), buddy_ch); + fit = _TRUE; + break; + } + } + + //Get the next P2P IE + p2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen); + } +#endif + return fit; +} + static void rtw_cfg80211_adjust_p2pie_channel(_adapter *padapter, const u8 *frame_body, u32 len) { #ifdef CONFIG_CONCURRENT_MODE @@ -3730,6 +3940,69 @@ void rtw_append_wfd_ie(_adapter *padapter, u8 *buf, u32* len) } #endif +u8 *dump_p2p_attr_ch_list(u8 *p2p_ie, uint p2p_ielen, u8 *buf, u32 buf_len) +{ + uint attr_contentlen = 0; + u8 *pattr = NULL; + int w_sz = 0; + u8 ch_cnt = 0; + u8 ch_list[40]; + bool continuous = _FALSE; + + if ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, &attr_contentlen))!=NULL) { + int i, j; + u32 num_of_ch; + u8 *pattr_temp = pattr + 3 ; + + attr_contentlen -= 3; + + _rtw_memset(ch_list, 0, 40); + + while (attr_contentlen>0) { + num_of_ch = *(pattr_temp+1); + + for(i=0; i=ch_cnt) + ch_list[ch_cnt++] = *(pattr_temp+2+i); + + } + + pattr_temp += (2+num_of_ch); + attr_contentlen -= (2+num_of_ch); + } + + for (j=0;j>1 == resp >>1) + return req&0x01 ? _TRUE : _FALSE; + else if (req>>1 > resp>>1) + return _TRUE; + else + return _FALSE; +} + int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx) { int is_p2p_frame = (-1); @@ -3738,6 +4011,11 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx) u8 *p2p_ie = NULL; uint p2p_ielen = 0; struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + int status = -1; + u8 ch_list_buf[128] = {'\0'}; + int op_ch = -1; + int listen_ch = -1; + u8 intent = 0; frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); category = frame_body[0]; @@ -3767,60 +4045,152 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx) u8 *cont; uint cont_len; case P2P_GO_NEGO_REQ: - DBG_871X("RTW_%s:P2P_GO_NEGO_REQ, dialogToken=%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken); - - if(tx) - { -#ifdef CONFIG_DRV_ISSUE_PROV_REQ // IOT FOR S2 + { + struct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info; + + if (tx) { + #ifdef CONFIG_DRV_ISSUE_PROV_REQ // IOT FOR S2 if(pwdev_priv->provdisc_req_issued == _FALSE) rtw_cfg80211_issue_p2p_provision_request(padapter, buf, len); -#endif //CONFIG_DRV_ISSUE_PROV_REQ + #endif //CONFIG_DRV_ISSUE_PROV_REQ //pwdev_priv->provdisc_req_issued = _FALSE; - -#ifdef CONFIG_CONCURRENT_MODE + + #ifdef CONFIG_CONCURRENT_MODE if(check_buddy_fwstate(padapter, _FW_LINKED)) rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)); -#endif + #endif } - + + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) + op_ch = *(cont+4); + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, NULL, &cont_len))) + listen_ch = *(cont+4); + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, NULL, &cont_len))) + intent = *cont; + + if (nego_info->token != dialogToken) + rtw_wdev_nego_info_init(nego_info); + + _rtw_memcpy(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN); + nego_info->active = tx ? 1 : 0; + nego_info->token = dialogToken; + nego_info->req_op_ch = op_ch; + nego_info->req_listen_ch = listen_ch; + nego_info->req_intent = intent; + nego_info->state = 0; + + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); + DBG_871X("RTW_%s:P2P_GO_NEGO_REQ, dialogToken=%d, intent:%u%s, listen_ch:%d, op_ch:%d, ch_list:%s\n", + (tx==_TRUE)?"Tx":"Rx", dialogToken, (intent>>1), intent&0x1 ? "+" : "-", listen_ch, op_ch, ch_list_buf); + + if (!tx) { + #ifdef CONFIG_CONCURRENT_MODE + if(check_buddy_fwstate(padapter, _FW_LINKED) + && rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) + { + DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter)); + rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0); + } + #endif + } + break; + } case P2P_GO_NEGO_RESP: - cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len); - DBG_871X("RTW_%s:P2P_GO_NEGO_RESP, dialogToken=%d, status:%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken, cont?*cont:-1); + { + struct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info; - if(!tx) - { - pwdev_priv->provdisc_req_issued = _FALSE; - } -#ifdef CONFIG_CONCURRENT_MODE - else - { + if (tx) { + #ifdef CONFIG_CONCURRENT_MODE if(check_buddy_fwstate(padapter, _FW_LINKED)) rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)); + #endif } -#endif - break; + + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) + op_ch = *(cont+4); + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, NULL, &cont_len))) + intent = *cont; + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len))) + status = *cont; + + if (nego_info->token == dialogToken && nego_info->state == 0 + && _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE + ) { + nego_info->status = (status==-1) ? 0xff : status; + nego_info->rsp_op_ch= op_ch; + nego_info->rsp_intent = intent; + nego_info->state = 1; + if (status != 0) + nego_info->token = 0; /* init */ + } + + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); + DBG_871X("RTW_%s:P2P_GO_NEGO_RESP, dialogToken=%d, intent:%u%s, status:%d, op_ch:%d, ch_list:%s\n", + (tx==_TRUE)?"Tx":"Rx", dialogToken, (intent>>1), intent&0x1 ? "+" : "-", status, op_ch, ch_list_buf); + + if (!tx) { + pwdev_priv->provdisc_req_issued = _FALSE; + #ifdef CONFIG_CONCURRENT_MODE + if(check_buddy_fwstate(padapter, _FW_LINKED) + && rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) + { + DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter)); + rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0); + } + #endif + } + + break; + } case P2P_GO_NEGO_CONF: - cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len); - DBG_871X("RTW_%s:P2P_GO_NEGO_CONF, dialogToken=%d, status:%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken, cont?*cont:-1); + { + struct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info; + bool is_go = _FALSE; -#ifdef CONFIG_CONCURRENT_MODE - if(tx) - { + if (tx) { + #ifdef CONFIG_CONCURRENT_MODE if(check_buddy_fwstate(padapter, _FW_LINKED)) rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)); + #endif } -#endif - break; + + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) + op_ch = *(cont+4); + if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len))) + status = *cont; + + if (nego_info->token == dialogToken && nego_info->state == 1 + && _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE + ) { + nego_info->status = (status==-1) ? 0xff : status; + nego_info->conf_op_ch = (op_ch==-1) ? 0 : op_ch; + nego_info->state = 2; + + if (status == 0) { + if (rtw_p2p_nego_intent_compare(nego_info->req_intent, nego_info->rsp_intent) && tx) + is_go = _TRUE; + } + + nego_info->token = 0; /* init */ + } + + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); + DBG_871X("RTW_%s:P2P_GO_NEGO_CONF, dialogToken=%d, status:%d, op_ch:%d, ch_list:%s\n", + (tx==_TRUE)?"Tx":"Rx", dialogToken, status, op_ch, ch_list_buf); + + if (!tx) { + } + + break; + } case P2P_INVIT_REQ: { struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info; int flags = -1; - int op_ch = 0; - if(tx) - { + if (tx) { #ifdef CONFIG_CONCURRENT_MODE if(check_buddy_fwstate(padapter, _FW_LINKED)) rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)); @@ -3835,21 +4205,38 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx) if (invit_info->token != dialogToken) rtw_wdev_invit_info_init(invit_info); + _rtw_memcpy(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN); + invit_info->active = tx ? 1 : 0; invit_info->token = dialogToken; invit_info->flags = (flags==-1) ? 0x0 : flags; invit_info->req_op_ch= op_ch; + invit_info->state = 0; + + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); + DBG_871X("RTW_%s:P2P_INVIT_REQ, dialogToken=%d, flags:0x%02x, op_ch:%d, ch_list:%s\n", + (tx==_TRUE)?"Tx":"Rx", dialogToken, flags, op_ch, ch_list_buf); + + if (!tx) { + #ifdef CONFIG_CONCURRENT_MODE + if(check_buddy_fwstate(padapter, _FW_LINKED)) { + if (op_ch != -1 && rtw_chk_p2pie_op_ch_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) { + DBG_871X(FUNC_ADPT_FMT" op_ch:%u has no intersect with buddy\n", FUNC_ADPT_ARG(padapter), op_ch); + rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0); + } else if (rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) { + DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter)); + rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0); + } + } + #endif + } - DBG_871X("RTW_%s:P2P_INVIT_REQ, dialogToken=%d, flags:0x%02x, op_ch:%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken, flags, op_ch); break; } case P2P_INVIT_RESP: { struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info; - int status = -1; - int op_ch = 0; - if(tx) - { + if (tx) { #ifdef CONFIG_CONCURRENT_MODE if(check_buddy_fwstate(padapter, _FW_LINKED)) rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)); @@ -3857,19 +4244,35 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx) } if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len))) + { +#ifdef CONFIG_P2P_INVITE_IOT + if(tx && *cont==7) + { + DBG_871X("TX_P2P_INVITE_RESP, status is no common channel, change to unknown group\n"); + *cont = 8; //unknow group status + } +#endif //CONFIG_P2P_INVITE_IOT status = *cont; + } if ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len))) op_ch = *(cont+4); - if (invit_info->token != dialogToken) { - rtw_wdev_invit_info_init(invit_info); - } else { - invit_info->token = 0; + if (invit_info->token == dialogToken && invit_info->state == 0 + && _rtw_memcmp(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE + ) { invit_info->status = (status==-1) ? 0xff : status; invit_info->rsp_op_ch= op_ch; + invit_info->state = 1; + invit_info->token = 0; /* init */ + } + + dump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128); + DBG_871X("RTW_%s:P2P_INVIT_RESP, dialogToken=%d, status:%d, op_ch:%d, ch_list:%s\n", + (tx==_TRUE)?"Tx":"Rx", dialogToken, status, op_ch, ch_list_buf); + + if (!tx) { } - DBG_871X("RTW_%s:P2P_INVIT_RESP, dialogToken=%d, status:%d, op_ch:%d\n", (tx==_TRUE)?"Tx":"Rx", dialogToken, status, op_ch); break; } case P2P_DEVDISC_REQ: @@ -3954,10 +4357,9 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx) } } - else + else { DBG_871X("RTW_%s:action frame category=%d\n", (tx==_TRUE)?"TX":"RX", category); - //is_p2p_frame = (-1); } return is_p2p_frame; @@ -4138,7 +4540,7 @@ _func_enter_; { pwdinfo->p2p_ps_mode = P2P_PS_CTWINDOW; // driver should wait LPS for entering CTWindow - if(padapter->pwrctrlpriv.bFwCurrentInPSMode == _TRUE) + if(adapter_to_pwrctl(padapter)->bFwCurrentInPSMode == _TRUE) { p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); } @@ -4175,7 +4577,7 @@ _func_exit_; void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct wifidirect_info *pwdinfo= &(padapter->wdinfo); _func_enter_; @@ -4193,12 +4595,12 @@ _func_enter_; pwdinfo->opp_ps = 0; pwdinfo->noa_num = 0; pwdinfo->p2p_ps_mode = P2P_PS_NONE; - if(padapter->pwrctrlpriv.bFwCurrentInPSMode == _TRUE) + if(pwrpriv->bFwCurrentInPSMode == _TRUE) { if(pwrpriv->smart_ps == 0) { pwrpriv->smart_ps = 2; - rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(padapter->pwrctrlpriv.pwr_mode))); + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(pwrpriv->pwr_mode))); } } break; @@ -4212,7 +4614,7 @@ _func_enter_; { pwrpriv->smart_ps = 0; DBG_871X("%s(): Enter CTW, change SmartPS\n", __FUNCTION__); - rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(padapter->pwrctrlpriv.pwr_mode))); + rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(pwrpriv->pwr_mode))); } } rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); @@ -4300,6 +4702,11 @@ static void reset_ch_sitesurvey_timer_process (void *FunctionContext) DBG_871X( "[%s] In\n", __FUNCTION__ ); // Reset the operation channel information pwdinfo->rx_invitereq_info.operation_ch[0] = 0; +#ifdef P2P_OP_CHECK_SOCIAL_CH + pwdinfo->rx_invitereq_info.operation_ch[1] = 0; + pwdinfo->rx_invitereq_info.operation_ch[2] = 0; + pwdinfo->rx_invitereq_info.operation_ch[3] = 0; +#endif //P2P_OP_CHECK_SOCIAL_CH pwdinfo->rx_invitereq_info.scan_op_ch_only = 0; } @@ -4314,6 +4721,11 @@ static void reset_ch_sitesurvey_timer_process2 (void *FunctionContext) DBG_871X( "[%s] In\n", __FUNCTION__ ); // Reset the operation channel information pwdinfo->p2p_info.operation_ch[0] = 0; +#ifdef P2P_OP_CHECK_SOCIAL_CH + pwdinfo->p2p_info.operation_ch[1] = 0; + pwdinfo->p2p_info.operation_ch[2] = 0; + pwdinfo->p2p_info.operation_ch[3] = 0; +#endif //P2P_OP_CHECK_SOCIAL_CH pwdinfo->p2p_info.scan_op_ch_only = 0; } @@ -4611,45 +5023,118 @@ void init_wifidirect_info( _adapter* padapter, enum P2P_ROLE role) pwdinfo->ext_listen_period = 1000; #endif //!CONFIG_IOCTL_CFG80211 #endif + +// Commented by Kurt 20130319 +// For WiDi purpose: Use CFG80211 interface but controled WFD/RDS frame by driver itself. +#ifdef CONFIG_IOCTL_CFG80211 + pwdinfo->driver_interface = DRIVER_CFG80211; +#else + pwdinfo->driver_interface = DRIVER_WEXT; +#endif //CONFIG_IOCTL_CFG80211 + pwdinfo->wfd_tdls_enable = 0; _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN ); _rtw_memset( pwdinfo->p2p_peer_device_addr, 0x00, ETH_ALEN ); pwdinfo->rx_invitereq_info.operation_ch[0] = 0; pwdinfo->rx_invitereq_info.operation_ch[1] = 0; // Used to indicate the scan end in site survey function +#ifdef P2P_OP_CHECK_SOCIAL_CH + pwdinfo->rx_invitereq_info.operation_ch[2] = 0; + pwdinfo->rx_invitereq_info.operation_ch[3] = 0; + pwdinfo->rx_invitereq_info.operation_ch[4] = 0; +#endif //P2P_OP_CHECK_SOCIAL_CH pwdinfo->rx_invitereq_info.scan_op_ch_only = 0; pwdinfo->p2p_info.operation_ch[0] = 0; pwdinfo->p2p_info.operation_ch[1] = 0; // Used to indicate the scan end in site survey function +#ifdef P2P_OP_CHECK_SOCIAL_CH + pwdinfo->p2p_info.operation_ch[2] = 0; + pwdinfo->p2p_info.operation_ch[3] = 0; + pwdinfo->p2p_info.operation_ch[4] = 0; +#endif //P2P_OP_CHECK_SOCIAL_CH pwdinfo->p2p_info.scan_op_ch_only = 0; } #ifdef CONFIG_DBG_P2P -char * p2p_role_str[] = { - "P2P_ROLE_DISABLE", - "P2P_ROLE_DEVICE", - "P2P_ROLE_CLIENT", - "P2P_ROLE_GO" -}; - -char * p2p_state_str[] = { - "P2P_STATE_NONE", - "P2P_STATE_IDLE", - "P2P_STATE_LISTEN", - "P2P_STATE_SCAN", - "P2P_STATE_FIND_PHASE_LISTEN", - "P2P_STATE_FIND_PHASE_SEARCH", - "P2P_STATE_TX_PROVISION_DIS_REQ", - "P2P_STATE_RX_PROVISION_DIS_RSP", - "P2P_STATE_RX_PROVISION_DIS_REQ", - "P2P_STATE_GONEGO_ING", - "P2P_STATE_GONEGO_OK", - "P2P_STATE_GONEGO_FAIL", - "P2P_STATE_RECV_INVITE_REQ_MATCH", - "P2P_STATE_PROVISIONING_ING", - "P2P_STATE_PROVISIONING_DONE", - "P2P_STATE_RECV_INVITE_REQ_DISMATCH", - "P2P_STATE_RECV_INVITE_REQ_GO" -}; + +/** + * rtw_p2p_role_txt - Get the p2p role name as a text string + * @role: P2P role + * Returns: The state name as a printable text string + */ +const char * rtw_p2p_role_txt(enum P2P_ROLE role) +{ + switch (role) { + case P2P_ROLE_DISABLE: + return "P2P_ROLE_DISABLE"; + case P2P_ROLE_DEVICE: + return "P2P_ROLE_DEVICE"; + case P2P_ROLE_CLIENT: + return "P2P_ROLE_CLIENT"; + case P2P_ROLE_GO: + return "P2P_ROLE_GO"; + default: + return "UNKNOWN"; + } +} + +/** + * rtw_p2p_state_txt - Get the p2p state name as a text string + * @state: P2P state + * Returns: The state name as a printable text string + */ +const char * rtw_p2p_state_txt(enum P2P_STATE state) +{ + switch (state) { + case P2P_STATE_NONE: + return "P2P_STATE_NONE"; + case P2P_STATE_IDLE: + return "P2P_STATE_IDLE"; + case P2P_STATE_LISTEN: + return "P2P_STATE_LISTEN"; + case P2P_STATE_SCAN: + return "P2P_STATE_SCAN"; + case P2P_STATE_FIND_PHASE_LISTEN: + return "P2P_STATE_FIND_PHASE_LISTEN"; + case P2P_STATE_FIND_PHASE_SEARCH: + return "P2P_STATE_FIND_PHASE_SEARCH"; + case P2P_STATE_TX_PROVISION_DIS_REQ: + return "P2P_STATE_TX_PROVISION_DIS_REQ"; + case P2P_STATE_RX_PROVISION_DIS_RSP: + return "P2P_STATE_RX_PROVISION_DIS_RSP"; + case P2P_STATE_RX_PROVISION_DIS_REQ: + return "P2P_STATE_RX_PROVISION_DIS_REQ"; + case P2P_STATE_GONEGO_ING: + return "P2P_STATE_GONEGO_ING"; + case P2P_STATE_GONEGO_OK: + return "P2P_STATE_GONEGO_OK"; + case P2P_STATE_GONEGO_FAIL: + return "P2P_STATE_GONEGO_FAIL"; + case P2P_STATE_RECV_INVITE_REQ_MATCH: + return "P2P_STATE_RECV_INVITE_REQ_MATCH"; + case P2P_STATE_PROVISIONING_ING: + return "P2P_STATE_PROVISIONING_ING"; + case P2P_STATE_PROVISIONING_DONE: + return "P2P_STATE_PROVISIONING_DONE"; + case P2P_STATE_TX_INVITE_REQ: + return "P2P_STATE_TX_INVITE_REQ"; + case P2P_STATE_RX_INVITE_RESP_OK: + return "P2P_STATE_RX_INVITE_RESP_OK"; + case P2P_STATE_RECV_INVITE_REQ_DISMATCH: + return "P2P_STATE_RECV_INVITE_REQ_DISMATCH"; + case P2P_STATE_RECV_INVITE_REQ_GO: + return "P2P_STATE_RECV_INVITE_REQ_GO"; + case P2P_STATE_RECV_INVITE_REQ_JOIN: + return "P2P_STATE_RECV_INVITE_REQ_JOIN"; + case P2P_STATE_RX_INVITE_RESP_FAIL: + return "P2P_STATE_RX_INVITE_RESP_FAIL"; + case P2P_STATE_RX_INFOR_NOREADY: + return "P2P_STATE_RX_INFOR_NOREADY"; + case P2P_STATE_TX_INFOR_NOREADY: + return "P2P_STATE_TX_INFOR_NOREADY"; + default: + return "UNKNOWN"; + } +} void dbg_rtw_p2p_set_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line) { @@ -4657,11 +5142,11 @@ void dbg_rtw_p2p_set_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, enum P2P_STATE old_state = _rtw_p2p_state(wdinfo); _rtw_p2p_set_state(wdinfo, state); DBG_871X("[CONFIG_DBG_P2P]%s:%d set_state from %s to %s\n", caller, line - , p2p_state_str[old_state], p2p_state_str[_rtw_p2p_state(wdinfo)] + , rtw_p2p_state_txt(old_state), rtw_p2p_state_txt(_rtw_p2p_state(wdinfo)) ); } else { DBG_871X("[CONFIG_DBG_P2P]%s:%d set_state to same state %s\n", caller, line - , p2p_state_str[_rtw_p2p_state(wdinfo)] + , rtw_p2p_state_txt(_rtw_p2p_state(wdinfo)) ); } } @@ -4671,11 +5156,11 @@ void dbg_rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo, enum P2P_STATE st enum P2P_STATE old_state = _rtw_p2p_pre_state(wdinfo); _rtw_p2p_set_pre_state(wdinfo, state); DBG_871X("[CONFIG_DBG_P2P]%s:%d set_pre_state from %s to %s\n", caller, line - , p2p_state_str[old_state], p2p_state_str[_rtw_p2p_pre_state(wdinfo)] + , rtw_p2p_state_txt(old_state), rtw_p2p_state_txt(_rtw_p2p_pre_state(wdinfo)) ); } else { DBG_871X("[CONFIG_DBG_P2P]%s:%d set_pre_state to same state %s\n", caller, line - , p2p_state_str[_rtw_p2p_pre_state(wdinfo)] + , rtw_p2p_state_txt(_rtw_p2p_pre_state(wdinfo)) ); } } @@ -4700,11 +5185,11 @@ void dbg_rtw_p2p_set_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role, co enum P2P_ROLE old_role = wdinfo->role; _rtw_p2p_set_role(wdinfo, role); DBG_871X("[CONFIG_DBG_P2P]%s:%d set_role from %s to %s\n", caller, line - , p2p_role_str[old_role], p2p_role_str[wdinfo->role] + , rtw_p2p_role_txt(old_role), rtw_p2p_role_txt(wdinfo->role) ); } else { DBG_871X("[CONFIG_DBG_P2P]%s:%d set_role to same role %s\n", caller, line - , p2p_role_str[wdinfo->role] + , rtw_p2p_role_txt(wdinfo->role) ); } } @@ -4715,7 +5200,6 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role) { int ret = _SUCCESS; struct wifidirect_info *pwdinfo= &(padapter->wdinfo); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; if (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT|| role == P2P_ROLE_GO) { @@ -4757,6 +5241,11 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role) } else if (role == P2P_ROLE_DISABLE) { +#ifdef CONFIG_INTEL_WIDI + if( padapter->mlmepriv.p2p_reject_disable == _TRUE ) + return ret; +#endif //CONFIG_INTEL_WIDI + if (_FAIL == rtw_pwr_wakeup(padapter)) { ret = _FAIL; goto exit; @@ -4787,6 +5276,18 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role) //Restore to initial setting. update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode); + +#ifdef CONFIG_INTEL_WIDI + rtw_reset_widi_info(padapter); +#endif //CONFIG_INTEL_WIDI + + //For WiDi purpose. +#ifdef CONFIG_IOCTL_CFG80211 + pwdinfo->driver_interface = DRIVER_CFG80211; +#else + pwdinfo->driver_interface = DRIVER_WEXT; +#endif //CONFIG_IOCTL_CFG80211 + } exit: diff --git a/drivers/net/wireless/rtl8723as/core/rtw_pwrctrl.c b/drivers/net/wireless/rtl8723as/core/rtw_pwrctrl.c index 9e53994211b2..77b86f344dca 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_pwrctrl.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_pwrctrl.c @@ -29,11 +29,15 @@ #endif #ifdef CONFIG_IPS -void ips_enter(_adapter * padapter) +void _ips_enter(_adapter * padapter) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - _enter_pwrlock(&pwrpriv->lock); + if (padapter->hw_init_completed == _FALSE) { + DBG_871X("%s: hw_init_completed: %d\n", + __func__, padapter->hw_init_completed); + return; + } pwrpriv->bips_processing = _TRUE; @@ -58,20 +62,21 @@ void ips_enter(_adapter * padapter) } pwrpriv->bips_processing = _FALSE; - _exit_pwrlock(&pwrpriv->lock); - } -int ips_leave(_adapter * padapter) +void ips_enter(_adapter * padapter) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - int result = _SUCCESS; - sint keyid; - + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); _enter_pwrlock(&pwrpriv->lock); + _ips_enter(padapter); + _exit_pwrlock(&pwrpriv->lock); +} + +int _ips_leave(_adapter * padapter) +{ + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + int result = _SUCCESS; if((pwrpriv->rf_pwrstate == rf_off) &&(!pwrpriv->bips_processing)) { @@ -84,20 +89,6 @@ int ips_leave(_adapter * padapter) pwrpriv->rf_pwrstate = rf_on; } DBG_871X_LEVEL(_drv_always_, "nolinked power save leave\n"); - - if((_WEP40_ == psecuritypriv->dot11PrivacyAlgrthm) ||(_WEP104_ == psecuritypriv->dot11PrivacyAlgrthm)) - { - DBG_871X("==>%s,channel(%d),processing(%x)\n",__FUNCTION__,padapter->mlmeextpriv.cur_channel,pwrpriv->bips_processing); - set_channel_bwmode(padapter, padapter->mlmeextpriv.cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - for(keyid=0;keyid<4;keyid++){ - if(pmlmepriv->key_mask & BIT(keyid)){ - if(keyid == psecuritypriv->dot11PrivacyKeyIndex) - result=rtw_set_key(padapter,psecuritypriv, keyid, 1); - else - result=rtw_set_key(padapter,psecuritypriv, keyid, 0); - } - } - } DBG_871X("==> ips_leave.....LED(0x%08x)...\n",rtw_read32(padapter,0x4c)); pwrpriv->bips_processing = _FALSE; @@ -106,13 +97,21 @@ int ips_leave(_adapter * padapter) pwrpriv->bpower_saving = _FALSE; } - _exit_pwrlock(&pwrpriv->lock); - return result; } +int ips_leave(_adapter * padapter) +{ + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + int ret; + + _enter_pwrlock(&pwrpriv->lock); + ret = _ips_leave(padapter); + _exit_pwrlock(&pwrpriv->lock); -#endif + return ret; +} +#endif /* CONFIG_IPS */ #ifdef CONFIG_AUTOSUSPEND extern void autosuspend_enter(_adapter* padapter); @@ -138,7 +137,7 @@ bool rtw_pwr_unassociated_idle(_adapter *adapter) bool ret = _FALSE; - if (adapter->pwrctrlpriv.ips_deny_time >= rtw_get_current_time()) { + if (adapter_to_pwrctl(adapter)->ips_deny_time >= rtw_get_current_time()) { //DBG_871X("%s ips_deny_time\n", __func__); goto exit; } @@ -211,7 +210,7 @@ void rtw_ps_processor(_adapter*padapter) #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); #endif //CONFIG_P2P - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); #ifdef SUPPORT_HW_RFOFF_DETECTED rt_rf_power_state rfpwrstate; @@ -224,7 +223,7 @@ void rtw_ps_processor(_adapter*padapter) goto exit; //DBG_871X("==> fw report state(0x%x)\n",rtw_read8(padapter,0x1ca)); - if(padapter->pwrctrlpriv.bHWPwrPindetect) + if(pwrpriv->bHWPwrPindetect) { #ifdef CONFIG_AUTOSUSPEND if(padapter->registrypriv.usbss_enable) @@ -277,11 +276,7 @@ void rtw_ps_processor(_adapter*padapter) } #endif //SUPPORT_HW_RFOFF_DETECTED - if (pwrpriv->ips_mode_req == IPS_NONE - #ifdef CONFIG_CONCURRENT_MODE - || padapter->pbuddy_adapter->pwrctrlpriv.ips_mode_req == IPS_NONE - #endif - ) + if (pwrpriv->ips_mode_req == IPS_NONE) goto exit; if (rtw_pwr_unassociated_idle(padapter) == _FALSE) @@ -333,7 +328,7 @@ void rtw_ps_processor(_adapter*padapter) } } exit: - rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); + rtw_set_pwr_state_check_timer(pwrpriv); pwrpriv->ps_processing = _FALSE; return; } @@ -359,7 +354,13 @@ void pwr_state_check_handler(void *FunctionContext) void rtw_set_rpwm(PADAPTER padapter, u8 pslv) { u8 rpwm; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); +#ifdef CONFIG_DETECT_CPWM_BY_POLLING + u8 cpwm_orig = 0; + u8 cpwm_now = 0; + u32 cpwm_polling_start_time = 0; + u8 pollingRes = _FAIL; +#endif _func_enter_; @@ -382,7 +383,9 @@ _func_enter_; { if ( (pwrpriv->rpwm == pslv) #ifdef CONFIG_LPS_LCLK +#ifndef CONFIG_RTL8723A || ((pwrpriv->rpwm >= PS_STATE_S2)&&(pslv >= PS_STATE_S2)) +#endif #endif ) { @@ -427,10 +430,18 @@ _func_enter_; pwrpriv->rpwm = pslv; -#ifdef CONFIG_LPS_RPWM_TIMER +#ifdef CONFIG_DETECT_CPWM_BY_POLLING + if (rpwm & PS_ACK) + { + //cpwm_orig = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HCPWM1); + rtw_hal_get_hwreg(padapter, HW_VAR_GET_CPWM, (u8 *)(&cpwm_orig)); + } +#endif + +#if defined(CONFIG_LPS_RPWM_TIMER) && !defined(CONFIG_DETECT_CPWM_BY_POLLING) if (rpwm & PS_ACK) _set_timer(&pwrpriv->pwr_rpwm_timer, LPS_RPWM_WAIT_MS); -#endif // CONFIG_LPS_RPWM_TIMER +#endif // CONFIG_LPS_RPWM_TIMER && !CONFIG_DETECT_CPWM_BY_POLLING rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm)); pwrpriv->tog += 0x80; @@ -443,6 +454,42 @@ _func_enter_; pwrpriv->cpwm = pslv; } +#ifdef CONFIG_DETECT_CPWM_BY_POLLING + if (rpwm & PS_ACK) + { + cpwm_polling_start_time = rtw_get_current_time(); + + //polling cpwm + do{ + rtw_mdelay_os(1); + + //cpwm_now = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HCPWM1); + rtw_hal_get_hwreg(padapter, HW_VAR_GET_CPWM, (u8 *)(&cpwm_now)); + if ((cpwm_orig ^ cpwm_now) & 0x80) + { +#ifdef CONFIG_LPS_LCLK + #ifdef CONFIG_RTL8723A + pwrpriv->cpwm = PS_STATE(cpwm_now); + #else // !CONFIG_RTL8723A + pwrpriv->cpwm = PS_STATE_S4; + #endif // !CONFIG_RTL8723A + pwrpriv->cpwm_tog = cpwm_now & PS_TOGGLE; +#endif + pollingRes = _SUCCESS; + break; + } + }while (rtw_get_passing_time_ms(cpwm_polling_start_time) < LPS_RPWM_WAIT_MS); + + if (pollingRes == _FAIL) + { +#ifdef CONFIG_LPS_RPWM_TIMER + _set_timer(&pwrpriv->pwr_rpwm_timer, 1); +#endif + DBG_871X("%s polling cpwm timeout!!!!!!!!!!\n", __FUNCTION__); + } + } +#endif + _func_exit_; } @@ -450,9 +497,18 @@ u8 PS_RDY_CHECK(_adapter * padapter); u8 PS_RDY_CHECK(_adapter * padapter) { u32 curr_time, delta_time; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); +#ifdef CONFIG_WOWLAN + if(_TRUE == pwrpriv->bInSuspend && pwrpriv->wowlan_mode) + return _TRUE; + else if (_TRUE == pwrpriv->bInSuspend) + return _FALSE; +#else + if(_TRUE == pwrpriv->bInSuspend ) + return _FALSE; +#endif curr_time = rtw_get_current_time(); delta_time = curr_time -pwrpriv->DelayLPSLastTimeStamp; @@ -464,24 +520,18 @@ u8 PS_RDY_CHECK(_adapter * padapter) if ((check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) || (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_UNDER_WPS) == _TRUE) || (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ) return _FALSE; -#ifdef CONFIG_WOWLAN - if(_TRUE == pwrpriv->bInSuspend && pwrpriv->wowlan_mode) - return _TRUE; - else - return _FALSE; -#else - if(_TRUE == pwrpriv->bInSuspend ) - return _FALSE; -#endif + if( (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) && (padapter->securitypriv.binstallGrpkey == _FALSE) ) { DBG_871X("Group handshake still in progress !!!\n"); return _FALSE; } + #ifdef CONFIG_IOCTL_CFG80211 if (!rtw_cfg80211_pwr_mgmt(padapter)) return _FALSE; @@ -492,7 +542,7 @@ u8 PS_RDY_CHECK(_adapter * padapter) void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); #endif //CONFIG_P2P @@ -562,6 +612,26 @@ _func_enter_; pwrpriv->pwr_mode = ps_mode; rtw_set_rpwm(padapter, PS_STATE_S4); +#ifdef CONFIG_WOWLAN + if (pwrpriv->wowlan_mode == _TRUE) + { + u32 start_time, delay_ms; + u8 val8; + delay_ms = 20; + start_time = rtw_get_current_time(); + do { + val8 = rtw_read8(padapter, 0x90); + if (!(val8 & BIT(0))) break; + if (rtw_get_passing_time_ms(start_time) > delay_ms) + { + DBG_871X("%s: Wait for FW 32K leave more than %u ms!!!\n", __FUNCTION__, delay_ms); + break; + } + rtw_usleep_os(100); + } while (1); + pwrpriv->cpwm = PS_STATE_S4; + } +#endif rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); pwrpriv->bFwCurrentInPSMode = _FALSE; } @@ -610,8 +680,9 @@ _func_enter_; #endif //CONFIG_P2P_PS #ifdef CONFIG_LPS_LCLK - if (pwrpriv->alives == 0) - rtw_set_rpwm(padapter, PS_STATE_S0); + DBG_871X("%s: alives: %d\n", __FUNCTION__, pwrpriv->alives); + if (pwrpriv->alives == 0) + rtw_set_rpwm(padapter, PS_STATE_S0); #else rtw_set_rpwm(padapter, PS_STATE_S2); #endif @@ -670,7 +741,7 @@ s32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms) // void LPS_Enter(PADAPTER padapter) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); _adapter *buddy = padapter->pbuddy_adapter; @@ -721,7 +792,7 @@ _func_enter_; pwrpriv->bpower_saving = _TRUE; DBG_871X("%s smart_ps:%d\n", __func__, pwrpriv->smart_ps); //For Tenda W311R IOT issue - rtw_set_ps_mode(padapter, pwrpriv->power_mgnt, pwrpriv->smart_ps, 0); + rtw_set_ps_mode(padapter, pwrpriv->power_mgnt, pwrpriv->smart_ps, 0x40); } } else @@ -741,7 +812,7 @@ void LPS_Leave(PADAPTER padapter) { #define LPS_LEAVE_TIMEOUT_MS 100 - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); u32 start_time; u8 bAwake = _FALSE; @@ -758,7 +829,7 @@ _func_enter_; { if(pwrpriv->pwr_mode != PS_MODE_ACTIVE) { - rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0); + rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0x40); if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) LPS_RF_ON_check(padapter, LPS_LEAVE_TIMEOUT_MS); @@ -805,7 +876,7 @@ _func_enter_; } else { - if(Adapter->pwrctrlpriv.rf_pwrstate== rf_off) + if(adapter_to_pwrctl(Adapter)->rf_pwrstate== rf_off) { #ifdef CONFIG_AUTOSUSPEND if(Adapter->registrypriv.usbss_enable) @@ -844,7 +915,7 @@ void LPS_Leave_check( _func_enter_; - pwrpriv = &padapter->pwrctrlpriv; + pwrpriv = adapter_to_pwrctl(padapter); bReady = _FALSE; start_time = rtw_get_current_time(); @@ -897,7 +968,7 @@ void cpwm_int_hdl( _func_enter_; - pwrpriv = &padapter->pwrctrlpriv; + pwrpriv = adapter_to_pwrctl(padapter); #if 0 if (pwrpriv->cpwm_tog == (preportpwrstate->state & PS_TOGGLE)) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, @@ -942,7 +1013,8 @@ _func_exit_; static void cpwm_event_callback(struct work_struct *work) { struct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, cpwm_event); - _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + struct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv); + _adapter *adapter = dvobj->if1; struct reportpwrstate_parm report; //DBG_871X("%s\n",__FUNCTION__); @@ -955,11 +1027,13 @@ static void cpwm_event_callback(struct work_struct *work) static void rpwmtimeout_workitem_callback(struct work_struct *work) { PADAPTER padapter; + struct dvobj_priv *dvobj; struct pwrctrl_priv *pwrpriv; pwrpriv = container_of(work, struct pwrctrl_priv, rpwmtimeoutwi); - padapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + dvobj = pwrctl_to_dvobj(pwrpriv); + padapter = dvobj->if1; // DBG_871X("+%s: rpwm=0x%02X cpwm=0x%02X\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); _enter_pwrlock(&pwrpriv->lock); @@ -1010,7 +1084,7 @@ static void pwr_rpwm_timeout_handler(void *FunctionContext) padapter = (PADAPTER)FunctionContext; - pwrpriv = &padapter->pwrctrlpriv; + pwrpriv = adapter_to_pwrctl(padapter); // DBG_871X("+%s: rpwm=0x%02X cpwm=0x%02X\n", __func__, pwrpriv->rpwm, pwrpriv->cpwm); if ((pwrpriv->rpwm == pwrpriv->cpwm) || (pwrpriv->cpwm >= PS_STATE_S2)) @@ -1055,9 +1129,9 @@ s32 rtw_register_tx_alive(PADAPTER padapter) _func_enter_; res = _SUCCESS; - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); #ifdef CONFIG_BT_COEXIST - if (_TRUE == padapter->pwrctrlpriv.btcoex_rfon) + if (_TRUE == adapter_to_pwrctl(padapter)->btcoex_rfon) pslv = PS_STATE_S3; else #endif @@ -1086,6 +1160,14 @@ _func_enter_; _exit_pwrlock(&pwrctrl->lock); +#ifdef CONFIG_DETECT_CPWM_BY_POLLING + if (_FAIL == res) + { + if (pwrctrl->cpwm >= PS_STATE_S2) + res = _SUCCESS; + } +#endif // CONFIG_DETECT_CPWM_BY_POLLING + _func_exit_; return res; @@ -1113,9 +1195,9 @@ s32 rtw_register_cmd_alive(PADAPTER padapter) _func_enter_; res = _SUCCESS; - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); #ifdef CONFIG_BT_COEXIST - if (_TRUE == padapter->pwrctrlpriv.btcoex_rfon) + if (_TRUE == adapter_to_pwrctl(padapter)->btcoex_rfon) pslv = PS_STATE_S3; else #endif @@ -1144,6 +1226,14 @@ _func_enter_; _exit_pwrlock(&pwrctrl->lock); +#ifdef CONFIG_DETECT_CPWM_BY_POLLING + if (_FAIL == res) + { + if (pwrctrl->cpwm >= PS_STATE_S2) + res = _SUCCESS; + } +#endif // CONFIG_DETECT_CPWM_BY_POLLING + _func_exit_; return res; @@ -1164,7 +1254,7 @@ s32 rtw_register_rx_alive(PADAPTER padapter) _func_enter_; - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); _enter_pwrlock(&pwrctrl->lock); @@ -1195,7 +1285,7 @@ s32 rtw_register_evt_alive(PADAPTER padapter) _func_enter_; - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); _enter_pwrlock(&pwrctrl->lock); @@ -1224,7 +1314,7 @@ void rtw_unregister_tx_alive(PADAPTER padapter) _func_enter_; - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); _enter_pwrlock(&pwrctrl->lock); @@ -1262,7 +1352,7 @@ void rtw_unregister_cmd_alive(PADAPTER padapter) _func_enter_; - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); _enter_pwrlock(&pwrctrl->lock); @@ -1296,7 +1386,7 @@ void rtw_unregister_rx_alive(PADAPTER padapter) _func_enter_; - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); _enter_pwrlock(&pwrctrl->lock); @@ -1317,7 +1407,7 @@ void rtw_unregister_evt_alive(PADAPTER padapter) _func_enter_; - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); unregister_task_alive(pwrctrl, EVT_ALIVE); @@ -1337,7 +1427,12 @@ static void resume_workitem_callback(struct work_struct *work); void rtw_init_pwrctrl_priv(PADAPTER padapter) { - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); + +#if defined(CONFIG_CONCURRENT_MODE) + if (padapter->adapter_type != PRIMARY_ADAPTER) + return; +#endif _func_enter_; @@ -1421,7 +1516,12 @@ _func_exit_; void rtw_free_pwrctrl_priv(PADAPTER adapter) { - struct pwrctrl_priv *pwrctrlpriv = &adapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(adapter); + +#if defined(CONFIG_CONCURRENT_MODE) + if (adapter->adapter_type != PRIMARY_ADAPTER) + return; +#endif _func_enter_; @@ -1452,7 +1552,8 @@ extern int rtw_resume_process(_adapter *padapter); static void resume_workitem_callback(struct work_struct *work) { struct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, resume_work); - _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + struct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv); + _adapter *adapter = dvobj->if1; DBG_871X("%s\n",__FUNCTION__); @@ -1507,7 +1608,8 @@ static void rtw_early_suspend(struct early_suspend *h) static void rtw_late_resume(struct early_suspend *h) { struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); - _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + struct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv); + _adapter *adapter = dvobj->if1; DBG_871X("%s\n",__FUNCTION__); if(pwrpriv->do_late_resume) { @@ -1527,8 +1629,6 @@ void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv) pwrpriv->early_suspend.suspend = rtw_early_suspend; pwrpriv->early_suspend.resume = rtw_late_resume; register_early_suspend(&pwrpriv->early_suspend); - - } void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv) @@ -1560,7 +1660,8 @@ static void rtw_early_suspend(android_early_suspend_t *h) static void rtw_late_resume(android_early_suspend_t *h) { struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); - _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + struct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv); + _adapter *adapter = dvobj->if1; DBG_871X("%s\n",__FUNCTION__); if(pwrpriv->do_late_resume) { @@ -1607,7 +1708,7 @@ u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val) inline void rtw_set_ips_deny(_adapter *padapter, u32 ms) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); pwrpriv->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(ms); } @@ -1620,7 +1721,7 @@ inline void rtw_set_ips_deny(_adapter *padapter, u32 ms) int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct mlme_priv *pmlmepriv = &padapter->mlmepriv; int ret = _SUCCESS; u32 start = rtw_get_current_time(); @@ -1631,7 +1732,6 @@ int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller) if ((padapter->isprimary == _FALSE) && padapter->pbuddy_adapter){ padapter = padapter->pbuddy_adapter; - pwrpriv = &padapter->pwrctrlpriv; pmlmepriv = &padapter->mlmepriv; } #endif @@ -1774,7 +1874,7 @@ exit: int rtw_pm_set_lps(_adapter *padapter, u8 mode) { int ret = 0; - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); if ( mode < PS_MODE_NUM ) { @@ -1802,7 +1902,7 @@ int rtw_pm_set_lps(_adapter *padapter, u8 mode) int rtw_pm_set_ips(_adapter *padapter, u8 mode) { - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); if( mode == IPS_NORMAL || mode == IPS_LEVEL_2 ) { rtw_ips_mode_req(pwrctrlpriv, mode); diff --git a/drivers/net/wireless/rtl8723as/core/rtw_recv.c b/drivers/net/wireless/rtl8723as/core/rtw_recv.c index e7f8708c2028..05a514ea6926 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_recv.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_recv.c @@ -31,6 +31,10 @@ #include #endif +#ifdef CONFIG_BT_COEXIST +#include +#endif + #if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) #error "Shall be Linux or Windows, but not both!\n" @@ -279,7 +283,7 @@ _func_enter_; #ifdef CONFIG_BSD_RX_USE_MBUF m_freem(precvframe->u.hdr.pkt); #else // CONFIG_BSD_RX_USE_MBUF - dev_kfree_skb_any(precvframe->u.hdr.pkt);//free skb by driver + rtw_skb_free(precvframe->u.hdr.pkt);//free skb by driver #endif // CONFIG_BSD_RX_USE_MBUF precvframe->u.hdr.pkt = NULL; } @@ -737,6 +741,9 @@ _func_enter_; return_packet = NULL; } + else{ + prxattrib->bdecrypted = _TRUE; + } //recvframe_chkmic(adapter, precv_frame); //move to recvframme_defrag function _func_exit_; @@ -761,7 +768,6 @@ union recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame) _func_enter_; pstapriv = &adapter->stapriv; - psta = rtw_get_stainfo(pstapriv, psta_addr); auth_alg = adapter->securitypriv.dot11AuthAlgrthm; @@ -772,6 +778,8 @@ _func_enter_; prtnframe = NULL; + psta = rtw_get_stainfo(pstapriv, psta_addr); + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:adapter->securitypriv.dot11AuthAlgrthm=%d\n",adapter->securitypriv.dot11AuthAlgrthm)); if(auth_alg==2) @@ -1739,7 +1747,7 @@ union recv_frame* recvframe_chk_defrag(PADAPTER padapter, union recv_frame *prec sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame); sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame) { - //struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + //struct mlme_priv *pmlmepriv = &padapter->mlmepriv; RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("+validate_recv_mgnt_frame\n")); @@ -2012,6 +2020,127 @@ _func_exit_; return ret; } +#ifdef CONFIG_IEEE80211W +static sint validate_80211w_mgmt(_adapter *adapter, union recv_frame *precv_frame) +{ + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + u8 *ptr = precv_frame->u.hdr.rx_data; + u8 type; + u8 subtype; + + type = GetFrameType(ptr); + subtype = GetFrameSubType(ptr); //bit(7)~bit(2) + + //only support station mode + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED) + && adapter->securitypriv.binstallBIPkey == _TRUE) + { + //unicast management frame decrypt + if(pattrib->privacy && !(IS_MCAST(GetAddr1Ptr(ptr))) && + (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC || subtype == WIFI_ACTION)) + { + u8 *ppp, *mgmt_DATA; + u32 data_len=0; + ppp = GetAddr2Ptr(ptr); + + pattrib->bdecrypted = 0; + pattrib->encrypt = _AES_; + pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); + //set iv and icv length + SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt); + _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); + //actual management data frame body + data_len = pattrib->pkt_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len; + mgmt_DATA = rtw_zmalloc(data_len); + if(mgmt_DATA == NULL) + { + DBG_871X("%s mgmt allocate fail !!!!!!!!!\n", __FUNCTION__); + goto validate_80211w_fail; + } + /*//dump the packet content before decrypt + { + int pp; + printk("pattrib->pktlen = %d =>", pattrib->pkt_len); + for(pp=0;pp< pattrib->pkt_len; pp++) + printk(" %02x ", ptr[pp]); + printk("\n"); + }*/ + + precv_frame = decryptor(adapter, precv_frame); + //save actual management data frame body + _rtw_memcpy(mgmt_DATA, ptr+pattrib->hdrlen+pattrib->iv_len, data_len); + //overwrite the iv field + _rtw_memcpy(ptr+pattrib->hdrlen, mgmt_DATA, data_len); + //remove the iv and icv length + pattrib->pkt_len = pattrib->pkt_len - pattrib->iv_len - pattrib->icv_len; + rtw_mfree(mgmt_DATA, data_len); + /*//print packet content after decryption + { + int pp; + printk("after decryption pattrib->pktlen = %d @@=>", pattrib->pkt_len); + for(pp=0;pp< pattrib->pkt_len; pp++) + printk(" %02x ", ptr[pp]); + printk("\n"); + }*/ + if(!precv_frame) + { + DBG_871X("%s mgmt descrypt fail !!!!!!!!!\n", __FUNCTION__); + goto validate_80211w_fail; + } + } + else if(IS_MCAST(GetAddr1Ptr(ptr)) && + (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC)) + { + sint BIP_ret = _SUCCESS; + //verify BIP MME IE of broadcast/multicast de-auth/disassoc packet + BIP_ret = rtw_BIP_verify(adapter, (u8 * )precv_frame); + if(BIP_ret == _FAIL) + { + //DBG_871X("802.11w BIP verify fail\n"); + goto validate_80211w_fail; + } + else if(BIP_ret == RTW_RX_HANDLED) + { + //DBG_871X("802.11w recv none protected packet\n"); + //issue sa query request + issue_action_SA_Query(adapter, NULL, 0, 0); + goto validate_80211w_fail; + } + }//802.11w protect + else + { + if(subtype == WIFI_ACTION) + { + //according 802.11-2012 standard, these five types are not robust types + if( ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_PUBLIC && + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_HT && + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_UNPROTECTED_WNM && + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_SELF_PROTECTED && + ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_P2P) + { + DBG_871X("action frame category=%d should robust\n", ptr[WLAN_HDR_A3_LEN]); + goto validate_80211w_fail; + } + } + else if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC) + { + DBG_871X("802.11w recv none protected packet\n"); + //issue sa query request + issue_action_SA_Query(adapter, NULL, 0, 0); + goto validate_80211w_fail; + } + } + } + return _SUCCESS; + +validate_80211w_fail: + return _FAIL; + +} +#endif //CONFIG_IEEE80211W + sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame); sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame) { @@ -2022,7 +2151,6 @@ sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame) u8 type; u8 subtype; sint retval = _SUCCESS; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; u8 *ptr = precv_frame->u.hdr.rx_data; @@ -2138,6 +2266,14 @@ _func_enter_; switch (type) { case WIFI_MGT_TYPE: //mgnt +#ifdef CONFIG_IEEE80211W + if(validate_80211w_mgmt(adapter, precv_frame) == _FAIL) + { + retval = _FAIL; + break; + } +#endif //CONFIG_IEEE80211W + retval = validate_recv_mgnt_frame(adapter, precv_frame); if (retval == _FAIL) { @@ -2454,12 +2590,8 @@ static void recvframe_expand_pkt( //3 1. alloc new skb // prepare extra space for 4 bytes alignment -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - ppkt = dev_alloc_skb(alloc_sz); - if (ppkt) ppkt->dev = padapter->pnetdev; -#else - ppkt = netdev_alloc_skb(padapter->pnetdev, alloc_sz); -#endif + ppkt = rtw_skb_alloc(alloc_sz); + if (!ppkt) return; // no way to expand //3 2. Prepare new skb to replace & release old skb @@ -2471,7 +2603,7 @@ static void recvframe_expand_pkt( // copy data to new pkt _rtw_memcpy(skb_put(ppkt, pfhdr->len), pfhdr->rx_data, pfhdr->len); - dev_kfree_skb_any(pfhdr->pkt); + rtw_skb_free(pfhdr->pkt); // attach new pkt to recvframe pfhdr->pkt = ppkt; @@ -2770,7 +2902,7 @@ int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) /* Allocate new skb for releasing to upper layer */ #ifdef CONFIG_SKB_COPY - sub_skb = dev_alloc_skb(nSubframe_Length + 12); + sub_skb = rtw_skb_alloc(nSubframe_Length + 12); if(sub_skb) { skb_reserve(sub_skb, 12); @@ -2780,7 +2912,7 @@ int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) else #endif // CONFIG_SKB_COPY { - sub_skb = skb_clone(prframe->u.hdr.pkt, GFP_ATOMIC); + sub_skb = rtw_skb_clone(prframe->u.hdr.pkt); if(sub_skb) { sub_skb->data = pdata; @@ -2789,7 +2921,7 @@ int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) } else { - DBG_871X("skb_clone() Fail!!! , nr_subframes = %d\n",nr_subframes); + DBG_871X("rtw_skb_clone() Fail!!! , nr_subframes = %d\n",nr_subframes); break; } } @@ -2890,7 +3022,7 @@ int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) #if 1 // bypass this frame to upper layer!! #else - dev_kfree_skb_any(sub_skb); + rtw_skb_free(sub_skb); continue; #endif } @@ -2910,7 +3042,7 @@ int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) sub_skb->ip_summed = CHECKSUM_NONE; #endif //CONFIG_TCP_CSUM_OFFLOAD_RX - netif_rx(sub_skb); + rtw_netif_rx(padapter->pnetdev, sub_skb); } #else //PLATFORM_FREEBSD @@ -3151,11 +3283,8 @@ exit: _rtw_init_listhead(&pnrframe_new->u.hdr.list); - #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pskb_copy = dev_alloc_skb(copy_len+64); - #else - pskb_copy = netdev_alloc_skb(padapter->pnetdev, copy_len + 64); - #endif + pskb_copy = rtw_skb_alloc(copy_len+64); + if(pskb_copy==NULL) { DBG_871X("amsdu_to_msdu:can not all(ocate memory for skb copy\n"); @@ -3230,7 +3359,7 @@ exit: #ifdef PLATFORM_LINUX if(pskb) { - pnrframe_new->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); + pnrframe_new->u.hdr.pkt = rtw_skb_clone(pskb); } #endif //PLATFORM_LINUX @@ -3597,8 +3726,9 @@ int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe) //s1. wlanhdr_to_ethhdr(prframe); - if ((pattrib->qos!=1) /*|| pattrib->priority!=0 || IS_MCAST(pattrib->ra)*/ - || (pattrib->eth_type==0x0806) || (pattrib->ack_policy!=0)) + //if ((pattrib->qos!=1) /*|| pattrib->priority!=0 || IS_MCAST(pattrib->ra)*/ + // || (pattrib->eth_type==0x0806) || (pattrib->ack_policy!=0)) + if (pattrib->qos!=1) { if ((padapter->bDriverStopped == _FALSE) && (padapter->bSurpriseRemoved == _FALSE)) @@ -3863,7 +3993,8 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) struct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib; struct recv_priv *precvpriv = &padapter->recvpriv; _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue; - + + #ifdef CONFIG_MP_INCLUDED struct mlme_priv *pmlmepriv = &padapter->mlmepriv; #endif //CONFIG_MP_INCLUDED @@ -3871,20 +4002,20 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe) #ifdef CONFIG_MP_INCLUDED if (padapter->registrypriv.mp_mode == 1) { - if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0)) - { if (pattrib->crc_err == 1) + { padapter->mppriv.rx_crcerrpktcount++; + } else + { padapter->mppriv.rx_pktcount++; - + } if (check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE) == _FALSE) { RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("MP - Not in loopback mode , drop pkt \n")); ret = _FAIL; rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame goto exit; } - } } #endif @@ -4189,41 +4320,65 @@ void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){ recvpriv->signal_qual_data.update_req = 1; } - //update value of signal_strength, rssi, signal_qual - if(check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) == _FALSE) { - tmp_s = (avg_signal_strength+(_alpha-1)*recvpriv->signal_strength); - if(tmp_s %_alpha) - tmp_s = tmp_s/_alpha + 1; - else - tmp_s = tmp_s/_alpha; - if(tmp_s>100) - tmp_s = 100; + if (num_signal_strength == 0) { + if (rtw_get_on_cur_ch_time(adapter) == 0 + || rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) < 2 * adapter->mlmeextpriv.mlmext_info.bcn_interval +#ifdef CONFIG_BT_COEXIST + || ((BTDM_IsBtDisabled(adapter) == _FALSE) && (BT_IsBtInquiryPage(adapter) == _TRUE)) +#endif + ) { + goto set_timer; + } + } - tmp_q = (avg_signal_qual+(_alpha-1)*recvpriv->signal_qual); - if(tmp_q %_alpha) - tmp_q = tmp_q/_alpha + 1; - else - tmp_q = tmp_q/_alpha; - if(tmp_q>100) - tmp_q = 100; - - recvpriv->signal_strength = tmp_s; - recvpriv->rssi = (s8)translate_percentage_to_dbm(tmp_s); - recvpriv->signal_qual = tmp_q; - - #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 - DBG_871X("%s signal_strength:%3u, rssi:%3d, signal_qual:%3u" - ", num_signal_strength:%u, num_signal_qual:%u" - "\n" - , __FUNCTION__ - , recvpriv->signal_strength - , recvpriv->rssi - , recvpriv->signal_qual - , num_signal_strength, num_signal_qual - ); - #endif + if(check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE + || check_fwstate(&adapter->mlmepriv, _FW_LINKED) == _FALSE + ) { + goto set_timer; } + + #ifdef CONFIG_CONCURRENT_MODE + if (check_buddy_fwstate(adapter, _FW_UNDER_SURVEY) == _TRUE) + goto set_timer; + #endif + + //update value of signal_strength, rssi, signal_qual + tmp_s = (avg_signal_strength+(_alpha-1)*recvpriv->signal_strength); + if(tmp_s %_alpha) + tmp_s = tmp_s/_alpha + 1; + else + tmp_s = tmp_s/_alpha; + if(tmp_s>100) + tmp_s = 100; + + tmp_q = (avg_signal_qual+(_alpha-1)*recvpriv->signal_qual); + if(tmp_q %_alpha) + tmp_q = tmp_q/_alpha + 1; + else + tmp_q = tmp_q/_alpha; + if(tmp_q>100) + tmp_q = 100; + + recvpriv->signal_strength = tmp_s; + recvpriv->rssi = (s8)translate_percentage_to_dbm(tmp_s); + recvpriv->signal_qual = tmp_q; + + #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1 + DBG_871X(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u" + ", num_signal_strength:%u, num_signal_qual:%u" + ", on_cur_ch_ms:%d" + "\n" + , FUNC_ADPT_ARG(adapter) + , recvpriv->signal_strength + , recvpriv->rssi + , recvpriv->signal_qual + , num_signal_strength, num_signal_qual + , rtw_get_on_cur_ch_time(adapter) ? rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) : 0 + ); + #endif } + +set_timer: rtw_set_signal_stat_timer(recvpriv); } diff --git a/drivers/net/wireless/rtl8723as/core/rtw_security.c b/drivers/net/wireless/rtl8723as/core/rtw_security.c index 4a3b20a9caed..68dfafb18de5 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_security.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_security.c @@ -212,7 +212,7 @@ _func_enter_; length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; - *((unsigned long *)crc)=cpu_to_le32(getcrc32(payload,length)); + *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length)); arcfour_init(&mycontext, wepkey,3+keylength); arcfour_encrypt(&mycontext, payload, payload, length); @@ -222,7 +222,7 @@ _func_enter_; else { length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; - *((unsigned long *)crc)=cpu_to_le32(getcrc32(payload,length)); + *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length)); arcfour_init(&mycontext, wepkey,3+keylength); arcfour_encrypt(&mycontext, payload, payload, length); arcfour_encrypt(&mycontext, payload+length, crc, 4); @@ -275,7 +275,7 @@ _func_enter_; arcfour_encrypt(&mycontext, payload, payload, length); //calculate icv and compare the icv - *((unsigned long *)crc)=le32_to_cpu(getcrc32(payload,length-4)); + *((u32 *)crc)=le32_to_cpu(getcrc32(payload,length-4)); if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4]) { @@ -801,12 +801,42 @@ _func_enter_; if(IS_MCAST(prxattrib->ra)) { + static u32 start = 0; + static u32 no_gkey_bc_cnt = 0; + static u32 no_gkey_mc_cnt = 0; + if(psecuritypriv->binstallGrpkey==_FALSE) { - res=_FAIL; - DBG_8192C("%s:rx bc/mc packets,but didn't install group key!!!!!!!!!!\n",__FUNCTION__); + res=_FAIL; + + if (start == 0) + start = rtw_get_current_time(); + + if (is_broadcast_mac_addr(prxattrib->ra)) + no_gkey_bc_cnt++; + else + no_gkey_mc_cnt++; + + if (rtw_get_passing_time_ms(start) > 1000) { + if (no_gkey_bc_cnt || no_gkey_mc_cnt) { + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n", + FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt); + } + start = rtw_get_current_time(); + no_gkey_bc_cnt = 0; + no_gkey_mc_cnt = 0; + } goto exit; } + + if (no_gkey_bc_cnt || no_gkey_mc_cnt) { + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n", + FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt); + } + start = 0; + no_gkey_bc_cnt = 0; + no_gkey_mc_cnt = 0; + //DBG_871X("rx bc/mc packets, to perform sw rtw_tkip_decrypt\n"); //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; @@ -916,11 +946,13 @@ static void construct_mic_iv( sint a4_exists, u8 *mpdu, uint payload_length, - u8 * pn_vector); + u8 * pn_vector, + uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use static void construct_mic_header1( u8 *mic_header1, sint header_length, - u8 *mpdu); + u8 *mpdu, + uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use static void construct_mic_header2( u8 *mic_header2, u8 *mpdu, @@ -932,7 +964,8 @@ static void construct_ctr_preload( sint qc_exists, u8 *mpdu, u8 *pn_vector, - sint c); + sint c, + uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use static void xor_128(u8 *a, u8 *b, u8 *out); static void xor_32(u8 *a, u8 *b, u8 *out); static u8 sbox(u8 a); @@ -1152,6 +1185,8 @@ _func_exit_; /************************************************/ /* construct_mic_iv() */ /* Builds the MIC IV from header fields and PN */ +/* Baron think the function is construct CCM */ +/* nonce */ /************************************************/ static void construct_mic_iv( u8 *mic_iv, @@ -1159,7 +1194,8 @@ static void construct_mic_iv( sint a4_exists, u8 *mpdu, uint payload_length, - u8 *pn_vector + u8 *pn_vector, + uint frtype// add for CONFIG_IEEE80211W, none 11w also can use ) { sint i; @@ -1168,6 +1204,11 @@ _func_enter_; if (qc_exists && a4_exists) mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */ if (qc_exists && !a4_exists) mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */ if (!qc_exists) mic_iv[1] = 0x00; +#ifdef CONFIG_IEEE80211W + //802.11w management frame should set management bit(4) + if(frtype == WIFI_MGT_TYPE) + mic_iv[1] |= BIT(4); +#endif //CONFIG_IEEE80211W for (i = 2; i < 8; i++) mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */ #ifdef CONSISTENT_PN_ORDER @@ -1187,17 +1228,26 @@ _func_exit_; /* construct_mic_header1() */ /* Builds the first MIC header block from */ /* header fields. */ +/* Build AAD SC,A1,A2 */ /************************************************/ static void construct_mic_header1( u8 *mic_header1, sint header_length, - u8 *mpdu + u8 *mpdu, + uint frtype// add for CONFIG_IEEE80211W, none 11w also can use ) { _func_enter_; mic_header1[0] = (u8)((header_length - 2) / 256); mic_header1[1] = (u8)((header_length - 2) % 256); - mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */ +#ifdef CONFIG_IEEE80211W + //802.11w management frame don't AND subtype bits 4,5,6 of frame control field + if(frtype == WIFI_MGT_TYPE) + mic_header1[2] = mpdu[0]; /* Mute CF poll & CF ack bits */ + else +#endif //CONFIG_IEEE80211W + mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */ + mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */ mic_header1[4] = mpdu[4]; /* A1 */ mic_header1[5] = mpdu[5]; @@ -1271,6 +1321,8 @@ _func_exit_; /* construct_mic_header2() */ /* Builds the last MIC header block from */ /* header fields. */ +/* Baron think the function is construct CCM */ +/* nonce */ /************************************************/ static void construct_ctr_preload( u8 *ctr_preload, @@ -1278,20 +1330,25 @@ static void construct_ctr_preload( sint qc_exists, u8 *mpdu, u8 *pn_vector, - sint c + sint c, + uint frtype // add for CONFIG_IEEE80211W, none 11w also can use ) { sint i = 0; _func_enter_; for (i=0; i<16; i++) ctr_preload[i] = 0x00; i = 0; - + ctr_preload[0] = 0x01; /* flag */ if (qc_exists && a4_exists) ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */ if (qc_exists && !a4_exists) ctr_preload[1] = mpdu[24] & 0x0f; - +#ifdef CONFIG_IEEE80211W + //802.11w management frame should set management bit(4) + if(frtype == WIFI_MGT_TYPE) + ctr_preload[1] |= BIT(4); +#endif //CONFIG_IEEE80211W for (i = 2; i < 8; i++) ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */ #ifdef CONSISTENT_PN_ORDER @@ -1363,9 +1420,9 @@ _func_enter_; a4_exists = 1; if ( - (frtype == WIFI_DATA_CFACK) || - (frtype == WIFI_DATA_CFPOLL)|| - (frtype == WIFI_DATA_CFACKPOLL)) + ((frtype|frsubtype) == WIFI_DATA_CFACK) || + ((frtype|frsubtype) == WIFI_DATA_CFPOLL)|| + ((frtype|frsubtype) == WIFI_DATA_CFACKPOLL)) { qc_exists = 1; if(hdrlen != WLAN_HDR_A3_QOS_LEN){ @@ -1373,11 +1430,12 @@ _func_enter_; hdrlen += 2; } } - else if ( - (frsubtype == 0x08) || + // add for CONFIG_IEEE80211W, none 11w also can use + else if ((frtype == WIFI_DATA) && + ((frsubtype == 0x08) || (frsubtype == 0x09)|| (frsubtype == 0x0a)|| - (frsubtype == 0x0b)) + (frsubtype == 0x0b))) { if(hdrlen != WLAN_HDR_A3_QOS_LEN){ @@ -1401,13 +1459,15 @@ _func_enter_; a4_exists, pframe, //message, plen, - pn_vector + pn_vector, + frtype // add for CONFIG_IEEE80211W, none 11w also can use ); construct_mic_header1( mic_header1, hdrlen, - pframe //message + pframe, //message + frtype // add for CONFIG_IEEE80211W, none 11w also can use ); construct_mic_header2( mic_header2, @@ -1466,7 +1526,8 @@ _func_enter_; qc_exists, pframe, //message, pn_vector, - i+1); + i+1, + frtype); // add for CONFIG_IEEE80211W, none 11w also can use aes128k128d(key, ctr_preload, aes_out); bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer); for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; @@ -1480,7 +1541,8 @@ _func_enter_; qc_exists, pframe, //message, pn_vector, - num_blocks+1); + num_blocks+1, + frtype); // add for CONFIG_IEEE80211W, none 11w also can use for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; for (j = 0; j < payload_remainder; j++) @@ -1499,7 +1561,8 @@ _func_enter_; qc_exists, pframe, //message, pn_vector, - 0); + 0, + frtype); // add for CONFIG_IEEE80211W, none 11w also can use for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; for (j = 0; j < 8; j++) @@ -1566,7 +1629,7 @@ _func_enter_; { DBG_871X("%s, call rtw_get_stainfo()\n", __func__); stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); - } + } if (stainfo!=NULL){ @@ -1671,7 +1734,7 @@ _func_enter_; //start to decrypt the payload - num_blocks = (plen-8) / 16; //(plen including llc, payload_length and mic ) + num_blocks = (plen-8) / 16; //(plen including LLC, payload_length and mic ) payload_remainder = (plen-8) % 16; @@ -1688,21 +1751,21 @@ _func_enter_; a4_exists = 1; if ( - (frtype == WIFI_DATA_CFACK) || - (frtype == WIFI_DATA_CFPOLL)|| - (frtype == WIFI_DATA_CFACKPOLL)) + ((frtype|frsubtype) == WIFI_DATA_CFACK) || + ((frtype|frsubtype) == WIFI_DATA_CFPOLL)|| + ((frtype|frsubtype) == WIFI_DATA_CFACKPOLL)) { qc_exists = 1; if(hdrlen != WLAN_HDR_A3_QOS_LEN){ hdrlen += 2; } - } - else if ( - (frsubtype == 0x08) || + }//only for data packet . add for CONFIG_IEEE80211W, none 11w also can use + else if ((frtype == WIFI_DATA) && + ((frsubtype == 0x08) || (frsubtype == 0x09)|| (frsubtype == 0x0a)|| - (frsubtype == 0x0b)) + (frsubtype == 0x0b))) { if(hdrlen != WLAN_HDR_A3_QOS_LEN){ @@ -1726,7 +1789,8 @@ _func_enter_; qc_exists, pframe, pn_vector, - i+1 + i+1, + frtype ); aes128k128d(key, ctr_preload, aes_out); @@ -1743,7 +1807,8 @@ _func_enter_; qc_exists, pframe, pn_vector, - num_blocks+1 + num_blocks+1, + frtype // add for CONFIG_IEEE80211W, none 11w also can use ); for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; @@ -1776,13 +1841,15 @@ _func_enter_; a4_exists, message, plen-8, - pn_vector + pn_vector, + frtype // add for CONFIG_IEEE80211W, none 11w also can use ); construct_mic_header1( mic_header1, hdrlen, - message + message, + frtype // add for CONFIG_IEEE80211W, none 11w also can use ); construct_mic_header2( mic_header2, @@ -1841,7 +1908,8 @@ _func_enter_; qc_exists, message, pn_vector, - i+1); + i+1, + frtype); // add for CONFIG_IEEE80211W, none 11w also can use aes128k128d(key, ctr_preload, aes_out); bitwise_xor(aes_out, &message[payload_index], chain_buffer); for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; @@ -1855,7 +1923,8 @@ _func_enter_; qc_exists, message, pn_vector, - num_blocks+1); + num_blocks+1, + frtype); // add for CONFIG_IEEE80211W, none 11w also can use for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; for (j = 0; j < payload_remainder; j++) @@ -1874,7 +1943,8 @@ _func_enter_; qc_exists, message, pn_vector, - 0); + 0, + frtype); // add for CONFIG_IEEE80211W, none 11w also can use for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; for (j = 0; j < 8; j++) @@ -1952,9 +2022,31 @@ _func_enter_; { prwskey=&stainfo->dot118021x_UncstKey.skey[0]; } - + length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; - + /*// add for CONFIG_IEEE80211W, debug + if(0) + printk("@@@@@@@@@@@@@@@@@@ length=%d, prxattrib->hdrlen=%d, prxattrib->pkt_len=%d \n" + , length, prxattrib->hdrlen, prxattrib->pkt_len); + if(0) + { + int no; + //test print PSK + printk("PSK key below:\n"); + for(no=0;no<16;no++) + printk(" %02x ", prwskey[no]); + printk("\n"); + } + if(0) + { + int no; + //test print PSK + printk("frame:\n"); + for(no=0;nopkt_len;no++) + printk(" %02x ", pframe[no]); + printk("\n"); + }*/ + res= aes_decipher(prwskey,prxattrib->hdrlen,pframe, length); @@ -1969,6 +2061,109 @@ _func_exit_; exit: return res; } + +#ifdef CONFIG_IEEE80211W +u32 rtw_BIP_verify(_adapter *padapter, u8 *precvframe) +{ + struct rx_pkt_attrib *pattrib = &((union recv_frame *)precvframe)->u.hdr.attrib; + u8 *pframe; + u8 *BIP_AAD, *p; + u32 res=_FAIL; + uint len, ori_len; + struct rtw_ieee80211_hdr *pwlanhdr; + u8 mic[16]; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + ori_len = pattrib->pkt_len-WLAN_HDR_A3_LEN+BIP_AAD_SIZE; + BIP_AAD = rtw_zmalloc(ori_len); + + if(BIP_AAD == NULL) + { + DBG_871X("BIP AAD allocate fail\n"); + return _FAIL; + } + //PKT start + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; + //mapping to wlan header + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + //save the frame body + MME + _rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, pframe+WLAN_HDR_A3_LEN, pattrib->pkt_len-WLAN_HDR_A3_LEN); + //find MME IE pointer + p = rtw_get_ie(BIP_AAD+BIP_AAD_SIZE, _MME_IE_, &len, pattrib->pkt_len-WLAN_HDR_A3_LEN); + //Baron + if(p) + { + u16 keyid=0; + u64 temp_ipn=0; + //save packet number + _rtw_memcpy(&temp_ipn, p+4, 6); + temp_ipn = le64_to_cpu(temp_ipn); + //BIP packet number should bigger than previous BIP packet + if(temp_ipn <= pmlmeext->mgnt_80211w_IPN_rx) + { + DBG_871X("replay BIP packet\n"); + goto BIP_exit; + } + //copy key index + _rtw_memcpy(&keyid, p+2, 2); + keyid = le16_to_cpu(keyid); + if(keyid != padapter->securitypriv.dot11wBIPKeyid) + { + DBG_871X("BIP key index error!\n"); + goto BIP_exit; + } + //clear the MIC field of MME to zero + _rtw_memset(p+2+len-8, 0, 8); + + //conscruct AAD, copy frame control field + _rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2); + ClearRetry(BIP_AAD); + ClearPwrMgt(BIP_AAD); + ClearMData(BIP_AAD); + //conscruct AAD, copy address 1 to address 3 + _rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18); + + if(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey + , BIP_AAD, ori_len, mic)) + goto BIP_exit; + + /*//management packet content + { + int pp; + DBG_871X("pkt: "); + for(pp=0;pp< pattrib->pkt_len; pp++) + printk(" %02x ", pframe[pp]); + DBG_871X("\n"); + //BIP AAD + management frame body + MME(MIC is zero) + DBG_871X("AAD+PKT: "); + for(pp=0;pp< ori_len; pp++) + DBG_871X(" %02x ", BIP_AAD[pp]); + DBG_871X("\n"); + //show the MIC result + DBG_871X("mic: "); + for(pp=0;pp<16; pp++) + DBG_871X(" %02x ", mic[pp]); + DBG_871X("\n"); + } + */ + //MIC field should be last 8 bytes of packet (packet without FCS) + if(_rtw_memcmp(mic, pframe+pattrib->pkt_len-8, 8)) + { + pmlmeext->mgnt_80211w_IPN_rx = temp_ipn; + res=_SUCCESS; + } + else + DBG_871X("BIP MIC error!\n"); + + } + else + res = RTW_RX_HANDLED; +BIP_exit: + + rtw_mfree(BIP_AAD, ori_len); + return res; +} +#endif //CONFIG_IEEE80211W + #ifndef PLATFORM_FREEBSD /* compress 512-bits */ static int sha256_compress(struct sha256_state *md, unsigned char *buf) @@ -2676,8 +2871,8 @@ static int omac1_aes_128_vector(u8 *key, size_t num_elem, * This is a mode for using block cipher (AES in this case) for authentication. * OMAC1 was standardized with the name CMAC by NIST in a Special Publication * (SP) 800-38B. - */ -static int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac) + */ //modify for CONFIG_IEEE80211W +int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac) { return omac1_aes_128_vector(key, 1, &data, &data_len, mac); } @@ -2891,3 +3086,43 @@ _func_exit_; } +/* Restore HW wep key setting according to key_mask */ +void rtw_sec_restore_wep_key(_adapter *adapter) +{ + struct security_priv* securitypriv=&(adapter->securitypriv); + sint keyid; + + if((_WEP40_ == securitypriv->dot11PrivacyAlgrthm) ||(_WEP104_ == securitypriv->dot11PrivacyAlgrthm)) { + for(keyid=0;keyid<4;keyid++){ + if(securitypriv->key_mask & BIT(keyid)){ + if(keyid == securitypriv->dot11PrivacyKeyIndex) + rtw_set_key(adapter,securitypriv, keyid, 1, _TRUE); + else + rtw_set_key(adapter,securitypriv, keyid, 0, _TRUE); + } + } + } +} + +u8 rtw_handle_tkip_countermeasure(_adapter* adapter, const char *caller) +{ + struct security_priv* securitypriv=&(adapter->securitypriv); + u8 status = _SUCCESS; + + if (securitypriv->btkip_countermeasure == _TRUE) { + u32 passing_ms = rtw_get_passing_time_ms(securitypriv->btkip_countermeasure_time); + if (passing_ms > 60*1000) { + DBG_871X_LEVEL(_drv_always_, "%s("ADPT_FMT") countermeasure time:%ds > 60s \n", + caller, ADPT_ARG(adapter), passing_ms/1000); + securitypriv->btkip_countermeasure = _FALSE; + securitypriv->btkip_countermeasure_time = 0; + } else { + DBG_871X_LEVEL(_drv_always_, "%s("ADPT_FMT") countermeasure time:%ds < 60s \n", + caller, ADPT_ARG(adapter), passing_ms/1000); + status = _FAIL; + } + } + + return status; +} + diff --git a/drivers/net/wireless/rtl8723as/core/rtw_sreset.c b/drivers/net/wireless/rtl8723as/core/rtw_sreset.c index b700bbfe5958..bc34827b492b 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_sreset.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_sreset.c @@ -1,350 +1,356 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include - -void sreset_init_value(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - _rtw_mutex_init(&psrtpriv->silentreset_mutex); - psrtpriv->silent_reset_inprogress = _FALSE; - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - psrtpriv->last_tx_time =0; - psrtpriv->last_tx_complete_time =0; -#endif -} -void sreset_reset_value(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - psrtpriv->silent_reset_inprogress = _FALSE; - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - psrtpriv->last_tx_time =0; - psrtpriv->last_tx_complete_time =0; -#endif -} - -u8 sreset_get_wifi_status(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - u8 status = WIFI_STATUS_SUCCESS; - u32 val32 = 0; - _irqL irqL; - if(psrtpriv->silent_reset_inprogress == _TRUE) - { - return status; - } - val32 =rtw_read32(padapter,REG_TXDMA_STATUS); - if(val32==0xeaeaeaea){ - psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST; - } - else if(val32!=0){ - DBG_8192C("txdmastatu(%x)\n",val32); - psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR; - } - - if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status) - { - DBG_8192C("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status); - status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL))); - } - DBG_8192C("==> %s wifi_status(0x%x)\n",__FUNCTION__,status); - - //status restore - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - - return status; -#else - return WIFI_STATUS_SUCCESS; -#endif -} - -void sreset_set_wifi_error_status(_adapter *padapter, u32 status) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.Wifi_Error_Status = status; -#endif -} - -void sreset_set_trigger_point(_adapter *padapter, s32 tgp) -{ -#if defined(DBG_CONFIG_ERROR_DETECT) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.dbg_trigger_point = tgp; -#endif -} - -bool sreset_inprogress(_adapter *padapter) -{ -#if defined(DBG_CONFIG_ERROR_RESET) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - return pHalData->srestpriv.silent_reset_inprogress; -#else - return _FALSE; -#endif -} - -void sreset_restore_security_station(_adapter *padapter) -{ - u8 EntryId = 0; - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct sta_priv * pstapriv = &padapter->stapriv; - struct sta_info *psta; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; - - { - u8 val8; - - if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) { - val8 = 0xcc; - #ifdef CONFIG_WAPI_SUPPORT - } else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) { - //Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey. - val8 = 0x4c; - #endif - } else { - val8 = 0xcf; - } - rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - } - - #if 0 - if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) || - ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ )) - { - - for(EntryId=0; EntryId<4; EntryId++) - { - if(EntryId == psecuritypriv->dot11PrivacyKeyIndex) - rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1); - else - rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0); - } - - } - else - #endif - if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || - (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) - { - psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv)); - if (psta == NULL) { - //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); - } - else - { - //pairwise key - rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); - //group key - rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0); - } - } -} - -void sreset_restore_network_station(_adapter *padapter) -{ - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - #if 0 - { - //======================================================= - // reset related register of Beacon control - - //set MSR to nolink - Set_MSR(padapter, _HW_STATE_NOLINK_); - // reject all data frame - rtw_write16(padapter, REG_RXFLTMAP2,0x00); - //reset TSF - rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); - - // disable update TSF - SetBcnCtrlReg(padapter, BIT(4), 0); - - //======================================================= - } - #endif - - rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure); - - { - u8 threshold; - #ifdef CONFIG_USB_HCI - // TH=1 => means that invalidate usb rx aggregation - // TH=0 => means that validate usb rx aggregation, use init value. - if(mlmepriv->htpriv.ht_option) { - if(padapter->registrypriv.wifi_spec==1) - threshold = 1; - else - threshold = 0; - rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } else { - threshold = 1; - rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } - #endif - } - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - //disable dynamic functions, such as high power, DIG - //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - - rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); - - { - u8 join_type = 0; - rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - } - - Set_MSR(padapter, (pmlmeinfo->state & 0x3)); - - mlmeext_joinbss_event_callback(padapter, 1); - //restore Sequence No. - rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn); - - sreset_restore_security_station(padapter); -} - -void sreset_restore_network_status(_adapter *padapter) -{ - struct mlme_priv *mlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - sreset_restore_network_station(padapter); - } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - rtw_ap_restore_network(padapter); - } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - } else { - DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); - } -} - -void sreset_stop_adapter(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - if (padapter == NULL) - return; - - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); - - if (!rtw_netif_queue_stopped(padapter->pnetdev)) - rtw_netif_stop_queue(padapter->pnetdev); - - rtw_cancel_all_timer(padapter); - - /* TODO: OS and HCI independent */ - #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) - tasklet_kill(&pxmitpriv->xmit_tasklet); - #endif - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) - rtw_scan_abort(padapter); - - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) - _rtw_join_timeout_handler(padapter); - -} - -void sreset_start_adapter(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - if (padapter == NULL) - return; - - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); - - if (check_fwstate(pmlmepriv, _FW_LINKED)) { - sreset_restore_network_status(padapter); - } - - /* TODO: OS and HCI independent */ - #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); - #endif - - _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); - - if (rtw_netif_queue_stopped(padapter->pnetdev)) - rtw_netif_wake_queue(padapter->pnetdev); - -} - -void sreset_reset(_adapter *padapter) -{ -#ifdef DBG_CONFIG_ERROR_RESET - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - _irqL irqL; - u32 start = rtw_get_current_time(); - - DBG_871X("%s\n", __FUNCTION__); - - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - - _enter_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); - psrtpriv->silent_reset_inprogress = _TRUE; - pwrpriv->change_rfpwrstate = rf_off; - - sreset_stop_adapter(padapter); - #ifdef CONFIG_CONCURRENT_MODE - sreset_stop_adapter(padapter->pbuddy_adapter); - #endif - - #ifdef CONFIG_IPS - ips_enter(padapter); - ips_leave(padapter); - #endif - - sreset_start_adapter(padapter); - #ifdef CONFIG_CONCURRENT_MODE - sreset_start_adapter(padapter->pbuddy_adapter); - #endif - - psrtpriv->silent_reset_inprogress = _FALSE; - _exit_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); - - DBG_871X("%s done in %d ms\n", __FUNCTION__, rtw_get_passing_time_ms(start)); -#endif -} - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#include + +void sreset_init_value(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + _rtw_mutex_init(&psrtpriv->silentreset_mutex); + psrtpriv->silent_reset_inprogress = _FALSE; + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + psrtpriv->last_tx_time =0; + psrtpriv->last_tx_complete_time =0; +#endif +} +void sreset_reset_value(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + //psrtpriv->silent_reset_inprogress = _FALSE; + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + psrtpriv->last_tx_time =0; + psrtpriv->last_tx_complete_time =0; +#endif +} + +u8 sreset_get_wifi_status(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + u8 status = WIFI_STATUS_SUCCESS; + u32 val32 = 0; + _irqL irqL; + if(psrtpriv->silent_reset_inprogress == _TRUE) + { + return status; + } + val32 =rtw_read32(padapter,REG_TXDMA_STATUS); + if(val32==0xeaeaeaea){ + psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST; + } + else if(val32!=0){ + DBG_8192C("txdmastatu(%x)\n",val32); + psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR; + } + + if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status) + { + DBG_8192C("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status); + status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL))); + } + DBG_8192C("==> %s wifi_status(0x%x)\n",__FUNCTION__,status); + + //status restore + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + + return status; +#else + return WIFI_STATUS_SUCCESS; +#endif +} + +void sreset_set_wifi_error_status(_adapter *padapter, u32 status) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = status; +#endif +} + +void sreset_set_trigger_point(_adapter *padapter, s32 tgp) +{ +#if defined(DBG_CONFIG_ERROR_DETECT) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.dbg_trigger_point = tgp; +#endif +} + +bool sreset_inprogress(_adapter *padapter) +{ +#if defined(DBG_CONFIG_ERROR_RESET) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + return pHalData->srestpriv.silent_reset_inprogress; +#else + return _FALSE; +#endif +} + +void sreset_restore_security_station(_adapter *padapter) +{ + u8 EntryId = 0; + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct sta_priv * pstapriv = &padapter->stapriv; + struct sta_info *psta; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + + { + u8 val8; + + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) { + val8 = 0xcc; + #ifdef CONFIG_WAPI_SUPPORT + } else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) { + //Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey. + val8 = 0x4c; + #endif + } else { + val8 = 0xcf; + } + rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + } + + #if 0 + if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) || + ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ )) + { + + for(EntryId=0; EntryId<4; EntryId++) + { + if(EntryId == psecuritypriv->dot11PrivacyKeyIndex) + rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1,_FALSE); + else + rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0,_FALSE); + } + + } + else + #endif + if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) + { + psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv)); + if (psta == NULL) { + //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); + } + else + { + //pairwise key + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE,_FALSE); + //group key + rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0,_FALSE); + } + } +} + +void sreset_restore_network_station(_adapter *padapter) +{ + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + #if 0 + { + //======================================================= + // reset related register of Beacon control + + //set MSR to nolink + Set_MSR(padapter, _HW_STATE_NOLINK_); + // reject all data frame + rtw_write16(padapter, REG_RXFLTMAP2,0x00); + //reset TSF + rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); + + // disable update TSF + SetBcnCtrlReg(padapter, BIT(4), 0); + + //======================================================= + } + #endif + + rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure,_FALSE); + + { + u8 threshold; + #ifdef CONFIG_USB_HCI + // TH=1 => means that invalidate usb rx aggregation + // TH=0 => means that validate usb rx aggregation, use init value. + if(mlmepriv->htpriv.ht_option) { + if(padapter->registrypriv.wifi_spec==1) + threshold = 1; + else + threshold = 0; + rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); + } else { + threshold = 1; + rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); + } + #endif + } + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + //disable dynamic functions, such as high power, DIG + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); + + { + u8 join_type = 0; + rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + } + + Set_MSR(padapter, (pmlmeinfo->state & 0x3)); + + mlmeext_joinbss_event_callback(padapter, 1); + //restore Sequence No. + rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn); + + sreset_restore_security_station(padapter); +} + + +void sreset_restore_network_status(_adapter *padapter) +{ + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + sreset_restore_network_station(padapter); + } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + rtw_ap_restore_network(padapter); + } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + } else { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + } +} + +void sreset_stop_adapter(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + if (padapter == NULL) + return; + + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + if (!rtw_netif_queue_stopped(padapter->pnetdev)) + rtw_netif_stop_queue(padapter->pnetdev); + + rtw_cancel_all_timer(padapter); + + /* TODO: OS and HCI independent */ + #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) + tasklet_kill(&pxmitpriv->xmit_tasklet); + #endif + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) + rtw_scan_abort(padapter); + + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) + { + rtw_set_roaming(padapter, 0); + _rtw_join_timeout_handler(padapter); + } + +} + +void sreset_start_adapter(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + if (padapter == NULL) + return; + + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + if (check_fwstate(pmlmepriv, _FW_LINKED)) { + sreset_restore_network_status(padapter); + } + + /* TODO: OS and HCI independent */ + #if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI) + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); + #endif + + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); + + if (rtw_netif_queue_stopped(padapter->pnetdev)) + rtw_netif_wake_queue(padapter->pnetdev); + +} + +void sreset_reset(_adapter *padapter) +{ +#ifdef DBG_CONFIG_ERROR_RESET + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + _irqL irqL; + u32 start = rtw_get_current_time(); + + DBG_871X("%s\n", __FUNCTION__); + + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + + _enter_pwrlock(&pwrpriv->lock); + + psrtpriv->silent_reset_inprogress = _TRUE; + pwrpriv->change_rfpwrstate = rf_off; + + sreset_stop_adapter(padapter); + #ifdef CONFIG_CONCURRENT_MODE + sreset_stop_adapter(padapter->pbuddy_adapter); + #endif + + #ifdef CONFIG_IPS + _ips_enter(padapter); + _ips_leave(padapter); + #endif + + sreset_start_adapter(padapter); + #ifdef CONFIG_CONCURRENT_MODE + sreset_start_adapter(padapter->pbuddy_adapter); + #endif + + psrtpriv->silent_reset_inprogress = _FALSE; + + _exit_pwrlock(&pwrpriv->lock); + + DBG_871X("%s done in %d ms\n", __FUNCTION__, rtw_get_passing_time_ms(start)); +#endif +} + diff --git a/drivers/net/wireless/rtl8723as/core/rtw_sta_mgt.c b/drivers/net/wireless/rtl8723as/core/rtw_sta_mgt.c index 3c1e4c305dc3..3ba598f87371 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_sta_mgt.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_sta_mgt.c @@ -87,7 +87,18 @@ _func_enter_; psta->keep_alive_trycnt = 0; #endif // CONFIG_AP_MODE + +#ifdef DBG_TRX_STA_PKTS + psta->tx_be_cnt = 0; + psta->tx_bk_cnt = 0; + psta->tx_vi_cnt = 0; + psta->tx_vo_cnt = 0; + psta->rx_be_cnt = 0; + psta->rx_bk_cnt = 0; + psta->rx_vi_cnt = 0; + psta->rx_vo_cnt = 0; +#endif _func_exit_; } diff --git a/drivers/net/wireless/rtl8723as/core/rtw_tdls.c b/drivers/net/wireless/rtl8723as/core/rtw_tdls.c index 231b240c89b7..f7ca24aab826 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_tdls.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_tdls.c @@ -1,2941 +1,2941 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTW_TDLS_C_ - -#include -#include -#include -#include - -#ifdef CONFIG_TDLS -extern unsigned char MCS_rate_2R[16]; -extern unsigned char MCS_rate_1R[16]; -extern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame); -extern s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe); - -void rtw_reset_tdls_info(_adapter* padapter) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - - ptdlsinfo->ap_prohibited = _FALSE; - ptdlsinfo->setup_state = TDLS_STATE_NONE; - ptdlsinfo->sta_cnt = 0; - ptdlsinfo->sta_maximum = _FALSE; - ptdlsinfo->macid_index= 6; - ptdlsinfo->clear_cam= 0; - ptdlsinfo->ch_sensing = 0; - ptdlsinfo->cur_channel = 0; - ptdlsinfo->candidate_ch = 1; //when inplement channel switching, default candidate channel is 1 - ptdlsinfo->watchdog_count = 0; - ptdlsinfo->dev_discovered = 0; - -#ifdef CONFIG_WFD - ptdlsinfo->wfd_info = &padapter->wfd_info; -#endif //CONFIG_WFD -} - -int rtw_init_tdls_info(_adapter* padapter) -{ - int res = _SUCCESS; - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - - ptdlsinfo->enable = 1; - rtw_reset_tdls_info(padapter); - - _rtw_spinlock_init(&ptdlsinfo->cmd_lock); - _rtw_spinlock_init(&ptdlsinfo->hdl_lock); - - return res; - -} - -void rtw_free_tdls_info(struct tdls_info *ptdlsinfo) -{ - _rtw_spinlock_free(&ptdlsinfo->cmd_lock); - _rtw_spinlock_free(&ptdlsinfo->hdl_lock); - - _rtw_memset(ptdlsinfo, 0, sizeof(struct tdls_info) ); - -} - -void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; -// SetToDs(fctrl); - if (power_mode) - { - SetPwrMgt(fctrl); - } - - _rtw_memcpy(pwlanhdr->addr1, ptdls_sta->hwaddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; - ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; - pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; - SetSeqNum(pwlanhdr, pattrib->seqnum); - - SetFrameSubType(pframe, WIFI_DATA_NULL); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - - pattrib->last_txcmdsz = pattrib->pktlen; - dump_mgntframe(padapter, pmgntframe); - - return; -} - -s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib) -{ - - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv= &pmlmepriv->qospriv; - - s32 res=_SUCCESS; - sint bmcast; - - bmcast = IS_MCAST(pattrib->ra); - - psta = rtw_get_stainfo(pstapriv, pattrib->ra); - if (psta == NULL) { - res =_FAIL; - goto exit; - } - - pattrib->mac_id = psta->mac_id; - - pattrib->psta = psta; - - pattrib->ack_policy = 0; - // get ether_hdr_len - pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag - - if (pqospriv->qos_option && psta->qos_option) { - pattrib->priority = 1; //tdls management frame should be AC_BK - pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; - pattrib->subtype = WIFI_QOS_DATA_TYPE; - } else { - pattrib->hdrlen = WLAN_HDR_A3_LEN; - pattrib->subtype = WIFI_DATA_TYPE; - pattrib->priority = 0; - } - - if (psta->ieee8021x_blocked == _TRUE) - { - pattrib->encrypt = 0; - } - else - { - GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); - - switch(psecuritypriv->dot11AuthAlgrthm) - { - case dot11AuthAlgrthm_Open: - case dot11AuthAlgrthm_Shared: - case dot11AuthAlgrthm_Auto: - pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; - break; - case dot11AuthAlgrthm_8021X: - pattrib->key_idx = 0; - break; - default: - pattrib->key_idx = 0; - break; - } - } - - switch (pattrib->encrypt) - { - case _WEP40_: - case _WEP104_: - pattrib->iv_len = 4; - pattrib->icv_len = 4; - break; - case _TKIP_: - pattrib->iv_len = 8; - pattrib->icv_len = 4; - if(padapter->securitypriv.busetkipkey==_FAIL) - { - res =_FAIL; - goto exit; - } - break; - case _AES_: - pattrib->iv_len = 8; - pattrib->icv_len = 8; - break; - default: - pattrib->iv_len = 0; - pattrib->icv_len = 0; - break; - } - - if (pattrib->encrypt && - ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) - { - pattrib->bswenc = _TRUE; - } else { - pattrib->bswenc = _FALSE; - } - - //qos_en, ht_en, init rate, ,bw, ch_offset, sgi - pattrib->qos_en = psta->qos_option; - pattrib->ht_en = psta->htpriv.ht_option; - pattrib->raid = psta->raid; - pattrib->bwmode = psta->htpriv.bwmode; - pattrib->ch_offset = psta->htpriv.ch_offset; - pattrib->sgi= psta->htpriv.sgi; - pattrib->ampdu_en = _FALSE; - - //if(pattrib->ht_en && psta->htpriv.ampdu_enable) - //{ - // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) - // pattrib->ampdu_en = _TRUE; - //} - -exit: - - return res; -} - -void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct sta_priv *pstapriv = &padapter->stapriv; - _irqL irqL; - - //free peer sta_info - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if(ptdlsinfo->sta_cnt != 0) - ptdlsinfo->sta_cnt--; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if( ptdlsinfo->sta_cnt < (NUM_STA - 2) ) // -2: AP + BC/MC sta - { - ptdlsinfo->sta_maximum = _FALSE; - _rtw_memset( &ptdlsinfo->ss_record, 0x00, sizeof(struct tdls_ss_record) ); - } - //ready to clear cam - if(ptdls_sta->mac_id!=0){ - ptdlsinfo->clear_cam=ptdls_sta->mac_id; - rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE); - } - - if(ptdlsinfo->sta_cnt==0){ - rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR); - ptdlsinfo->setup_state=TDLS_STATE_NONE; - } - else - DBG_871X("Remain tdls sta:%02x\n", ptdlsinfo->sta_cnt); - - rtw_free_stainfo(padapter, ptdls_sta); - -} - -// cam entry will be the same as mac_id -void rtw_tdls_set_mac_id(struct tdls_info *ptdlsinfo, struct sta_info *ptdls_sta) -{ - if(ptdls_sta->mac_id==0) - { - ptdls_sta->mac_id = ptdlsinfo->macid_index; - if( (++ptdlsinfo->macid_index) > (NUM_STA -2) ) - ptdlsinfo->macid_index= TDLS_INI_MACID_ENTRY; - } -} - -//TDLS encryption(if needed) will always be CCMP -void rtw_tdls_set_key(_adapter *adapter, struct rx_pkt_attrib *prx_pkt_attrib, struct sta_info *ptdls_sta) -{ - if(prx_pkt_attrib->encrypt) - { - ptdls_sta->dot118021XPrivacy=_AES_; - rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE); - } -} - -void rtw_tdls_process_ht_cap(_adapter *adapter, struct sta_info *ptdls_sta, u8 *data, u8 Length) -{ - /* save HT capabilities in the sta object */ - _rtw_memset(&ptdls_sta->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap)); - if (data && Length >= sizeof(struct rtw_ieee80211_ht_cap) ) - { - ptdls_sta->flags |= WLAN_STA_HT; - - ptdls_sta->flags |= WLAN_STA_WME; - - _rtw_memcpy(&ptdls_sta->htpriv.ht_cap, data, sizeof(struct rtw_ieee80211_ht_cap)); - - } else - ptdls_sta->flags &= ~WLAN_STA_HT; - - if(ptdls_sta->flags & WLAN_STA_HT) - { - if(adapter->registrypriv.ht_enable == _TRUE) - { - ptdls_sta->htpriv.ht_option = _TRUE; - } - else - { - ptdls_sta->htpriv.ht_option = _FALSE; - ptdls_sta->stat_code = _STATS_FAILURE_; - } - } - - //HT related cap - if(ptdls_sta->htpriv.ht_option) - { - //check if sta supports rx ampdu - if(adapter->registrypriv.ampdu_enable==1) - ptdls_sta->htpriv.ampdu_enable = _TRUE; - - //check if sta support s Short GI - if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) - { - ptdls_sta->htpriv.sgi = _TRUE; - } - - // bwmode would still followed AP's setting - if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) - { - ptdls_sta->htpriv.bwmode = adapter->mlmeextpriv.cur_bwmode; - ptdls_sta->htpriv.ch_offset = adapter->mlmeextpriv.cur_ch_offset; - } - } -} - -u8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) -{ - struct rtw_ieee80211_ht_cap ht_capie; - u8 rf_type; - - //HT capabilities - _rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap)); - - ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | - IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; - - { - u32 rx_packet_offset, max_recvbuf_sz; - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); - if(max_recvbuf_sz-rx_packet_offset>(8191-256)) - ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; - } - - ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03); - - padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - switch(rf_type) - { - case RF_1T1R: - ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream - _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); - break; - - case RF_2T2R: - case RF_1T2R: - default: - ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream - _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); - break; - } - - return(rtw_set_ie(pframe, _HT_CAPABILITY_IE_, - sizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen))); -} - -u8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_attrib *pattrib) -{ - u8 sup_ch[ 30 * 2 ] = { 0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel - do{ - if( pmlmeext->channel_set[sup_ch_idx].ChannelNum <= 14 ) - { - sup_ch[0] = 1; //First channel number - sup_ch[1] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; //Number of channel - } - else - { - sup_ch[idx_5g++] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; - sup_ch[idx_5g++] = 1; - } - - sup_ch_idx++; - } - while( pmlmeext->channel_set[sup_ch_idx].ChannelNum != 0 ); - return(rtw_set_ie(pframe, _SUPPORTED_CH_IE_, idx_5g, sup_ch, &(pattrib->pktlen))); -} - -#ifdef CONFIG_WFD -void rtw_tdls_process_wfd_ie(struct tdls_info *ptdlsinfo, u8 *ptr, u8 length) -{ - u8 wfd_ie[ 128 ] = { 0x00 }; - u32 wfd_ielen = 0; - u32 wfd_offset = 0; - // Try to get the TCP port information when receiving the negotiation response. - // - - wfd_offset = 0; - wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); - while( wfd_offset ) - { - u8 attr_content[ 10 ] = { 0x00 }; - u32 attr_contentlen = 0; - int i; - - DBG_871X( "[%s] WFD IE Found!!\n", __FUNCTION__ ); - rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen); - if ( attr_contentlen ) - { - ptdlsinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 ); - DBG_871X( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, ptdlsinfo->wfd_info->peer_rtsp_ctrlport ); - } - - _rtw_memset( attr_content, 0x00, 10); - attr_contentlen = 0; - rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_LOCAL_IP_ADDR, attr_content, &attr_contentlen); - if ( attr_contentlen ) - { - _rtw_memcpy(ptdlsinfo->wfd_info->peer_ip_address, ( attr_content + 1 ), 4); - DBG_871X( "[%s] Peer IP = %02u.%02u.%02u.%02u \n", __FUNCTION__, - ptdlsinfo->wfd_info->peer_ip_address[0], ptdlsinfo->wfd_info->peer_ip_address[1], - ptdlsinfo->wfd_info->peer_ip_address[2], ptdlsinfo->wfd_info->peer_ip_address[3] - ); - } - wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); - } -} - -void issue_tunneled_probe_req(_adapter *padapter) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - DBG_871X("[%s]\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN); - - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_REQ) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; - - DBG_871X("[%s]\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); - - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_RSP) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} -#endif //CONFIG_WFD - -void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta= NULL; - _irqL irqL; - static u8 dialogtoken = 0; - u32 timeout_interval= TPK_RESEND_COUNT * 1000; //retry timer should set at least 301 sec, using TPK_count counting 301 times. - - if(ptdlsinfo->ap_prohibited == _TRUE) - goto exit; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - - //init peer sta_info - ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); - if(ptdls_sta==NULL) - { - ptdls_sta = rtw_alloc_stainfo(pstapriv, mac_addr); - if(ptdls_sta) - { - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) - ptdlsinfo->sta_cnt++; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if( ptdlsinfo->sta_cnt == (NUM_STA - 2) ) // -2: AP + BC/MC sta - { - ptdlsinfo->sta_maximum = _TRUE; - } - } - else - { - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - } - - if(ptdls_sta){ - ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE; - //for tdls; ptdls_sta->aid is used to fill dialogtoken - ptdls_sta->dialog = dialogtoken; - dialogtoken = (dialogtoken+1)%256; - ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; - _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME ); - } - - pattrib->qsel=pattrib->priority; - if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_REQUEST) !=_SUCCESS ){ - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta=NULL; - _irqL irqL; - - ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); - if(ptdls_sta==NULL){ - DBG_871X("issue tdls teardown unsuccessful\n"); - return; - }else{ - ptdls_sta->tdls_sta_state=TDLS_STATE_NONE; - } - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_TEARDOWN) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - - if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){ - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - } - - if( ptdls_sta->timer_flag == 1 ) - { - _enter_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL); - ptdls_sta->timer_flag = 2; - _exit_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL); - } - else - rtw_tdls_cmd(padapter, mac_addr, TDLS_FREE_STA ); - - -exit: - - return; -} - -void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - if(mac_addr == NULL) - _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN); - else - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_DISCOVERY_REQUEST) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - DBG_871X("issue tdls dis req\n"); - -exit: - - return; -} - -void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; - _irqL irqL; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_RESPONSE) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; - -} - -void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct sta_info *ptdls_sta=NULL; - _irqL irqL; - - struct rx_pkt_attrib *rx_pkt_pattrib = & precv_frame->u.hdr.attrib; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_CONFIRM) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; - -} - -//TDLS Discovery Response frame is a management action frame -void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame, u8 dialog) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - // unicast probe request frame - _rtw_memcpy(pwlanhdr->addr1, rx_pkt_pattrib->src, ETH_ALEN); - _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN); - - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN); - - _rtw_memcpy(pwlanhdr->addr3, rx_pkt_pattrib->bssid, ETH_ALEN); - _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof (struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); - - rtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, dialog); - - pattrib->nr_frags = 1; - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; -} - -void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - - static u8 dialogtoken=0; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - //for tdls; pattrib->nr_frags is used to fill dialogtoken - ptdls_sta->dialog = dialogtoken; - dialogtoken = (dialogtoken+1)%256; - //PTI frame's priority should be AC_VO - pattrib->priority = 7; - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_PEER_TRAFFIC_INDICATION) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - - pattrib->qsel=pattrib->priority; - if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_REQUEST) !=_SUCCESS ){ - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - - _irqL irqL; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - - pattrib->qsel=pattrib->priority; -/* - _enter_critical_bh(&pxmitpriv->lock, &irqL); - if(xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pmgntframe)==_TRUE){ - _exit_critical_bh(&pxmitpriv->lock, &irqL); - return _FALSE; - } -*/ - if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_RESPONSE) !=_SUCCESS ){ - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pmgntframe); - goto exit; - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(adapter->stapriv), get_bssid(&(adapter->mlmepriv))); - struct recv_priv *precvpriv = &(adapter->recvpriv); - u8 *ptr = precv_frame->u.hdr.rx_data, *psa; - struct rx_pkt_attrib *pattrib = &(precv_frame->u.hdr.attrib); - struct tdls_info *ptdlsinfo = &(adapter->tdlsinfo); - u8 empty_addr[ETH_ALEN] = { 0x00 }; - int UndecoratedSmoothedPWDB; - - - //WFDTDLS: for sigma test, not to setup direct link automatically - ptdlsinfo->dev_discovered = 1; - -#ifdef CONFIG_TDLS_AUTOSETUP - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(&(adapter->stapriv), psa); - - if(ptdls_sta != NULL) - { - ptdls_sta->tdls_sta_state |= TDLS_ALIVE_STATE; - - //Record the tdls sta with lowest signal strength - if( (ptdlsinfo->sta_maximum == _TRUE) && (ptdls_sta->alive_count >= 1) ) - { - if( _rtw_memcmp(ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN) ) - { - _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN); - ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll; - } - else - { - if( ptdlsinfo->ss_record.RxPWDBAll < pattrib->RxPWDBAll ) - { - _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN); - ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll; - } - } - } - - } - else - { - if( ptdlsinfo->sta_maximum == _TRUE) - { - if( _rtw_memcmp( ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN ) ) - { - //All traffics are busy, do not set up another direct link. - return _FAIL; - } - else - { - if( pattrib->RxPWDBAll > ptdlsinfo->ss_record.RxPWDBAll ) - { - issue_tdls_teardown(adapter, ptdlsinfo->ss_record.macaddr); - } - else - { - return _FAIL; - } - } - } - - adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); - - if( pattrib->RxPWDBAll + TDLS_SIGNAL_THRESH >= UndecoratedSmoothedPWDB); - { - DBG_871X("pattrib->RxPWDBAll=%d, pdmpriv->UndecoratedSmoothedPWDB=%d\n", pattrib->RxPWDBAll, UndecoratedSmoothedPWDB); - issue_tdls_setup_req(adapter, psa); - } - } -#endif //CONFIG_TDLS_AUTOSETUP - - return _SUCCESS; -} - -sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; - u8 *psa, *pmyid; - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct security_priv *psecuritypriv = &adapter->securitypriv; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *prsnie, *ppairwise_cipher; - u8 i, k, pairwise_count; - u8 ccmp_have=0, rsnie_have=0; - u16 j; - u8 SNonce[32]; - u32 *timeout_interval; - sint parsing_length; //frame body length, without icv_len - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE = 5; - unsigned char supportRate[16]; - int supportRateNum = 0; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - pmyid=myid(&(adapter->eeprompriv)); - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - if(ptdlsinfo->ap_prohibited == _TRUE) - { - goto exit; - } - - if(ptdls_sta==NULL){ - ptdls_sta = rtw_alloc_stainfo(pstapriv, psa); - }else{ - if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){ - //If the direct link is already set up - //Process as re-setup after tear down - DBG_871X("re-setup a direct link\n"); - } - //already receiving TDLS setup request - else if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ - DBG_871X("receive duplicated TDLS setup request frame in handshaking\n"); - goto exit; - } - //When receiving and sending setup_req to the same link at the same time, STA with higher MAC_addr would be initiator - //following is to check out MAC_addr - else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ - DBG_871X("receive setup_req after sending setup_req\n"); - for (i=0;i<6;i++){ - if(*(pmyid+i)==*(psa+i)){ - } - else if(*(pmyid+i)>*(psa+i)){ - goto exit; - }else if(*(pmyid+i)<*(psa+i)){ - ptdls_sta->tdls_sta_state=TDLS_INITIATOR_STATE; - break; - } - } - } - } - - if(ptdls_sta) - { - ptdls_sta->dialog = *(ptr+2); //copy dialog token - ptdls_sta->stat_code = 0; - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _SUPPORTEDRATES_IE_: - _rtw_memcpy(supportRate, pIE->data, pIE->Length); - supportRateNum = pIE->Length; - break; - case _COUNTRY_IE_: - break; - case _EXT_SUPPORTEDRATES_IE_: - if(supportRateNum<=sizeof(supportRate)) - { - _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); - supportRateNum += pIE->Length; - } - break; - case _SUPPORTED_CH_IE_: - break; - case _RSN_IE_2_: - rsnie_have=1; - if(prx_pkt_attrib->encrypt){ - prsnie=(u8*)pIE; - //check whether initiator STA has CCMP pairwise_cipher. - ppairwise_cipher=prsnie+10; - _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 1); - for(k=0;kstat_code=72; - } - } - break; - case _EXT_CAP_IE_: - break; - case _VENDOR_SPECIFIC_IE_: - break; - case _FTIE_: - if(prx_pkt_attrib->encrypt) - _rtw_memcpy(SNonce, (ptr+j+52), 32); - break; - case _TIMEOUT_ITVL_IE_: - if(prx_pkt_attrib->encrypt) - timeout_interval = (u32 *)(ptr+j+3); - break; - case _RIC_Descriptor_IE_: - break; - case _HT_CAPABILITY_IE_: - rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length); - break; - case EID_BSSCoexistence: - break; - case _LINK_ID_IE_: - if(_rtw_memcmp(get_bssid(pmlmepriv), pIE->data, 6) == _FALSE) - { - //not in the same BSS - ptdls_sta->stat_code=7; - } - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - //update station supportRate - ptdls_sta->bssratelen = supportRateNum; - _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); - - //check status code - //if responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject - if(ptdls_sta->stat_code == 0 ) - { - if(rsnie_have && (prx_pkt_attrib->encrypt==0)){ - //security disabled - ptdls_sta->stat_code = 5; - }else if(rsnie_have==0 && (prx_pkt_attrib->encrypt)){ - //request haven't RSNIE - ptdls_sta->stat_code = 38; - } - -#ifdef CONFIG_WFD - //WFD test plan version 0.18.2 test item 5.1.5 - //SoUT does not use TDLS if AP uses weak security - if ( adapter->wdinfo.wfd_tdls_enable ) - { - if(rsnie_have && (prx_pkt_attrib->encrypt != _AES_)) - { - ptdls_sta->stat_code = 5; - } - } -#endif //CONFIG_WFD - } - - ptdls_sta->tdls_sta_state|= TDLS_INITIATOR_STATE; - if(prx_pkt_attrib->encrypt){ - _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32); - _rtw_memcpy(&(ptdls_sta->TDLS_PeerKey_Lifetime), timeout_interval, 4); - } - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) - ptdlsinfo->sta_cnt++; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if( ptdlsinfo->sta_cnt == (NUM_STA - 2) ) // -2: AP + BC/MC sta - { - ptdlsinfo->sta_maximum = _TRUE; - } - -#ifdef CONFIG_WFD - rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE); -#endif // CONFIG_WFD - - } - else - { - goto exit; - } - - issue_tdls_setup_rsp(adapter, precv_frame); - - if(ptdls_sta->stat_code==0) - { - _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME); - } - else //status code!=0 ; setup unsuccess - { - free_tdls_sta(adapter, ptdls_sta); - } - -exit: - - return _FAIL; -} - -sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - u16 stat_code; - sint parsing_length; //frame body length, without icv_len - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =7; - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; - u16 pairwise_count, j, k; - u8 verify_ccmp=0; - unsigned char supportRate[16]; - int supportRateNum = 0; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - if ( NULL == ptdls_sta ) - { - return _FAIL; - } - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 - -FIXED_IE; - - _rtw_memcpy(&stat_code, ptr+2, 2); - - if(stat_code!=0) - { - DBG_871X( "[%s] status_code = %d, free_tdls_sta\n", __FUNCTION__, stat_code ); - free_tdls_sta(adapter, ptdls_sta); - return _FAIL; - } - - stat_code = 0; - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _SUPPORTEDRATES_IE_: - _rtw_memcpy(supportRate, pIE->data, pIE->Length); - supportRateNum = pIE->Length; - break; - case _COUNTRY_IE_: - break; - case _EXT_SUPPORTEDRATES_IE_: - if(supportRateNum<=sizeof(supportRate)) - { - _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); - supportRateNum += pIE->Length; - } - break; - case _SUPPORTED_CH_IE_: - break; - case _RSN_IE_2_: - prsnie=(u8*)pIE; - //check whether responder STA has CCMP pairwise_cipher. - ppairwise_cipher=prsnie+10; - _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2); - for(k=0;kANonce, (ptr+j+20), 32); - break; - case _TIMEOUT_ITVL_IE_: - ptimeout_ie=(u8*)pIE; - break; - case _RIC_Descriptor_IE_: - break; - case _HT_CAPABILITY_IE_: - rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length); - break; - case EID_BSSCoexistence: - break; - case _LINK_ID_IE_: - plinkid_ie=(u8*)pIE; - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - //update station supportRate - ptdls_sta->bssratelen = supportRateNum; - _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); - -#ifdef CONFIG_WFD - rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE); -#endif // CONFIG_WFD - - if(stat_code != 0) - { - ptdls_sta->stat_code = stat_code; - } - else - { - if(prx_pkt_attrib->encrypt) - { - if(verify_ccmp==1) - { - wpa_tdls_generate_tpk(adapter, ptdls_sta); - ptdls_sta->stat_code=0; - if(tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie)==0) //0: Invalid, 1: valid - { - free_tdls_sta(adapter, ptdls_sta); - return _FAIL; - } - } - else - { - ptdls_sta->stat_code=72; //invalide contents of RSNIE - } - - }else{ - ptdls_sta->stat_code=0; - } - } - - DBG_871X("issue_tdls_setup_cfm\n"); - issue_tdls_setup_cfm(adapter, precv_frame); - - if(ptdls_sta->stat_code==0) - { - ptdlsinfo->setup_state = TDLS_LINKED_STATE; - - if( ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE ) - { - ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE; - _cancel_timer_ex( &ptdls_sta->handshake_timer); -#ifdef CONFIG_TDLS_AUTOCHECKALIVE - _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1); -#endif //CONFIG_TDLS_AUTOSETUP - } - - rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta); - rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta); - - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR); - - } - else //status code!=0 ; setup unsuccessful - { - free_tdls_sta(adapter, ptdls_sta); - } - - return _FAIL; - -} - -sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - u16 stat_code; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =5; - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; - u16 j, pairwise_count; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - _rtw_memcpy(&stat_code, ptr+2, 2); - - if(stat_code!=0){ - DBG_871X( "[%s] stat_code = %d\n, free_tdls_sta", __FUNCTION__, stat_code ); - free_tdls_sta(adapter, ptdls_sta); - return _FAIL; - } - - if(prx_pkt_attrib->encrypt){ - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _RSN_IE_2_: - prsnie=(u8*)pIE; - break; - case _VENDOR_SPECIFIC_IE_: - break; - case _FTIE_: - pftie=(u8*)pIE; - break; - case _TIMEOUT_ITVL_IE_: - ptimeout_ie=(u8*)pIE; - break; - case _HT_EXTRA_INFO_IE_: - break; - case _LINK_ID_IE_: - plinkid_ie=(u8*)pIE; - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - //verify mic in FTIE MIC field - if(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: Valid - free_tdls_sta(adapter, ptdls_sta); - return _FAIL; - } - - } - - ptdlsinfo->setup_state = TDLS_LINKED_STATE; - if( ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE ) - { - ptdls_sta->tdls_sta_state|=TDLS_LINKED_STATE; - _cancel_timer_ex( &ptdls_sta->handshake_timer); -#ifdef CONFIG_TDLS_AUTOCHECKALIVE - _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1); -#endif //CONFIG_TDLS_AUTOCHECKALIVE - } - - rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta); - rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta); - - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR); - - return _FAIL; - -} - -sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame) -{ - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; - struct sta_info *psta_ap; - u8 *ptr = precv_frame->u.hdr.rx_data; - sint parsing_length; //frame body length, without icv_len - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE = 3, *dst, *pdialog = NULL; - u16 j; - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE + 1; - pdialog=ptr+2; - - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 - -FIXED_IE; - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _LINK_ID_IE_: - psta_ap = rtw_get_stainfo(pstapriv, pIE->data); - if(psta_ap == NULL) - { - goto exit; - } - dst = pIE->data + 12; - if( (MacAddr_isBcst(dst) == _FALSE) && (_rtw_memcmp(myid(&(adapter->eeprompriv)), dst, 6) == _FALSE) ) - { - goto exit; - } - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - //check frame contents - - issue_tdls_dis_rsp(adapter, precv_frame, *(pdialog) ); - -exit: - - return _FAIL; - -} - -sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame) -{ - u8 *psa; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &adapter->stapriv; - struct sta_info *ptdls_sta= NULL; - _irqL irqL; - - psa = get_sa(ptr); - - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - if(ptdls_sta!=NULL){ - if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){ - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - } - free_tdls_sta(adapter, ptdls_sta); - } - - return _FAIL; - -} - -u8 TDLS_check_ch_state(uint state){ - if( (state & TDLS_CH_SWITCH_ON_STATE) && - (state & TDLS_AT_OFF_CH_STATE) && - (state & TDLS_PEER_AT_OFF_STATE) ){ - - if(state & TDLS_PEER_SLEEP_STATE) - return 2; //U-APSD + ch. switch - else - return 1; //ch. switch - }else - return 0; -} - -//we process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here -sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; - //get peer sta infomation - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); - u8 wmmps_ac=0, state=TDLS_check_ch_state(ptdls_sta->tdls_sta_state); - int i; - - ptdls_sta->sta_stats.rx_data_pkts++; - - //receive peer traffic response frame, sleeping STA wakes up - //ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_SLEEP_STATE); - process_wmmps_data( adapter, precv_frame); - - // if noticed peer STA wakes up by receiving peer traffic response - // and we want to do channel swtiching, then we will transmit channel switch request first - if(ptdls_sta->tdls_sta_state & TDLS_APSD_CHSW_STATE){ - issue_tdls_ch_switch_req(adapter, pattrib->src); - ptdls_sta->tdls_sta_state &= ~(TDLS_APSD_CHSW_STATE); - return _FAIL; - } - - //check 4-AC queue bit - if(ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk) - wmmps_ac=1; - - //if it's a direct link and have buffered frame - if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){ - if(wmmps_ac && state) - { - _irqL irqL; - _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; - - _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - - xmitframe_phead = get_list_head(&ptdls_sta->sleep_q); - xmitframe_plist = get_next(xmitframe_phead); - - //transmit buffered frames - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - xmitframe_plist = get_next(xmitframe_plist); - rtw_list_delete(&pxmitframe->list); - - ptdls_sta->sleepq_len--; - if(ptdls_sta->sleepq_len>0){ - pxmitframe->attrib.mdata = 1; - pxmitframe->attrib.eosp = 0; - }else{ - pxmitframe->attrib.mdata = 0; - pxmitframe->attrib.eosp = 1; - } - //pxmitframe->attrib.triggered = 1; //maybe doesn't need in TDLS - if(adapter->HalFunc.hal_xmit(adapter, pxmitframe) == _TRUE) - { - rtw_os_xmit_complete(adapter, pxmitframe); - } - - } - - if(ptdls_sta->sleepq_len==0) - { - DBG_871X("no buffered packets for tdls to xmit\n"); - //on U-APSD + CH. switch state, when there is no buffered date to xmit, - // we should go back to base channel - if(state==2){ - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - }else if(ptdls_sta->tdls_sta_state&TDLS_SW_OFF_STATE){ - ptdls_sta->tdls_sta_state &= ~(TDLS_SW_OFF_STATE); - ptdlsinfo->candidate_ch= pmlmeext->cur_channel; - issue_tdls_ch_switch_req(adapter, pattrib->src); - DBG_871X("issue tdls ch switch req back to base channel\n"); - } - - } - else - { - DBG_871X("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len); - ptdls_sta->sleepq_len=0; - } - - _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - - } - - } - - return _FAIL; -} - -sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =3; - u16 j; - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - ptdls_sta->off_ch = *(ptr+2); - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _COUNTRY_IE_: - break; - case _CH_SWTICH_ANNOUNCE_: - break; - case _LINK_ID_IE_: - break; - case _CH_SWITCH_TIMING_: - _rtw_memcpy(&ptdls_sta->ch_switch_time, pIE->data, 2); - _rtw_memcpy(&ptdls_sta->ch_switch_timeout, pIE->data+2, 2); - default: - break; - } - - j += (pIE->Length + 2); - - } - - //todo: check status - ptdls_sta->stat_code=0; - ptdls_sta->tdls_sta_state |= TDLS_CH_SWITCH_ON_STATE; - - issue_nulldata(adapter, NULL, 1, 0, 0); - - issue_tdls_ch_switch_rsp(adapter, psa); - - DBG_871X("issue tdls channel switch response\n"); - - if((ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE) && ptdls_sta->off_ch==pmlmeext->cur_channel){ - DBG_871X("back to base channel %x\n", pmlmeext->cur_channel); - ptdls_sta->option=7; - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_BASE_CH); - }else{ - ptdls_sta->option=6; - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); - } - return _FAIL; -} - -sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =4; - u16 stat_code, j, switch_time, switch_timeout; - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - //if channel switch is running and receiving Unsolicited TDLS Channel Switch Response, - //it will go back to base channel and terminate this channel switch procedure - if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE ){ - if(pmlmeext->cur_channel==ptdls_sta->off_ch){ - DBG_871X("back to base channel %x\n", pmlmeext->cur_channel); - ptdls_sta->option=7; - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); - }else{ - DBG_871X("receive unsolicited channel switch response \n"); - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); - } - return _FAIL; - } - - //avoiding duplicated or unconditional ch. switch. rsp - if((ptdls_sta->tdls_sta_state & TDLS_CH_SW_INITIATOR_STATE) != TDLS_CH_SW_INITIATOR_STATE) - return _FAIL; - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -ETH_TYPE_LEN - -PAYLOAD_TYPE_LEN - -FIXED_IE; - - _rtw_memcpy(&stat_code, ptr+2, 2); - - if(stat_code!=0){ - return _FAIL; - } - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _LINK_ID_IE_: - break; - case _CH_SWITCH_TIMING_: - _rtw_memcpy(&switch_time, pIE->data, 2); - if(switch_time > ptdls_sta->ch_switch_time) - _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2); - - _rtw_memcpy(&switch_timeout, pIE->data+2, 2); - if(switch_timeout > ptdls_sta->ch_switch_timeout) - _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2); - - default: - break; - } - - j += (pIE->Length + 2); - - } - - ptdls_sta->tdls_sta_state &= ~(TDLS_CH_SW_INITIATOR_STATE); - ptdls_sta->tdls_sta_state |=TDLS_CH_SWITCH_ON_STATE; - - //goto set_channel_workitem_callback() - ptdls_sta->option=6; - rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); - - return _FAIL; -} - -#ifdef CONFIG_WFD -void wfd_ie_tdls(_adapter * padapter, u8 *pframe, u32 *pktlen ) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wifi_display_info *pwfd_info = padapter->tdlsinfo.wfd_info; - u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; - u32 wfdielen = 0; - - // WFD OUI - wfdielen = 0; - wfdie[ wfdielen++ ] = 0x50; - wfdie[ wfdielen++ ] = 0x6F; - wfdie[ wfdielen++ ] = 0x9A; - wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 - - // Commented by Albert 20110825 - // According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes - // 1. WFD Device Information - // 2. Associated BSSID ( Optional ) - // 3. Local IP Adress ( Optional ) - - // WFD Device Information ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; - - // Length: - // Note: In the WFD specification, the size of length field is 2. - RTW_PUT_BE16(wfdie + wfdielen, 0x0006); - wfdielen += 2; - - // Value1: - // WFD device information - // available for WFD session + Preferred TDLS + WSD ( WFD Service Discovery ) - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL - | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_WSD); - wfdielen += 2; - - // Value2: - // Session Management Control Port - // Default TCP port for RTSP messages is 554 - RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); - wfdielen += 2; - - // Value3: - // WFD Device Maximum Throughput - // 300Mbps is the maximum throughput - RTW_PUT_BE16(wfdie + wfdielen, 300); - wfdielen += 2; - - // Associated BSSID ATTR - // Type: - wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; - - // Length: - // Note: In the WFD specification, the size of length field is 2. - RTW_PUT_BE16(wfdie + wfdielen, 0x0006); - wfdielen += 2; - - // Value: - // Associated BSSID - if ( check_fwstate( pmlmepriv, _FW_LINKED) == _TRUE ) - { - _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); - } - else - { - _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN ); - } - - // Local IP Address ATTR - wfdie[ wfdielen++ ] = WFD_ATTR_LOCAL_IP_ADDR; - - // Length: - // Note: In the WFD specification, the size of length field is 2. - RTW_PUT_BE16(wfdie + wfdielen, 0x0005); - wfdielen += 2; - - // Version: - // 0x01: Version1;IPv4 - wfdie[ wfdielen++ ] = 0x01; - - // IPv4 Address - _rtw_memcpy( wfdie + wfdielen, pwfd_info->ip_address, 4 ); - wfdielen += 4; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, pktlen); - -} -#endif //CONFIG_WFD - -void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); - - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_TDLS; - u8 action = TDLS_SETUP_REQUEST; - u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; //Use NDIS_802_11_LENGTH_RATES_EX in order to call func.rtw_set_supported_rate - int bssrate_len = 0, i = 0 ; - u8 more_supportedrates = 0; - unsigned int ie_len; - u8 *p; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 iedata=0; - u8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel - u8 timeout_itvl[5]; //set timeout interval to maximum value - u32 time; - - //SNonce - if(pattrib->encrypt){ - for(i=0;i<8;i++){ - time=rtw_get_current_time(); - _rtw_memcpy(&ptdls_sta->SNonce[4*i], (u8 *)&time, 4); - } - } - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(pattrib->encrypt) - *pframe =*pframe | BIT(4); - pframe += 2; - pattrib->pktlen += 2; - - //supported rates - rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); - bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //country(optional) - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); - - // SRC IE - pframe = rtw_set_ie( pframe, _SRC_IE_, 16, TDLS_SRC, &(pattrib->pktlen)); - - //RSNIE - if(pattrib->encrypt) - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); - - //extended capabilities - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); - - //QoS capability(WMM_IE) - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE, &(pattrib->pktlen)); - - - if(pattrib->encrypt){ - //FTIE - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //Sup_reg_classes(optional) - //HT capabilities - pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -#ifdef CONFIG_WFD - wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); -#endif //CONFIG_WFD - -} - -void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_info *ptdls_sta; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_SETUP_RESPONSE; - unsigned char bssrate[NDIS_802_11_LENGTH_RATES_EX]; - int bssrate_len = 0; - u8 more_supportedrates = 0; - unsigned int ie_len; - unsigned char *p; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 iedata=0; - u8 timeout_itvl[5]; //setup response timeout interval will copy from request - u8 ANonce[32]; //maybe it can put in ontdls_req - u8 k; //for random ANonce - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; - u32 time; - - ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst); - - if(ptdls_sta == NULL ) - { - DBG_871X("[%s] %d\n", __FUNCTION__, __LINE__); - return; - } - - if(pattrib->encrypt){ - for(k=0;k<8;k++){ - time=rtw_get_current_time(); - _rtw_memcpy(&ptdls_sta->ANonce[4*k], (u8*)&time, 4); - } - } - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - - if(ptdls_sta->stat_code!=0) //invalid setup request - { - DBG_871X("ptdls_sta->stat_code:%04x \n", ptdls_sta->stat_code); - return; - } - - //dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(pattrib->encrypt ) - *pframe =*pframe | BIT(4); - pframe += 2; - pattrib->pktlen += 2; - - //supported rates - rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); - bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //country(optional) - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); - - // SRC IE - pframe = rtw_set_ie(pframe, _SRC_IE_ , 16, TDLS_SRC, &(pattrib->pktlen)); - - //RSNIE - if(pattrib->encrypt){ - prsnie = pframe; - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); - } - - //extended capabilities - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); - - //QoS capability(WMM_IE) - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE, &(pattrib->pktlen)); - - if(pattrib->encrypt){ - wpa_tdls_generate_tpk(padapter, ptdls_sta); - - //FTIE - pftie = pframe; - pftie_mic = pframe+4; - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval - ptimeout_ie = pframe; - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //Sup_reg_classes(optional) - //HT capabilities - pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - plinkid_ie = pframe; - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //fill FTIE mic - if(pattrib->encrypt) - wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); - -#ifdef CONFIG_WFD - wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); -#endif //CONFIG_WFD - -} - -void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); - - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_SETUP_CONFIRM; - u8 more_supportedrates = 0; - unsigned int ie_len; - unsigned char *p; - u8 timeout_itvl[5]; //set timeout interval to maximum value - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status code, dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); - - if(ptdls_sta->stat_code!=0) //invalid setup request - return; - - //RSNIE - if(pattrib->encrypt){ - prsnie = pframe; - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); - } - - //EDCA param set; WMM param ele. - if(pattrib->encrypt){ - //FTIE - pftie = pframe; - pftie_mic = pframe+4; - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval - ptimeout_ie = pframe; - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - ptdls_sta->TPK_count=0; - _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //HT operation; todo - //Link identifier - plinkid_ie = pframe; - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //fill FTIE mic - if(pattrib->encrypt) - wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); - -} - -void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_TEARDOWN; - u8 link_id_addr[18] = {0}; - - struct sta_info *ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst); - struct sta_priv *pstapriv = &padapter->stapriv; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - - //Link identifier - if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - }else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - } - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -} - -void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_TDLS; - u8 action = TDLS_DISCOVERY_REQUEST; - u8 link_id_addr[18] = {0}; - static u8 dialogtoken=0; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen)); - dialogtoken = (dialogtoken+1)%256; - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -} - -void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - - u8 category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = TDLS_DISCOVERY_RESPONSE; - u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; - int bssrate_len = 0; - u8 more_supportedrates = 0; - u8 *p; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 link_id_addr[18] = {0}; - u8 iedata=0; - u8 timeout_itvl[5]; //set timeout interval to maximum value - u32 timeout_interval= TPK_RESEND_COUNT * 1000; - - //category, action, dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialog), &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(pattrib->encrypt) - *pframe =*pframe | BIT(4); - pframe += 2; - pattrib->pktlen += 2; - - //supported rates - rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); - bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); - - //RSNIE - if(pattrib->encrypt) - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); - - //extended capability - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); - - if(pattrib->encrypt){ - //FTIE - _rtw_memset(pframe, 0, 84); //All fields shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //Sup_reg_classes(optional) - //HT capabilities - pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -} - -void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_PEER_TRAFFIC_INDICATION; - - u8 link_id_addr[18] = {0}; - u8 AC_queue=0; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //PTI control - //PU buffer status - if(ptdls_sta->uapsd_bk&BIT(1)) - AC_queue=BIT(0); - if(ptdls_sta->uapsd_be&BIT(1)) - AC_queue=BIT(1); - if(ptdls_sta->uapsd_vi&BIT(1)) - AC_queue=BIT(2); - if(ptdls_sta->uapsd_vo&BIT(1)) - AC_queue=BIT(3); - pframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen)); - -} - -void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_CHANNEL_SWITCH_REQUEST; - u8 link_id_addr[18] = {0}; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - u8 ch_switch_timing[4] = {0}; - u16 switch_time= CH_SWITCH_TIME, switch_timeout=CH_SWITCH_TIMEOUT; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, target_ch - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(ptdlsinfo->candidate_ch), &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //ch switch timing - _rtw_memcpy(ch_switch_timing, &switch_time, 2); - _rtw_memcpy(ch_switch_timing+2, &switch_timeout, 2); - pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); - - //update ch switch attrib to sta_info - ptdls_sta->off_ch=ptdlsinfo->candidate_ch; - ptdls_sta->ch_switch_time=switch_time; - ptdls_sta->ch_switch_timeout=switch_timeout; - -} - -void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = RTW_WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_CHANNEL_SWITCH_RESPONSE; - u8 link_id_addr[18] = {0}; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - u8 ch_switch_timing[4] = {0}; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status_code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //ch switch timing - _rtw_memcpy(ch_switch_timing, &ptdls_sta->ch_switch_time, 2); - _rtw_memcpy(ch_switch_timing+2, &ptdls_sta->ch_switch_timeout, 2); - pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); - -} - -#ifdef CONFIG_WFD -void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_P2P; - u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; - u8 probe_req = 4; - u8 wfdielen = 0; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, OUI, frame_body_type - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(probe_req), &(pattrib->pktlen)); - - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } - else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) - { - wfdielen = build_probe_req_wfd_ie(pbuddy_wdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } - -} - -void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; - u8 payload_type = 0x02; - u8 category = RTW_WLAN_CATEGORY_P2P; - u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; - u8 probe_rsp = 5; - u8 wfdielen = 0; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, OUI, frame_body_type - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(probe_rsp), &(pattrib->pktlen)); - - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 1); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } - else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) - { - wfdielen = build_probe_resp_wfd_ie(pbuddy_wdinfo, pframe, 1); - pframe += wfdielen; - pattrib->pktlen += wfdielen; - } - -} -#endif //CONFIG_WFD - -void _TPK_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - - ptdls_sta->TPK_count++; - //TPK_timer set 1000 as default - //retry timer should set at least 301 sec. - if(ptdls_sta->TPK_count==TPK_RESEND_COUNT){ - ptdls_sta->TPK_count=0; - issue_tdls_setup_req(ptdls_sta->padapter, ptdls_sta->hwaddr); - } - - _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); -} - -void init_TPK_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - - _init_timer(&psta->TPK_timer, padapter->pnetdev, _TPK_timer_hdl, psta); -} - -// TDLS_DONE_CH_SEN: channel sensing and report candidate channel -// TDLS_OFF_CH: first time set channel to off channel -// TDLS_BASE_CH: when go back to the channel linked with AP, send null data to peer STA as an indication -void _ch_switch_timer_hdl(void *FunctionContext) -{ - - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - _adapter *padapter = ptdls_sta->padapter; - - if( ptdls_sta->option == TDLS_DONE_CH_SEN ){ - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_DONE_CH_SEN); - }else if( ptdls_sta->option == TDLS_OFF_CH ){ - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); - _set_timer(&ptdls_sta->base_ch_timer, 500); - }else if( ptdls_sta->option == TDLS_BASE_CH){ - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); - } -} - -void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->option_timer, padapter->pnetdev, _ch_switch_timer_hdl, psta); -} - -void _base_ch_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_OFF_CH); -} - -void init_base_ch_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->base_ch_timer, padapter->pnetdev, _base_ch_timer_hdl, psta); -} - -void _off_ch_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_BASE_CH ); -} - -void init_off_ch_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->off_ch_timer, padapter->pnetdev, _off_ch_timer_hdl, psta); -} - -void _tdls_handshake_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - - if(ptdls_sta != NULL) - { - if( !(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) ) - { - DBG_871X("tdls handshake time out\n"); - free_tdls_sta(ptdls_sta->padapter, ptdls_sta); - } - } -} - -void init_handshake_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->handshake_timer, padapter->pnetdev, _tdls_handshake_timer_hdl, psta); -} - -//Check tdls peer sta alive. -void _tdls_alive_timer_phase1_hdl(void *FunctionContext) -{ - _irqL irqL; - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - _adapter *padapter = ptdls_sta->padapter; - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - - _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL); - ptdls_sta->timer_flag = 1; - _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); - - ptdls_sta->tdls_sta_state &= (~TDLS_ALIVE_STATE); - - DBG_871X("issue_tdls_dis_req to check alive\n"); - issue_tdls_dis_req( padapter, ptdls_sta->hwaddr); - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH1); - sta_update_last_rx_pkts(ptdls_sta); - - if ( ptdls_sta->timer_flag == 2 ) - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA); - else - { - _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL); - ptdls_sta->timer_flag = 0; - _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); - } - -} - -void _tdls_alive_timer_phase2_hdl(void *FunctionContext) -{ - _irqL irqL; - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - _adapter *padapter = ptdls_sta->padapter; - struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; - - _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); - ptdls_sta->timer_flag = 1; - _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); - - if( (ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) && - (sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta)) ) - { - DBG_871X("TDLS STA ALIVE, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n", - sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta)); - - ptdls_sta->alive_count = 0; - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2); - } - else - { - if( !(ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) ) - DBG_871X("TDLS STA TOO FAR\n"); - if( !(sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta))) - DBG_871X("TDLS LINK WITH LOW TRAFFIC, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n", - sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta)); - - ptdls_sta->alive_count++; - if( ptdls_sta->alive_count == TDLS_ALIVE_COUNT ) - { - ptdls_sta->stat_code = _RSON_TDLS_TEAR_TOOFAR_; - issue_tdls_teardown(padapter, ptdls_sta->hwaddr); - } - else - { - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2); - } - } - - if ( ptdls_sta->timer_flag == 2 ) - rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA); - else - { - _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); - ptdls_sta->timer_flag = 0; - _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); -} - -} - -void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->alive_timer1, padapter->pnetdev, _tdls_alive_timer_phase1_hdl, psta); - _init_timer(&psta->alive_timer2, padapter->pnetdev, _tdls_alive_timer_phase2_hdl, psta); -} - -int update_sgi_tdls(_adapter *padapter, struct sta_info *psta) -{ - struct ht_priv *psta_ht = NULL; - psta_ht = &psta->htpriv; - - if(psta_ht->ht_option) - { - return psta_ht->sgi; - } - else - return _FALSE; -} - -u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta) -{ - int i; - u8 rf_type, id; - unsigned char sta_band = 0; - unsigned char limit; - unsigned int tx_ra_bitmap=0; - struct ht_priv *psta_ht = NULL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - - psta_ht = &psta->htpriv; - //b/g mode ra_bitmap - for (i=0; ibssrateset); i++) - { - if (psta->bssrateset[i]) - tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); - } - - //n mode ra_bitmap - if(psta_ht->ht_option) - { - padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - if(rf_type == RF_2T2R) - limit=16;// 2R - else - limit=8;// 1R - - for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) - tx_ra_bitmap |= BIT(i+12); - } - } - - if ( pcur_network->Configuration.DSConfig > 14 ) { - // 5G band - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_5N | WIRELESS_11A; - else - sta_band |= WIRELESS_11A; - } else { - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; - else if (tx_ra_bitmap & 0xff0) - sta_band |= WIRELESS_11G |WIRELESS_11B; - else - sta_band |= WIRELESS_11B; - } - - id = networktype_to_raid(sta_band); - tx_ra_bitmap |= ((id<<28)&0xf0000000); - return tx_ra_bitmap; -} - -#endif //CONFIG_TDLS - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_TDLS_C_ + +#include +#include +#include +#include + +#ifdef CONFIG_TDLS +extern unsigned char MCS_rate_2R[16]; +extern unsigned char MCS_rate_1R[16]; +extern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame); +extern s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe); + +void rtw_reset_tdls_info(_adapter* padapter) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + ptdlsinfo->ap_prohibited = _FALSE; + ptdlsinfo->setup_state = TDLS_STATE_NONE; + ptdlsinfo->sta_cnt = 0; + ptdlsinfo->sta_maximum = _FALSE; + ptdlsinfo->macid_index= 6; + ptdlsinfo->clear_cam= 0; + ptdlsinfo->ch_sensing = 0; + ptdlsinfo->cur_channel = 0; + ptdlsinfo->candidate_ch = 1; //when inplement channel switching, default candidate channel is 1 + ptdlsinfo->watchdog_count = 0; + ptdlsinfo->dev_discovered = 0; + +#ifdef CONFIG_WFD + ptdlsinfo->wfd_info = &padapter->wfd_info; +#endif //CONFIG_WFD +} + +int rtw_init_tdls_info(_adapter* padapter) +{ + int res = _SUCCESS; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + ptdlsinfo->enable = 1; + rtw_reset_tdls_info(padapter); + + _rtw_spinlock_init(&ptdlsinfo->cmd_lock); + _rtw_spinlock_init(&ptdlsinfo->hdl_lock); + + return res; + +} + +void rtw_free_tdls_info(struct tdls_info *ptdlsinfo) +{ + _rtw_spinlock_free(&ptdlsinfo->cmd_lock); + _rtw_spinlock_free(&ptdlsinfo->hdl_lock); + + _rtw_memset(ptdlsinfo, 0, sizeof(struct tdls_info) ); + +} + +void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; +// SetToDs(fctrl); + if (power_mode) + { + SetPwrMgt(fctrl); + } + + _rtw_memcpy(pwlanhdr->addr1, ptdls_sta->hwaddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; + SetSeqNum(pwlanhdr, pattrib->seqnum); + + SetFrameSubType(pframe, WIFI_DATA_NULL); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + pattrib->last_txcmdsz = pattrib->pktlen; + dump_mgntframe(padapter, pmgntframe); + + return; +} + +s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib) +{ + + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv= &pmlmepriv->qospriv; + + s32 res=_SUCCESS; + sint bmcast; + + bmcast = IS_MCAST(pattrib->ra); + + psta = rtw_get_stainfo(pstapriv, pattrib->ra); + if (psta == NULL) { + res =_FAIL; + goto exit; + } + + pattrib->mac_id = psta->mac_id; + + pattrib->psta = psta; + + pattrib->ack_policy = 0; + // get ether_hdr_len + pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag + + if (pqospriv->qos_option && psta->qos_option) { + pattrib->priority = 1; //tdls management frame should be AC_BK + pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; + pattrib->subtype = WIFI_QOS_DATA_TYPE; + } else { + pattrib->hdrlen = WLAN_HDR_A3_LEN; + pattrib->subtype = WIFI_DATA_TYPE; + pattrib->priority = 0; + } + + if (psta->ieee8021x_blocked == _TRUE) + { + pattrib->encrypt = 0; + } + else + { + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); + + switch(psecuritypriv->dot11AuthAlgrthm) + { + case dot11AuthAlgrthm_Open: + case dot11AuthAlgrthm_Shared: + case dot11AuthAlgrthm_Auto: + pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; + break; + case dot11AuthAlgrthm_8021X: + pattrib->key_idx = 0; + break; + default: + pattrib->key_idx = 0; + break; + } + } + + switch (pattrib->encrypt) + { + case _WEP40_: + case _WEP104_: + pattrib->iv_len = 4; + pattrib->icv_len = 4; + break; + case _TKIP_: + pattrib->iv_len = 8; + pattrib->icv_len = 4; + if(padapter->securitypriv.busetkipkey==_FAIL) + { + res =_FAIL; + goto exit; + } + break; + case _AES_: + pattrib->iv_len = 8; + pattrib->icv_len = 8; + break; + default: + pattrib->iv_len = 0; + pattrib->icv_len = 0; + break; + } + + if (pattrib->encrypt && + ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) + { + pattrib->bswenc = _TRUE; + } else { + pattrib->bswenc = _FALSE; + } + + //qos_en, ht_en, init rate, ,bw, ch_offset, sgi + pattrib->qos_en = psta->qos_option; + pattrib->ht_en = psta->htpriv.ht_option; + pattrib->raid = psta->raid; + pattrib->bwmode = psta->htpriv.bwmode; + pattrib->ch_offset = psta->htpriv.ch_offset; + pattrib->sgi= psta->htpriv.sgi; + pattrib->ampdu_en = _FALSE; + + //if(pattrib->ht_en && psta->htpriv.ampdu_enable) + //{ + // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) + // pattrib->ampdu_en = _TRUE; + //} + +exit: + + return res; +} + +void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct sta_priv *pstapriv = &padapter->stapriv; + _irqL irqL; + + //free peer sta_info + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if(ptdlsinfo->sta_cnt != 0) + ptdlsinfo->sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if( ptdlsinfo->sta_cnt < (NUM_STA - 2) ) // -2: AP + BC/MC sta + { + ptdlsinfo->sta_maximum = _FALSE; + _rtw_memset( &ptdlsinfo->ss_record, 0x00, sizeof(struct tdls_ss_record) ); + } + //ready to clear cam + if(ptdls_sta->mac_id!=0){ + ptdlsinfo->clear_cam=ptdls_sta->mac_id; + rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE, _TRUE); + } + + if(ptdlsinfo->sta_cnt==0){ + rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR); + ptdlsinfo->setup_state=TDLS_STATE_NONE; + } + else + DBG_871X("Remain tdls sta:%02x\n", ptdlsinfo->sta_cnt); + + rtw_free_stainfo(padapter, ptdls_sta); + +} + +// cam entry will be the same as mac_id +void rtw_tdls_set_mac_id(struct tdls_info *ptdlsinfo, struct sta_info *ptdls_sta) +{ + if(ptdls_sta->mac_id==0) + { + ptdls_sta->mac_id = ptdlsinfo->macid_index; + if( (++ptdlsinfo->macid_index) > (NUM_STA -2) ) + ptdlsinfo->macid_index= TDLS_INI_MACID_ENTRY; + } +} + +//TDLS encryption(if needed) will always be CCMP +void rtw_tdls_set_key(_adapter *adapter, struct rx_pkt_attrib *prx_pkt_attrib, struct sta_info *ptdls_sta) +{ + if(prx_pkt_attrib->encrypt) + { + ptdls_sta->dot118021XPrivacy=_AES_; + rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE, _TRUE); + } +} + +void rtw_tdls_process_ht_cap(_adapter *adapter, struct sta_info *ptdls_sta, u8 *data, u8 Length) +{ + /* save HT capabilities in the sta object */ + _rtw_memset(&ptdls_sta->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap)); + if (data && Length >= sizeof(struct rtw_ieee80211_ht_cap) ) + { + ptdls_sta->flags |= WLAN_STA_HT; + + ptdls_sta->flags |= WLAN_STA_WME; + + _rtw_memcpy(&ptdls_sta->htpriv.ht_cap, data, sizeof(struct rtw_ieee80211_ht_cap)); + + } else + ptdls_sta->flags &= ~WLAN_STA_HT; + + if(ptdls_sta->flags & WLAN_STA_HT) + { + if(adapter->registrypriv.ht_enable == _TRUE) + { + ptdls_sta->htpriv.ht_option = _TRUE; + } + else + { + ptdls_sta->htpriv.ht_option = _FALSE; + ptdls_sta->stat_code = _STATS_FAILURE_; + } + } + + //HT related cap + if(ptdls_sta->htpriv.ht_option) + { + //check if sta supports rx ampdu + if(adapter->registrypriv.ampdu_enable==1) + ptdls_sta->htpriv.ampdu_enable = _TRUE; + + //check if sta support s Short GI + if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) + { + ptdls_sta->htpriv.sgi = _TRUE; + } + + // bwmode would still followed AP's setting + if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) + { + ptdls_sta->htpriv.bwmode = adapter->mlmeextpriv.cur_bwmode; + ptdls_sta->htpriv.ch_offset = adapter->mlmeextpriv.cur_ch_offset; + } + } +} + +u8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib) +{ + struct rtw_ieee80211_ht_cap ht_capie; + u8 rf_type; + + //HT capabilities + _rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap)); + + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; + + { + u32 rx_packet_offset, max_recvbuf_sz; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + if(max_recvbuf_sz-rx_packet_offset>(8191-256)) + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; + } + + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03); + + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + switch(rf_type) + { + case RF_1T1R: + ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); + break; + + case RF_2T2R: + case RF_1T2R: + default: + ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); + break; + } + + return(rtw_set_ie(pframe, _HT_CAPABILITY_IE_, + sizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen))); +} + +u8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_attrib *pattrib) +{ + u8 sup_ch[ 30 * 2 ] = { 0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel + do{ + if( pmlmeext->channel_set[sup_ch_idx].ChannelNum <= 14 ) + { + sup_ch[0] = 1; //First channel number + sup_ch[1] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; //Number of channel + } + else + { + sup_ch[idx_5g++] = pmlmeext->channel_set[sup_ch_idx].ChannelNum; + sup_ch[idx_5g++] = 1; + } + + sup_ch_idx++; + } + while( pmlmeext->channel_set[sup_ch_idx].ChannelNum != 0 ); + return(rtw_set_ie(pframe, _SUPPORTED_CH_IE_, idx_5g, sup_ch, &(pattrib->pktlen))); +} + +#ifdef CONFIG_WFD +void rtw_tdls_process_wfd_ie(struct tdls_info *ptdlsinfo, u8 *ptr, u8 length) +{ + u8 wfd_ie[ 128 ] = { 0x00 }; + u32 wfd_ielen = 0; + u32 wfd_offset = 0; + // Try to get the TCP port information when receiving the negotiation response. + // + + wfd_offset = 0; + wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); + while( wfd_offset ) + { + u8 attr_content[ 10 ] = { 0x00 }; + u32 attr_contentlen = 0; + int i; + + DBG_871X( "[%s] WFD IE Found!!\n", __FUNCTION__ ); + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen); + if ( attr_contentlen ) + { + ptdlsinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 ); + DBG_871X( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, ptdlsinfo->wfd_info->peer_rtsp_ctrlport ); + } + + _rtw_memset( attr_content, 0x00, 10); + attr_contentlen = 0; + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_LOCAL_IP_ADDR, attr_content, &attr_contentlen); + if ( attr_contentlen ) + { + _rtw_memcpy(ptdlsinfo->wfd_info->peer_ip_address, ( attr_content + 1 ), 4); + DBG_871X( "[%s] Peer IP = %02u.%02u.%02u.%02u \n", __FUNCTION__, + ptdlsinfo->wfd_info->peer_ip_address[0], ptdlsinfo->wfd_info->peer_ip_address[1], + ptdlsinfo->wfd_info->peer_ip_address[2], ptdlsinfo->wfd_info->peer_ip_address[3] + ); + } + wfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen ); + } +} + +void issue_tunneled_probe_req(_adapter *padapter) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + DBG_871X("[%s]\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN); + + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_REQ) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; + + DBG_871X("[%s]\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); + + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_RSP) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} +#endif //CONFIG_WFD + +void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta= NULL; + _irqL irqL; + static u8 dialogtoken = 0; + u32 timeout_interval= TPK_RESEND_COUNT * 1000; //retry timer should set at least 301 sec, using TPK_count counting 301 times. + + if(ptdlsinfo->ap_prohibited == _TRUE) + goto exit; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + + //init peer sta_info + ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); + if(ptdls_sta==NULL) + { + ptdls_sta = rtw_alloc_stainfo(pstapriv, mac_addr); + if(ptdls_sta) + { + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) + ptdlsinfo->sta_cnt++; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if( ptdlsinfo->sta_cnt == (NUM_STA - 2) ) // -2: AP + BC/MC sta + { + ptdlsinfo->sta_maximum = _TRUE; + } + } + else + { + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + } + + if(ptdls_sta){ + ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE; + //for tdls; ptdls_sta->aid is used to fill dialogtoken + ptdls_sta->dialog = dialogtoken; + dialogtoken = (dialogtoken+1)%256; + ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; + _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME ); + } + + pattrib->qsel=pattrib->priority; + if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_REQUEST) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta=NULL; + _irqL irqL; + + ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); + if(ptdls_sta==NULL){ + DBG_871X("issue tdls teardown unsuccessful\n"); + return; + }else{ + ptdls_sta->tdls_sta_state=TDLS_STATE_NONE; + } + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_TEARDOWN) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + + if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){ + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF); + } + + if( ptdls_sta->timer_flag == 1 ) + { + _enter_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL); + ptdls_sta->timer_flag = 2; + _exit_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL); + } + else + rtw_tdls_cmd(padapter, mac_addr, TDLS_FREE_STA ); + + +exit: + + return; +} + +void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + if(mac_addr == NULL) + _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN); + else + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_DISCOVERY_REQUEST) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + DBG_871X("issue tdls dis req\n"); + +exit: + + return; +} + +void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; + _irqL irqL; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_RESPONSE) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; + +} + +void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct sta_info *ptdls_sta=NULL; + _irqL irqL; + + struct rx_pkt_attrib *rx_pkt_pattrib = & precv_frame->u.hdr.attrib; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_CONFIRM) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; + +} + +//TDLS Discovery Response frame is a management action frame +void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame, u8 dialog) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + // unicast probe request frame + _rtw_memcpy(pwlanhdr->addr1, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN); + + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN); + + _rtw_memcpy(pwlanhdr->addr3, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof (struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); + + rtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, dialog); + + pattrib->nr_frags = 1; + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; +} + +void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + static u8 dialogtoken=0; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //for tdls; pattrib->nr_frags is used to fill dialogtoken + ptdls_sta->dialog = dialogtoken; + dialogtoken = (dialogtoken+1)%256; + //PTI frame's priority should be AC_VO + pattrib->priority = 7; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_PEER_TRAFFIC_INDICATION) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + + pattrib->qsel=pattrib->priority; + if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_REQUEST) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + _irqL irqL; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + + pattrib->qsel=pattrib->priority; +/* + _enter_critical_bh(&pxmitpriv->lock, &irqL); + if(xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pmgntframe)==_TRUE){ + _exit_critical_bh(&pxmitpriv->lock, &irqL); + return _FALSE; + } +*/ + if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_RESPONSE) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pmgntframe); + goto exit; + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(adapter->stapriv), get_bssid(&(adapter->mlmepriv))); + struct recv_priv *precvpriv = &(adapter->recvpriv); + u8 *ptr = precv_frame->u.hdr.rx_data, *psa; + struct rx_pkt_attrib *pattrib = &(precv_frame->u.hdr.attrib); + struct tdls_info *ptdlsinfo = &(adapter->tdlsinfo); + u8 empty_addr[ETH_ALEN] = { 0x00 }; + int UndecoratedSmoothedPWDB; + + + //WFDTDLS: for sigma test, not to setup direct link automatically + ptdlsinfo->dev_discovered = 1; + +#ifdef CONFIG_TDLS_AUTOSETUP + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(&(adapter->stapriv), psa); + + if(ptdls_sta != NULL) + { + ptdls_sta->tdls_sta_state |= TDLS_ALIVE_STATE; + + //Record the tdls sta with lowest signal strength + if( (ptdlsinfo->sta_maximum == _TRUE) && (ptdls_sta->alive_count >= 1) ) + { + if( _rtw_memcmp(ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN) ) + { + _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN); + ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll; + } + else + { + if( ptdlsinfo->ss_record.RxPWDBAll < pattrib->RxPWDBAll ) + { + _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN); + ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll; + } + } + } + + } + else + { + if( ptdlsinfo->sta_maximum == _TRUE) + { + if( _rtw_memcmp( ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN ) ) + { + //All traffics are busy, do not set up another direct link. + return _FAIL; + } + else + { + if( pattrib->RxPWDBAll > ptdlsinfo->ss_record.RxPWDBAll ) + { + issue_tdls_teardown(adapter, ptdlsinfo->ss_record.macaddr); + } + else + { + return _FAIL; + } + } + } + + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); + + if( pattrib->RxPWDBAll + TDLS_SIGNAL_THRESH >= UndecoratedSmoothedPWDB); + { + DBG_871X("pattrib->RxPWDBAll=%d, pdmpriv->UndecoratedSmoothedPWDB=%d\n", pattrib->RxPWDBAll, UndecoratedSmoothedPWDB); + issue_tdls_setup_req(adapter, psa); + } + } +#endif //CONFIG_TDLS_AUTOSETUP + + return _SUCCESS; +} + +sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; + u8 *psa, *pmyid; + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct security_priv *psecuritypriv = &adapter->securitypriv; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *prsnie, *ppairwise_cipher; + u8 i, k, pairwise_count; + u8 ccmp_have=0, rsnie_have=0; + u16 j; + u8 SNonce[32]; + u32 *timeout_interval; + sint parsing_length; //frame body length, without icv_len + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE = 5; + unsigned char supportRate[16]; + int supportRateNum = 0; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + pmyid=myid(&(adapter->eeprompriv)); + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -ETH_TYPE_LEN + -PAYLOAD_TYPE_LEN + -FIXED_IE; + + if(ptdlsinfo->ap_prohibited == _TRUE) + { + goto exit; + } + + if(ptdls_sta==NULL){ + ptdls_sta = rtw_alloc_stainfo(pstapriv, psa); + }else{ + if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){ + //If the direct link is already set up + //Process as re-setup after tear down + DBG_871X("re-setup a direct link\n"); + } + //already receiving TDLS setup request + else if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ + DBG_871X("receive duplicated TDLS setup request frame in handshaking\n"); + goto exit; + } + //When receiving and sending setup_req to the same link at the same time, STA with higher MAC_addr would be initiator + //following is to check out MAC_addr + else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ + DBG_871X("receive setup_req after sending setup_req\n"); + for (i=0;i<6;i++){ + if(*(pmyid+i)==*(psa+i)){ + } + else if(*(pmyid+i)>*(psa+i)){ + goto exit; + }else if(*(pmyid+i)<*(psa+i)){ + ptdls_sta->tdls_sta_state=TDLS_INITIATOR_STATE; + break; + } + } + } + } + + if(ptdls_sta) + { + ptdls_sta->dialog = *(ptr+2); //copy dialog token + ptdls_sta->stat_code = 0; + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _SUPPORTEDRATES_IE_: + _rtw_memcpy(supportRate, pIE->data, pIE->Length); + supportRateNum = pIE->Length; + break; + case _COUNTRY_IE_: + break; + case _EXT_SUPPORTEDRATES_IE_: + if(supportRateNum<=sizeof(supportRate)) + { + _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); + supportRateNum += pIE->Length; + } + break; + case _SUPPORTED_CH_IE_: + break; + case _RSN_IE_2_: + rsnie_have=1; + if(prx_pkt_attrib->encrypt){ + prsnie=(u8*)pIE; + //check whether initiator STA has CCMP pairwise_cipher. + ppairwise_cipher=prsnie+10; + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 1); + for(k=0;kstat_code=72; + } + } + break; + case _EXT_CAP_IE_: + break; + case _VENDOR_SPECIFIC_IE_: + break; + case _FTIE_: + if(prx_pkt_attrib->encrypt) + _rtw_memcpy(SNonce, (ptr+j+52), 32); + break; + case _TIMEOUT_ITVL_IE_: + if(prx_pkt_attrib->encrypt) + timeout_interval = (u32 *)(ptr+j+3); + break; + case _RIC_Descriptor_IE_: + break; + case _HT_CAPABILITY_IE_: + rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length); + break; + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + if(_rtw_memcmp(get_bssid(pmlmepriv), pIE->data, 6) == _FALSE) + { + //not in the same BSS + ptdls_sta->stat_code=7; + } + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //update station supportRate + ptdls_sta->bssratelen = supportRateNum; + _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); + + //check status code + //if responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject + if(ptdls_sta->stat_code == 0 ) + { + if(rsnie_have && (prx_pkt_attrib->encrypt==0)){ + //security disabled + ptdls_sta->stat_code = 5; + }else if(rsnie_have==0 && (prx_pkt_attrib->encrypt)){ + //request haven't RSNIE + ptdls_sta->stat_code = 38; + } + +#ifdef CONFIG_WFD + //WFD test plan version 0.18.2 test item 5.1.5 + //SoUT does not use TDLS if AP uses weak security + if ( adapter->wdinfo.wfd_tdls_enable ) + { + if(rsnie_have && (prx_pkt_attrib->encrypt != _AES_)) + { + ptdls_sta->stat_code = 5; + } + } +#endif //CONFIG_WFD + } + + ptdls_sta->tdls_sta_state|= TDLS_INITIATOR_STATE; + if(prx_pkt_attrib->encrypt){ + _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32); + _rtw_memcpy(&(ptdls_sta->TDLS_PeerKey_Lifetime), timeout_interval, 4); + } + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) + ptdlsinfo->sta_cnt++; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if( ptdlsinfo->sta_cnt == (NUM_STA - 2) ) // -2: AP + BC/MC sta + { + ptdlsinfo->sta_maximum = _TRUE; + } + +#ifdef CONFIG_WFD + rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE); +#endif // CONFIG_WFD + + } + else + { + goto exit; + } + + issue_tdls_setup_rsp(adapter, precv_frame); + + if(ptdls_sta->stat_code==0) + { + _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME); + } + else //status code!=0 ; setup unsuccess + { + free_tdls_sta(adapter, ptdls_sta); + } + +exit: + + return _FAIL; +} + +sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + u16 stat_code; + sint parsing_length; //frame body length, without icv_len + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =7; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; + u16 pairwise_count, j, k; + u8 verify_ccmp=0; + unsigned char supportRate[16]; + int supportRateNum = 0; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + if ( NULL == ptdls_sta ) + { + return _FAIL; + } + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + + _rtw_memcpy(&stat_code, ptr+2, 2); + + if(stat_code!=0) + { + DBG_871X( "[%s] status_code = %d, free_tdls_sta\n", __FUNCTION__, stat_code ); + free_tdls_sta(adapter, ptdls_sta); + return _FAIL; + } + + stat_code = 0; + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _SUPPORTEDRATES_IE_: + _rtw_memcpy(supportRate, pIE->data, pIE->Length); + supportRateNum = pIE->Length; + break; + case _COUNTRY_IE_: + break; + case _EXT_SUPPORTEDRATES_IE_: + if(supportRateNum<=sizeof(supportRate)) + { + _rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length); + supportRateNum += pIE->Length; + } + break; + case _SUPPORTED_CH_IE_: + break; + case _RSN_IE_2_: + prsnie=(u8*)pIE; + //check whether responder STA has CCMP pairwise_cipher. + ppairwise_cipher=prsnie+10; + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2); + for(k=0;kANonce, (ptr+j+20), 32); + break; + case _TIMEOUT_ITVL_IE_: + ptimeout_ie=(u8*)pIE; + break; + case _RIC_Descriptor_IE_: + break; + case _HT_CAPABILITY_IE_: + rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length); + break; + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + plinkid_ie=(u8*)pIE; + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //update station supportRate + ptdls_sta->bssratelen = supportRateNum; + _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum); + +#ifdef CONFIG_WFD + rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE); +#endif // CONFIG_WFD + + if(stat_code != 0) + { + ptdls_sta->stat_code = stat_code; + } + else + { + if(prx_pkt_attrib->encrypt) + { + if(verify_ccmp==1) + { + wpa_tdls_generate_tpk(adapter, ptdls_sta); + ptdls_sta->stat_code=0; + if(tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie)==0) //0: Invalid, 1: valid + { + free_tdls_sta(adapter, ptdls_sta); + return _FAIL; + } + } + else + { + ptdls_sta->stat_code=72; //invalide contents of RSNIE + } + + }else{ + ptdls_sta->stat_code=0; + } + } + + DBG_871X("issue_tdls_setup_cfm\n"); + issue_tdls_setup_cfm(adapter, precv_frame); + + if(ptdls_sta->stat_code==0) + { + ptdlsinfo->setup_state = TDLS_LINKED_STATE; + + if( ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE ) + { + ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE; + _cancel_timer_ex( &ptdls_sta->handshake_timer); +#ifdef CONFIG_TDLS_AUTOCHECKALIVE + _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1); +#endif //CONFIG_TDLS_AUTOSETUP + } + + rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta); + rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta); + + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR); + + } + else //status code!=0 ; setup unsuccessful + { + free_tdls_sta(adapter, ptdls_sta); + } + + return _FAIL; + +} + +sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + u16 stat_code; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =5; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; + u16 j, pairwise_count; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -ETH_TYPE_LEN + -PAYLOAD_TYPE_LEN + -FIXED_IE; + _rtw_memcpy(&stat_code, ptr+2, 2); + + if(stat_code!=0){ + DBG_871X( "[%s] stat_code = %d\n, free_tdls_sta", __FUNCTION__, stat_code ); + free_tdls_sta(adapter, ptdls_sta); + return _FAIL; + } + + if(prx_pkt_attrib->encrypt){ + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _RSN_IE_2_: + prsnie=(u8*)pIE; + break; + case _VENDOR_SPECIFIC_IE_: + break; + case _FTIE_: + pftie=(u8*)pIE; + break; + case _TIMEOUT_ITVL_IE_: + ptimeout_ie=(u8*)pIE; + break; + case _HT_EXTRA_INFO_IE_: + break; + case _LINK_ID_IE_: + plinkid_ie=(u8*)pIE; + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //verify mic in FTIE MIC field + if(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: Valid + free_tdls_sta(adapter, ptdls_sta); + return _FAIL; + } + + } + + ptdlsinfo->setup_state = TDLS_LINKED_STATE; + if( ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE ) + { + ptdls_sta->tdls_sta_state|=TDLS_LINKED_STATE; + _cancel_timer_ex( &ptdls_sta->handshake_timer); +#ifdef CONFIG_TDLS_AUTOCHECKALIVE + _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1); +#endif //CONFIG_TDLS_AUTOCHECKALIVE + } + + rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta); + rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta); + + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR); + + return _FAIL; + +} + +sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + struct sta_info *psta_ap; + u8 *ptr = precv_frame->u.hdr.rx_data; + sint parsing_length; //frame body length, without icv_len + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE = 3, *dst, *pdialog = NULL; + u16 j; + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE + 1; + pdialog=ptr+2; + + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _LINK_ID_IE_: + psta_ap = rtw_get_stainfo(pstapriv, pIE->data); + if(psta_ap == NULL) + { + goto exit; + } + dst = pIE->data + 12; + if( (MacAddr_isBcst(dst) == _FALSE) && (_rtw_memcmp(myid(&(adapter->eeprompriv)), dst, 6) == _FALSE) ) + { + goto exit; + } + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //check frame contents + + issue_tdls_dis_rsp(adapter, precv_frame, *(pdialog) ); + +exit: + + return _FAIL; + +} + +sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame) +{ + u8 *psa; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &adapter->stapriv; + struct sta_info *ptdls_sta= NULL; + _irqL irqL; + + psa = get_sa(ptr); + + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + if(ptdls_sta!=NULL){ + if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){ + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); + } + free_tdls_sta(adapter, ptdls_sta); + } + + return _FAIL; + +} + +u8 TDLS_check_ch_state(uint state){ + if( (state & TDLS_CH_SWITCH_ON_STATE) && + (state & TDLS_AT_OFF_CH_STATE) && + (state & TDLS_PEER_AT_OFF_STATE) ){ + + if(state & TDLS_PEER_SLEEP_STATE) + return 2; //U-APSD + ch. switch + else + return 1; //ch. switch + }else + return 0; +} + +//we process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here +sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct tdls_info *ptdlsinfo = &adapter->tdlsinfo; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + //get peer sta infomation + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); + u8 wmmps_ac=0, state=TDLS_check_ch_state(ptdls_sta->tdls_sta_state); + int i; + + ptdls_sta->sta_stats.rx_data_pkts++; + + //receive peer traffic response frame, sleeping STA wakes up + //ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_SLEEP_STATE); + process_wmmps_data( adapter, precv_frame); + + // if noticed peer STA wakes up by receiving peer traffic response + // and we want to do channel swtiching, then we will transmit channel switch request first + if(ptdls_sta->tdls_sta_state & TDLS_APSD_CHSW_STATE){ + issue_tdls_ch_switch_req(adapter, pattrib->src); + ptdls_sta->tdls_sta_state &= ~(TDLS_APSD_CHSW_STATE); + return _FAIL; + } + + //check 4-AC queue bit + if(ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk) + wmmps_ac=1; + + //if it's a direct link and have buffered frame + if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){ + if(wmmps_ac && state) + { + _irqL irqL; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + + _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&ptdls_sta->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + //transmit buffered frames + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + xmitframe_plist = get_next(xmitframe_plist); + rtw_list_delete(&pxmitframe->list); + + ptdls_sta->sleepq_len--; + if(ptdls_sta->sleepq_len>0){ + pxmitframe->attrib.mdata = 1; + pxmitframe->attrib.eosp = 0; + }else{ + pxmitframe->attrib.mdata = 0; + pxmitframe->attrib.eosp = 1; + } + //pxmitframe->attrib.triggered = 1; //maybe doesn't need in TDLS + if(adapter->HalFunc.hal_xmit(adapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(adapter, pxmitframe); + } + + } + + if(ptdls_sta->sleepq_len==0) + { + DBG_871X("no buffered packets for tdls to xmit\n"); + //on U-APSD + CH. switch state, when there is no buffered date to xmit, + // we should go back to base channel + if(state==2){ + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); + }else if(ptdls_sta->tdls_sta_state&TDLS_SW_OFF_STATE){ + ptdls_sta->tdls_sta_state &= ~(TDLS_SW_OFF_STATE); + ptdlsinfo->candidate_ch= pmlmeext->cur_channel; + issue_tdls_ch_switch_req(adapter, pattrib->src); + DBG_871X("issue tdls ch switch req back to base channel\n"); + } + + } + else + { + DBG_871X("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len); + ptdls_sta->sleepq_len=0; + } + + _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + } + + } + + return _FAIL; +} + +sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =3; + u16 j; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -ETH_TYPE_LEN + -PAYLOAD_TYPE_LEN + -FIXED_IE; + + ptdls_sta->off_ch = *(ptr+2); + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _COUNTRY_IE_: + break; + case _CH_SWTICH_ANNOUNCE_: + break; + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + _rtw_memcpy(&ptdls_sta->ch_switch_time, pIE->data, 2); + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, pIE->data+2, 2); + default: + break; + } + + j += (pIE->Length + 2); + + } + + //todo: check status + ptdls_sta->stat_code=0; + ptdls_sta->tdls_sta_state |= TDLS_CH_SWITCH_ON_STATE; + + issue_nulldata(adapter, NULL, 1, 0, 0); + + issue_tdls_ch_switch_rsp(adapter, psa); + + DBG_871X("issue tdls channel switch response\n"); + + if((ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE) && ptdls_sta->off_ch==pmlmeext->cur_channel){ + DBG_871X("back to base channel %x\n", pmlmeext->cur_channel); + ptdls_sta->option=7; + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_BASE_CH); + }else{ + ptdls_sta->option=6; + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); + } + return _FAIL; +} + +sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =4; + u16 stat_code, j, switch_time, switch_timeout; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + //if channel switch is running and receiving Unsolicited TDLS Channel Switch Response, + //it will go back to base channel and terminate this channel switch procedure + if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE ){ + if(pmlmeext->cur_channel==ptdls_sta->off_ch){ + DBG_871X("back to base channel %x\n", pmlmeext->cur_channel); + ptdls_sta->option=7; + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); + }else{ + DBG_871X("receive unsolicited channel switch response \n"); + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF); + } + return _FAIL; + } + + //avoiding duplicated or unconditional ch. switch. rsp + if((ptdls_sta->tdls_sta_state & TDLS_CH_SW_INITIATOR_STATE) != TDLS_CH_SW_INITIATOR_STATE) + return _FAIL; + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -ETH_TYPE_LEN + -PAYLOAD_TYPE_LEN + -FIXED_IE; + + _rtw_memcpy(&stat_code, ptr+2, 2); + + if(stat_code!=0){ + return _FAIL; + } + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + _rtw_memcpy(&switch_time, pIE->data, 2); + if(switch_time > ptdls_sta->ch_switch_time) + _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2); + + _rtw_memcpy(&switch_timeout, pIE->data+2, 2); + if(switch_timeout > ptdls_sta->ch_switch_timeout) + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2); + + default: + break; + } + + j += (pIE->Length + 2); + + } + + ptdls_sta->tdls_sta_state &= ~(TDLS_CH_SW_INITIATOR_STATE); + ptdls_sta->tdls_sta_state |=TDLS_CH_SWITCH_ON_STATE; + + //goto set_channel_workitem_callback() + ptdls_sta->option=6; + rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH); + + return _FAIL; +} + +#ifdef CONFIG_WFD +void wfd_ie_tdls(_adapter * padapter, u8 *pframe, u32 *pktlen ) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wifi_display_info *pwfd_info = padapter->tdlsinfo.wfd_info; + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; + u32 wfdielen = 0; + + // WFD OUI + wfdielen = 0; + wfdie[ wfdielen++ ] = 0x50; + wfdie[ wfdielen++ ] = 0x6F; + wfdie[ wfdielen++ ] = 0x9A; + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + + // Commented by Albert 20110825 + // According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes + // 1. WFD Device Information + // 2. Associated BSSID ( Optional ) + // 3. Local IP Adress ( Optional ) + + // WFD Device Information ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + + // Length: + // Note: In the WFD specification, the size of length field is 2. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006); + wfdielen += 2; + + // Value1: + // WFD device information + // available for WFD session + Preferred TDLS + WSD ( WFD Service Discovery ) + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL + | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_WSD); + wfdielen += 2; + + // Value2: + // Session Management Control Port + // Default TCP port for RTSP messages is 554 + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + wfdielen += 2; + + // Value3: + // WFD Device Maximum Throughput + // 300Mbps is the maximum throughput + RTW_PUT_BE16(wfdie + wfdielen, 300); + wfdielen += 2; + + // Associated BSSID ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + + // Length: + // Note: In the WFD specification, the size of length field is 2. + RTW_PUT_BE16(wfdie + wfdielen, 0x0006); + wfdielen += 2; + + // Value: + // Associated BSSID + if ( check_fwstate( pmlmepriv, _FW_LINKED) == _TRUE ) + { + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); + } + else + { + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN ); + } + + // Local IP Address ATTR + wfdie[ wfdielen++ ] = WFD_ATTR_LOCAL_IP_ADDR; + + // Length: + // Note: In the WFD specification, the size of length field is 2. + RTW_PUT_BE16(wfdie + wfdielen, 0x0005); + wfdielen += 2; + + // Version: + // 0x01: Version1;IPv4 + wfdie[ wfdielen++ ] = 0x01; + + // IPv4 Address + _rtw_memcpy( wfdie + wfdielen, pwfd_info->ip_address, 4 ); + wfdielen += 4; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, pktlen); + +} +#endif //CONFIG_WFD + +void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); + + u8 payload_type = 0x02; + u8 category = RTW_WLAN_CATEGORY_TDLS; + u8 action = TDLS_SETUP_REQUEST; + u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; //Use NDIS_802_11_LENGTH_RATES_EX in order to call func.rtw_set_supported_rate + int bssrate_len = 0, i = 0 ; + u8 more_supportedrates = 0; + unsigned int ie_len; + u8 *p; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 link_id_addr[18] = {0}; + u8 iedata=0; + u8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2; //For supported channel + u8 timeout_itvl[5]; //set timeout interval to maximum value + u32 time; + + //SNonce + if(pattrib->encrypt){ + for(i=0;i<8;i++){ + time=rtw_get_current_time(); + _rtw_memcpy(&ptdls_sta->SNonce[4*i], (u8 *)&time, 4); + } + } + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); + bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //country(optional) + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); + + // SRC IE + pframe = rtw_set_ie( pframe, _SRC_IE_, 16, TDLS_SRC, &(pattrib->pktlen)); + + //RSNIE + if(pattrib->encrypt) + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); + + //extended capabilities + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); + + //QoS capability(WMM_IE) + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE, &(pattrib->pktlen)); + + + if(pattrib->encrypt){ + //FTIE + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //Sup_reg_classes(optional) + //HT capabilities + pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +#ifdef CONFIG_WFD + wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); +#endif //CONFIG_WFD + +} + +void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *ptdls_sta; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_SETUP_RESPONSE; + unsigned char bssrate[NDIS_802_11_LENGTH_RATES_EX]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + unsigned int ie_len; + unsigned char *p; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 link_id_addr[18] = {0}; + u8 iedata=0; + u8 timeout_itvl[5]; //setup response timeout interval will copy from request + u8 ANonce[32]; //maybe it can put in ontdls_req + u8 k; //for random ANonce + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; + u32 time; + + ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst); + + if(ptdls_sta == NULL ) + { + DBG_871X("[%s] %d\n", __FUNCTION__, __LINE__); + return; + } + + if(pattrib->encrypt){ + for(k=0;k<8;k++){ + time=rtw_get_current_time(); + _rtw_memcpy(&ptdls_sta->ANonce[4*k], (u8*)&time, 4); + } + } + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + + if(ptdls_sta->stat_code!=0) //invalid setup request + { + DBG_871X("ptdls_sta->stat_code:%04x \n", ptdls_sta->stat_code); + return; + } + + //dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt ) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); + bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //country(optional) + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); + + // SRC IE + pframe = rtw_set_ie(pframe, _SRC_IE_ , 16, TDLS_SRC, &(pattrib->pktlen)); + + //RSNIE + if(pattrib->encrypt){ + prsnie = pframe; + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); + } + + //extended capabilities + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); + + //QoS capability(WMM_IE) + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE, &(pattrib->pktlen)); + + if(pattrib->encrypt){ + wpa_tdls_generate_tpk(padapter, ptdls_sta); + + //FTIE + pftie = pframe; + pftie_mic = pframe+4; + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + ptimeout_ie = pframe; + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //Sup_reg_classes(optional) + //HT capabilities + pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + plinkid_ie = pframe; + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //fill FTIE mic + if(pattrib->encrypt) + wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); + +#ifdef CONFIG_WFD + wfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) ); +#endif //CONFIG_WFD + +} + +void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst); + + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_SETUP_CONFIRM; + u8 more_supportedrates = 0; + unsigned int ie_len; + unsigned char *p; + u8 timeout_itvl[5]; //set timeout interval to maximum value + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 link_id_addr[18] = {0}; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status code, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); + + if(ptdls_sta->stat_code!=0) //invalid setup request + return; + + //RSNIE + if(pattrib->encrypt){ + prsnie = pframe; + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); + } + + //EDCA param set; WMM param ele. + if(pattrib->encrypt){ + //FTIE + pftie = pframe; + pftie_mic = pframe+4; + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + ptimeout_ie = pframe; + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + ptdls_sta->TPK_count=0; + _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //HT operation; todo + //Link identifier + plinkid_ie = pframe; + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //fill FTIE mic + if(pattrib->encrypt) + wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); + +} + +void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_TEARDOWN; + u8 link_id_addr[18] = {0}; + + struct sta_info *ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst); + struct sta_priv *pstapriv = &padapter->stapriv; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + + //Link identifier + if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){ + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + }else if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){ + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + } + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + u8 category = RTW_WLAN_CATEGORY_TDLS; + u8 action = TDLS_DISCOVERY_REQUEST; + u8 link_id_addr[18] = {0}; + static u8 dialogtoken=0; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen)); + dialogtoken = (dialogtoken+1)%256; + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + + u8 category = RTW_WLAN_CATEGORY_PUBLIC; + u8 action = TDLS_DISCOVERY_RESPONSE; + u8 bssrate[NDIS_802_11_LENGTH_RATES_EX]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + u8 *p; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 link_id_addr[18] = {0}; + u8 iedata=0; + u8 timeout_itvl[5]; //set timeout interval to maximum value + u32 timeout_interval= TPK_RESEND_COUNT * 1000; + + //category, action, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialog), &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N); + bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN; + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib); + + //RSNIE + if(pattrib->encrypt) + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen)); + + //extended capability + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen)); + + if(pattrib->encrypt){ + //FTIE + _rtw_memset(pframe, 0, 84); //All fields shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //Sup_reg_classes(optional) + //HT capabilities + pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_PEER_TRAFFIC_INDICATION; + + u8 link_id_addr[18] = {0}; + u8 AC_queue=0; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //PTI control + //PU buffer status + if(ptdls_sta->uapsd_bk&BIT(1)) + AC_queue=BIT(0); + if(ptdls_sta->uapsd_be&BIT(1)) + AC_queue=BIT(1); + if(ptdls_sta->uapsd_vi&BIT(1)) + AC_queue=BIT(2); + if(ptdls_sta->uapsd_vo&BIT(1)) + AC_queue=BIT(3); + pframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen)); + +} + +void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_CHANNEL_SWITCH_REQUEST; + u8 link_id_addr[18] = {0}; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + u8 ch_switch_timing[4] = {0}; + u16 switch_time= CH_SWITCH_TIME, switch_timeout=CH_SWITCH_TIMEOUT; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, target_ch + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(ptdlsinfo->candidate_ch), &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //ch switch timing + _rtw_memcpy(ch_switch_timing, &switch_time, 2); + _rtw_memcpy(ch_switch_timing+2, &switch_timeout, 2); + pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); + + //update ch switch attrib to sta_info + ptdls_sta->off_ch=ptdlsinfo->candidate_ch; + ptdls_sta->ch_switch_time=switch_time; + ptdls_sta->ch_switch_timeout=switch_timeout; + +} + +void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = RTW_WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_CHANNEL_SWITCH_RESPONSE; + u8 link_id_addr[18] = {0}; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u8 ch_switch_timing[4] = {0}; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status_code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //ch switch timing + _rtw_memcpy(ch_switch_timing, &ptdls_sta->ch_switch_time, 2); + _rtw_memcpy(ch_switch_timing+2, &ptdls_sta->ch_switch_timeout, 2); + pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); + +} + +#ifdef CONFIG_WFD +void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; + u8 payload_type = 0x02; + u8 category = RTW_WLAN_CATEGORY_P2P; + u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; + u8 probe_req = 4; + u8 wfdielen = 0; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, OUI, frame_body_type + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(probe_req), &(pattrib->pktlen)); + + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; + } + else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) + { + wfdielen = build_probe_req_wfd_ie(pbuddy_wdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; + } + +} + +void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo; + u8 payload_type = 0x02; + u8 category = RTW_WLAN_CATEGORY_P2P; + u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a}; + u8 probe_rsp = 5; + u8 wfdielen = 0; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, OUI, frame_body_type + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(probe_rsp), &(pattrib->pktlen)); + + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 1); + pframe += wfdielen; + pattrib->pktlen += wfdielen; + } + else if(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) + { + wfdielen = build_probe_resp_wfd_ie(pbuddy_wdinfo, pframe, 1); + pframe += wfdielen; + pattrib->pktlen += wfdielen; + } + +} +#endif //CONFIG_WFD + +void _TPK_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + + ptdls_sta->TPK_count++; + //TPK_timer set 1000 as default + //retry timer should set at least 301 sec. + if(ptdls_sta->TPK_count==TPK_RESEND_COUNT){ + ptdls_sta->TPK_count=0; + issue_tdls_setup_req(ptdls_sta->padapter, ptdls_sta->hwaddr); + } + + _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); +} + +void init_TPK_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + + _init_timer(&psta->TPK_timer, padapter->pnetdev, _TPK_timer_hdl, psta); +} + +// TDLS_DONE_CH_SEN: channel sensing and report candidate channel +// TDLS_OFF_CH: first time set channel to off channel +// TDLS_BASE_CH: when go back to the channel linked with AP, send null data to peer STA as an indication +void _ch_switch_timer_hdl(void *FunctionContext) +{ + + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + + if( ptdls_sta->option == TDLS_DONE_CH_SEN ){ + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_DONE_CH_SEN); + }else if( ptdls_sta->option == TDLS_OFF_CH ){ + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); + _set_timer(&ptdls_sta->base_ch_timer, 500); + }else if( ptdls_sta->option == TDLS_BASE_CH){ + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); + } +} + +void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->option_timer, padapter->pnetdev, _ch_switch_timer_hdl, psta); +} + +void _base_ch_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_OFF_CH); +} + +void init_base_ch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->base_ch_timer, padapter->pnetdev, _base_ch_timer_hdl, psta); +} + +void _off_ch_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_BASE_CH ); +} + +void init_off_ch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->off_ch_timer, padapter->pnetdev, _off_ch_timer_hdl, psta); +} + +void _tdls_handshake_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + + if(ptdls_sta != NULL) + { + if( !(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) ) + { + DBG_871X("tdls handshake time out\n"); + free_tdls_sta(ptdls_sta->padapter, ptdls_sta); + } + } +} + +void init_handshake_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->handshake_timer, padapter->pnetdev, _tdls_handshake_timer_hdl, psta); +} + +//Check tdls peer sta alive. +void _tdls_alive_timer_phase1_hdl(void *FunctionContext) +{ + _irqL irqL; + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL); + ptdls_sta->timer_flag = 1; + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); + + ptdls_sta->tdls_sta_state &= (~TDLS_ALIVE_STATE); + + DBG_871X("issue_tdls_dis_req to check alive\n"); + issue_tdls_dis_req( padapter, ptdls_sta->hwaddr); + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH1); + sta_update_last_rx_pkts(ptdls_sta); + + if ( ptdls_sta->timer_flag == 2 ) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA); + else + { + _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL); + ptdls_sta->timer_flag = 0; + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); + } + +} + +void _tdls_alive_timer_phase2_hdl(void *FunctionContext) +{ + _irqL irqL; + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _adapter *padapter = ptdls_sta->padapter; + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + + _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); + ptdls_sta->timer_flag = 1; + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); + + if( (ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) && + (sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta)) ) + { + DBG_871X("TDLS STA ALIVE, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n", + sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta)); + + ptdls_sta->alive_count = 0; + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2); + } + else + { + if( !(ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) ) + DBG_871X("TDLS STA TOO FAR\n"); + if( !(sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta))) + DBG_871X("TDLS LINK WITH LOW TRAFFIC, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n", + sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta)); + + ptdls_sta->alive_count++; + if( ptdls_sta->alive_count == TDLS_ALIVE_COUNT ) + { + ptdls_sta->stat_code = _RSON_TDLS_TEAR_TOOFAR_; + issue_tdls_teardown(padapter, ptdls_sta->hwaddr); + } + else + { + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2); + } + } + + if ( ptdls_sta->timer_flag == 2 ) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA); + else + { + _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL); + ptdls_sta->timer_flag = 0; + _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL); +} + +} + +void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->alive_timer1, padapter->pnetdev, _tdls_alive_timer_phase1_hdl, psta); + _init_timer(&psta->alive_timer2, padapter->pnetdev, _tdls_alive_timer_phase2_hdl, psta); +} + +int update_sgi_tdls(_adapter *padapter, struct sta_info *psta) +{ + struct ht_priv *psta_ht = NULL; + psta_ht = &psta->htpriv; + + if(psta_ht->ht_option) + { + return psta_ht->sgi; + } + else + return _FALSE; +} + +u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta) +{ + int i; + u8 rf_type, id; + unsigned char sta_band = 0; + unsigned char limit; + unsigned int tx_ra_bitmap=0; + struct ht_priv *psta_ht = NULL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + + psta_ht = &psta->htpriv; + //b/g mode ra_bitmap + for (i=0; ibssrateset); i++) + { + if (psta->bssrateset[i]) + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); + } + + //n mode ra_bitmap + if(psta_ht->ht_option) + { + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + if(rf_type == RF_2T2R) + limit=16;// 2R + else + limit=8;// 1R + + for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) + tx_ra_bitmap |= BIT(i+12); + } + } + + if ( pcur_network->Configuration.DSConfig > 14 ) { + // 5G band + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_5N | WIRELESS_11A; + else + sta_band |= WIRELESS_11A; + } else { + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; + else if (tx_ra_bitmap & 0xff0) + sta_band |= WIRELESS_11G |WIRELESS_11B; + else + sta_band |= WIRELESS_11B; + } + + id = networktype_to_raid(sta_band); + tx_ra_bitmap |= ((id<<28)&0xf0000000); + return tx_ra_bitmap; +} + +#endif //CONFIG_TDLS + diff --git a/drivers/net/wireless/rtl8723as/core/rtw_wapi.c b/drivers/net/wireless/rtl8723as/core/rtw_wapi.c index 1d4e197a85db..6c6268c0a56f 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_wapi.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_wapi.c @@ -1,1326 +1,1326 @@ -#ifdef CONFIG_WAPI_SUPPORT - -#include -#include -#include -#include - - -u32 wapi_debug_component = -// WAPI_INIT | -// WAPI_API | -// WAPI_TX | -// WAPI_RX | - WAPI_ERR ; //always open err flags on - -void WapiFreeAllStaInfo(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - PRT_WAPI_STA_INFO pWapiStaInfo; - PRT_WAPI_BKID pWapiBkid; - - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - pWapiInfo = &padapter->wapiInfo; - - //Pust to Idle List - rtw_wapi_return_all_sta_info(padapter); - - //Sta Info List - while(!list_empty(&(pWapiInfo->wapiSTAIdleList))) - { - pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); - list_del_init(&pWapiStaInfo->list); - } - - //BKID List - while(!list_empty(&(pWapiInfo->wapiBKIDIdleList))) - { - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - } - WAPI_TRACE(WAPI_INIT, "<=========== %s\n", __FUNCTION__); - return; -} - -void WapiSetIE(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - //PRT_WAPI_BKID pWapiBkid; - u16 protocolVer = 1; - u16 akmCnt = 1; - u16 suiteCnt = 1; - u16 capability = 0; - u8 OUI[3]; - - OUI[0] = 0x00; - OUI[1] = 0x14; - OUI[2] = 0x72; - - pWapiInfo->wapiIELength = 0; -//protocol version - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &protocolVer, 2); - pWapiInfo->wapiIELength +=2; -//akm - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &akmCnt, 2); - pWapiInfo->wapiIELength +=2; - - if(pWapiInfo->bWapiPSK){ - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x2; - pWapiInfo->wapiIELength +=1; - }else{ - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; - pWapiInfo->wapiIELength +=1; - } - -//usk - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &suiteCnt, 2); - pWapiInfo->wapiIELength +=2; - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; - pWapiInfo->wapiIELength +=1; - -//msk - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); - pWapiInfo->wapiIELength +=3; - pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; - pWapiInfo->wapiIELength +=1; - -//Capbility - memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &capability, 2); - pWapiInfo->wapiIELength +=2; -} - - -/* PN1 > PN2, return 1, - * else return 0. - */ -u32 WapiComparePN(u8 *PN1, u8 *PN2) -{ - char i; - - if ((NULL == PN1) || (NULL == PN2)) - return 1; - - // overflow case - if ((PN2[15] - PN1[15]) & 0x80) - return 1; - - for (i=16; i>0; i--) - { - if(PN1[i-1] == PN2[i-1]) - continue; - else if(PN1[i-1] > PN2[i-1]) - return 1; - else - return 0; - } - - return 0; -} - -u8 -WapiGetEntryForCamWrite(_adapter *padapter,u8 *pMacAddr,u8 KID,BOOLEAN IsMsk) -{ - PRT_WAPI_T pWapiInfo=NULL; - //PRT_WAPI_CAM_ENTRY pEntry=NULL; - u8 i=0; - u8 ret = 0xff; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - //exist? - for(i=0;iwapiCamEntry[i].IsUsed - && (_rtw_memcmp(pMacAddr, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) - && pWapiInfo->wapiCamEntry[i].keyidx == KID - && pWapiInfo->wapiCamEntry[i].type == IsMsk) - { - ret = pWapiInfo->wapiCamEntry[i].entry_idx; //cover it - break; - } - } - - if(i == WAPI_CAM_ENTRY_NUM) //not found - { - for(i=0;iwapiCamEntry[i].IsUsed == 0) - { - pWapiInfo->wapiCamEntry[i].IsUsed = 1; - pWapiInfo->wapiCamEntry[i].type = IsMsk; - pWapiInfo->wapiCamEntry[i].keyidx = KID; - _rtw_memcpy(pWapiInfo->wapiCamEntry[i].PeerMacAddr, pMacAddr,ETH_ALEN); - ret = pWapiInfo->wapiCamEntry[i].entry_idx; - break; - } - } - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - return ret; - -/* - if(RTIsListEmpty(&pWapiInfo->wapiCamIdleList)){ - RT_TRACE(COMP_SEC,DBG_LOUD,("No Entry for wapi!!!\n")); - return 0; - } - - pEntry = (PRT_WAPI_CAM_ENTRY)RTRemoveHeadList(&pWapiInfo->wapiCamIdleList); - RTInsertTailList(&pWapiInfo->wapiCamUsedList, &pEntry->list); - - RT_TRACE(COMP_SEC,DBG_LOUD,("<====WapiGetCamEntry(),Get Entry Idx:%d.but we just return 4 for test\n",pEntry->entry_idx)); - - return pEntry->entry_idx;*/ -} - -u8 WapiGetEntryForCamClear(_adapter *padapter,u8 *pPeerMac,u8 keyid,u8 IsMsk) -{ - PRT_WAPI_T pWapiInfo=NULL; - u8 i=0; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - for(i=0;iwapiCamEntry[i].IsUsed - && (_rtw_memcmp(pPeerMac, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) - && pWapiInfo->wapiCamEntry[i].keyidx == keyid - && pWapiInfo->wapiCamEntry[i].type == IsMsk) - { - pWapiInfo->wapiCamEntry[i].IsUsed = 0; - pWapiInfo->wapiCamEntry[i].keyidx = 2; - _rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr,0,ETH_ALEN); - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - return pWapiInfo->wapiCamEntry[i].entry_idx; - } - } - - WAPI_TRACE(WAPI_API,"<====WapiGetReturnCamEntry(), No this cam entry.\n"); - return 0xff; -/* - if(RTIsListEmpty(&pWapiInfo->wapiCamUsedList)){ - RT_TRACE(COMP_SEC,DBG_LOUD,("No Entry for wapi!!!\n")); - return FALSE; - } - - pList = &pWapiInfo->wapiCamUsedList; - while(pList->Flink != &pWapiInfo->wapiCamUsedList) - { - pEntry = (PRT_WAPI_CAM_ENTRY)pList->Flink; - if(PlatformCompareMemory(pPeerMac,pEntry->PeerMacAddr, ETHER_ADDRLEN)== 0 - && keyid == pEntry->keyidx) - { - RTRemoveEntryList(pList); - RTInsertHeadList(&pWapiInfo->wapiCamIdleList, pList); - return pEntry->entry_idx; - } - pList = pList->Flink; - } - - return 0; -*/ -} - -void -WapiResetAllCamEntry(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - int i; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - for (i=0;iwapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN); - pWapiInfo->wapiCamEntry[i].IsUsed = 0; - pWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid - pWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2; - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - - return; -} - -u8 WapiWriteOneCamEntry( - _adapter *padapter, - u8 *pMacAddr, - u8 KeyId, - u8 EntryId, - u8 EncAlg, - u8 bGroupKey, - u8 *pKey -) -{ - u8 retVal = 0; - u16 usConfig = 0; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if(EntryId >= 32) - { - WAPI_TRACE(WAPI_ERR, "<=== CamAddOneEntry(): ulKeyId exceed!\n"); - return retVal; - } - - usConfig=usConfig|(0x01<<15)|((u16)(EncAlg)<<2)|(KeyId); - - if(EncAlg == _SMS4_ ) - { - if(bGroupKey == 1) - usConfig |= (0x01<<6); - if((EntryId % 2)==1) // ==0 sec key; == 1mic key - usConfig |= (0x01<<5); - } - - write_cam(padapter, EntryId, usConfig, pMacAddr, pKey); - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - return 1; -} - -void rtw_wapi_init(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - int i; - - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - RT_ASSERT_RET(padapter); - - if (!padapter->WapiSupport) - { - WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - pWapiInfo = &padapter->wapiInfo; - pWapiInfo->bWapiEnable = false; - - //Init BKID List - INIT_LIST_HEAD(&pWapiInfo->wapiBKIDIdleList); - INIT_LIST_HEAD(&pWapiInfo->wapiBKIDStoreList); - for(i=0;iwapiBKID[i].list, &pWapiInfo->wapiBKIDIdleList); - } - - //Init STA List - INIT_LIST_HEAD(&pWapiInfo->wapiSTAIdleList); - INIT_LIST_HEAD(&pWapiInfo->wapiSTAUsedList); - for(i=0;iwapiSta[i].list, &pWapiInfo->wapiSTAIdleList); - } - - for (i=0;iwapiCamEntry[i].IsUsed = 0; - pWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid - pWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2; - } - - WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_free(_adapter *padapter) -{ - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - RT_ASSERT_RET(padapter); - - if (!padapter->WapiSupport) - { - WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiFreeAllStaInfo(padapter); - - WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_disable_tx(_adapter *padapter) -{ - WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); - RT_ASSERT_RET(padapter); - - if (!padapter->WapiSupport) - { - WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - padapter->wapiInfo.wapiTxMsk.bTxEnable = false; - padapter->wapiInfo.wapiTxMsk.bSet = false; - - WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); -} - -u8 rtw_wapi_is_wai_packet(_adapter* padapter,u8 *pkt_data) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 WaiPkt = 0, *pTaddr, bFind = false; - u8 Offset_TypeWAI = 0 ; // (mac header len + llc length) - - WAPI_TRACE(WAPI_TX|WAPI_RX, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return 0; - } - - Offset_TypeWAI = 24 + 6 ; - - //YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4. - if ((pkt_data[1]&0x40) !=0) - { - DBG_871X("data is privacy \n"); - return 0; - } - - pTaddr = GetAddr2Ptr(pkt_data); - if(list_empty(&pWapiInfo->wapiSTAUsedList)){ - bFind = false; - }else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ - if (_rtw_memcmp(pTaddr, pWapiSta->PeerMacAddr, 6) == _TRUE) { - bFind = true; - break; - } - } - } - - WAPI_TRACE(WAPI_TX|WAPI_RX, "%s: bFind=%d pTaddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(pTaddr)); - - if (pkt_data[0] == WIFI_QOS_DATA_TYPE) - { - Offset_TypeWAI += 2; - } - - // 88b4? - if( (pkt_data[Offset_TypeWAI]==0x88) && (pkt_data[Offset_TypeWAI+1]==0xb4) ){ - WaiPkt = pkt_data[Offset_TypeWAI+5]; - - psecuritypriv->hw_decrypted = _TRUE; - }else{ - WAPI_TRACE(WAPI_TX|WAPI_RX, "%s(): non wai packet\n",__FUNCTION__); - } - - WAPI_TRACE(WAPI_TX|WAPI_RX, "%s(): Recvd WAI frame. IsWAIPkt(%d)\n",__FUNCTION__, WaiPkt); - - return WaiPkt; -} - - -void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - struct recv_frame_hdr *precv_hdr; - u8 *ptr; - u8 *pTA; - u8 *pRecvPN; - - - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - precv_hdr = &precv_frame->u.hdr; - ptr = precv_hdr->rx_data; - - if (precv_hdr->attrib.qos == 1) - { - precv_hdr->UserPriority = GetTid(ptr); - } - else - { - precv_hdr->UserPriority = 0; - } - - pTA = GetAddr2Ptr(ptr); - _rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6); - pRecvPN = ptr + precv_hdr->attrib.hdrlen + 2; - _rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16); - - WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); -} - -/**************************************************************************** -TRUE-----------------Drop -FALSE---------------- handle -add to support WAPI to N-mode -*****************************************************************************/ -u8 rtw_wapi_check_for_drop( - _adapter *padapter, - union recv_frame *precv_frame -) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 *pLastRecvPN = NULL; - u8 bFind = false; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 bDrop = false; - struct recv_frame_hdr *precv_hdr = &precv_frame->u.hdr; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 *ptr = precv_frame->u.hdr.rx_data; - int i; - - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return false; - } - - if(precv_hdr->bIsWaiPacket !=0) - { - if(precv_hdr->bIsWaiPacket== 0x8) - { - - DBG_871X("rtw_wapi_check_for_drop: dump packet \n"); - for(i=0;i<50;i++) - { - DBG_871X("%02X ",ptr[i]); - if((i+1) %8 ==0) - DBG_871X("\n"); - } - DBG_871X("\n rtw_wapi_check_for_drop: dump packet \n"); - - for(i=0;i<16;i++) - { - if(ptr[i+27] !=0) - break; - } - - if(i== 16) - { - WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: drop with zero BKID \n"); - return true; - } - else - { - return false; - } - } - else - return false; - } - - if(list_empty(&pWapiInfo->wapiSTAUsedList)){ - bFind = false; - }else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if (_rtw_memcmp(precv_hdr->WapiSrcAddr, pWapiSta->PeerMacAddr, ETH_ALEN) == _TRUE) { - bFind = true; - break; - } - } - } - WAPI_TRACE(WAPI_RX, "%s: bFind=%d prxb->WapiSrcAddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(precv_hdr->WapiSrcAddr)); - - if(bFind) - { - if(IS_MCAST(precv_hdr->attrib.ra)) - { - WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: multicast case \n"); - pLastRecvPN = pWapiSta->lastRxMulticastPN; - } - else - { - WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: unicast case \n"); - switch(precv_hdr->UserPriority) - { - case 0: - case 3: - pLastRecvPN = pWapiSta->lastRxUnicastPNBEQueue; - break; - case 1: - case 2: - pLastRecvPN = pWapiSta->lastRxUnicastPNBKQueue; - break; - case 4: - case 5: - pLastRecvPN = pWapiSta->lastRxUnicastPNVIQueue; - break; - case 6: - case 7: - pLastRecvPN = pWapiSta->lastRxUnicastPNVOQueue; - break; - default: - WAPI_TRACE(WAPI_ERR,"%s: Unknown TID \n",__FUNCTION__); - break; - } - } - - if(!WapiComparePN(precv_hdr->WapiTempPN,pLastRecvPN)) - { - WAPI_TRACE(WAPI_RX,"%s: Equal PN!!\n",__FUNCTION__); - if(IS_MCAST(precv_hdr->attrib.ra)) - _rtw_memcpy(pLastRecvPN,WapiAEMultiCastPNInitialValueSrc,16); - else - _rtw_memcpy(pLastRecvPN,WapiAEPNInitialValueSrc,16); - bDrop = true; - } - else - { - _rtw_memcpy(pLastRecvPN,precv_hdr->WapiTempPN,16); - } - } - - WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); - return bDrop; -} - -void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 WapiIELength = 0; - - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiSetIE(padapter); - WapiIELength = pWapiInfo->wapiIELength; - pframe[0] = _WAPI_IE_; - pframe[1] = WapiIELength; - _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); - pframe += WapiIELength+2; - pattrib->pktlen += WapiIELength+2; - - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - -void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 WapiIELength = 0; - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiSetIE(padapter); - WapiIELength = pWapiInfo->wapiIELength; - pframe[0] = _WAPI_IE_; - pframe[1] = WapiIELength; - _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); - pframe += WapiIELength+2; - pattrib->pktlen += WapiIELength+2; - - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - -void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) -{ - PRT_WAPI_BKID pWapiBKID; - u16 bkidNum; - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - u8 WapiIELength = 0; - - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); - return; - } - - WapiSetIE(padapter); - WapiIELength = pWapiInfo->wapiIELength; - bkidNum = 0; - if(!list_empty(&(pWapiInfo->wapiBKIDStoreList))){ - list_for_each_entry(pWapiBKID, &pWapiInfo->wapiBKIDStoreList, list) { - bkidNum ++; - _rtw_memcpy(pWapiInfo->wapiIE+WapiIELength+2, pWapiBKID->bkid,16); - WapiIELength += 16; - } - } - _rtw_memcpy(pWapiInfo->wapiIE+WapiIELength, &bkidNum, 2); - WapiIELength += 2; - - pframe[0] = _WAPI_IE_; - pframe[1] = WapiIELength; - _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); - pframe += WapiIELength+2; - pattrib->pktlen += WapiIELength+2; - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -{ - PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); - PRT_WAPI_STA_INFO pWapiSta; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - //u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - - WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - pWapiSta =(PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); - list_del_init(&pWapiSta->list); - list_add_tail(&pWapiSta->list, &pWapiInfo->wapiSTAUsedList); - _rtw_memcpy(pWapiSta->PeerMacAddr,padapter->mlmeextpriv.mlmext_info.network.MacAddress,6); - _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); - _rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16); - - //For chenk PN error with Qos Data after s3: add by ylb 20111114 - _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16); - - WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); -} - - -void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr) -{ - PRT_WAPI_T pWapiInfo; - PRT_WAPI_STA_INFO pWapiStaInfo = NULL; - PRT_WAPI_BKID pWapiBkid = NULL; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - pWapiInfo = &padapter->wapiInfo; - - WAPI_TRACE(WAPI_API, "==========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)) - { - while(!list_empty(&(pWapiInfo->wapiBKIDStoreList))) - { - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - _rtw_memset(pWapiBkid->bkid,0,16); - list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); - } - } - - - WAPI_TRACE(WAPI_API, " %s: after clear bkid \n", __FUNCTION__); - - - //Remove STA info - if(list_empty(&(pWapiInfo->wapiSTAUsedList))){ - WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is null \n", __FUNCTION__); - return; - }else{ - - WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is not null \n", __FUNCTION__); -#if 0 - pWapiStaInfo=(PRT_WAPI_STA_INFO)list_entry((pWapiInfo->wapiSTAUsedList.next),RT_WAPI_STA_INFO,list); - - list_for_each_entry(pWapiStaInfo, &(pWapiInfo->wapiSTAUsedList), list) { - - DBG_871X("MAC Addr %02x-%02x-%02x-%02x-%02x-%02x \n",MacAddr[0],MacAddr[1],MacAddr[2],MacAddr[3],MacAddr[4],MacAddr[5]); - - - DBG_871X("peer Addr %02x-%02x-%02x-%02x-%02x-%02x \n",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]); - - if(pWapiStaInfo == NULL) - { - WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo == NULL Case \n", __FUNCTION__); - return; - } - - if(pWapiStaInfo->PeerMacAddr == NULL) - { - WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo->PeerMacAddr == NULL Case \n", __FUNCTION__); - return; - } - - if(MacAddr == NULL) - { - WAPI_TRACE(WAPI_API, " %s: MacAddr == NULL Case \n", __FUNCTION__); - return; - } - - if (_rtw_memcmp(pWapiStaInfo->PeerMacAddr, MacAddr, ETH_ALEN) == _TRUE) { - pWapiStaInfo->bAuthenticateInProgress = false; - pWapiStaInfo->bSetkeyOk = false; - _rtw_memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); - list_del_init(&pWapiStaInfo->list); - list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); - break; - } - - } -#endif - - while(!list_empty(&(pWapiInfo->wapiSTAUsedList))) - { - pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); - - DBG_871X("peer Addr %02x-%02x-%02x-%02x-%02x-%02x \n",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]); - - list_del_init(&pWapiStaInfo->list); - memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); - pWapiStaInfo->bSetkeyOk = 0; - list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); - } - - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); - return; -} - -void rtw_wapi_return_all_sta_info(_adapter *padapter) -{ - PRT_WAPI_T pWapiInfo; - PRT_WAPI_STA_INFO pWapiStaInfo; - PRT_WAPI_BKID pWapiBkid; - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - pWapiInfo = &padapter->wapiInfo; - - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - //Sta Info List - while(!list_empty(&(pWapiInfo->wapiSTAUsedList))) - { - pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); - list_del_init(&pWapiStaInfo->list); - memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); - pWapiStaInfo->bSetkeyOk = 0; - list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); - } - - //BKID List - while(!list_empty(&(pWapiInfo->wapiBKIDStoreList))) - { - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - memset(pWapiBkid->bkid,0,16); - list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); - } - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr) -{ - u8 UcIndex = 0; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 0); - if(UcIndex != 0xff){ - //CAM_mark_invalid(Adapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 0); - if(UcIndex != 0xff){ - //CAM_mark_invalid(Adapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 1); - if(UcIndex != 0xff){ - //CAM_mark_invalid(Adapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 1); - if(UcIndex != 0xff){ - //CAM_mark_invalid(padapter, UcIndex); - CAM_empty_entry(padapter, UcIndex); - } - - WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); -} - -void rtw_wapi_clear_all_cam_entry(_adapter *padapter) -{ - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - invalidate_cam_all(padapter); // is this ok? - WapiResetAllCamEntry(padapter); - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); -} - -void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - u8 *pMacAddr = pWapiSta->PeerMacAddr; - u32 EntryId = 0; - BOOLEAN IsPairWise = false ; - u8 EncAlgo; - - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_API, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); - return; - } - - EncAlgo = _SMS4_; - - //For Tx bc/mc pkt,use defualt key entry - if(bUseDefaultKey) - { - // when WAPI update key, keyid will be 0 or 1 by turns. - if (pWapiKey->keyId == 0) - EntryId = 0; - else - EntryId = 2; - } - else - { - // tx/rx unicast pkt, or rx broadcast, find the key entry by peer's MacAddr - EntryId = WapiGetEntryForCamWrite(padapter,pMacAddr,pWapiKey->keyId,bGroupKey); - } - - if(EntryId == 0xff){ - WAPI_TRACE(WAPI_API, "===>No entry for WAPI setkey! !!\n"); - return; - } - - //EntryId is also used to diff Sec key and Mic key - //Sec Key - WapiWriteOneCamEntry(padapter, - pMacAddr, - pWapiKey->keyId, //keyid - EntryId, //entry - EncAlgo, //type - bGroupKey, //pairwise or group key - pWapiKey->dataKey); - //MIC key - WapiWriteOneCamEntry(padapter, - pMacAddr, - pWapiKey->keyId, //keyid - EntryId+1, //entry - EncAlgo, //type - bGroupKey, //pairwise or group key - pWapiKey->micKey); - - WAPI_TRACE(WAPI_API, "Set Wapi Key :KeyId:%d,EntryId:%d,PairwiseKey:%d.\n",pWapiKey->keyId,EntryId,!bGroupKey); - WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); - -} - -#if 0 -//YJ,test,091013 -void wapi_test_set_key(struct _adapter *padapter, u8* buf) -{ /*Data: keyType(1) + bTxEnable(1) + bAuthenticator(1) + bUpdate(1) + PeerAddr(6) + DataKey(16) + MicKey(16) + KeyId(1)*/ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_BKID pWapiBkid; - PRT_WAPI_STA_INFO pWapiSta; - u8 data[43]; - bool bTxEnable; - bool bUpdate; - bool bAuthenticator; - u8 PeerAddr[6]; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - - WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); - - if (!padapter->WapiSupport){ - return; - } - - copy_from_user(data, buf, 43); - bTxEnable = data[1]; - bAuthenticator = data[2]; - bUpdate = data[3]; - memcpy(PeerAddr,data+4,6); - - if(data[0] == 0x3){ - if(!list_empty(&(pWapiInfo->wapiBKIDIdleList))){ - pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); - list_del_init(&pWapiBkid->list); - memcpy(pWapiBkid->bkid, data+10, 16); - WAPI_DATA(WAPI_INIT, "SetKey - BKID", pWapiBkid->bkid, 16); - list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDStoreList); - } - }else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if(!memcmp(pWapiSta->PeerMacAddr,PeerAddr,6)){ - pWapiSta->bAuthenticatorInUpdata = false; - switch(data[0]){ - case 1: //usk - if(bAuthenticator){ //authenticator - memcpy(pWapiSta->lastTxUnicastPN,WapiAEPNInitialValueSrc,16); - if(!bUpdate) { //first - WAPI_TRACE(WAPI_INIT,"AE fisrt set usk \n"); - pWapiSta->wapiUsk.bSet = true; - memcpy(pWapiSta->wapiUsk.dataKey,data+10,16); - memcpy(pWapiSta->wapiUsk.micKey,data+26,16); - pWapiSta->wapiUsk.keyId = *(data+42); - pWapiSta->wapiUsk.bTxEnable = true; - WAPI_DATA(WAPI_INIT, "SetKey - AE USK Data Key", pWapiSta->wapiUsk.dataKey, 16); - WAPI_DATA(WAPI_INIT, "SetKey - AE USK Mic Key", pWapiSta->wapiUsk.micKey, 16); - } - else //update - { - WAPI_TRACE(WAPI_INIT, "AE update usk \n"); - pWapiSta->wapiUskUpdate.bSet = true; - pWapiSta->bAuthenticatorInUpdata = true; - memcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16); - memcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16); - memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16); - pWapiSta->wapiUskUpdate.keyId = *(data+42); - pWapiSta->wapiUskUpdate.bTxEnable = true; - } - } - else{ - if(!bUpdate){ - WAPI_TRACE(WAPI_INIT,"ASUE fisrt set usk \n"); - if(bTxEnable){ - pWapiSta->wapiUsk.bTxEnable = true; - memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); - }else{ - pWapiSta->wapiUsk.bSet = true; - memcpy(pWapiSta->wapiUsk.dataKey,data+10,16); - memcpy(pWapiSta->wapiUsk.micKey,data+26,16); - pWapiSta->wapiUsk.keyId = *(data+42); - pWapiSta->wapiUsk.bTxEnable = false; - } - }else{ - WAPI_TRACE(WAPI_INIT,"ASUE update usk \n"); - if(bTxEnable){ - pWapiSta->wapiUskUpdate.bTxEnable = true; - if(pWapiSta->wapiUskUpdate.bSet){ - memcpy(pWapiSta->wapiUsk.dataKey,pWapiSta->wapiUskUpdate.dataKey,16); - memcpy(pWapiSta->wapiUsk.micKey,pWapiSta->wapiUskUpdate.micKey,16); - pWapiSta->wapiUsk.keyId=pWapiSta->wapiUskUpdate.keyId; - memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16); - memcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16); - pWapiSta->wapiUskUpdate.bTxEnable = false; - pWapiSta->wapiUskUpdate.bSet = false; - } - memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); - }else{ - pWapiSta->wapiUskUpdate.bSet = true; - memcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16); - memcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16); - pWapiSta->wapiUskUpdate.keyId = *(data+42); - pWapiSta->wapiUskUpdate.bTxEnable = false; - } - } - } - break; - case 2: //msk - if(bAuthenticator){ //authenticator - pWapiInfo->wapiTxMsk.bSet = true; - memcpy(pWapiInfo->wapiTxMsk.dataKey,data+10,16); - memcpy(pWapiInfo->wapiTxMsk.micKey,data+26,16); - pWapiInfo->wapiTxMsk.keyId = *(data+42); - pWapiInfo->wapiTxMsk.bTxEnable = true; - memcpy(pWapiInfo->lastTxMulticastPN,WapiAEMultiCastPNInitialValueSrc,16); - - if(!bUpdate){ //first - WAPI_TRACE(WAPI_INIT, "AE fisrt set msk \n"); - if(!pWapiSta->bSetkeyOk) - pWapiSta->bSetkeyOk = true; - pWapiInfo->bFirstAuthentiateInProgress= false; - }else{ //update - WAPI_TRACE(WAPI_INIT,"AE update msk \n"); - } - - WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Data Key", pWapiInfo->wapiTxMsk.dataKey, 16); - WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Mic Key", pWapiInfo->wapiTxMsk.micKey, 16); - } - else{ - if(!bUpdate){ - WAPI_TRACE(WAPI_INIT,"ASUE fisrt set msk \n"); - pWapiSta->wapiMsk.bSet = true; - memcpy(pWapiSta->wapiMsk.dataKey,data+10,16); - memcpy(pWapiSta->wapiMsk.micKey,data+26,16); - pWapiSta->wapiMsk.keyId = *(data+42); - pWapiSta->wapiMsk.bTxEnable = false; - if(!pWapiSta->bSetkeyOk) - pWapiSta->bSetkeyOk = true; - pWapiInfo->bFirstAuthentiateInProgress= false; - WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Data Key", pWapiSta->wapiMsk.dataKey, 16); - WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Mic Key", pWapiSta->wapiMsk.micKey, 16); - }else{ - WAPI_TRACE(WAPI_INIT,"ASUE update msk \n"); - pWapiSta->wapiMskUpdate.bSet = true; - memcpy(pWapiSta->wapiMskUpdate.dataKey,data+10,16); - memcpy(pWapiSta->wapiMskUpdate.micKey,data+26,16); - pWapiSta->wapiMskUpdate.keyId = *(data+42); - pWapiSta->wapiMskUpdate.bTxEnable = false; - } - } - break; - default: - WAPI_TRACE(WAPI_ERR,"Unknown Flag \n"); - break; - } - } - } - } - WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); -} - - -void wapi_test_init(struct _adapter *padapter) -{ - u8 keybuf[100]; - u8 mac_addr[6]={0x00,0xe0,0x4c,0x72,0x04,0x70}; - u8 UskDataKey[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; - u8 UskMicKey[16]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f}; - u8 UskId = 0; - u8 MskDataKey[16]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f}; - u8 MskMicKey[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f}; - u8 MskId = 0; - - WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); - - //Enable Wapi - WAPI_TRACE(WAPI_INIT, "%s: Enable wapi!!!!\n", __FUNCTION__); - padapter->wapiInfo.bWapiEnable = true; - padapter->pairwise_key_type = KEY_TYPE_SMS4; - ieee->group_key_type = KEY_TYPE_SMS4; - padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; - padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; - - //set usk - WAPI_TRACE(WAPI_INIT, "%s: Set USK!!!!\n", __FUNCTION__); - memset(keybuf,0,100); - keybuf[0] = 1; //set usk - keybuf[1] = 1; //enable tx - keybuf[2] = 1; //AE - keybuf[3] = 0; //not update - - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,UskDataKey,16); - memcpy(keybuf+26,UskMicKey,16); - keybuf[42]=UskId; - wapi_test_set_key(padapter, keybuf); - - memset(keybuf,0,100); - keybuf[0] = 1; //set usk - keybuf[1] = 1; //enable tx - keybuf[2] = 0; //AE - keybuf[3] = 0; //not update - - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,UskDataKey,16); - memcpy(keybuf+26,UskMicKey,16); - keybuf[42]=UskId; - wapi_test_set_key(padapter, keybuf); - - //set msk - WAPI_TRACE(WAPI_INIT, "%s: Set MSK!!!!\n", __FUNCTION__); - memset(keybuf,0,100); - keybuf[0] = 2; //set msk - keybuf[1] = 1; //Enable TX - keybuf[2] = 1; //AE - keybuf[3] = 0; //not update - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,MskDataKey,16); - memcpy(keybuf+26,MskMicKey,16); - keybuf[42] = MskId; - wapi_test_set_key(padapter, keybuf); - - memset(keybuf,0,100); - keybuf[0] = 2; //set msk - keybuf[1] = 1; //Enable TX - keybuf[2] = 0; //AE - keybuf[3] = 0; //not update - memcpy(keybuf+4,mac_addr,6); - memcpy(keybuf+10,MskDataKey,16); - memcpy(keybuf+26,MskMicKey,16); - keybuf[42] = MskId; - wapi_test_set_key(padapter, keybuf); - WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); -} -#endif - -void rtw_wapi_get_iv(_adapter *padapter,u8 *pRA, u8*IV) -{ - PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - bool bPNOverflow = false; - bool bFindMatchPeer = false; - PRT_WAPI_STA_INFO pWapiSta = NULL; - - pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)IV; - - WAPI_DATA(WAPI_RX,"wapi_get_iv: pra",pRA,6); - - if(IS_MCAST(pRA)){ - if(!pWapiInfo->wapiTxMsk.bTxEnable){ - WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); - return; - } - - if(pWapiInfo->wapiTxMsk.keyId <= 1){ - pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); - memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); - } - } - else - { - if(list_empty(&pWapiInfo->wapiSTAUsedList)){ - WAPI_TRACE(WAPI_RX,"rtw_wapi_get_iv: list is empty \n"); - _rtw_memset(IV,10,18); - return; - } - else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ - WAPI_DATA(WAPI_RX,"rtw_wapi_get_iv: peermacaddr ",pWapiSta->PeerMacAddr,6); - if (_rtw_memcmp((u8*)pWapiSta->PeerMacAddr, pRA, 6) == _TRUE) { - bFindMatchPeer = true; - break; - } - } - - WAPI_TRACE(WAPI_RX,"bFindMatchPeer: %d \n",bFindMatchPeer); - WAPI_DATA(WAPI_RX,"Addr",pRA,6); - - if (bFindMatchPeer){ - if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)) - return; - - if (pWapiSta->wapiUsk.keyId <= 1){ - if(pWapiSta->wapiUskUpdate.bTxEnable) - pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; - else - pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; - - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); - _rtw_memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); - - } - } - } - - } - -} - -bool rtw_wapi_drop_for_key_absent(_adapter *padapter,u8 *pRA) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - bool bFindMatchPeer = false; - bool bDrop = false; - PRT_WAPI_STA_INFO pWapiSta = NULL; - struct security_priv *psecuritypriv = &padapter->securitypriv; - - WAPI_DATA(WAPI_RX,"rtw_wapi_drop_for_key_absent: ra ",pRA,6); - - if(psecuritypriv->dot11PrivacyAlgrthm == _SMS4_) - { - if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) - return true; - - if(IS_MCAST(pRA)){ - if(!pWapiInfo->wapiTxMsk.bTxEnable){ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: multicast key is absent \n"); - return bDrop; - } - } - else{ - if(!list_empty(&pWapiInfo->wapiSTAUsedList)){ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ - WAPI_DATA(WAPI_RX,"rtw_wapi_drop_for_key_absent: pWapiSta->PeerMacAddr ",pWapiSta->PeerMacAddr,6); - if (_rtw_memcmp(pRA, pWapiSta->PeerMacAddr, 6) == _TRUE){ - bFindMatchPeer = true; - break; - } - } - if (bFindMatchPeer) { - if (!pWapiSta->wapiUsk.bTxEnable){ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: unicast key is absent \n"); - return bDrop; - } - } - else{ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: no peer find \n"); - return bDrop; - } - - } - else{ - bDrop = true; - WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: no sta exist \n"); - return bDrop; - } - } - } - else - { - return bDrop; - } - - return bDrop; -} - -#endif +#ifdef CONFIG_WAPI_SUPPORT + +#include +#include +#include +#include + + +u32 wapi_debug_component = +// WAPI_INIT | +// WAPI_API | +// WAPI_TX | +// WAPI_RX | + WAPI_ERR ; //always open err flags on + +void WapiFreeAllStaInfo(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + PRT_WAPI_STA_INFO pWapiStaInfo; + PRT_WAPI_BKID pWapiBkid; + + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + pWapiInfo = &padapter->wapiInfo; + + //Pust to Idle List + rtw_wapi_return_all_sta_info(padapter); + + //Sta Info List + while(!list_empty(&(pWapiInfo->wapiSTAIdleList))) + { + pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); + list_del_init(&pWapiStaInfo->list); + } + + //BKID List + while(!list_empty(&(pWapiInfo->wapiBKIDIdleList))) + { + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + } + WAPI_TRACE(WAPI_INIT, "<=========== %s\n", __FUNCTION__); + return; +} + +void WapiSetIE(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + //PRT_WAPI_BKID pWapiBkid; + u16 protocolVer = 1; + u16 akmCnt = 1; + u16 suiteCnt = 1; + u16 capability = 0; + u8 OUI[3]; + + OUI[0] = 0x00; + OUI[1] = 0x14; + OUI[2] = 0x72; + + pWapiInfo->wapiIELength = 0; +//protocol version + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &protocolVer, 2); + pWapiInfo->wapiIELength +=2; +//akm + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &akmCnt, 2); + pWapiInfo->wapiIELength +=2; + + if(pWapiInfo->bWapiPSK){ + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); + pWapiInfo->wapiIELength +=3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x2; + pWapiInfo->wapiIELength +=1; + }else{ + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); + pWapiInfo->wapiIELength +=3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; + pWapiInfo->wapiIELength +=1; + } + +//usk + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &suiteCnt, 2); + pWapiInfo->wapiIELength +=2; + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); + pWapiInfo->wapiIELength +=3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; + pWapiInfo->wapiIELength +=1; + +//msk + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3); + pWapiInfo->wapiIELength +=3; + pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1; + pWapiInfo->wapiIELength +=1; + +//Capbility + memcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &capability, 2); + pWapiInfo->wapiIELength +=2; +} + + +/* PN1 > PN2, return 1, + * else return 0. + */ +u32 WapiComparePN(u8 *PN1, u8 *PN2) +{ + char i; + + if ((NULL == PN1) || (NULL == PN2)) + return 1; + + // overflow case + if ((PN2[15] - PN1[15]) & 0x80) + return 1; + + for (i=16; i>0; i--) + { + if(PN1[i-1] == PN2[i-1]) + continue; + else if(PN1[i-1] > PN2[i-1]) + return 1; + else + return 0; + } + + return 0; +} + +u8 +WapiGetEntryForCamWrite(_adapter *padapter,u8 *pMacAddr,u8 KID,BOOLEAN IsMsk) +{ + PRT_WAPI_T pWapiInfo=NULL; + //PRT_WAPI_CAM_ENTRY pEntry=NULL; + u8 i=0; + u8 ret = 0xff; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + //exist? + for(i=0;iwapiCamEntry[i].IsUsed + && (_rtw_memcmp(pMacAddr, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) + && pWapiInfo->wapiCamEntry[i].keyidx == KID + && pWapiInfo->wapiCamEntry[i].type == IsMsk) + { + ret = pWapiInfo->wapiCamEntry[i].entry_idx; //cover it + break; + } + } + + if(i == WAPI_CAM_ENTRY_NUM) //not found + { + for(i=0;iwapiCamEntry[i].IsUsed == 0) + { + pWapiInfo->wapiCamEntry[i].IsUsed = 1; + pWapiInfo->wapiCamEntry[i].type = IsMsk; + pWapiInfo->wapiCamEntry[i].keyidx = KID; + _rtw_memcpy(pWapiInfo->wapiCamEntry[i].PeerMacAddr, pMacAddr,ETH_ALEN); + ret = pWapiInfo->wapiCamEntry[i].entry_idx; + break; + } + } + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + return ret; + +/* + if(RTIsListEmpty(&pWapiInfo->wapiCamIdleList)){ + RT_TRACE(COMP_SEC,DBG_LOUD,("No Entry for wapi!!!\n")); + return 0; + } + + pEntry = (PRT_WAPI_CAM_ENTRY)RTRemoveHeadList(&pWapiInfo->wapiCamIdleList); + RTInsertTailList(&pWapiInfo->wapiCamUsedList, &pEntry->list); + + RT_TRACE(COMP_SEC,DBG_LOUD,("<====WapiGetCamEntry(),Get Entry Idx:%d.but we just return 4 for test\n",pEntry->entry_idx)); + + return pEntry->entry_idx;*/ +} + +u8 WapiGetEntryForCamClear(_adapter *padapter,u8 *pPeerMac,u8 keyid,u8 IsMsk) +{ + PRT_WAPI_T pWapiInfo=NULL; + u8 i=0; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + for(i=0;iwapiCamEntry[i].IsUsed + && (_rtw_memcmp(pPeerMac, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE) + && pWapiInfo->wapiCamEntry[i].keyidx == keyid + && pWapiInfo->wapiCamEntry[i].type == IsMsk) + { + pWapiInfo->wapiCamEntry[i].IsUsed = 0; + pWapiInfo->wapiCamEntry[i].keyidx = 2; + _rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr,0,ETH_ALEN); + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + return pWapiInfo->wapiCamEntry[i].entry_idx; + } + } + + WAPI_TRACE(WAPI_API,"<====WapiGetReturnCamEntry(), No this cam entry.\n"); + return 0xff; +/* + if(RTIsListEmpty(&pWapiInfo->wapiCamUsedList)){ + RT_TRACE(COMP_SEC,DBG_LOUD,("No Entry for wapi!!!\n")); + return FALSE; + } + + pList = &pWapiInfo->wapiCamUsedList; + while(pList->Flink != &pWapiInfo->wapiCamUsedList) + { + pEntry = (PRT_WAPI_CAM_ENTRY)pList->Flink; + if(PlatformCompareMemory(pPeerMac,pEntry->PeerMacAddr, ETHER_ADDRLEN)== 0 + && keyid == pEntry->keyidx) + { + RTRemoveEntryList(pList); + RTInsertHeadList(&pWapiInfo->wapiCamIdleList, pList); + return pEntry->entry_idx; + } + pList = pList->Flink; + } + + return 0; +*/ +} + +void +WapiResetAllCamEntry(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + int i; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + for (i=0;iwapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN); + pWapiInfo->wapiCamEntry[i].IsUsed = 0; + pWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid + pWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2; + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + + return; +} + +u8 WapiWriteOneCamEntry( + _adapter *padapter, + u8 *pMacAddr, + u8 KeyId, + u8 EntryId, + u8 EncAlg, + u8 bGroupKey, + u8 *pKey +) +{ + u8 retVal = 0; + u16 usConfig = 0; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if(EntryId >= 32) + { + WAPI_TRACE(WAPI_ERR, "<=== CamAddOneEntry(): ulKeyId exceed!\n"); + return retVal; + } + + usConfig=usConfig|(0x01<<15)|((u16)(EncAlg)<<2)|(KeyId); + + if(EncAlg == _SMS4_ ) + { + if(bGroupKey == 1) + usConfig |= (0x01<<6); + if((EntryId % 2)==1) // ==0 sec key; == 1mic key + usConfig |= (0x01<<5); + } + + write_cam(padapter, EntryId, usConfig, pMacAddr, pKey); + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + return 1; +} + +void rtw_wapi_init(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + int i; + + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + RT_ASSERT_RET(padapter); + + if (!padapter->WapiSupport) + { + WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + pWapiInfo = &padapter->wapiInfo; + pWapiInfo->bWapiEnable = false; + + //Init BKID List + INIT_LIST_HEAD(&pWapiInfo->wapiBKIDIdleList); + INIT_LIST_HEAD(&pWapiInfo->wapiBKIDStoreList); + for(i=0;iwapiBKID[i].list, &pWapiInfo->wapiBKIDIdleList); + } + + //Init STA List + INIT_LIST_HEAD(&pWapiInfo->wapiSTAIdleList); + INIT_LIST_HEAD(&pWapiInfo->wapiSTAUsedList); + for(i=0;iwapiSta[i].list, &pWapiInfo->wapiSTAIdleList); + } + + for (i=0;iwapiCamEntry[i].IsUsed = 0; + pWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid + pWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2; + } + + WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_free(_adapter *padapter) +{ + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + RT_ASSERT_RET(padapter); + + if (!padapter->WapiSupport) + { + WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiFreeAllStaInfo(padapter); + + WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_disable_tx(_adapter *padapter) +{ + WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__); + RT_ASSERT_RET(padapter); + + if (!padapter->WapiSupport) + { + WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + padapter->wapiInfo.wapiTxMsk.bTxEnable = false; + padapter->wapiInfo.wapiTxMsk.bSet = false; + + WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__); +} + +u8 rtw_wapi_is_wai_packet(_adapter* padapter,u8 *pkt_data) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 WaiPkt = 0, *pTaddr, bFind = false; + u8 Offset_TypeWAI = 0 ; // (mac header len + llc length) + + WAPI_TRACE(WAPI_TX|WAPI_RX, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return 0; + } + + Offset_TypeWAI = 24 + 6 ; + + //YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4. + if ((pkt_data[1]&0x40) !=0) + { + DBG_871X("data is privacy \n"); + return 0; + } + + pTaddr = GetAddr2Ptr(pkt_data); + if(list_empty(&pWapiInfo->wapiSTAUsedList)){ + bFind = false; + }else{ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ + if (_rtw_memcmp(pTaddr, pWapiSta->PeerMacAddr, 6) == _TRUE) { + bFind = true; + break; + } + } + } + + WAPI_TRACE(WAPI_TX|WAPI_RX, "%s: bFind=%d pTaddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(pTaddr)); + + if (pkt_data[0] == WIFI_QOS_DATA_TYPE) + { + Offset_TypeWAI += 2; + } + + // 88b4? + if( (pkt_data[Offset_TypeWAI]==0x88) && (pkt_data[Offset_TypeWAI+1]==0xb4) ){ + WaiPkt = pkt_data[Offset_TypeWAI+5]; + + psecuritypriv->hw_decrypted = _TRUE; + }else{ + WAPI_TRACE(WAPI_TX|WAPI_RX, "%s(): non wai packet\n",__FUNCTION__); + } + + WAPI_TRACE(WAPI_TX|WAPI_RX, "%s(): Recvd WAI frame. IsWAIPkt(%d)\n",__FUNCTION__, WaiPkt); + + return WaiPkt; +} + + +void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + struct recv_frame_hdr *precv_hdr; + u8 *ptr; + u8 *pTA; + u8 *pRecvPN; + + + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + precv_hdr = &precv_frame->u.hdr; + ptr = precv_hdr->rx_data; + + if (precv_hdr->attrib.qos == 1) + { + precv_hdr->UserPriority = GetTid(ptr); + } + else + { + precv_hdr->UserPriority = 0; + } + + pTA = GetAddr2Ptr(ptr); + _rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6); + pRecvPN = ptr + precv_hdr->attrib.hdrlen + 2; + _rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16); + + WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); +} + +/**************************************************************************** +TRUE-----------------Drop +FALSE---------------- handle +add to support WAPI to N-mode +*****************************************************************************/ +u8 rtw_wapi_check_for_drop( + _adapter *padapter, + union recv_frame *precv_frame +) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 *pLastRecvPN = NULL; + u8 bFind = false; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 bDrop = false; + struct recv_frame_hdr *precv_hdr = &precv_frame->u.hdr; + u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 *ptr = precv_frame->u.hdr.rx_data; + int i; + + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return false; + } + + if(precv_hdr->bIsWaiPacket !=0) + { + if(precv_hdr->bIsWaiPacket== 0x8) + { + + DBG_871X("rtw_wapi_check_for_drop: dump packet \n"); + for(i=0;i<50;i++) + { + DBG_871X("%02X ",ptr[i]); + if((i+1) %8 ==0) + DBG_871X("\n"); + } + DBG_871X("\n rtw_wapi_check_for_drop: dump packet \n"); + + for(i=0;i<16;i++) + { + if(ptr[i+27] !=0) + break; + } + + if(i== 16) + { + WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: drop with zero BKID \n"); + return true; + } + else + { + return false; + } + } + else + return false; + } + + if(list_empty(&pWapiInfo->wapiSTAUsedList)){ + bFind = false; + }else{ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (_rtw_memcmp(precv_hdr->WapiSrcAddr, pWapiSta->PeerMacAddr, ETH_ALEN) == _TRUE) { + bFind = true; + break; + } + } + } + WAPI_TRACE(WAPI_RX, "%s: bFind=%d prxb->WapiSrcAddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(precv_hdr->WapiSrcAddr)); + + if(bFind) + { + if(IS_MCAST(precv_hdr->attrib.ra)) + { + WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: multicast case \n"); + pLastRecvPN = pWapiSta->lastRxMulticastPN; + } + else + { + WAPI_TRACE(WAPI_RX,"rtw_wapi_check_for_drop: unicast case \n"); + switch(precv_hdr->UserPriority) + { + case 0: + case 3: + pLastRecvPN = pWapiSta->lastRxUnicastPNBEQueue; + break; + case 1: + case 2: + pLastRecvPN = pWapiSta->lastRxUnicastPNBKQueue; + break; + case 4: + case 5: + pLastRecvPN = pWapiSta->lastRxUnicastPNVIQueue; + break; + case 6: + case 7: + pLastRecvPN = pWapiSta->lastRxUnicastPNVOQueue; + break; + default: + WAPI_TRACE(WAPI_ERR,"%s: Unknown TID \n",__FUNCTION__); + break; + } + } + + if(!WapiComparePN(precv_hdr->WapiTempPN,pLastRecvPN)) + { + WAPI_TRACE(WAPI_RX,"%s: Equal PN!!\n",__FUNCTION__); + if(IS_MCAST(precv_hdr->attrib.ra)) + _rtw_memcpy(pLastRecvPN,WapiAEMultiCastPNInitialValueSrc,16); + else + _rtw_memcpy(pLastRecvPN,WapiAEPNInitialValueSrc,16); + bDrop = true; + } + else + { + _rtw_memcpy(pLastRecvPN,precv_hdr->WapiTempPN,16); + } + } + + WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__); + return bDrop; +} + +void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 WapiIELength = 0; + + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiSetIE(padapter); + WapiIELength = pWapiInfo->wapiIELength; + pframe[0] = _WAPI_IE_; + pframe[1] = WapiIELength; + _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); + pframe += WapiIELength+2; + pattrib->pktlen += WapiIELength+2; + + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + +void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 WapiIELength = 0; + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiSetIE(padapter); + WapiIELength = pWapiInfo->wapiIELength; + pframe[0] = _WAPI_IE_; + pframe[1] = WapiIELength; + _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); + pframe += WapiIELength+2; + pattrib->pktlen += WapiIELength+2; + + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + +void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib) +{ + PRT_WAPI_BKID pWapiBKID; + u16 bkidNum; + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + u8 WapiIELength = 0; + + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__); + return; + } + + WapiSetIE(padapter); + WapiIELength = pWapiInfo->wapiIELength; + bkidNum = 0; + if(!list_empty(&(pWapiInfo->wapiBKIDStoreList))){ + list_for_each_entry(pWapiBKID, &pWapiInfo->wapiBKIDStoreList, list) { + bkidNum ++; + _rtw_memcpy(pWapiInfo->wapiIE+WapiIELength+2, pWapiBKID->bkid,16); + WapiIELength += 16; + } + } + _rtw_memcpy(pWapiInfo->wapiIE+WapiIELength, &bkidNum, 2); + WapiIELength += 2; + + pframe[0] = _WAPI_IE_; + pframe[1] = WapiIELength; + _rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength); + pframe += WapiIELength+2; + pattrib->pktlen += WapiIELength+2; + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo); + PRT_WAPI_STA_INFO pWapiSta; + u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + //u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + + WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + pWapiSta =(PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list); + list_del_init(&pWapiSta->list); + list_add_tail(&pWapiSta->list, &pWapiInfo->wapiSTAUsedList); + _rtw_memcpy(pWapiSta->PeerMacAddr,padapter->mlmeextpriv.mlmext_info.network.MacAddress,6); + _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); + _rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16); + + //For chenk PN error with Qos Data after s3: add by ylb 20111114 + _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16); + + WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__); +} + + +void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr) +{ + PRT_WAPI_T pWapiInfo; + PRT_WAPI_STA_INFO pWapiStaInfo = NULL; + PRT_WAPI_BKID pWapiBkid = NULL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + pWapiInfo = &padapter->wapiInfo; + + WAPI_TRACE(WAPI_API, "==========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)) + { + while(!list_empty(&(pWapiInfo->wapiBKIDStoreList))) + { + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + _rtw_memset(pWapiBkid->bkid,0,16); + list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); + } + } + + + WAPI_TRACE(WAPI_API, " %s: after clear bkid \n", __FUNCTION__); + + + //Remove STA info + if(list_empty(&(pWapiInfo->wapiSTAUsedList))){ + WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is null \n", __FUNCTION__); + return; + }else{ + + WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is not null \n", __FUNCTION__); +#if 0 + pWapiStaInfo=(PRT_WAPI_STA_INFO)list_entry((pWapiInfo->wapiSTAUsedList.next),RT_WAPI_STA_INFO,list); + + list_for_each_entry(pWapiStaInfo, &(pWapiInfo->wapiSTAUsedList), list) { + + DBG_871X("MAC Addr %02x-%02x-%02x-%02x-%02x-%02x \n",MacAddr[0],MacAddr[1],MacAddr[2],MacAddr[3],MacAddr[4],MacAddr[5]); + + + DBG_871X("peer Addr %02x-%02x-%02x-%02x-%02x-%02x \n",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]); + + if(pWapiStaInfo == NULL) + { + WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo == NULL Case \n", __FUNCTION__); + return; + } + + if(pWapiStaInfo->PeerMacAddr == NULL) + { + WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo->PeerMacAddr == NULL Case \n", __FUNCTION__); + return; + } + + if(MacAddr == NULL) + { + WAPI_TRACE(WAPI_API, " %s: MacAddr == NULL Case \n", __FUNCTION__); + return; + } + + if (_rtw_memcmp(pWapiStaInfo->PeerMacAddr, MacAddr, ETH_ALEN) == _TRUE) { + pWapiStaInfo->bAuthenticateInProgress = false; + pWapiStaInfo->bSetkeyOk = false; + _rtw_memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); + list_del_init(&pWapiStaInfo->list); + list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); + break; + } + + } +#endif + + while(!list_empty(&(pWapiInfo->wapiSTAUsedList))) + { + pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); + + DBG_871X("peer Addr %02x-%02x-%02x-%02x-%02x-%02x \n",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]); + + list_del_init(&pWapiStaInfo->list); + memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); + pWapiStaInfo->bSetkeyOk = 0; + list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); + } + + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); + return; +} + +void rtw_wapi_return_all_sta_info(_adapter *padapter) +{ + PRT_WAPI_T pWapiInfo; + PRT_WAPI_STA_INFO pWapiStaInfo; + PRT_WAPI_BKID pWapiBkid; + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + pWapiInfo = &padapter->wapiInfo; + + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + //Sta Info List + while(!list_empty(&(pWapiInfo->wapiSTAUsedList))) + { + pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list); + list_del_init(&pWapiStaInfo->list); + memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN); + pWapiStaInfo->bSetkeyOk = 0; + list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList); + } + + //BKID List + while(!list_empty(&(pWapiInfo->wapiBKIDStoreList))) + { + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + memset(pWapiBkid->bkid,0,16); + list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList); + } + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr) +{ + u8 UcIndex = 0; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 0); + if(UcIndex != 0xff){ + //CAM_mark_invalid(Adapter, UcIndex); + CAM_empty_entry(padapter, UcIndex); + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 0); + if(UcIndex != 0xff){ + //CAM_mark_invalid(Adapter, UcIndex); + CAM_empty_entry(padapter, UcIndex); + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 1); + if(UcIndex != 0xff){ + //CAM_mark_invalid(Adapter, UcIndex); + CAM_empty_entry(padapter, UcIndex); + } + + UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 1); + if(UcIndex != 0xff){ + //CAM_mark_invalid(padapter, UcIndex); + CAM_empty_entry(padapter, UcIndex); + } + + WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__); +} + +void rtw_wapi_clear_all_cam_entry(_adapter *padapter) +{ + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) + { + WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + invalidate_cam_all(padapter); // is this ok? + WapiResetAllCamEntry(padapter); + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); +} + +void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + u8 *pMacAddr = pWapiSta->PeerMacAddr; + u32 EntryId = 0; + BOOLEAN IsPairWise = false ; + u8 EncAlgo; + + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) + { + WAPI_TRACE(WAPI_API, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__); + return; + } + + EncAlgo = _SMS4_; + + //For Tx bc/mc pkt,use defualt key entry + if(bUseDefaultKey) + { + // when WAPI update key, keyid will be 0 or 1 by turns. + if (pWapiKey->keyId == 0) + EntryId = 0; + else + EntryId = 2; + } + else + { + // tx/rx unicast pkt, or rx broadcast, find the key entry by peer's MacAddr + EntryId = WapiGetEntryForCamWrite(padapter,pMacAddr,pWapiKey->keyId,bGroupKey); + } + + if(EntryId == 0xff){ + WAPI_TRACE(WAPI_API, "===>No entry for WAPI setkey! !!\n"); + return; + } + + //EntryId is also used to diff Sec key and Mic key + //Sec Key + WapiWriteOneCamEntry(padapter, + pMacAddr, + pWapiKey->keyId, //keyid + EntryId, //entry + EncAlgo, //type + bGroupKey, //pairwise or group key + pWapiKey->dataKey); + //MIC key + WapiWriteOneCamEntry(padapter, + pMacAddr, + pWapiKey->keyId, //keyid + EntryId+1, //entry + EncAlgo, //type + bGroupKey, //pairwise or group key + pWapiKey->micKey); + + WAPI_TRACE(WAPI_API, "Set Wapi Key :KeyId:%d,EntryId:%d,PairwiseKey:%d.\n",pWapiKey->keyId,EntryId,!bGroupKey); + WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__); + +} + +#if 0 +//YJ,test,091013 +void wapi_test_set_key(struct _adapter *padapter, u8* buf) +{ /*Data: keyType(1) + bTxEnable(1) + bAuthenticator(1) + bUpdate(1) + PeerAddr(6) + DataKey(16) + MicKey(16) + KeyId(1)*/ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_BKID pWapiBkid; + PRT_WAPI_STA_INFO pWapiSta; + u8 data[43]; + bool bTxEnable; + bool bUpdate; + bool bAuthenticator; + u8 PeerAddr[6]; + u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + + WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); + + if (!padapter->WapiSupport){ + return; + } + + copy_from_user(data, buf, 43); + bTxEnable = data[1]; + bAuthenticator = data[2]; + bUpdate = data[3]; + memcpy(PeerAddr,data+4,6); + + if(data[0] == 0x3){ + if(!list_empty(&(pWapiInfo->wapiBKIDIdleList))){ + pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list); + list_del_init(&pWapiBkid->list); + memcpy(pWapiBkid->bkid, data+10, 16); + WAPI_DATA(WAPI_INIT, "SetKey - BKID", pWapiBkid->bkid, 16); + list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDStoreList); + } + }else{ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if(!memcmp(pWapiSta->PeerMacAddr,PeerAddr,6)){ + pWapiSta->bAuthenticatorInUpdata = false; + switch(data[0]){ + case 1: //usk + if(bAuthenticator){ //authenticator + memcpy(pWapiSta->lastTxUnicastPN,WapiAEPNInitialValueSrc,16); + if(!bUpdate) { //first + WAPI_TRACE(WAPI_INIT,"AE fisrt set usk \n"); + pWapiSta->wapiUsk.bSet = true; + memcpy(pWapiSta->wapiUsk.dataKey,data+10,16); + memcpy(pWapiSta->wapiUsk.micKey,data+26,16); + pWapiSta->wapiUsk.keyId = *(data+42); + pWapiSta->wapiUsk.bTxEnable = true; + WAPI_DATA(WAPI_INIT, "SetKey - AE USK Data Key", pWapiSta->wapiUsk.dataKey, 16); + WAPI_DATA(WAPI_INIT, "SetKey - AE USK Mic Key", pWapiSta->wapiUsk.micKey, 16); + } + else //update + { + WAPI_TRACE(WAPI_INIT, "AE update usk \n"); + pWapiSta->wapiUskUpdate.bSet = true; + pWapiSta->bAuthenticatorInUpdata = true; + memcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16); + memcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16); + memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16); + pWapiSta->wapiUskUpdate.keyId = *(data+42); + pWapiSta->wapiUskUpdate.bTxEnable = true; + } + } + else{ + if(!bUpdate){ + WAPI_TRACE(WAPI_INIT,"ASUE fisrt set usk \n"); + if(bTxEnable){ + pWapiSta->wapiUsk.bTxEnable = true; + memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); + }else{ + pWapiSta->wapiUsk.bSet = true; + memcpy(pWapiSta->wapiUsk.dataKey,data+10,16); + memcpy(pWapiSta->wapiUsk.micKey,data+26,16); + pWapiSta->wapiUsk.keyId = *(data+42); + pWapiSta->wapiUsk.bTxEnable = false; + } + }else{ + WAPI_TRACE(WAPI_INIT,"ASUE update usk \n"); + if(bTxEnable){ + pWapiSta->wapiUskUpdate.bTxEnable = true; + if(pWapiSta->wapiUskUpdate.bSet){ + memcpy(pWapiSta->wapiUsk.dataKey,pWapiSta->wapiUskUpdate.dataKey,16); + memcpy(pWapiSta->wapiUsk.micKey,pWapiSta->wapiUskUpdate.micKey,16); + pWapiSta->wapiUsk.keyId=pWapiSta->wapiUskUpdate.keyId; + memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16); + memcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16); + pWapiSta->wapiUskUpdate.bTxEnable = false; + pWapiSta->wapiUskUpdate.bSet = false; + } + memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); + }else{ + pWapiSta->wapiUskUpdate.bSet = true; + memcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16); + memcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16); + pWapiSta->wapiUskUpdate.keyId = *(data+42); + pWapiSta->wapiUskUpdate.bTxEnable = false; + } + } + } + break; + case 2: //msk + if(bAuthenticator){ //authenticator + pWapiInfo->wapiTxMsk.bSet = true; + memcpy(pWapiInfo->wapiTxMsk.dataKey,data+10,16); + memcpy(pWapiInfo->wapiTxMsk.micKey,data+26,16); + pWapiInfo->wapiTxMsk.keyId = *(data+42); + pWapiInfo->wapiTxMsk.bTxEnable = true; + memcpy(pWapiInfo->lastTxMulticastPN,WapiAEMultiCastPNInitialValueSrc,16); + + if(!bUpdate){ //first + WAPI_TRACE(WAPI_INIT, "AE fisrt set msk \n"); + if(!pWapiSta->bSetkeyOk) + pWapiSta->bSetkeyOk = true; + pWapiInfo->bFirstAuthentiateInProgress= false; + }else{ //update + WAPI_TRACE(WAPI_INIT,"AE update msk \n"); + } + + WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Data Key", pWapiInfo->wapiTxMsk.dataKey, 16); + WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Mic Key", pWapiInfo->wapiTxMsk.micKey, 16); + } + else{ + if(!bUpdate){ + WAPI_TRACE(WAPI_INIT,"ASUE fisrt set msk \n"); + pWapiSta->wapiMsk.bSet = true; + memcpy(pWapiSta->wapiMsk.dataKey,data+10,16); + memcpy(pWapiSta->wapiMsk.micKey,data+26,16); + pWapiSta->wapiMsk.keyId = *(data+42); + pWapiSta->wapiMsk.bTxEnable = false; + if(!pWapiSta->bSetkeyOk) + pWapiSta->bSetkeyOk = true; + pWapiInfo->bFirstAuthentiateInProgress= false; + WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Data Key", pWapiSta->wapiMsk.dataKey, 16); + WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Mic Key", pWapiSta->wapiMsk.micKey, 16); + }else{ + WAPI_TRACE(WAPI_INIT,"ASUE update msk \n"); + pWapiSta->wapiMskUpdate.bSet = true; + memcpy(pWapiSta->wapiMskUpdate.dataKey,data+10,16); + memcpy(pWapiSta->wapiMskUpdate.micKey,data+26,16); + pWapiSta->wapiMskUpdate.keyId = *(data+42); + pWapiSta->wapiMskUpdate.bTxEnable = false; + } + } + break; + default: + WAPI_TRACE(WAPI_ERR,"Unknown Flag \n"); + break; + } + } + } + } + WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); +} + + +void wapi_test_init(struct _adapter *padapter) +{ + u8 keybuf[100]; + u8 mac_addr[6]={0x00,0xe0,0x4c,0x72,0x04,0x70}; + u8 UskDataKey[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; + u8 UskMicKey[16]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f}; + u8 UskId = 0; + u8 MskDataKey[16]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f}; + u8 MskMicKey[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f}; + u8 MskId = 0; + + WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__); + + //Enable Wapi + WAPI_TRACE(WAPI_INIT, "%s: Enable wapi!!!!\n", __FUNCTION__); + padapter->wapiInfo.bWapiEnable = true; + padapter->pairwise_key_type = KEY_TYPE_SMS4; + ieee->group_key_type = KEY_TYPE_SMS4; + padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; + padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; + + //set usk + WAPI_TRACE(WAPI_INIT, "%s: Set USK!!!!\n", __FUNCTION__); + memset(keybuf,0,100); + keybuf[0] = 1; //set usk + keybuf[1] = 1; //enable tx + keybuf[2] = 1; //AE + keybuf[3] = 0; //not update + + memcpy(keybuf+4,mac_addr,6); + memcpy(keybuf+10,UskDataKey,16); + memcpy(keybuf+26,UskMicKey,16); + keybuf[42]=UskId; + wapi_test_set_key(padapter, keybuf); + + memset(keybuf,0,100); + keybuf[0] = 1; //set usk + keybuf[1] = 1; //enable tx + keybuf[2] = 0; //AE + keybuf[3] = 0; //not update + + memcpy(keybuf+4,mac_addr,6); + memcpy(keybuf+10,UskDataKey,16); + memcpy(keybuf+26,UskMicKey,16); + keybuf[42]=UskId; + wapi_test_set_key(padapter, keybuf); + + //set msk + WAPI_TRACE(WAPI_INIT, "%s: Set MSK!!!!\n", __FUNCTION__); + memset(keybuf,0,100); + keybuf[0] = 2; //set msk + keybuf[1] = 1; //Enable TX + keybuf[2] = 1; //AE + keybuf[3] = 0; //not update + memcpy(keybuf+4,mac_addr,6); + memcpy(keybuf+10,MskDataKey,16); + memcpy(keybuf+26,MskMicKey,16); + keybuf[42] = MskId; + wapi_test_set_key(padapter, keybuf); + + memset(keybuf,0,100); + keybuf[0] = 2; //set msk + keybuf[1] = 1; //Enable TX + keybuf[2] = 0; //AE + keybuf[3] = 0; //not update + memcpy(keybuf+4,mac_addr,6); + memcpy(keybuf+10,MskDataKey,16); + memcpy(keybuf+26,MskMicKey,16); + keybuf[42] = MskId; + wapi_test_set_key(padapter, keybuf); + WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__); +} +#endif + +void rtw_wapi_get_iv(_adapter *padapter,u8 *pRA, u8*IV) +{ + PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + bool bPNOverflow = false; + bool bFindMatchPeer = false; + PRT_WAPI_STA_INFO pWapiSta = NULL; + + pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)IV; + + WAPI_DATA(WAPI_RX,"wapi_get_iv: pra",pRA,6); + + if(IS_MCAST(pRA)){ + if(!pWapiInfo->wapiTxMsk.bTxEnable){ + WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); + return; + } + + if(pWapiInfo->wapiTxMsk.keyId <= 1){ + pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); + memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); + } + } + else + { + if(list_empty(&pWapiInfo->wapiSTAUsedList)){ + WAPI_TRACE(WAPI_RX,"rtw_wapi_get_iv: list is empty \n"); + _rtw_memset(IV,10,18); + return; + } + else{ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ + WAPI_DATA(WAPI_RX,"rtw_wapi_get_iv: peermacaddr ",pWapiSta->PeerMacAddr,6); + if (_rtw_memcmp((u8*)pWapiSta->PeerMacAddr, pRA, 6) == _TRUE) { + bFindMatchPeer = true; + break; + } + } + + WAPI_TRACE(WAPI_RX,"bFindMatchPeer: %d \n",bFindMatchPeer); + WAPI_DATA(WAPI_RX,"Addr",pRA,6); + + if (bFindMatchPeer){ + if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)) + return; + + if (pWapiSta->wapiUsk.keyId <= 1){ + if(pWapiSta->wapiUskUpdate.bTxEnable) + pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; + else + pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; + + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); + _rtw_memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); + + } + } + } + + } + +} + +bool rtw_wapi_drop_for_key_absent(_adapter *padapter,u8 *pRA) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + bool bFindMatchPeer = false; + bool bDrop = false; + PRT_WAPI_STA_INFO pWapiSta = NULL; + struct security_priv *psecuritypriv = &padapter->securitypriv; + + WAPI_DATA(WAPI_RX,"rtw_wapi_drop_for_key_absent: ra ",pRA,6); + + if(psecuritypriv->dot11PrivacyAlgrthm == _SMS4_) + { + if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) + return true; + + if(IS_MCAST(pRA)){ + if(!pWapiInfo->wapiTxMsk.bTxEnable){ + bDrop = true; + WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: multicast key is absent \n"); + return bDrop; + } + } + else{ + if(!list_empty(&pWapiInfo->wapiSTAUsedList)){ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){ + WAPI_DATA(WAPI_RX,"rtw_wapi_drop_for_key_absent: pWapiSta->PeerMacAddr ",pWapiSta->PeerMacAddr,6); + if (_rtw_memcmp(pRA, pWapiSta->PeerMacAddr, 6) == _TRUE){ + bFindMatchPeer = true; + break; + } + } + if (bFindMatchPeer) { + if (!pWapiSta->wapiUsk.bTxEnable){ + bDrop = true; + WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: unicast key is absent \n"); + return bDrop; + } + } + else{ + bDrop = true; + WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: no peer find \n"); + return bDrop; + } + + } + else{ + bDrop = true; + WAPI_TRACE(WAPI_RX,"rtw_wapi_drop_for_key_absent: no sta exist \n"); + return bDrop; + } + } + } + else + { + return bDrop; + } + + return bDrop; +} + +#endif diff --git a/drivers/net/wireless/rtl8723as/core/rtw_wapi_sms4.c b/drivers/net/wireless/rtl8723as/core/rtw_wapi_sms4.c index aa6419390673..6126ed9a00c6 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_wapi_sms4.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_wapi_sms4.c @@ -1,923 +1,923 @@ -#ifdef CONFIG_WAPI_SUPPORT - -#include -#include -#include -#include - - -#ifdef CONFIG_WAPI_SW_SMS4 - -#define WAPI_LITTLE_ENDIAN -//#define BIG_ENDIAN -#define ENCRYPT 0 -#define DECRYPT 1 - - -/********************************************************** - **********************************************************/ -const u8 Sbox[256] = { -0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05, -0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99, -0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62, -0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6, -0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8, -0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35, -0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87, -0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e, -0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1, -0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3, -0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f, -0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51, -0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8, -0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0, -0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84, -0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48 -}; - -const u32 CK[32] = { - 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, - 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, - 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, - 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, - 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, - 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, - 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, - 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 }; - -#define Rotl(_x, _y) (((_x) << (_y)) | ((_x) >> (32 - (_y)))) - -#define ByteSub(_A) (Sbox[(_A) >> 24 & 0xFF] << 24 | \ - Sbox[(_A) >> 16 & 0xFF] << 16 | \ - Sbox[(_A) >> 8 & 0xFF] << 8 | \ - Sbox[(_A) & 0xFF]) - -#define L1(_B) ((_B) ^ Rotl(_B, 2) ^ Rotl(_B, 10) ^ Rotl(_B, 18) ^ Rotl(_B, 24)) -#define L2(_B) ((_B) ^ Rotl(_B, 13) ^ Rotl(_B, 23)) - -static void -xor_block(void *dst, void *src1, void *src2) -/* 128-bit xor: *dst = *src1 xor *src2. Pointers must be 32-bit aligned */ -{ - ((u32 *)dst)[0] = ((u32 *)src1)[0] ^ ((u32 *)src2)[0]; - ((u32 *)dst)[1] = ((u32 *)src1)[1] ^ ((u32 *)src2)[1]; - ((u32 *)dst)[2] = ((u32 *)src1)[2] ^ ((u32 *)src2)[2]; - ((u32 *)dst)[3] = ((u32 *)src1)[3] ^ ((u32 *)src2)[3]; -} - - -void SMS4Crypt(u8 *Input, u8 *Output, u32 *rk) -{ - u32 r, mid, x0, x1, x2, x3, *p; - p = (u32 *)Input; - x0 = p[0]; - x1 = p[1]; - x2 = p[2]; - x3 = p[3]; -#ifdef WAPI_LITTLE_ENDIAN - x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); - x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); - x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); - x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); -#endif - for (r = 0; r < 32; r += 4) - { - mid = x1 ^ x2 ^ x3 ^ rk[r + 0]; - mid = ByteSub(mid); - x0 ^= L1(mid); - mid = x2 ^ x3 ^ x0 ^ rk[r + 1]; - mid = ByteSub(mid); - x1 ^= L1(mid); - mid = x3 ^ x0 ^ x1 ^ rk[r + 2]; - mid = ByteSub(mid); - x2 ^= L1(mid); - mid = x0 ^ x1 ^ x2 ^ rk[r + 3]; - mid = ByteSub(mid); - x3 ^= L1(mid); - } -#ifdef WAPI_LITTLE_ENDIAN - x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); - x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); - x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); - x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); -#endif - p = (u32 *)Output; - p[0] = x3; - p[1] = x2; - p[2] = x1; - p[3] = x0; -} - - - -void SMS4KeyExt(u8 *Key, u32 *rk, u32 CryptFlag) -{ - u32 r, mid, x0, x1, x2, x3, *p; - - p = (u32 *)Key; - x0 = p[0]; - x1 = p[1]; - x2 = p[2]; - x3 = p[3]; -#ifdef WAPI_LITTLE_ENDIAN - x0 = Rotl(x0, 16); x0 = ((x0 & 0xFF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); - x1 = Rotl(x1, 16); x1 = ((x1 & 0xFF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); - x2 = Rotl(x2, 16); x2 = ((x2 & 0xFF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); - x3 = Rotl(x3, 16); x3 = ((x3 & 0xFF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); -#endif - - x0 ^= 0xa3b1bac6; - x1 ^= 0x56aa3350; - x2 ^= 0x677d9197; - x3 ^= 0xb27022dc; - for (r = 0; r < 32; r += 4) - { - mid = x1 ^ x2 ^ x3 ^ CK[r + 0]; - mid = ByteSub(mid); - rk[r + 0] = x0 ^= L2(mid); - mid = x2 ^ x3 ^ x0 ^ CK[r + 1]; - mid = ByteSub(mid); - rk[r + 1] = x1 ^= L2(mid); - mid = x3 ^ x0 ^ x1 ^ CK[r + 2]; - mid = ByteSub(mid); - rk[r + 2] = x2 ^= L2(mid); - mid = x0 ^ x1 ^ x2 ^ CK[r + 3]; - mid = ByteSub(mid); - rk[r + 3] = x3 ^= L2(mid); - } - if (CryptFlag == DECRYPT) - { - for (r = 0; r < 16; r++) - mid = rk[r], rk[r] = rk[31 - r], rk[31 - r] = mid; - } -} - - -void WapiSMS4Cryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength, - u8 *Output, u16 *OutputLength, u32 CryptFlag) -{ - u32 blockNum,i,j, rk[32]; - u16 remainder; - u8 blockIn[16],blockOut[16], tempIV[16], k; - - *OutputLength = 0; - remainder = InputLength & 0x0F; - blockNum = InputLength >> 4; - if(remainder !=0) - blockNum++; - else - remainder = 16; - - for(k=0;k<16;k++) - tempIV[k] = IV[15-k]; - - memcpy(blockIn, tempIV, 16); - - SMS4KeyExt((u8 *)Key, rk,CryptFlag); - - for(i=0; i> 4; - - for(k=0;k<16;k++) - tempIV[k] = IV[15-k]; - - memcpy(BlockIn, tempIV, 16); - - SMS4KeyExt((u8 *)Key, rk, ENCRYPT); - - SMS4Crypt((u8 *)BlockIn, BlockOut, rk); - - for(i=0; i> 4; - - for(i=0; i%s\n", __FUNCTION__); - - header = (struct ieee80211_hdr_3addr_qos *)pHeader; - memset(TempBuf, 0, 34); - memcpy(TempBuf, pHeader, 2); //FrameCtrl - pTemp = (u16*)TempBuf; - *pTemp &= 0xc78f; //bit4,5,6,11,12,13 - - memcpy((TempBuf+2), (pHeader+4), 12); //Addr1, Addr2 - memcpy((TempBuf+14), (pHeader+22), 2); // SeqCtrl - pTemp = (u16*)(TempBuf + 14); - *pTemp &= 0x000f; - - memcpy((TempBuf+16), (pHeader+16), 6); //Addr3 - - fc = le16_to_cpu(header->frame_ctl); - - - - if (GetFrDs((u16*)&fc) && GetToDs((u16 *)&fc)) - { - memcpy((TempBuf+22), (pHeader+24), 6); - QosOffset = 30; - }else{ - memset((TempBuf+22), 0, 6); - QosOffset = 24; - } - - if((fc & 0x0088) == 0x0088){ - memcpy((TempBuf+28), (pHeader+QosOffset), 2); - TempLen += 2; - //IV = pHeader + QosOffset + 2 + SNAP_SIZE + sizeof(u16) + 2; - IV = pHeader + QosOffset + 2 + 2; - }else{ - IV = pHeader + QosOffset + 2; - //IV = pHeader + QosOffset + SNAP_SIZE + sizeof(u16) + 2; - } - - TempBuf[TempLen-1] = (u8)(DataLen & 0xff); - TempBuf[TempLen-2] = (u8)((DataLen & 0xff00)>>8); - TempBuf[TempLen-4] = KeyIdx; - - WAPI_DATA(WAPI_TX, "CalculateMic - KEY", MicKey, 16); - WAPI_DATA(WAPI_TX, "CalculateMic - IV", IV, 16); - WAPI_DATA(WAPI_TX, "CalculateMic - TempBuf", TempBuf, TempLen); - WAPI_DATA(WAPI_TX, "CalculateMic - pData", pData, DataLen); - - WapiSMS4CalculateMic(MicKey, IV, TempBuf, TempLen, - pData, DataLen, MicBuffer, &MicLen); - - if (MicLen != 16) - WAPI_TRACE(WAPI_ERR,"%s: MIC Length Error!!\n",__FUNCTION__); - - WAPI_TRACE(WAPI_TX|WAPI_RX, "<=========%s\n", __FUNCTION__); -#endif -} - -/* AddCount: 1 or 2. - * If overflow, return 1, - * else return 0. - */ -u8 WapiIncreasePN(u8 *PN, u8 AddCount) -{ - u8 i; - - if (NULL == PN) - return 1; - //YJ,test,091102 - /* - if(AddCount == 2){ - DBG_8192C("############################%s(): PN[0]=0x%x\n", __FUNCTION__, PN[0]); - if(PN[0] == 0x48){ - PN[0] += AddCount; - return 1; - }else{ - PN[0] += AddCount; - return 0; - } - } - */ - //YJ,test,091102,end - - for (i=0; i<16; i++) - { - if (PN[i] + AddCount <= 0xff) - { - PN[i] += AddCount; - return 0; - } - else - { - PN[i] += AddCount; - AddCount = 1; - } - } - return 1; -} - - -void WapiGetLastRxUnicastPNForQoSData( - u8 UserPriority, - PRT_WAPI_STA_INFO pWapiStaInfo, - u8 *PNOut -) -{ - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - switch(UserPriority) - { - case 0: - case 3: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBEQueue,16); - break; - case 1: - case 2: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBKQueue,16); - break; - case 4: - case 5: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVIQueue,16); - break; - case 6: - case 7: - memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVOQueue,16); - break; - default: - WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__); - break; - } - WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); -} - - -void WapiSetLastRxUnicastPNForQoSData( - u8 UserPriority, - u8 *PNIn, - PRT_WAPI_STA_INFO pWapiStaInfo -) -{ - WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); - switch(UserPriority) - { - case 0: - case 3: - memcpy(pWapiStaInfo->lastRxUnicastPNBEQueue,PNIn,16); - break; - case 1: - case 2: - memcpy(pWapiStaInfo->lastRxUnicastPNBKQueue,PNIn,16); - break; - case 4: - case 5: - memcpy(pWapiStaInfo->lastRxUnicastPNVIQueue,PNIn,16); - break; - case 6: - case 7: - memcpy(pWapiStaInfo->lastRxUnicastPNVOQueue,PNIn,16); - break; - default: - WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__); - break; - } - WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); -} - - -/**************************************************************************** - FALSE not RX-Reorder - TRUE do RX Reorder -add to support WAPI to N-mode -*****************************************************************************/ -u8 WapiCheckPnInSwDecrypt( - _adapter *padapter, - struct sk_buff *pskb -) -{ - u8 ret = false; - -#if 0 - struct ieee80211_hdr_3addr_qos *header; - u16 fc; - u8 *pDaddr, *pTaddr, *pRaddr; - - header = (struct ieee80211_hdr_3addr_qos *)pskb->data; - pTaddr = header->addr2; - pRaddr = header->addr1; - fc = le16_to_cpu(header->frame_ctl); - - if(GetToDs(&fc)) - pDaddr = header->addr3; - else - pDaddr = header->addr1; - - if ((_rtw_memcmp(pRaddr, padapter->pnetdev->dev_addr, ETH_ALEN) == 0) - && ! (pDaddr) - && (GetFrameType(&fc) == WIFI_QOS_DATA_TYPE)) - //&& ieee->pHTInfo->bCurrentHTSupport && - //ieee->pHTInfo->bCurRxReorderEnable) - ret = false; - else - ret = true; -#endif - WAPI_TRACE(WAPI_RX, "%s: return %d\n", __FUNCTION__, ret); - return ret; -} - -int SecSMS4HeaderFillIV(_adapter *padapter, u8 *pxmitframe) -{ - struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; - u8 * frame = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET; - u8 *pSecHeader = NULL, *pos = NULL, *pRA = NULL; - u8 bPNOverflow = false, bFindMatchPeer = false, hdr_len = 0; - PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_STA_INFO pWapiSta = NULL; - int ret = 0; - - WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); - - return ret; -#if 0 - hdr_len = sMacHdrLng; - if (GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE) - { - hdr_len += 2; - } - //hdr_len += SNAP_SIZE + sizeof(u16); - - pos = skb_push(pskb, padapter->wapiInfo.extra_prefix_len); - memmove(pos, pos+padapter->wapiInfo.extra_prefix_len, hdr_len); - - pSecHeader = pskb->data + hdr_len; - pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)pSecHeader; - pRA = pskb->data + 4; - - WAPI_DATA(WAPI_TX, "FillIV - Before Fill IV", pskb->data, pskb->len); - - //Address 1 is always receiver's address - if( IS_MCAST(pRA) ){ - if(!pWapiInfo->wapiTxMsk.bTxEnable){ - WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); - return -2; - } - if(pWapiInfo->wapiTxMsk.keyId <= 1){ - pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); - memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); - if (bPNOverflow){ - // Update MSK Notification. - WAPI_TRACE(WAPI_ERR,"===============>%s():multicast PN overflow\n",__FUNCTION__); - rtw_wapi_app_event_handler(padapter,NULL,0,pRA, false, false, true, 0, false); - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Multicast KeyIdx!!\n",__FUNCTION__); - ret = -3; - } - } - else{ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if(!memcmp(pWapiSta->PeerMacAddr,pRA,6)){ - bFindMatchPeer = true; - break; - } - } - if (bFindMatchPeer){ - if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)){ - WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); - return -4; - } - if (pWapiSta->wapiUsk.keyId <= 1){ - if(pWapiSta->wapiUskUpdate.bTxEnable) - pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; - else - pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; - - pWapiExt->Reserved = 0; - bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); - memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); - if (bPNOverflow){ - // Update USK Notification. - WAPI_TRACE(WAPI_ERR,"===============>%s():unicast PN overflow\n",__FUNCTION__); - rtw_wapi_app_event_handler(padapter,NULL,0,pWapiSta->PeerMacAddr, false, true, false, 0, false); - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Unicast KeyIdx!!\n",__FUNCTION__); - ret = -5; - } - } - else{ - WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta "MAC_FMT"!!\n",__FUNCTION__, MAC_ARG(pRA)); - ret = -6; - } - } - - WAPI_DATA(WAPI_TX, "FillIV - After Fill IV", pskb->data, pskb->len); - WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); - return ret; -#endif -} - -// WAPI SW Enc: must have done Coalesce! -void SecSWSMS4Encryption( - _adapter *padapter, - u8 * pxmitframe - ) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 *pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE; - struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; - - u8 *SecPtr = NULL, *pRA, *pMicKey = NULL, *pDataKey = NULL, *pIV = NULL; - u8 IVOffset, DataOffset, bFindMatchPeer = false, KeyIdx = 0, MicBuffer[16]; - u16 OutputLength; - - WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); - - WAPI_TRACE(WAPI_TX,"hdrlen: %d \n",pattrib->hdrlen); - - return; - - DataOffset = pattrib->hdrlen + pattrib->iv_len; - - pRA = pframe + 4; - - - if( IS_MCAST(pRA) ){ - KeyIdx = pWapiInfo->wapiTxMsk.keyId; - pIV = pWapiInfo->lastTxMulticastPN; - pMicKey = pWapiInfo->wapiTxMsk.micKey; - pDataKey = pWapiInfo->wapiTxMsk.dataKey; - }else{ - if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if (0 == memcmp(pWapiSta->PeerMacAddr, pRA, 6)){ - bFindMatchPeer = true; - break; - } - } - - if (bFindMatchPeer){ - if (pWapiSta->wapiUskUpdate.bTxEnable){ - KeyIdx = pWapiSta->wapiUskUpdate.keyId; - WAPI_TRACE(WAPI_TX, "%s(): Use update USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); - pIV = pWapiSta->lastTxUnicastPN; - pMicKey = pWapiSta->wapiUskUpdate.micKey; - pDataKey = pWapiSta->wapiUskUpdate.dataKey; - }else{ - KeyIdx = pWapiSta->wapiUsk.keyId; - WAPI_TRACE(WAPI_TX, "%s(): Use USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); - pIV = pWapiSta->lastTxUnicastPN; - pMicKey = pWapiSta->wapiUsk.micKey; - pDataKey = pWapiSta->wapiUsk.dataKey; - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta!!\n",__FUNCTION__); - return; - } - }else{ - WAPI_TRACE(WAPI_ERR,"%s: wapiSTAUsedList is empty!!\n",__FUNCTION__); - return; - } - } - - SecPtr = pframe; - SecCalculateMicSMS4(KeyIdx, pMicKey, SecPtr, (SecPtr+DataOffset), pattrib->pktlen, MicBuffer); - - WAPI_DATA(WAPI_TX, "Encryption - MIC", MicBuffer, padapter->wapiInfo.extra_postfix_len); - - memcpy(pframe+pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen-pattrib->icv_len, - (u8 *)MicBuffer, - padapter->wapiInfo.extra_postfix_len - ); - - - WapiSMS4Encryption(pDataKey, pIV, (SecPtr+DataOffset),pattrib->pktlen+pattrib->icv_len, (SecPtr+DataOffset), &OutputLength); - - WAPI_DATA(WAPI_TX, "Encryption - After SMS4 encryption",pframe,pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen); - - WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); -} - -u8 SecSWSMS4Decryption( - _adapter *padapter, - u8 *precv_frame, - struct recv_priv *precv_priv - ) -{ - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - struct recv_frame_hdr *precv_hdr; - PRT_WAPI_STA_INFO pWapiSta = NULL; - u8 IVOffset, DataOffset, bFindMatchPeer = false, bUseUpdatedKey = false; - u8 KeyIdx, MicBuffer[16], lastRxPNforQoS[16]; - u8 *pRA, *pTA, *pMicKey, *pDataKey, *pLastRxPN, *pRecvPN, *pSecData, *pRecvMic, *pos; - u8 TID = 0; - u16 OutputLength, DataLen; - u8 bQosData; - struct sk_buff * pskb; - - WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); - - return 0; - - precv_hdr = &((union recv_frame*)precv_frame)->u.hdr; - pskb = (struct sk_buff *)(precv_hdr->rx_data); - precv_hdr->bWapiCheckPNInDecrypt = WapiCheckPnInSwDecrypt(padapter, pskb); - WAPI_TRACE(WAPI_RX, "=========>%s: check PN %d\n", __FUNCTION__,precv_hdr->bWapiCheckPNInDecrypt); - WAPI_DATA(WAPI_RX, "Decryption - Before decryption", pskb->data, pskb->len); - - IVOffset = sMacHdrLng; - bQosData = GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE; - if (bQosData){ - IVOffset += 2; - } - - //if(GetHTC()) - // IVOffset += 4; - - //IVOffset += SNAP_SIZE + sizeof(u16); - - DataOffset = IVOffset + padapter->wapiInfo.extra_prefix_len; - - pRA = pskb->data + 4; - pTA = pskb->data + 10; - KeyIdx = *(pskb->data + IVOffset); - pRecvPN = pskb->data + IVOffset + 2; - pSecData = pskb->data + DataOffset; - DataLen = pskb->len - DataOffset; - pRecvMic = pskb->data + pskb->len - padapter->wapiInfo.extra_postfix_len; - TID = GetTid(pskb->data); - - if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){ - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if (0 == memcmp(pWapiSta->PeerMacAddr, pTA, 6)){ - bFindMatchPeer = true; - break; - } - } - } - - if (!bFindMatchPeer){ - WAPI_TRACE(WAPI_ERR, "%s: Can not find Peer Sta "MAC_FMT" for Key Info!!!\n", __FUNCTION__, MAC_ARG(pTA)); - return false; - } - - if( IS_MCAST(pRA) ){ - WAPI_TRACE(WAPI_RX, "%s: Multicast decryption !!!\n", __FUNCTION__); - if (pWapiSta->wapiMsk.keyId == KeyIdx && pWapiSta->wapiMsk.bSet){ - pLastRxPN = pWapiSta->lastRxMulticastPN; - if (!WapiComparePN(pRecvPN, pLastRxPN)){ - WAPI_TRACE(WAPI_ERR, "%s: MSK PN is not larger than last, Dropped!!!\n", __FUNCTION__); - WAPI_DATA(WAPI_ERR, "pRecvPN:", pRecvPN, 16); - WAPI_DATA(WAPI_ERR, "pLastRxPN:", pLastRxPN, 16); - return false; - } - - memcpy(pLastRxPN, pRecvPN, 16); - pMicKey = pWapiSta->wapiMsk.micKey; - pDataKey = pWapiSta->wapiMsk.dataKey; - }else if (pWapiSta->wapiMskUpdate.keyId == KeyIdx && pWapiSta->wapiMskUpdate.bSet){ - WAPI_TRACE(WAPI_RX, "%s: Use Updated MSK for Decryption !!!\n", __FUNCTION__); - bUseUpdatedKey = true; - memcpy(pWapiSta->lastRxMulticastPN, pRecvPN, 16); - pMicKey = pWapiSta->wapiMskUpdate.micKey; - pDataKey = pWapiSta->wapiMskUpdate.dataKey; - }else{ - WAPI_TRACE(WAPI_ERR, "%s: Can not find MSK with matched KeyIdx(%d), Dropped !!!\n", __FUNCTION__,KeyIdx); - return false; - } - } - else{ - WAPI_TRACE(WAPI_RX, "%s: Unicast decryption !!!\n", __FUNCTION__); - if (pWapiSta->wapiUsk.keyId == KeyIdx && pWapiSta->wapiUsk.bSet){ - WAPI_TRACE(WAPI_RX, "%s: Use USK for Decryption!!!\n", __FUNCTION__); - if(precv_hdr->bWapiCheckPNInDecrypt){ - if(GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE){ - WapiGetLastRxUnicastPNForQoSData(TID, pWapiSta, lastRxPNforQoS); - pLastRxPN = lastRxPNforQoS; - }else{ - pLastRxPN = pWapiSta->lastRxUnicastPN; - } - if (!WapiComparePN(pRecvPN, pLastRxPN)){ - return false; - } - if(bQosData){ - WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); - }else{ - memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); - } - }else{ - memcpy(precv_hdr->WapiTempPN,pRecvPN,16); - } - - if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE)) - { - if ((pRecvPN[0] & 0x1) == 0){ - WAPI_TRACE(WAPI_ERR, "%s: Rx USK PN is not odd when Infra STA mode, Dropped !!!\n", __FUNCTION__); - return false; - } - } - - pMicKey = pWapiSta->wapiUsk.micKey; - pDataKey = pWapiSta->wapiUsk.dataKey; - } - else if (pWapiSta->wapiUskUpdate.keyId == KeyIdx && pWapiSta->wapiUskUpdate.bSet ){ - WAPI_TRACE(WAPI_RX, "%s: Use Updated USK for Decryption!!!\n", __FUNCTION__); - if(pWapiSta->bAuthenticatorInUpdata) - bUseUpdatedKey = true; - else - bUseUpdatedKey = false; - - if(bQosData){ - WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); - }else{ - memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); - } - pMicKey = pWapiSta->wapiUskUpdate.micKey; - pDataKey = pWapiSta->wapiUskUpdate.dataKey; - }else{ - WAPI_TRACE(WAPI_ERR, "%s: No valid USK!!!KeyIdx=%d pWapiSta->wapiUsk.keyId=%d pWapiSta->wapiUskUpdate.keyId=%d\n", __FUNCTION__, KeyIdx, pWapiSta->wapiUsk.keyId, pWapiSta->wapiUskUpdate.keyId); - //dump_buf(pskb->data,pskb->len); - return false; - } - } - - WAPI_DATA(WAPI_RX, "Decryption - DataKey", pDataKey, 16); - WAPI_DATA(WAPI_RX, "Decryption - IV", pRecvPN, 16); - WapiSMS4Decryption(pDataKey, pRecvPN, pSecData, DataLen, pSecData, &OutputLength); - - if (OutputLength != DataLen) - WAPI_TRACE(WAPI_ERR, "%s: Output Length Error!!!!\n", __FUNCTION__); - - WAPI_DATA(WAPI_RX, "Decryption - After decryption", pskb->data, pskb->len); - - DataLen -= padapter->wapiInfo.extra_postfix_len; - - SecCalculateMicSMS4(KeyIdx, pMicKey, pskb->data, pSecData, DataLen, MicBuffer); - - WAPI_DATA(WAPI_RX, "Decryption - MIC received", pRecvMic, SMS4_MIC_LEN); - WAPI_DATA(WAPI_RX, "Decryption - MIC calculated", MicBuffer, SMS4_MIC_LEN); - - if (0 == memcmp(MicBuffer, pRecvMic, padapter->wapiInfo.extra_postfix_len)){ - WAPI_TRACE(WAPI_RX, "%s: Check MIC OK!!\n", __FUNCTION__); - if (bUseUpdatedKey){ - // delete the old key - if ( IS_MCAST(pRA) ){ - WAPI_TRACE(WAPI_API, "%s(): AE use new update MSK!!\n", __FUNCTION__); - pWapiSta->wapiMsk.keyId = pWapiSta->wapiMskUpdate.keyId; - memcpy(pWapiSta->wapiMsk.dataKey, pWapiSta->wapiMskUpdate.dataKey, 16); - memcpy(pWapiSta->wapiMsk.micKey, pWapiSta->wapiMskUpdate.micKey, 16); - pWapiSta->wapiMskUpdate.bTxEnable = pWapiSta->wapiMskUpdate.bSet = false; - }else{ - WAPI_TRACE(WAPI_API, "%s(): AE use new update USK!!\n", __FUNCTION__); - pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId; - memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16); - memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16); - pWapiSta->wapiUskUpdate.bTxEnable = pWapiSta->wapiUskUpdate.bSet = false; - } - } - }else{ - WAPI_TRACE(WAPI_ERR, "%s: Check MIC Error, Dropped !!!!\n", __FUNCTION__); - return false; - } - - pos = pskb->data; - memmove(pos+padapter->wapiInfo.extra_prefix_len, pos, IVOffset); - skb_pull(pskb, padapter->wapiInfo.extra_prefix_len); - - WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); - - return true; -} - -u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) -{ - - u8 *pframe; - u32 res = _SUCCESS; - - WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_TX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); - return _FAIL; - } - - if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) - return _FAIL; - - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; - - SecSWSMS4Encryption(padapter, pxmitframe); - - WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); - return res; -} - -u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) -{ - u8 *pframe; - u32 res = _SUCCESS; - - WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); - - if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) - { - WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); - return _FAIL; - } - - - //drop packet when hw decrypt fail - //return tempraily - return _FAIL; - - //pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; - - if (false == SecSWSMS4Decryption(padapter, precvframe, &padapter->recvpriv)) - { - WAPI_TRACE(WAPI_ERR, "%s():SMS4 decrypt frame error\n",__FUNCTION__); - return _FAIL; - } - - WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); - return res; -} - -#else - -u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) -{ - WAPI_TRACE(WAPI_TX, "=========>Dummy %s\n", __FUNCTION__); - WAPI_TRACE(WAPI_TX, "<=========Dummy %s\n", __FUNCTION__); - return _SUCCESS; -} - -u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) -{ - WAPI_TRACE(WAPI_RX, "=========>Dummy %s\n", __FUNCTION__); - WAPI_TRACE(WAPI_RX, "<=========Dummy %s\n", __FUNCTION__); - return _SUCCESS; -} - -#endif - -#endif +#ifdef CONFIG_WAPI_SUPPORT + +#include +#include +#include +#include + + +#ifdef CONFIG_WAPI_SW_SMS4 + +#define WAPI_LITTLE_ENDIAN +//#define BIG_ENDIAN +#define ENCRYPT 0 +#define DECRYPT 1 + + +/********************************************************** + **********************************************************/ +const u8 Sbox[256] = { +0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05, +0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99, +0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62, +0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6, +0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8, +0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35, +0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87, +0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e, +0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1, +0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3, +0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f, +0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51, +0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8, +0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0, +0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84, +0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48 +}; + +const u32 CK[32] = { + 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, + 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, + 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, + 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, + 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, + 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, + 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, + 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 }; + +#define Rotl(_x, _y) (((_x) << (_y)) | ((_x) >> (32 - (_y)))) + +#define ByteSub(_A) (Sbox[(_A) >> 24 & 0xFF] << 24 | \ + Sbox[(_A) >> 16 & 0xFF] << 16 | \ + Sbox[(_A) >> 8 & 0xFF] << 8 | \ + Sbox[(_A) & 0xFF]) + +#define L1(_B) ((_B) ^ Rotl(_B, 2) ^ Rotl(_B, 10) ^ Rotl(_B, 18) ^ Rotl(_B, 24)) +#define L2(_B) ((_B) ^ Rotl(_B, 13) ^ Rotl(_B, 23)) + +static void +xor_block(void *dst, void *src1, void *src2) +/* 128-bit xor: *dst = *src1 xor *src2. Pointers must be 32-bit aligned */ +{ + ((u32 *)dst)[0] = ((u32 *)src1)[0] ^ ((u32 *)src2)[0]; + ((u32 *)dst)[1] = ((u32 *)src1)[1] ^ ((u32 *)src2)[1]; + ((u32 *)dst)[2] = ((u32 *)src1)[2] ^ ((u32 *)src2)[2]; + ((u32 *)dst)[3] = ((u32 *)src1)[3] ^ ((u32 *)src2)[3]; +} + + +void SMS4Crypt(u8 *Input, u8 *Output, u32 *rk) +{ + u32 r, mid, x0, x1, x2, x3, *p; + p = (u32 *)Input; + x0 = p[0]; + x1 = p[1]; + x2 = p[2]; + x3 = p[3]; +#ifdef WAPI_LITTLE_ENDIAN + x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); + x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); + x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); + x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); +#endif + for (r = 0; r < 32; r += 4) + { + mid = x1 ^ x2 ^ x3 ^ rk[r + 0]; + mid = ByteSub(mid); + x0 ^= L1(mid); + mid = x2 ^ x3 ^ x0 ^ rk[r + 1]; + mid = ByteSub(mid); + x1 ^= L1(mid); + mid = x3 ^ x0 ^ x1 ^ rk[r + 2]; + mid = ByteSub(mid); + x2 ^= L1(mid); + mid = x0 ^ x1 ^ x2 ^ rk[r + 3]; + mid = ByteSub(mid); + x3 ^= L1(mid); + } +#ifdef WAPI_LITTLE_ENDIAN + x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); + x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); + x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); + x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); +#endif + p = (u32 *)Output; + p[0] = x3; + p[1] = x2; + p[2] = x1; + p[3] = x0; +} + + + +void SMS4KeyExt(u8 *Key, u32 *rk, u32 CryptFlag) +{ + u32 r, mid, x0, x1, x2, x3, *p; + + p = (u32 *)Key; + x0 = p[0]; + x1 = p[1]; + x2 = p[2]; + x3 = p[3]; +#ifdef WAPI_LITTLE_ENDIAN + x0 = Rotl(x0, 16); x0 = ((x0 & 0xFF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8); + x1 = Rotl(x1, 16); x1 = ((x1 & 0xFF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8); + x2 = Rotl(x2, 16); x2 = ((x2 & 0xFF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8); + x3 = Rotl(x3, 16); x3 = ((x3 & 0xFF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8); +#endif + + x0 ^= 0xa3b1bac6; + x1 ^= 0x56aa3350; + x2 ^= 0x677d9197; + x3 ^= 0xb27022dc; + for (r = 0; r < 32; r += 4) + { + mid = x1 ^ x2 ^ x3 ^ CK[r + 0]; + mid = ByteSub(mid); + rk[r + 0] = x0 ^= L2(mid); + mid = x2 ^ x3 ^ x0 ^ CK[r + 1]; + mid = ByteSub(mid); + rk[r + 1] = x1 ^= L2(mid); + mid = x3 ^ x0 ^ x1 ^ CK[r + 2]; + mid = ByteSub(mid); + rk[r + 2] = x2 ^= L2(mid); + mid = x0 ^ x1 ^ x2 ^ CK[r + 3]; + mid = ByteSub(mid); + rk[r + 3] = x3 ^= L2(mid); + } + if (CryptFlag == DECRYPT) + { + for (r = 0; r < 16; r++) + mid = rk[r], rk[r] = rk[31 - r], rk[31 - r] = mid; + } +} + + +void WapiSMS4Cryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength, + u8 *Output, u16 *OutputLength, u32 CryptFlag) +{ + u32 blockNum,i,j, rk[32]; + u16 remainder; + u8 blockIn[16],blockOut[16], tempIV[16], k; + + *OutputLength = 0; + remainder = InputLength & 0x0F; + blockNum = InputLength >> 4; + if(remainder !=0) + blockNum++; + else + remainder = 16; + + for(k=0;k<16;k++) + tempIV[k] = IV[15-k]; + + memcpy(blockIn, tempIV, 16); + + SMS4KeyExt((u8 *)Key, rk,CryptFlag); + + for(i=0; i> 4; + + for(k=0;k<16;k++) + tempIV[k] = IV[15-k]; + + memcpy(BlockIn, tempIV, 16); + + SMS4KeyExt((u8 *)Key, rk, ENCRYPT); + + SMS4Crypt((u8 *)BlockIn, BlockOut, rk); + + for(i=0; i> 4; + + for(i=0; i%s\n", __FUNCTION__); + + header = (struct ieee80211_hdr_3addr_qos *)pHeader; + memset(TempBuf, 0, 34); + memcpy(TempBuf, pHeader, 2); //FrameCtrl + pTemp = (u16*)TempBuf; + *pTemp &= 0xc78f; //bit4,5,6,11,12,13 + + memcpy((TempBuf+2), (pHeader+4), 12); //Addr1, Addr2 + memcpy((TempBuf+14), (pHeader+22), 2); // SeqCtrl + pTemp = (u16*)(TempBuf + 14); + *pTemp &= 0x000f; + + memcpy((TempBuf+16), (pHeader+16), 6); //Addr3 + + fc = le16_to_cpu(header->frame_ctl); + + + + if (GetFrDs((u16*)&fc) && GetToDs((u16 *)&fc)) + { + memcpy((TempBuf+22), (pHeader+24), 6); + QosOffset = 30; + }else{ + memset((TempBuf+22), 0, 6); + QosOffset = 24; + } + + if((fc & 0x0088) == 0x0088){ + memcpy((TempBuf+28), (pHeader+QosOffset), 2); + TempLen += 2; + //IV = pHeader + QosOffset + 2 + SNAP_SIZE + sizeof(u16) + 2; + IV = pHeader + QosOffset + 2 + 2; + }else{ + IV = pHeader + QosOffset + 2; + //IV = pHeader + QosOffset + SNAP_SIZE + sizeof(u16) + 2; + } + + TempBuf[TempLen-1] = (u8)(DataLen & 0xff); + TempBuf[TempLen-2] = (u8)((DataLen & 0xff00)>>8); + TempBuf[TempLen-4] = KeyIdx; + + WAPI_DATA(WAPI_TX, "CalculateMic - KEY", MicKey, 16); + WAPI_DATA(WAPI_TX, "CalculateMic - IV", IV, 16); + WAPI_DATA(WAPI_TX, "CalculateMic - TempBuf", TempBuf, TempLen); + WAPI_DATA(WAPI_TX, "CalculateMic - pData", pData, DataLen); + + WapiSMS4CalculateMic(MicKey, IV, TempBuf, TempLen, + pData, DataLen, MicBuffer, &MicLen); + + if (MicLen != 16) + WAPI_TRACE(WAPI_ERR,"%s: MIC Length Error!!\n",__FUNCTION__); + + WAPI_TRACE(WAPI_TX|WAPI_RX, "<=========%s\n", __FUNCTION__); +#endif +} + +/* AddCount: 1 or 2. + * If overflow, return 1, + * else return 0. + */ +u8 WapiIncreasePN(u8 *PN, u8 AddCount) +{ + u8 i; + + if (NULL == PN) + return 1; + //YJ,test,091102 + /* + if(AddCount == 2){ + DBG_8192C("############################%s(): PN[0]=0x%x\n", __FUNCTION__, PN[0]); + if(PN[0] == 0x48){ + PN[0] += AddCount; + return 1; + }else{ + PN[0] += AddCount; + return 0; + } + } + */ + //YJ,test,091102,end + + for (i=0; i<16; i++) + { + if (PN[i] + AddCount <= 0xff) + { + PN[i] += AddCount; + return 0; + } + else + { + PN[i] += AddCount; + AddCount = 1; + } + } + return 1; +} + + +void WapiGetLastRxUnicastPNForQoSData( + u8 UserPriority, + PRT_WAPI_STA_INFO pWapiStaInfo, + u8 *PNOut +) +{ + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + switch(UserPriority) + { + case 0: + case 3: + memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBEQueue,16); + break; + case 1: + case 2: + memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBKQueue,16); + break; + case 4: + case 5: + memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVIQueue,16); + break; + case 6: + case 7: + memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVOQueue,16); + break; + default: + WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__); + break; + } + WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); +} + + +void WapiSetLastRxUnicastPNForQoSData( + u8 UserPriority, + u8 *PNIn, + PRT_WAPI_STA_INFO pWapiStaInfo +) +{ + WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__); + switch(UserPriority) + { + case 0: + case 3: + memcpy(pWapiStaInfo->lastRxUnicastPNBEQueue,PNIn,16); + break; + case 1: + case 2: + memcpy(pWapiStaInfo->lastRxUnicastPNBKQueue,PNIn,16); + break; + case 4: + case 5: + memcpy(pWapiStaInfo->lastRxUnicastPNVIQueue,PNIn,16); + break; + case 6: + case 7: + memcpy(pWapiStaInfo->lastRxUnicastPNVOQueue,PNIn,16); + break; + default: + WAPI_TRACE(WAPI_ERR, "%s: Unknown TID \n", __FUNCTION__); + break; + } + WAPI_TRACE(WAPI_RX, "<=========== %s\n", __FUNCTION__); +} + + +/**************************************************************************** + FALSE not RX-Reorder + TRUE do RX Reorder +add to support WAPI to N-mode +*****************************************************************************/ +u8 WapiCheckPnInSwDecrypt( + _adapter *padapter, + struct sk_buff *pskb +) +{ + u8 ret = false; + +#if 0 + struct ieee80211_hdr_3addr_qos *header; + u16 fc; + u8 *pDaddr, *pTaddr, *pRaddr; + + header = (struct ieee80211_hdr_3addr_qos *)pskb->data; + pTaddr = header->addr2; + pRaddr = header->addr1; + fc = le16_to_cpu(header->frame_ctl); + + if(GetToDs(&fc)) + pDaddr = header->addr3; + else + pDaddr = header->addr1; + + if ((_rtw_memcmp(pRaddr, padapter->pnetdev->dev_addr, ETH_ALEN) == 0) + && ! (pDaddr) + && (GetFrameType(&fc) == WIFI_QOS_DATA_TYPE)) + //&& ieee->pHTInfo->bCurrentHTSupport && + //ieee->pHTInfo->bCurRxReorderEnable) + ret = false; + else + ret = true; +#endif + WAPI_TRACE(WAPI_RX, "%s: return %d\n", __FUNCTION__, ret); + return ret; +} + +int SecSMS4HeaderFillIV(_adapter *padapter, u8 *pxmitframe) +{ + struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; + u8 * frame = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET; + u8 *pSecHeader = NULL, *pos = NULL, *pRA = NULL; + u8 bPNOverflow = false, bFindMatchPeer = false, hdr_len = 0; + PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL; + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_STA_INFO pWapiSta = NULL; + int ret = 0; + + WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); + + return ret; +#if 0 + hdr_len = sMacHdrLng; + if (GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE) + { + hdr_len += 2; + } + //hdr_len += SNAP_SIZE + sizeof(u16); + + pos = skb_push(pskb, padapter->wapiInfo.extra_prefix_len); + memmove(pos, pos+padapter->wapiInfo.extra_prefix_len, hdr_len); + + pSecHeader = pskb->data + hdr_len; + pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)pSecHeader; + pRA = pskb->data + 4; + + WAPI_DATA(WAPI_TX, "FillIV - Before Fill IV", pskb->data, pskb->len); + + //Address 1 is always receiver's address + if( IS_MCAST(pRA) ){ + if(!pWapiInfo->wapiTxMsk.bTxEnable){ + WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); + return -2; + } + if(pWapiInfo->wapiTxMsk.keyId <= 1){ + pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId; + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1); + memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16); + if (bPNOverflow){ + // Update MSK Notification. + WAPI_TRACE(WAPI_ERR,"===============>%s():multicast PN overflow\n",__FUNCTION__); + rtw_wapi_app_event_handler(padapter,NULL,0,pRA, false, false, true, 0, false); + } + }else{ + WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Multicast KeyIdx!!\n",__FUNCTION__); + ret = -3; + } + } + else{ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if(!memcmp(pWapiSta->PeerMacAddr,pRA,6)){ + bFindMatchPeer = true; + break; + } + } + if (bFindMatchPeer){ + if((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)){ + WAPI_TRACE(WAPI_ERR,"%s: bTxEnable = 0!!\n",__FUNCTION__); + return -4; + } + if (pWapiSta->wapiUsk.keyId <= 1){ + if(pWapiSta->wapiUskUpdate.bTxEnable) + pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId; + else + pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId; + + pWapiExt->Reserved = 0; + bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2); + memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16); + if (bPNOverflow){ + // Update USK Notification. + WAPI_TRACE(WAPI_ERR,"===============>%s():unicast PN overflow\n",__FUNCTION__); + rtw_wapi_app_event_handler(padapter,NULL,0,pWapiSta->PeerMacAddr, false, true, false, 0, false); + } + }else{ + WAPI_TRACE(WAPI_ERR,"%s: Invalid Wapi Unicast KeyIdx!!\n",__FUNCTION__); + ret = -5; + } + } + else{ + WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta "MAC_FMT"!!\n",__FUNCTION__, MAC_ARG(pRA)); + ret = -6; + } + } + + WAPI_DATA(WAPI_TX, "FillIV - After Fill IV", pskb->data, pskb->len); + WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); + return ret; +#endif +} + +// WAPI SW Enc: must have done Coalesce! +void SecSWSMS4Encryption( + _adapter *padapter, + u8 * pxmitframe + ) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 *pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE; + struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; + + u8 *SecPtr = NULL, *pRA, *pMicKey = NULL, *pDataKey = NULL, *pIV = NULL; + u8 IVOffset, DataOffset, bFindMatchPeer = false, KeyIdx = 0, MicBuffer[16]; + u16 OutputLength; + + WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); + + WAPI_TRACE(WAPI_TX,"hdrlen: %d \n",pattrib->hdrlen); + + return; + + DataOffset = pattrib->hdrlen + pattrib->iv_len; + + pRA = pframe + 4; + + + if( IS_MCAST(pRA) ){ + KeyIdx = pWapiInfo->wapiTxMsk.keyId; + pIV = pWapiInfo->lastTxMulticastPN; + pMicKey = pWapiInfo->wapiTxMsk.micKey; + pDataKey = pWapiInfo->wapiTxMsk.dataKey; + }else{ + if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (0 == memcmp(pWapiSta->PeerMacAddr, pRA, 6)){ + bFindMatchPeer = true; + break; + } + } + + if (bFindMatchPeer){ + if (pWapiSta->wapiUskUpdate.bTxEnable){ + KeyIdx = pWapiSta->wapiUskUpdate.keyId; + WAPI_TRACE(WAPI_TX, "%s(): Use update USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); + pIV = pWapiSta->lastTxUnicastPN; + pMicKey = pWapiSta->wapiUskUpdate.micKey; + pDataKey = pWapiSta->wapiUskUpdate.dataKey; + }else{ + KeyIdx = pWapiSta->wapiUsk.keyId; + WAPI_TRACE(WAPI_TX, "%s(): Use USK!! KeyIdx=%d\n", __FUNCTION__, KeyIdx); + pIV = pWapiSta->lastTxUnicastPN; + pMicKey = pWapiSta->wapiUsk.micKey; + pDataKey = pWapiSta->wapiUsk.dataKey; + } + }else{ + WAPI_TRACE(WAPI_ERR,"%s: Can not find Peer Sta!!\n",__FUNCTION__); + return; + } + }else{ + WAPI_TRACE(WAPI_ERR,"%s: wapiSTAUsedList is empty!!\n",__FUNCTION__); + return; + } + } + + SecPtr = pframe; + SecCalculateMicSMS4(KeyIdx, pMicKey, SecPtr, (SecPtr+DataOffset), pattrib->pktlen, MicBuffer); + + WAPI_DATA(WAPI_TX, "Encryption - MIC", MicBuffer, padapter->wapiInfo.extra_postfix_len); + + memcpy(pframe+pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen-pattrib->icv_len, + (u8 *)MicBuffer, + padapter->wapiInfo.extra_postfix_len + ); + + + WapiSMS4Encryption(pDataKey, pIV, (SecPtr+DataOffset),pattrib->pktlen+pattrib->icv_len, (SecPtr+DataOffset), &OutputLength); + + WAPI_DATA(WAPI_TX, "Encryption - After SMS4 encryption",pframe,pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen); + + WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); +} + +u8 SecSWSMS4Decryption( + _adapter *padapter, + u8 *precv_frame, + struct recv_priv *precv_priv + ) +{ + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + struct recv_frame_hdr *precv_hdr; + PRT_WAPI_STA_INFO pWapiSta = NULL; + u8 IVOffset, DataOffset, bFindMatchPeer = false, bUseUpdatedKey = false; + u8 KeyIdx, MicBuffer[16], lastRxPNforQoS[16]; + u8 *pRA, *pTA, *pMicKey, *pDataKey, *pLastRxPN, *pRecvPN, *pSecData, *pRecvMic, *pos; + u8 TID = 0; + u16 OutputLength, DataLen; + u8 bQosData; + struct sk_buff * pskb; + + WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); + + return 0; + + precv_hdr = &((union recv_frame*)precv_frame)->u.hdr; + pskb = (struct sk_buff *)(precv_hdr->rx_data); + precv_hdr->bWapiCheckPNInDecrypt = WapiCheckPnInSwDecrypt(padapter, pskb); + WAPI_TRACE(WAPI_RX, "=========>%s: check PN %d\n", __FUNCTION__,precv_hdr->bWapiCheckPNInDecrypt); + WAPI_DATA(WAPI_RX, "Decryption - Before decryption", pskb->data, pskb->len); + + IVOffset = sMacHdrLng; + bQosData = GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE; + if (bQosData){ + IVOffset += 2; + } + + //if(GetHTC()) + // IVOffset += 4; + + //IVOffset += SNAP_SIZE + sizeof(u16); + + DataOffset = IVOffset + padapter->wapiInfo.extra_prefix_len; + + pRA = pskb->data + 4; + pTA = pskb->data + 10; + KeyIdx = *(pskb->data + IVOffset); + pRecvPN = pskb->data + IVOffset + 2; + pSecData = pskb->data + DataOffset; + DataLen = pskb->len - DataOffset; + pRecvMic = pskb->data + pskb->len - padapter->wapiInfo.extra_postfix_len; + TID = GetTid(pskb->data); + + if (!list_empty(&(pWapiInfo->wapiSTAUsedList))){ + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if (0 == memcmp(pWapiSta->PeerMacAddr, pTA, 6)){ + bFindMatchPeer = true; + break; + } + } + } + + if (!bFindMatchPeer){ + WAPI_TRACE(WAPI_ERR, "%s: Can not find Peer Sta "MAC_FMT" for Key Info!!!\n", __FUNCTION__, MAC_ARG(pTA)); + return false; + } + + if( IS_MCAST(pRA) ){ + WAPI_TRACE(WAPI_RX, "%s: Multicast decryption !!!\n", __FUNCTION__); + if (pWapiSta->wapiMsk.keyId == KeyIdx && pWapiSta->wapiMsk.bSet){ + pLastRxPN = pWapiSta->lastRxMulticastPN; + if (!WapiComparePN(pRecvPN, pLastRxPN)){ + WAPI_TRACE(WAPI_ERR, "%s: MSK PN is not larger than last, Dropped!!!\n", __FUNCTION__); + WAPI_DATA(WAPI_ERR, "pRecvPN:", pRecvPN, 16); + WAPI_DATA(WAPI_ERR, "pLastRxPN:", pLastRxPN, 16); + return false; + } + + memcpy(pLastRxPN, pRecvPN, 16); + pMicKey = pWapiSta->wapiMsk.micKey; + pDataKey = pWapiSta->wapiMsk.dataKey; + }else if (pWapiSta->wapiMskUpdate.keyId == KeyIdx && pWapiSta->wapiMskUpdate.bSet){ + WAPI_TRACE(WAPI_RX, "%s: Use Updated MSK for Decryption !!!\n", __FUNCTION__); + bUseUpdatedKey = true; + memcpy(pWapiSta->lastRxMulticastPN, pRecvPN, 16); + pMicKey = pWapiSta->wapiMskUpdate.micKey; + pDataKey = pWapiSta->wapiMskUpdate.dataKey; + }else{ + WAPI_TRACE(WAPI_ERR, "%s: Can not find MSK with matched KeyIdx(%d), Dropped !!!\n", __FUNCTION__,KeyIdx); + return false; + } + } + else{ + WAPI_TRACE(WAPI_RX, "%s: Unicast decryption !!!\n", __FUNCTION__); + if (pWapiSta->wapiUsk.keyId == KeyIdx && pWapiSta->wapiUsk.bSet){ + WAPI_TRACE(WAPI_RX, "%s: Use USK for Decryption!!!\n", __FUNCTION__); + if(precv_hdr->bWapiCheckPNInDecrypt){ + if(GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE){ + WapiGetLastRxUnicastPNForQoSData(TID, pWapiSta, lastRxPNforQoS); + pLastRxPN = lastRxPNforQoS; + }else{ + pLastRxPN = pWapiSta->lastRxUnicastPN; + } + if (!WapiComparePN(pRecvPN, pLastRxPN)){ + return false; + } + if(bQosData){ + WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); + }else{ + memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); + } + }else{ + memcpy(precv_hdr->WapiTempPN,pRecvPN,16); + } + + if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE)) + { + if ((pRecvPN[0] & 0x1) == 0){ + WAPI_TRACE(WAPI_ERR, "%s: Rx USK PN is not odd when Infra STA mode, Dropped !!!\n", __FUNCTION__); + return false; + } + } + + pMicKey = pWapiSta->wapiUsk.micKey; + pDataKey = pWapiSta->wapiUsk.dataKey; + } + else if (pWapiSta->wapiUskUpdate.keyId == KeyIdx && pWapiSta->wapiUskUpdate.bSet ){ + WAPI_TRACE(WAPI_RX, "%s: Use Updated USK for Decryption!!!\n", __FUNCTION__); + if(pWapiSta->bAuthenticatorInUpdata) + bUseUpdatedKey = true; + else + bUseUpdatedKey = false; + + if(bQosData){ + WapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta); + }else{ + memcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16); + } + pMicKey = pWapiSta->wapiUskUpdate.micKey; + pDataKey = pWapiSta->wapiUskUpdate.dataKey; + }else{ + WAPI_TRACE(WAPI_ERR, "%s: No valid USK!!!KeyIdx=%d pWapiSta->wapiUsk.keyId=%d pWapiSta->wapiUskUpdate.keyId=%d\n", __FUNCTION__, KeyIdx, pWapiSta->wapiUsk.keyId, pWapiSta->wapiUskUpdate.keyId); + //dump_buf(pskb->data,pskb->len); + return false; + } + } + + WAPI_DATA(WAPI_RX, "Decryption - DataKey", pDataKey, 16); + WAPI_DATA(WAPI_RX, "Decryption - IV", pRecvPN, 16); + WapiSMS4Decryption(pDataKey, pRecvPN, pSecData, DataLen, pSecData, &OutputLength); + + if (OutputLength != DataLen) + WAPI_TRACE(WAPI_ERR, "%s: Output Length Error!!!!\n", __FUNCTION__); + + WAPI_DATA(WAPI_RX, "Decryption - After decryption", pskb->data, pskb->len); + + DataLen -= padapter->wapiInfo.extra_postfix_len; + + SecCalculateMicSMS4(KeyIdx, pMicKey, pskb->data, pSecData, DataLen, MicBuffer); + + WAPI_DATA(WAPI_RX, "Decryption - MIC received", pRecvMic, SMS4_MIC_LEN); + WAPI_DATA(WAPI_RX, "Decryption - MIC calculated", MicBuffer, SMS4_MIC_LEN); + + if (0 == memcmp(MicBuffer, pRecvMic, padapter->wapiInfo.extra_postfix_len)){ + WAPI_TRACE(WAPI_RX, "%s: Check MIC OK!!\n", __FUNCTION__); + if (bUseUpdatedKey){ + // delete the old key + if ( IS_MCAST(pRA) ){ + WAPI_TRACE(WAPI_API, "%s(): AE use new update MSK!!\n", __FUNCTION__); + pWapiSta->wapiMsk.keyId = pWapiSta->wapiMskUpdate.keyId; + memcpy(pWapiSta->wapiMsk.dataKey, pWapiSta->wapiMskUpdate.dataKey, 16); + memcpy(pWapiSta->wapiMsk.micKey, pWapiSta->wapiMskUpdate.micKey, 16); + pWapiSta->wapiMskUpdate.bTxEnable = pWapiSta->wapiMskUpdate.bSet = false; + }else{ + WAPI_TRACE(WAPI_API, "%s(): AE use new update USK!!\n", __FUNCTION__); + pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId; + memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16); + memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16); + pWapiSta->wapiUskUpdate.bTxEnable = pWapiSta->wapiUskUpdate.bSet = false; + } + } + }else{ + WAPI_TRACE(WAPI_ERR, "%s: Check MIC Error, Dropped !!!!\n", __FUNCTION__); + return false; + } + + pos = pskb->data; + memmove(pos+padapter->wapiInfo.extra_prefix_len, pos, IVOffset); + skb_pull(pskb, padapter->wapiInfo.extra_prefix_len); + + WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); + + return true; +} + +u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) +{ + + u8 *pframe; + u32 res = _SUCCESS; + + WAPI_TRACE(WAPI_TX, "=========>%s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) + { + WAPI_TRACE(WAPI_TX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); + return _FAIL; + } + + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + return _FAIL; + + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; + + SecSWSMS4Encryption(padapter, pxmitframe); + + WAPI_TRACE(WAPI_TX, "<=========%s\n", __FUNCTION__); + return res; +} + +u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) +{ + u8 *pframe; + u32 res = _SUCCESS; + + WAPI_TRACE(WAPI_RX, "=========>%s\n", __FUNCTION__); + + if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) + { + WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or enabled!\n", __FUNCTION__); + return _FAIL; + } + + + //drop packet when hw decrypt fail + //return tempraily + return _FAIL; + + //pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; + + if (false == SecSWSMS4Decryption(padapter, precvframe, &padapter->recvpriv)) + { + WAPI_TRACE(WAPI_ERR, "%s():SMS4 decrypt frame error\n",__FUNCTION__); + return _FAIL; + } + + WAPI_TRACE(WAPI_RX, "<=========%s\n", __FUNCTION__); + return res; +} + +#else + +u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe) +{ + WAPI_TRACE(WAPI_TX, "=========>Dummy %s\n", __FUNCTION__); + WAPI_TRACE(WAPI_TX, "<=========Dummy %s\n", __FUNCTION__); + return _SUCCESS; +} + +u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe) +{ + WAPI_TRACE(WAPI_RX, "=========>Dummy %s\n", __FUNCTION__); + WAPI_TRACE(WAPI_RX, "<=========Dummy %s\n", __FUNCTION__); + return _SUCCESS; +} + +#endif + +#endif diff --git a/drivers/net/wireless/rtl8723as/core/rtw_wlan_util.c b/drivers/net/wireless/rtl8723as/core/rtw_wlan_util.c index 182865daaab0..8615468f2648 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_wlan_util.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_wlan_util.c @@ -24,6 +24,9 @@ #include #include +#ifdef CONFIG_WOWLAN +#include +#endif unsigned char ARTHEROS_OUI1[] = {0x00, 0x03, 0x7f}; unsigned char ARTHEROS_OUI2[] = {0x00, 0x13, 0x74}; @@ -361,66 +364,21 @@ void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen) void Save_DM_Func_Flag(_adapter *padapter) { u8 bSaveFlag = _TRUE; - -#ifdef CONFIG_CONCURRENT_MODE - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - if(pbuddy_adapter) - rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag)); -#endif - rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag)); - } void Restore_DM_Func_Flag(_adapter *padapter) { u8 bSaveFlag = _FALSE; -#ifdef CONFIG_CONCURRENT_MODE - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; - if(pbuddy_adapter) - rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag)); -#endif rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag)); } void Switch_DM_Func(_adapter *padapter, u32 mode, u8 enable) { -#ifdef CONFIG_CONCURRENT_MODE - _adapter *pbuddy_adapter = padapter->pbuddy_adapter; -#endif - if(enable == _TRUE) - { -#ifdef CONFIG_CONCURRENT_MODE - if(pbuddy_adapter) - rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode)); -#endif rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode)); - } else - { -#ifdef CONFIG_CONCURRENT_MODE - if(pbuddy_adapter) - rtw_hal_set_hwreg(pbuddy_adapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode)); -#endif rtw_hal_set_hwreg(padapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode)); - } - -#if 0 - u8 val8; - - val8 = rtw_read8(padapter, FW_DYNAMIC_FUN_SWITCH); - - if(enable == _TRUE) - { - rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 | mode)); - } - else - { - rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 & mode)); - } -#endif - } static void Set_NETYPE1_MSR(_adapter *padapter, u8 type) @@ -454,6 +412,9 @@ inline u8 rtw_get_oper_ch(_adapter *adapter) inline void rtw_set_oper_ch(_adapter *adapter, u8 ch) { + if (adapter_to_dvobj(adapter)->oper_channel != ch) + adapter_to_dvobj(adapter)->on_oper_ch_time = rtw_get_current_time(); + adapter_to_dvobj(adapter)->oper_channel = ch; } @@ -477,6 +438,19 @@ inline void rtw_set_oper_choffset(_adapter *adapter, u8 offset) adapter_to_dvobj(adapter)->oper_ch_offset = offset; } +inline u32 rtw_get_on_oper_ch_time(_adapter *adapter) +{ + return adapter_to_dvobj(adapter)->on_oper_ch_time; +} + +inline u32 rtw_get_on_cur_ch_time(_adapter *adapter) +{ + if (adapter->mlmeextpriv.cur_channel == adapter_to_dvobj(adapter)->oper_channel) + return adapter_to_dvobj(adapter)->on_oper_ch_time; + else + return 0; +} + void SelectChannel(_adapter *padapter, unsigned char channel) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -707,20 +681,25 @@ static u32 _ReadCAM(_adapter *padapter ,u32 addr) return rtw_read32(padapter,REG_CAMREAD); } +#endif void read_cam(_adapter *padapter ,u8 entry) { - u32 j,count = 0, addr, cmd; + u32 j,count = 0, addr; + u32 cam_val[2]; //cam_val[0] is read_val, cam_val[1] is the address addr = entry << 3; DBG_8192C("********* DUMP CAM Entry_#%02d***************\n",entry); for (j = 0; j < 6; j++) { - cmd = _ReadCAM(padapter ,addr+j); - DBG_8192C("offset:0x%02x => 0x%08x \n",addr+j,cmd); + //cmd = _ReadCAM(padapter ,addr+j); + //HW_VAR_CAM_READ + cam_val[1]=addr+j; + rtw_hal_get_hwreg(padapter, HW_VAR_CAM_READ, (u8 *)cam_val); + DBG_8192C("offset:0x%02x => 0x%08x \n",addr+j,cam_val[0]); } DBG_8192C("*********************************\n"); } -#endif + void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key) { @@ -2612,4 +2591,72 @@ int rtw_handle_dualmac(_adapter *adapter, bool init) exit: return status; } +#ifdef CONFIG_WOWLAN +void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct in_device *my_ip_ptr = padapter->pnetdev->ip_ptr; + u8 ipaddress[4]; + + if ( (pmlmeinfo->state & WIFI_FW_LINKING_STATE) ) { + if ( my_ip_ptr != NULL ) { + struct in_ifaddr *my_ifa_list = my_ip_ptr->ifa_list ; + if ( my_ifa_list != NULL ) { + ipaddress[0] = my_ifa_list->ifa_address & 0xFF; + ipaddress[1] = (my_ifa_list->ifa_address >> 8) & 0xFF; + ipaddress[2] = (my_ifa_list->ifa_address >> 16) & 0xFF; + ipaddress[3] = my_ifa_list->ifa_address >> 24; + DBG_871X("%s: %d.%d.%d.%d ==========\n", __func__, + ipaddress[0], ipaddress[1], ipaddress[2], ipaddress[3]); + _rtw_memcpy(pcurrentip, ipaddress, 4); + } + } + } +} +void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr) +{ + struct sta_info *psta; + struct security_priv *psecpriv = &padapter->securitypriv; + + _rtw_memset(pcur_dot11txpn, 0, 8); + if(NULL == StaAddr) + return; + psta = rtw_get_stainfo(&padapter->stapriv, StaAddr); + DBG_871X("%s(): StaAddr: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", + __func__, StaAddr[0], StaAddr[1], StaAddr[2], StaAddr[3], StaAddr[4], StaAddr[5]); + if(psta) + { + if (psecpriv->dot11PrivacyAlgrthm != _NO_PRIVACY_ && psta->dot11txpn.val > 0) + psta->dot11txpn.val--; + + _rtw_memcpy(pcur_dot11txpn, (u8*)&psta->dot11txpn, 8); + + DBG_871X("%s(): CurrentIV: 0x%016llx\n", __func__, psta->dot11txpn.val); + } +} +void rtw_set_sec_iv(PADAPTER padapter) +{ + struct sta_info *psta; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct security_priv *psecpriv = &padapter->securitypriv; + + psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(&pmlmeinfo->network)); + + if(psta) + { + if (pwrpriv->wowlan_fw_iv > psta->dot11txpn.val) + { + if (psecpriv->dot11PrivacyAlgrthm != _NO_PRIVACY_) + psta->dot11txpn.val = pwrpriv->wowlan_fw_iv + 2; + } else { + DBG_871X("%s(): FW IV is smaller than driver\n", __func__); + psta->dot11txpn.val += 2; + } + DBG_871X("%s: dot11txpn: 0x%016llx\n", __func__ ,psta->dot11txpn.val); + } +} +#endif //CONFIG_WOWLAN diff --git a/drivers/net/wireless/rtl8723as/core/rtw_xmit.c b/drivers/net/wireless/rtl8723as/core/rtw_xmit.c index 0ba3bce864fb..73043534f56c 100755 --- a/drivers/net/wireless/rtl8723as/core/rtw_xmit.c +++ b/drivers/net/wireless/rtl8723as/core/rtw_xmit.c @@ -1960,6 +1960,244 @@ _func_exit_; return res; } +#ifdef CONFIG_IEEE80211W +//broadcast or multicast management pkt use BIP, unicast management pkt use CCMP encryption +s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe) +{ + struct pkt_file pktfile; + s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz; + SIZE_PTR addr; + u8 *pframe, *mem_start = NULL, *tmp_buf=NULL; + u8 hw_hdr_offset, subtype ; + struct sta_info *psta = NULL; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 *pbuf_start; + s32 bmcst = IS_MCAST(pattrib->ra); + s32 res = _FAIL; + u8 *BIP_AAD; + u8 *MGMT_body=NULL; + + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct rtw_ieee80211_hdr *pwlanhdr; + u8 MME[_MME_IE_LENGTH_]; + + _irqL irqL; + u32 ori_len; + mem_start = pframe = (u8 *)(pxmitframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + tmp_buf = BIP_AAD; + +_func_enter_; + ori_len = BIP_AAD_SIZE+pattrib->pktlen; + tmp_buf = BIP_AAD = rtw_zmalloc(ori_len); + subtype = GetFrameSubType(pframe); //bit(7)~bit(2) + + if(BIP_AAD == NULL) + return _FAIL; + + _enter_critical_bh(&padapter->security_key_mutex, &irqL); + + //only support station mode + if(!check_fwstate(pmlmepriv, WIFI_STATION_STATE) || !check_fwstate(pmlmepriv, _FW_LINKED)) + goto xmitframe_coalesce_success; + + //IGTK key is not install, it may not support 802.11w + if(padapter->securitypriv.binstallBIPkey != _TRUE) + { + DBG_871X("no instll BIP key\n"); + goto xmitframe_coalesce_success; + } + //station mode doesn't need TX BIP, just ready the code + if(bmcst) + { + int frame_body_len; + u8 mic[16]; + + _rtw_memset(MME, 0, 18); + + //other types doesn't need the BIP + if(GetFrameSubType(pframe) != WIFI_DEAUTH && GetFrameSubType(pframe) != WIFI_DISASSOC) + goto xmitframe_coalesce_fail; + + MGMT_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += pattrib->pktlen; + + //octent 0 and 1 is key index ,BIP keyid is 4 or 5, LSB only need octent 0 + MME[0]=padapter->securitypriv.dot11wBIPKeyid; + //copy packet number + _rtw_memcpy(&MME[2], &pmlmeext->mgnt_80211w_IPN, 6); + //increase the packet number + pmlmeext->mgnt_80211w_IPN++; + + //add MME IE with MIC all zero, MME string doesn't include element id and length + pframe = rtw_set_ie(pframe, _MME_IE_ , 16 , MME, &(pattrib->pktlen)); + pattrib->last_txcmdsz = pattrib->pktlen; + // total frame length - header length + frame_body_len = pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr); + + //conscruct AAD, copy frame control field + _rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2); + ClearRetry(BIP_AAD); + ClearPwrMgt(BIP_AAD); + ClearMData(BIP_AAD); + //conscruct AAD, copy address 1 to address 3 + _rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18); + //copy management fram body + _rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, MGMT_body, frame_body_len); + /*//dump total packet include MME with zero MIC + { + int i; + printk("Total packet: "); + for(i=0; i < BIP_AAD_SIZE+frame_body_len; i++) + printk(" %02x ", BIP_AAD[i]); + printk("\n"); + }*/ + //calculate mic + if(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey + , BIP_AAD, BIP_AAD_SIZE+frame_body_len, mic)) + goto xmitframe_coalesce_fail; + + /*//dump calculated mic result + { + int i; + printk("Calculated mic result: "); + for(i=0; i<16; i++) + printk(" %02x ", mic[i]); + printk("\n"); + }*/ + //copy right BIP mic value, total is 128bits, we use the 0~63 bits + _rtw_memcpy(pframe-8, mic, 8); + /*/dump all packet after mic ok + { + int pp; + printk("pattrib->pktlen = %d \n", pattrib->pktlen); + for(pp=0;pp< pattrib->pktlen; pp++) + printk(" %02x ", mem_start[pp]); + printk("\n"); + }*/ + } + else //unicast mgmt frame TX + { + //start to encrypt mgmt frame + if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC || + subtype == WIFI_REASSOCREQ || subtype == WIFI_ACTION) + { + if (pattrib->psta) + psta = pattrib->psta; + else + { + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + } + + if(psta==NULL) + { + + DBG_871X("%s, psta==NUL\n", __func__); + goto xmitframe_coalesce_fail; + } + + if(!(psta->state & _FW_LINKED) || pxmitframe->buf_addr==NULL) + { + DBG_871X("%s, not _FW_LINKED or addr null\n", __func__); + goto xmitframe_coalesce_fail; + } + + //DBG_871X("%s, action frame category=%d \n", __func__, pframe[WLAN_HDR_A3_LEN]); + //according 802.11-2012 standard, these five types are not robust types + if(subtype == WIFI_ACTION && + (pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_PUBLIC || + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_HT || + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_UNPROTECTED_WNM || + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_SELF_PROTECTED || + pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_P2P)) + goto xmitframe_coalesce_fail; + /*//before encrypt dump the management packet content + { + int i; + printk("Management pkt: "); + for(i=0; ipktlen; i++) + printk(" %02x ", pframe[i]); + printk("=======\n"); + }*/ + + //bakeup original management packet + _rtw_memcpy(tmp_buf, pframe, pattrib->pktlen); + //move to data portion + pframe += pattrib->hdrlen; + + //802.11w unicast management packet must be _AES_ + pattrib->iv_len = 8; + //it's MIC of AES + pattrib->icv_len = 8; + + switch(pattrib->encrypt) + { + case _AES_: + //set AES IV header + AES_IV(pattrib->iv, psta->dot11wtxpn, 0); + break; + default: + goto xmitframe_coalesce_fail; + } + //insert iv header into management frame + _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len); + pframe += pattrib->iv_len; + //copy mgmt data portion after CCMP header + _rtw_memcpy(pframe, tmp_buf+pattrib->hdrlen, pattrib->pktlen-pattrib->hdrlen); + //move pframe to end of mgmt pkt + pframe += pattrib->pktlen-pattrib->hdrlen; + //add 8 bytes CCMP IV header to length + pattrib->pktlen += pattrib->iv_len; + /*//dump management packet include AES IV header + { + int i; + printk("Management pkt + IV: "); + //for(i=0; ipktlen; i++) + //printk(" %02x ", mem_start[i]); + printk("@@@@@@@@@@@@@\n"); + }*/ + + if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) { + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); + pframe += pattrib->icv_len; + } + //add 8 bytes MIC + pattrib->pktlen += pattrib->icv_len; + //set final tx command size + pattrib->last_txcmdsz = pattrib->pktlen; + + //set protected bit must be beofre SW encrypt + SetPrivacy(mem_start); + /*//dump management packet include AES header + { + int i; + printk("prepare to enc Management pkt + IV: "); + for(i=0; ipktlen; i++) + printk(" %02x ", mem_start[i]); + printk("@@@@@@@@@@@@@\n"); + }*/ + //software encrypt + xmitframe_swencrypt(padapter, pxmitframe); + } + } + +xmitframe_coalesce_success: + _exit_critical_bh(&padapter->security_key_mutex, &irqL); + rtw_mfree(BIP_AAD, ori_len); +_func_exit_; + return _SUCCESS; + +xmitframe_coalesce_fail: + _exit_critical_bh(&padapter->security_key_mutex, &irqL); + rtw_mfree(BIP_AAD, ori_len); +_func_exit_; + + return _FAIL; +} +#endif //CONFIG_IEEE80211W + /* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header * IEEE LLC/SNAP header contains 8 octets * First 3 octets comprise the LLC portion @@ -2996,14 +3234,14 @@ int rtw_br_client_tx(_adapter *padapter, struct sk_buff **pskb) *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr; } - newskb = skb_copy(skb, GFP_ATOMIC); + newskb = rtw_skb_copy(skb); if (newskb == NULL) { //priv->ext_stats.tx_drops++; - DEBUG_ERR("TX DROP: skb_copy fail!\n"); + DEBUG_ERR("TX DROP: rtw_skb_copy fail!\n"); //goto stop_proc; return -1; } - dev_kfree_skb_any(skb); + rtw_skb_free(skb); *pskb = skb = newskb; if (is_vlan_tag) { @@ -3606,10 +3844,12 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta) struct sta_priv *pstapriv = &padapter->stapriv; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + psta_bmc = rtw_get_bcmc_stainfo(padapter); + + //_enter_critical_bh(&psta->sleep_q.lock, &irqL); _enter_critical_bh(&pxmitpriv->lock, &irqL); - xmitframe_phead = get_list_head(&psta->sleep_q); xmitframe_plist = get_next(xmitframe_phead); @@ -3678,52 +3918,12 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta) } - if(psta->sleepq_len==0) - { -#ifdef CONFIG_TDLS - if( psta->tdls_sta_state & TDLS_LINKED_STATE ) - { - if(psta->state&WIFI_SLEEP_STATE) - psta->state ^= WIFI_SLEEP_STATE; - - //_exit_critical_bh(&psta->sleep_q.lock, &irqL); - _exit_critical_bh(&pxmitpriv->lock, &irqL); - return; - } -#endif //CONFIG_TDLS - pstapriv->tim_bitmap &= ~BIT(psta->aid); - - //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); - //upate BCN for TIM IE - //update_BCNTIM(padapter); - update_mask = BIT(0); - - if(psta->state&WIFI_SLEEP_STATE) - psta->state ^= WIFI_SLEEP_STATE; - - if(psta->state & WIFI_STA_ALIVE_CHK_STATE) - { - psta->expire_to = pstapriv->expire_to; - psta->state ^= WIFI_STA_ALIVE_CHK_STATE; - } - - pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); - } - - //_exit_critical_bh(&psta->sleep_q.lock, &irqL); - _exit_critical_bh(&pxmitpriv->lock, &irqL); - - //for BC/MC Frames - psta_bmc = rtw_get_bcmc_stainfo(padapter); if(!psta_bmc) - return; + goto _exit; if((pstapriv->sta_dz_bitmap&0xfffe) == 0x0)//no any sta in ps mode { - //_enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); - _enter_critical_bh(&pxmitpriv->lock, &irqL); - xmitframe_phead = get_list_head(&psta_bmc->sleep_q); xmitframe_plist = get_next(xmitframe_phead); @@ -3767,11 +3967,42 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta) update_mask |= BIT(1); } - //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); - _exit_critical_bh(&pxmitpriv->lock, &irqL); - } + if(psta->sleepq_len==0) + { +#ifdef CONFIG_TDLS + if( psta->tdls_sta_state & TDLS_LINKED_STATE ) + { + if(psta->state&WIFI_SLEEP_STATE) + psta->state ^= WIFI_SLEEP_STATE; + + goto _exit; + } +#endif //CONFIG_TDLS + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_mask = BIT(0); + + if(psta->state&WIFI_SLEEP_STATE) + psta->state ^= WIFI_SLEEP_STATE; + + if(psta->state & WIFI_STA_ALIVE_CHK_STATE) + { + psta->expire_to = pstapriv->expire_to; + psta->state ^= WIFI_STA_ALIVE_CHK_STATE; + } + + pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); + } + +_exit: + + //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + _exit_critical_bh(&pxmitpriv->lock, &irqL); if(update_mask) { @@ -4150,8 +4381,66 @@ int rtw_ack_tx_polling(struct xmit_priv *pxmitpriv, u32 timeout_ms) } #endif +#ifdef CONFIG_DETECT_C2H_BY_POLLING +s32 c2h_evt_hdl(_adapter *adapter, struct c2h_evt_hdr *c2h_evt, c2h_id_filter filter); +#endif + int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms) { +#ifdef CONFIG_DETECT_C2H_BY_POLLING + _adapter *adapter = container_of(pxmitpriv, _adapter, xmitpriv); + c2h_id_filter ccx_id_filter = rtw_hal_c2h_id_filter_ccx(adapter); + struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops; + u8 check_c2hcmd; + u8 check_ccx; + int ret = _FAIL; + + pack_tx_ops->submit_time = rtw_get_current_time(); + pack_tx_ops->timeout_ms = timeout_ms; + pack_tx_ops->status = RTW_SCTX_SUBMITTED; + + do { + rtw_msleep_os(10); + //check_c2hcmd = rtw_read8(adapter, 0x1AF); + //check_ccx = rtw_read8(adapter, 0x1A0); + rtw_hal_get_hwreg(adapter, HW_VAR_C2HEVT_CLEAR, (u8 *)(&check_c2hcmd)); + rtw_hal_get_hwreg(adapter, HW_VAR_C2HEVT_MSG_NORMAL, (u8 *)(&check_ccx)); + + + if (check_c2hcmd != 0) + { + if (check_c2hcmd != 0xFF) + { + c2h_evt_clear(adapter); + } + else if (ccx_id_filter(check_ccx & 0x0F) == _TRUE) + { + c2h_evt_hdl(adapter, NULL, ccx_id_filter); + if (pack_tx_ops->status != RTW_SCTX_SUBMITTED) + break; + + if (adapter->bDriverStopped) { + pack_tx_ops->status = RTW_SCTX_DONE_DRV_STOP; + break; + } + if (adapter->bSurpriseRemoved) { + pack_tx_ops->status = RTW_SCTX_DONE_DEV_REMOVE; + break; + } + } + } + } while (rtw_get_passing_time_ms(pack_tx_ops->submit_time) < timeout_ms); + + if (pack_tx_ops->status == RTW_SCTX_SUBMITTED) { + pack_tx_ops->status = RTW_SCTX_DONE_TIMEOUT; + DBG_871X("%s timeout\n", __func__); + } + + if (pack_tx_ops->status == RTW_SCTX_DONE_SUCCESS) + ret = _SUCCESS; + + return ret; +#else #ifdef CONFIG_XMIT_ACK_POLLING return rtw_ack_tx_polling(pxmitpriv, timeout_ms); #else @@ -4163,6 +4452,7 @@ int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms) return rtw_sctx_wait(pack_tx_ops); #endif +#endif } void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status) diff --git a/drivers/net/wireless/rtl8723as/hal/HalPwrSeqCmd.c b/drivers/net/wireless/rtl8723as/hal/HalPwrSeqCmd.c index 1a7fc94cb49d..2948242cab68 100755 --- a/drivers/net/wireless/rtl8723as/hal/HalPwrSeqCmd.c +++ b/drivers/net/wireless/rtl8723as/hal/HalPwrSeqCmd.c @@ -1,187 +1,187 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -/*++ -Copyright (c) Realtek Semiconductor Corp. All rights reserved. - -Module Name: - HalPwrSeqCmd.c - -Abstract: - Implement HW Power sequence configuration CMD handling routine for Realtek devices. - -Major Change History: - When Who What - ---------- --------------- ------------------------------- - 2011-10-26 Lucas Modify to be compatible with SD4-CE driver. - 2011-07-07 Roger Create. - ---*/ -#include -#ifdef CONFIG_SDIO_HCI -#include -#elif defined(CONFIG_GSPI_HCI) -#include -#endif - -// -// Description: -// This routine deal with the Power Configuration CMDs parsing for RTL8723/RTL8188E Series IC. -// -// Assumption: -// We should follow specific format which was released from HW SD. -// -// 2011.07.07, added by Roger. -// -u8 HalPwrSeqCmdParsing( - PADAPTER padapter, - u8 CutVersion, - u8 FabVersion, - u8 InterfaceType, - WLAN_PWR_CFG PwrSeqCmd[]) -{ - WLAN_PWR_CFG PwrCfgCmd = {0}; - u8 bPollingBit = _FALSE; - u32 AryIdx = 0; - u8 value = 0; - u32 offset = 0; - u32 pollingCount = 0; // polling autoload done. - u32 maxPollingCnt = 5000; - - do { - PwrCfgCmd = PwrSeqCmd[AryIdx]; - - RT_TRACE(_module_hal_init_c_ , _drv_info_, - ("HalPwrSeqCmdParsing: offset(%#x) cut_msk(%#x) fab_msk(%#x) interface_msk(%#x) base(%#x) cmd(%#x) msk(%#x) value(%#x)\n", - GET_PWR_CFG_OFFSET(PwrCfgCmd), - GET_PWR_CFG_CUT_MASK(PwrCfgCmd), - GET_PWR_CFG_FAB_MASK(PwrCfgCmd), - GET_PWR_CFG_INTF_MASK(PwrCfgCmd), - GET_PWR_CFG_BASE(PwrCfgCmd), - GET_PWR_CFG_CMD(PwrCfgCmd), - GET_PWR_CFG_MASK(PwrCfgCmd), - GET_PWR_CFG_VALUE(PwrCfgCmd))); - - //2 Only Handle the command whose FAB, CUT, and Interface are matched - if ((GET_PWR_CFG_FAB_MASK(PwrCfgCmd) & FabVersion) && - (GET_PWR_CFG_CUT_MASK(PwrCfgCmd) & CutVersion) && - (GET_PWR_CFG_INTF_MASK(PwrCfgCmd) & InterfaceType)) - { - switch (GET_PWR_CFG_CMD(PwrCfgCmd)) - { - case PWR_CMD_READ: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_READ\n")); - break; - - case PWR_CMD_WRITE: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_WRITE\n")); - offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); - -#ifdef CONFIG_SDIO_HCI - // - // We should deal with interface specific address mapping for some interfaces, e.g., SDIO interface - // 2011.07.07. - // - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - { - // Read Back SDIO Local value - value = SdioLocalCmd52Read1Byte(padapter, offset); - - value &= ~(GET_PWR_CFG_MASK(PwrCfgCmd)); - value |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)); - - // Write Back SDIO Local value - SdioLocalCmd52Write1Byte(padapter, offset, value); - } - else -#endif - { -#ifdef CONFIG_GSPI_HCI - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - offset = SPI_LOCAL_OFFSET | offset; -#endif - // Read the value from system register - value = rtw_read8(padapter, offset); - - value &= ~(GET_PWR_CFG_MASK(PwrCfgCmd)); - value |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)); - - // Write the value back to sytem register - rtw_write8(padapter, offset, value); - } - break; - - case PWR_CMD_POLLING: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_POLLING\n")); - - bPollingBit = _FALSE; - offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); -#ifdef CONFIG_GSPI_HCI - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - offset = SPI_LOCAL_OFFSET | offset; -#endif - do { -#ifdef CONFIG_SDIO_HCI - if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) - value = SdioLocalCmd52Read1Byte(padapter, offset); - else -#endif - value = rtw_read8(padapter, offset); - - value &= GET_PWR_CFG_MASK(PwrCfgCmd); - if (value == (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd))) - bPollingBit = _TRUE; - else - rtw_udelay_os(10); - - if (pollingCount++ > maxPollingCnt) { - DBG_871X("Fail to polling Offset[%#x]\n", offset); - return _FALSE; - } - } while (!bPollingBit); - - break; - - case PWR_CMD_DELAY: - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_DELAY\n")); - if (GET_PWR_CFG_VALUE(PwrCfgCmd) == PWRSEQ_DELAY_US) - rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)); - else - rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)*1000); - break; - - case PWR_CMD_END: - // When this command is parsed, end the process - RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_END\n")); - return _TRUE; - break; - - default: - RT_TRACE(_module_hal_init_c_ , _drv_err_, ("HalPwrSeqCmdParsing: Unknown CMD!!\n")); - break; - } - } - - AryIdx++;//Add Array Index - }while(1); - - return _TRUE; -} - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/*++ +Copyright (c) Realtek Semiconductor Corp. All rights reserved. + +Module Name: + HalPwrSeqCmd.c + +Abstract: + Implement HW Power sequence configuration CMD handling routine for Realtek devices. + +Major Change History: + When Who What + ---------- --------------- ------------------------------- + 2011-10-26 Lucas Modify to be compatible with SD4-CE driver. + 2011-07-07 Roger Create. + +--*/ +#include +#ifdef CONFIG_SDIO_HCI +#include +#elif defined(CONFIG_GSPI_HCI) +#include +#endif + +// +// Description: +// This routine deal with the Power Configuration CMDs parsing for RTL8723/RTL8188E Series IC. +// +// Assumption: +// We should follow specific format which was released from HW SD. +// +// 2011.07.07, added by Roger. +// +u8 HalPwrSeqCmdParsing( + PADAPTER padapter, + u8 CutVersion, + u8 FabVersion, + u8 InterfaceType, + WLAN_PWR_CFG PwrSeqCmd[]) +{ + WLAN_PWR_CFG PwrCfgCmd = {0}; + u8 bPollingBit = _FALSE; + u32 AryIdx = 0; + u8 value = 0; + u32 offset = 0; + u32 pollingCount = 0; // polling autoload done. + u32 maxPollingCnt = 5000; + + do { + PwrCfgCmd = PwrSeqCmd[AryIdx]; + + RT_TRACE(_module_hal_init_c_ , _drv_info_, + ("HalPwrSeqCmdParsing: offset(%#x) cut_msk(%#x) fab_msk(%#x) interface_msk(%#x) base(%#x) cmd(%#x) msk(%#x) value(%#x)\n", + GET_PWR_CFG_OFFSET(PwrCfgCmd), + GET_PWR_CFG_CUT_MASK(PwrCfgCmd), + GET_PWR_CFG_FAB_MASK(PwrCfgCmd), + GET_PWR_CFG_INTF_MASK(PwrCfgCmd), + GET_PWR_CFG_BASE(PwrCfgCmd), + GET_PWR_CFG_CMD(PwrCfgCmd), + GET_PWR_CFG_MASK(PwrCfgCmd), + GET_PWR_CFG_VALUE(PwrCfgCmd))); + + //2 Only Handle the command whose FAB, CUT, and Interface are matched + if ((GET_PWR_CFG_FAB_MASK(PwrCfgCmd) & FabVersion) && + (GET_PWR_CFG_CUT_MASK(PwrCfgCmd) & CutVersion) && + (GET_PWR_CFG_INTF_MASK(PwrCfgCmd) & InterfaceType)) + { + switch (GET_PWR_CFG_CMD(PwrCfgCmd)) + { + case PWR_CMD_READ: + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_READ\n")); + break; + + case PWR_CMD_WRITE: + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_WRITE\n")); + offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); + +#ifdef CONFIG_SDIO_HCI + // + // We should deal with interface specific address mapping for some interfaces, e.g., SDIO interface + // 2011.07.07. + // + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + { + // Read Back SDIO Local value + value = SdioLocalCmd52Read1Byte(padapter, offset); + + value &= ~(GET_PWR_CFG_MASK(PwrCfgCmd)); + value |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)); + + // Write Back SDIO Local value + SdioLocalCmd52Write1Byte(padapter, offset, value); + } + else +#endif + { +#ifdef CONFIG_GSPI_HCI + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + offset = SPI_LOCAL_OFFSET | offset; +#endif + // Read the value from system register + value = rtw_read8(padapter, offset); + + value &= ~(GET_PWR_CFG_MASK(PwrCfgCmd)); + value |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)); + + // Write the value back to sytem register + rtw_write8(padapter, offset, value); + } + break; + + case PWR_CMD_POLLING: + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_POLLING\n")); + + bPollingBit = _FALSE; + offset = GET_PWR_CFG_OFFSET(PwrCfgCmd); +#ifdef CONFIG_GSPI_HCI + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + offset = SPI_LOCAL_OFFSET | offset; +#endif + do { +#ifdef CONFIG_SDIO_HCI + if (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO) + value = SdioLocalCmd52Read1Byte(padapter, offset); + else +#endif + value = rtw_read8(padapter, offset); + + value &= GET_PWR_CFG_MASK(PwrCfgCmd); + if (value == (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd))) + bPollingBit = _TRUE; + else + rtw_udelay_os(10); + + if (pollingCount++ > maxPollingCnt) { + DBG_871X("Fail to polling Offset[%#x]\n", offset); + return _FALSE; + } + } while (!bPollingBit); + + break; + + case PWR_CMD_DELAY: + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_DELAY\n")); + if (GET_PWR_CFG_VALUE(PwrCfgCmd) == PWRSEQ_DELAY_US) + rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)); + else + rtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)*1000); + break; + + case PWR_CMD_END: + // When this command is parsed, end the process + RT_TRACE(_module_hal_init_c_ , _drv_info_, ("HalPwrSeqCmdParsing: PWR_CMD_END\n")); + return _TRUE; + break; + + default: + RT_TRACE(_module_hal_init_c_ , _drv_err_, ("HalPwrSeqCmdParsing: Unknown CMD!!\n")); + break; + } + } + + AryIdx++;//Add Array Index + }while(1); + + return _TRUE; +} + + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.c index c28dcdfe241d..a6353905bad0 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.c @@ -352,6 +352,16 @@ VOID odm_1R_CCA( IN PDM_ODM_T pDM_Odm ); +VOID +odm_AdaptivityInit( + IN PDM_ODM_T pDM_Odm +); + +VOID +odm_Adaptivity( + IN PDM_ODM_T pDM_Odm, + IN u1Byte IGI +); //END---------BB POWER SAVE-----------------------// //START-----------------PSD-----------------------// @@ -775,6 +785,7 @@ ODM_DMInit( odm_CommonInfoSelfInit(pDM_Odm); odm_CmnInfoInit_Debug(pDM_Odm); odm_DIGInit(pDM_Odm); + odm_AdaptivityInit(pDM_Odm); odm_RateAdaptiveMaskInit(pDM_Odm); if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) @@ -835,12 +846,11 @@ ODM_DMWatchdog( //8723A or 8189ES platform //NeilChen--2012--08--24-- //Fix Leave LPS issue - if( (pDM_Odm->Adapter->pwrctrlpriv.pwr_mode != PS_MODE_ACTIVE) &&// in LPS mode + if( (adapter_to_pwrctl(pDM_Odm->Adapter)->pwr_mode != PS_MODE_ACTIVE) &&// in LPS mode ( (pDM_Odm->SupportICType & (ODM_RTL8723A ) )|| - (pDM_Odm->SupportICType & (ODM_RTL8188E) &&((pDM_Odm->SupportInterface == ODM_ITRF_SDIO)) ) - - //&&((pDM_Odm->SupportInterface == ODM_ITRF_SDIO)) + (pDM_Odm->SupportICType & (ODM_RTL8188E) )//&&((pDM_Odm->SupportInterface == ODM_ITRF_SDIO)) ) + ) ) { @@ -860,6 +870,9 @@ ODM_DMWatchdog( if(*(pDM_Odm->pbPowerSaving)==TRUE) return; + + odm_Adaptivity(pDM_Odm, pDM_Odm->DM_DigTable.CurIGValue); + odm_RefreshRateAdaptiveMask(pDM_Odm); @@ -992,13 +1005,6 @@ ODM_CmnInfoInit( } - // - // Tx power tracking BB swing table. - // The base index = 12. +((12-n)/2)dB 13~?? = decrease tx pwr by -((n-12)/2)dB - // - pDM_Odm->BbSwingIdxOfdm = 12; // Set defalut value as index 12. - pDM_Odm->BbSwingIdxOfdmCurrent = 12; - pDM_Odm->BbSwingFlagOfdm = FALSE; } @@ -1628,164 +1634,1070 @@ odm_DynamicEDCCA( u1Byte RegC50, RegC58; BOOLEAN bEDCCAenable = FALSE; - RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0); - RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0); + RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0); + RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0); + + + if((RegC50 > 0x28 && RegC58 > 0x28) || + ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26)) || + (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28)) + { + if(!pHalData->bPreEdccaEnable) + { + odm_EnableEDCCA(pDM_Odm); + pHalData->bPreEdccaEnable = TRUE; + } + + } + else if((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25)) + { + if(pHalData->bPreEdccaEnable) + { + odm_DisableEDCCA(pDM_Odm); + pHalData->bPreEdccaEnable = FALSE; + } + } +} + + +#endif // end MP platform support + +VOID +ODM_Write_DIG( + IN PDM_ODM_T pDM_Odm, + IN u1Byte CurrentIGI + ) +{ + pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_REG(IGI_A,pDM_Odm)=0x%x, ODM_BIT(IGI,pDM_Odm)=0x%x \n", + ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm))); + + if(pDM_DigTable->CurIGValue != CurrentIGI)//if(pDM_DigTable->PreIGValue != CurrentIGI) + { + if(pDM_Odm->SupportPlatform & (ODM_CE|ODM_MP)) + { + ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); + if(pDM_Odm->SupportICType != ODM_RTL8188E) + ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); + } + else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL)) + { + switch(*(pDM_Odm->pOnePathCCA)) + { + case ODM_CCA_2R: + ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); + if(pDM_Odm->SupportICType != ODM_RTL8188E) + ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); + break; + case ODM_CCA_1R_A: + ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); + if(pDM_Odm->SupportICType != ODM_RTL8188E) + ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI)); + break; + case ODM_CCA_1R_B: + ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI)); + if(pDM_Odm->SupportICType != ODM_RTL8188E) + ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); + break; + } + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurrentIGI(0x%02x). \n",CurrentIGI)); + //pDM_DigTable->PreIGValue = pDM_DigTable->CurIGValue; + pDM_DigTable->CurIGValue = CurrentIGI; + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG():CurrentIGI=0x%x \n",CurrentIGI)); + +// Add by Neil Chen to enable edcca to MP Platform +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + // Adjust EDCCA. + if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES) + odm_DynamicEDCCA(pDM_Odm); +#endif + + +} + + +//Need LPS mode for CE platform --2012--08--24--- +//8723AS/8189ES +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + +VOID +odm_DIGbyRSSI_LPS( + IN PDM_ODM_T pDM_Odm + ) +{ + PADAPTER pAdapter =pDM_Odm->Adapter; + pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; + PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt; + +#if 0 //and 2.3.5 coding rule + struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; +#endif + + u1Byte RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C + u1Byte bFwCurrentInPSMode = FALSE; + u1Byte CurrentIGI=pDM_Odm->RSSI_Min; + + if(! (pDM_Odm->SupportICType & (ODM_RTL8723A |ODM_RTL8188E))) + return; + + //if((pDM_Odm->SupportInterface==ODM_ITRF_PCIE)||(pDM_Odm->SupportInterface ==ODM_ITRF_USB)) + // return; + + CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG; +#ifdef CONFIG_LPS + bFwCurrentInPSMode = adapter_to_pwrctl(pAdapter)->bFwCurrentInPSMode; +#endif + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("==>pDM_Odm->RSSI_Min=%d ()\n",pDM_Odm->RSSI_Min)); + + // Using FW PS mode to make IGI + if(bFwCurrentInPSMode) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Neil---odm_DIG is in LPS mode\n")); + //Adjust by FA in LPS MODE + if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS) + CurrentIGI = CurrentIGI+2; + else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS) + CurrentIGI = CurrentIGI+1; + else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS) + CurrentIGI = CurrentIGI-1; + } + else + { + CurrentIGI = RSSI_Lower; + } + + //Lower bound checking + + //RSSI Lower bound check + if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC) + RSSI_Lower =(pDM_Odm->RSSI_Min-10); + else + RSSI_Lower =DM_DIG_MIN_NIC; + + //Upper and Lower Bound checking + if(CurrentIGI > DM_DIG_MAX_NIC) + CurrentIGI=DM_DIG_MAX_NIC; + else if(CurrentIGI < RSSI_Lower) + CurrentIGI =RSSI_Lower; + + ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); + +} +#endif + +VOID +odm_AdaptivityInit( +IN PDM_ODM_T pDM_Odm +) +{ + if(pDM_Odm->SupportICType == ODM_RTL8723B) + { + pDM_Odm->TH_L2H_ini = 0xf8; // -8 + } + if((pDM_Odm->SupportICType == ODM_RTL8192E)&&(pDM_Odm->SupportInterface == ODM_ITRF_PCIE)) + { + pDM_Odm->TH_L2H_ini = 0xf0; // -16 + } + else + { + pDM_Odm->TH_L2H_ini = 0xf9; // -7 + } + + pDM_Odm->TH_EDCCA_HL_diff = 7; + pDM_Odm->IGI_Base = 0x32; + pDM_Odm->IGI_target = 0x1c; + pDM_Odm->ForceEDCCA = 0; + pDM_Odm->AdapEn_RSSI = 20; + + //Reg524[11]=0 is easily to transmit packets during adaptivity test + + //ODM_SetBBReg(pDM_Odm, 0x524, BIT11, 1);// stop counting if EDCCA is asserted +} + + +VOID +odm_Adaptivity( + IN PDM_ODM_T pDM_Odm, + IN u1Byte IGI +) +{ + s1Byte TH_L2H_dmc, TH_H2L_dmc; + s1Byte TH_L2H, TH_H2L, Diff, IGI_target; + u4Byte value32; + BOOLEAN EDCCA_State = 0; + +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + PADAPTER pAdapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN bFwCurrentInPSMode=FALSE; + PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo); + + pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode)); + + // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14. + if(bFwCurrentInPSMode) + return; +#endif + + if(!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA() \n")); + // Add by Neil Chen to enable edcca to MP Platform +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + // Adjust EDCCA. + if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES) + odm_DynamicEDCCA(pDM_Odm); +#endif + return; + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_Adaptivity() =====> \n")); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ForceEDCCA=%d, IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d, AdapEn_RSSI = %d\n", + pDM_Odm->ForceEDCCA, pDM_Odm->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, pDM_Odm->AdapEn_RSSI)); + + if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) + ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); //ADC_mask enable + + if((!pDM_Odm->bLinked)||(*pDM_Odm->pChannel > 149)) // Band4 doesn't need adaptivity + { + if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES) + { + ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, 0x7f); + ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, 0x7f); + } + else + ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, (0x7f<<8) | 0x7f); + return; + } + +#if (DM_ODM_SUPPORT_TYPE==ODM_MP) + if(pMgntInfo->IOTPeer == HT_IOT_PEER_BROADCOM) + ODM_Write1Byte(pDM_Odm, REG_TRX_SIFS_OFDM, 0x0a); + else + ODM_Write1Byte(pDM_Odm, REG_TRX_SIFS_OFDM, 0x0e); +#endif + if(!pDM_Odm->ForceEDCCA) + { + if(pDM_Odm->RSSI_Min > pDM_Odm->AdapEn_RSSI) + EDCCA_State = 1; + else if(pDM_Odm->RSSI_Min < (pDM_Odm->AdapEn_RSSI - 5)) + EDCCA_State = 0; + } + else + EDCCA_State = 1; + //if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (*pDM_Odm->pBandType == BAND_ON_5G)) + //IGI_target = pDM_Odm->IGI_Base; + //else + { + + if(*pDM_Odm->pBandWidth == ODM_BW20M) //CHANNEL_WIDTH_20 + IGI_target = pDM_Odm->IGI_Base; + else if(*pDM_Odm->pBandWidth == ODM_BW40M) + IGI_target = pDM_Odm->IGI_Base + 2; + else if(*pDM_Odm->pBandWidth == ODM_BW80M) + IGI_target = pDM_Odm->IGI_Base + 6; + else + IGI_target = pDM_Odm->IGI_Base; + } + + pDM_Odm->IGI_target = (u1Byte) IGI_target; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, EDCCA_State=%d\n", + (*pDM_Odm->pBandWidth==ODM_BW80M)?"80M":((*pDM_Odm->pBandWidth==ODM_BW40M)?"40M":"20M"), IGI_target, EDCCA_State)); + + if(EDCCA_State == 1) + { + Diff = IGI_target -(s1Byte)IGI; + TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff; + if(TH_L2H_dmc > 10) TH_L2H_dmc = 10; + TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff; + } + else + { + TH_L2H_dmc = 0x7f; + TH_H2L_dmc = 0x7f; + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n", + IGI, TH_L2H_dmc, TH_H2L_dmc)); + + if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES) + { + ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc); + ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc); + } + else + ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc); +} + +#if 1 +VOID +odm_DIGInit( + IN PDM_ODM_T pDM_Odm + ) +{ + pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; + + //pDM_DigTable->Dig_Enable_Flag = TRUE; + //pDM_DigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX; + pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm)); + //pDM_DigTable->PreIGValue = 0x0; + //pDM_DigTable->CurSTAConnectState = pDM_DigTable->PreSTAConnectState = DIG_STA_DISCONNECT; + //pDM_DigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT; + pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW; + pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH; + pDM_DigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW; + pDM_DigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH; + if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA)) + { + pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC; + pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC; + } + else + { + pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC; + pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC; + } + pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; + pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX; + pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN; + pDM_DigTable->PreCCK_CCAThres = 0xFF; + pDM_DigTable->CurCCK_CCAThres = 0x83; + pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC; + pDM_DigTable->LargeFAHit = 0; + pDM_DigTable->Recover_cnt = 0; + pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC; + pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC; + pDM_DigTable->bMediaConnect_0 = FALSE; + pDM_DigTable->bMediaConnect_1 = FALSE; + + //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error + pDM_Odm->bDMInitialGainEnable = TRUE; + + //To Initi BT30 IGI + pDM_DigTable->BT30_CurIGI=0x32; + +} + +VOID +odm_DigForBtHsMode( + IN PDM_ODM_T pDM_Odm + ) +{ +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + pDIG_T pDM_DigTable=&pDM_Odm->DM_DigTable; + u1Byte digForBtHs=0; + u1Byte digUpBound=0x5a; + + if(pDM_Odm->bBtConnectProcess) + { + if(pDM_Odm->SupportICType&(ODM_RTL8723A)) + digForBtHs = 0x28; + else + digForBtHs = 0x22; + } + else + { + // + // Decide DIG value by BT HS RSSI. + // + digForBtHs = pDM_Odm->btHsRssi+4; + + //DIG Bound + if(pDM_Odm->SupportICType&(ODM_RTL8723A)) + digUpBound = 0x3e; + + if(digForBtHs > digUpBound) + digForBtHs = digUpBound; + if(digForBtHs < 0x1c) + digForBtHs = 0x1c; + + // update Current IGI + pDM_DigTable->BT30_CurIGI = digForBtHs; + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : set DigValue=0x%x\n", digForBtHs)); +#endif +} + +VOID +odm_DIG( + IN PDM_ODM_T pDM_Odm + ) +{ + pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; + PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt; + pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table; + u1Byte DIG_Dynamic_MIN; + u1Byte DIG_MaxOfMin; + BOOLEAN FirstConnect, FirstDisConnect; + u1Byte dm_dig_max, dm_dig_min, offset; + u1Byte CurrentIGI = pDM_DigTable->CurIGValue; + u1Byte Adap_IGI_Upper = pDM_Odm->IGI_target + 30 + (u1Byte) pDM_Odm->TH_L2H_ini -(u1Byte) pDM_Odm->TH_EDCCA_HL_diff; + +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) +// This should be moved out of OUTSRC + PADAPTER pAdapter = pDM_Odm->Adapter; +#if OS_WIN_FROM_WIN7(OS_VERSION) + if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Is AP mode or In HCT Test \n")); + return; + } +#endif +/* + if (pDM_Odm->SupportICType==ODM_RTL8723B) + return; +*/ +#if(BT_30_SUPPORT == 1) + if(pDM_Odm->bBtHsOperation) + { + odm_DigForBtHsMode(pDM_Odm); + } +#endif + if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E))) + { + if(pRX_HP_Table->RXHP_flag == 1) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In RXHP Operation \n")); + return; + } + } +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) +#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + if((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0)) + { + printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min); + ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi); + return; + } +#endif +#endif +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + if (!((priv->up_time > 5) && (priv->up_time % 2)) ) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Not In DIG Operation Period \n")); + return; + } +#endif + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()==>\n")); + //if(!(pDM_Odm->SupportAbility & (ODM_BB_DIG|ODM_BB_FA_CNT))) + if((!(pDM_Odm->SupportAbility&ODM_BB_DIG)) ||(!(pDM_Odm->SupportAbility&ODM_BB_FA_CNT))) + { +#if 0 + if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL)) + { + if ((pDM_Odm->SupportICType == ODM_RTL8192C) && (pDM_Odm->ExtLNA == 1)) + CurrentIGI = 0x30; //pDM_DigTable->CurIGValue = 0x30; + else + CurrentIGI = 0x20; //pDM_DigTable->CurIGValue = 0x20; + ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); + } +#endif + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n")); + return; + } + + if(*(pDM_Odm->pbScanInProcess)) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In Scan Progress \n")); + return; + } + + //add by Neil Chen to avoid PSD is processing + if(pDM_Odm->SupportICType==ODM_RTL8723A) + { + if(pDM_Odm->bDMInitialGainEnable == FALSE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: PSD is Processing \n")); + return; + } + } + + if(pDM_Odm->SupportICType == ODM_RTL8192D) + { + if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP) + { + if(*(pDM_Odm->pbMasterOfDMSP)) + { + DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0; + FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE); + FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE); + } + else + { + DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1; + FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE); + FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE); + } + } + else + { + if(*(pDM_Odm->pBandType) == ODM_BAND_5G) + { + DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0; + FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE); + FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE); + } + else + { + DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1; + FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE); + FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE); + } + } + } + else + { + DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0; + FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE); + FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE); + } + + //1 Boundary Decision + if(pDM_Odm->SupportICType & (ODM_RTL8192C) &&(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA))) + { + if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL)) + { + + dm_dig_max = DM_DIG_MAX_AP_HP; + dm_dig_min = DM_DIG_MIN_AP_HP; + } + else + { + dm_dig_max = DM_DIG_MAX_NIC_HP; + dm_dig_min = DM_DIG_MIN_NIC_HP; + } + DIG_MaxOfMin = DM_DIG_MAX_AP_HP; + } + else + { + if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL)) + { +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#ifdef DFS + if (!priv->pmib->dot11DFSEntry.disable_DFS && + (OPMODE & WIFI_AP_STATE) && + (((pDM_Odm->ControlChannel >= 52) && + (pDM_Odm->ControlChannel <= 64)) || + ((pDM_Odm->ControlChannel >= 100) && + (pDM_Odm->ControlChannel <= 140)))) + dm_dig_max = 0x24; + else +#endif + if (priv->pmib->dot11RFEntry.tx2path) { + if (*(pDM_Odm->pWirelessMode) == ODM_WM_B)//(priv->pmib->dot11BssType.net_work_type == WIRELESS_11B) + dm_dig_max = 0x2A; + else + dm_dig_max = 0x32; + } + else +#endif + dm_dig_max = DM_DIG_MAX_AP; + dm_dig_min = DM_DIG_MIN_AP; + DIG_MaxOfMin = dm_dig_max; + } + else + { + if((pDM_Odm->SupportICType >= ODM_RTL8188E) && (pDM_Odm->SupportPlatform & (ODM_MP|ODM_CE))) + dm_dig_max = 0x5A; + else + dm_dig_max = DM_DIG_MAX_NIC; + + if(pDM_Odm->SupportICType != ODM_RTL8821) + dm_dig_min = DM_DIG_MIN_NIC; + else + dm_dig_min = 0x1C; + + DIG_MaxOfMin = DM_DIG_MAX_AP; + } + } + + + if(pDM_Odm->bLinked) + { + if(pDM_Odm->SupportICType&(ODM_RTL8723A/*|ODM_RTL8821*/)) + { + //2 Upper Bound + if(( pDM_Odm->RSSI_Min + 10) > DM_DIG_MAX_NIC ) + pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC; + else if(( pDM_Odm->RSSI_Min + 10) < DM_DIG_MIN_NIC ) + pDM_DigTable->rx_gain_range_max = DM_DIG_MIN_NIC; + else + pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10; + + //BT is Concurrent + + if(pDM_Odm->bBtLimitedDig) + { + if(pDM_Odm->RSSI_Min>10) + { + if((pDM_Odm->RSSI_Min - 10) > DM_DIG_MAX_NIC) + DIG_Dynamic_MIN = DM_DIG_MAX_NIC; + else if((pDM_Odm->RSSI_Min - 10) < DM_DIG_MIN_NIC) + DIG_Dynamic_MIN = DM_DIG_MIN_NIC; + else + DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - 10; + } + else + DIG_Dynamic_MIN=DM_DIG_MIN_NIC; + } + else + { + if((pDM_Odm->RSSI_Min + 20) > dm_dig_max ) + pDM_DigTable->rx_gain_range_max = dm_dig_max; + else if((pDM_Odm->RSSI_Min + 20) < dm_dig_min ) + pDM_DigTable->rx_gain_range_max = dm_dig_min; + else + pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 20; + + } + } + else + { + if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821)) && (pDM_Odm->bBtLimitedDig==1)){ + //2 Modify DIG upper bound for 92E, 8723B, 8821 & 8812 BT + if((pDM_Odm->RSSI_Min + 10) > dm_dig_max ) + pDM_DigTable->rx_gain_range_max = dm_dig_max; + else if((pDM_Odm->RSSI_Min + 10) < dm_dig_min ) + pDM_DigTable->rx_gain_range_max = dm_dig_min; + else + pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10; + } + else{ + + //2 Modify DIG upper bound + //2013.03.19 Luke: Modified upper bound for Netgear rental house test + if(pDM_Odm->SupportICType != ODM_RTL8821) + offset = 20; + else + offset = 10; + + if((pDM_Odm->RSSI_Min + offset) > dm_dig_max ) + pDM_DigTable->rx_gain_range_max = dm_dig_max; + else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min ) + pDM_DigTable->rx_gain_range_max = dm_dig_min; + else + pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset; + + } + + //2 Modify DIG lower bound + /* + if((pFalseAlmCnt->Cnt_all > 500)&&(DIG_Dynamic_MIN < 0x25)) + DIG_Dynamic_MIN++; + else if(((pFalseAlmCnt->Cnt_all < 500)||(pDM_Odm->RSSI_Min < 8))&&(DIG_Dynamic_MIN > dm_dig_min)) + DIG_Dynamic_MIN--; + */ + + + //1 Lower Bound for 88E AntDiv +#if (RTL8188E_SUPPORT == 1) + if((pDM_Odm->SupportICType == ODM_RTL8188E)&&(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)) + { + if((pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) ||(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)) + { + DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->AntDiv_RSSI_max=%d \n",pDM_DigTable->AntDiv_RSSI_max)); + } + } + else +#endif + { + if(pDM_Odm->SupportICType != ODM_RTL8723B) + offset = 0; + else + offset = 12; + + if(pDM_Odm->RSSI_Min - offset < dm_dig_min) + DIG_Dynamic_MIN = dm_dig_min; + else if (pDM_Odm->RSSI_Min - offset > DIG_MaxOfMin) + DIG_Dynamic_MIN = DIG_MaxOfMin; + else + DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - offset; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : bOneEntryOnly=TRUE, DIG_Dynamic_MIN=0x%x\n",DIG_Dynamic_MIN)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : pDM_Odm->RSSI_Min=%d\n",pDM_Odm->RSSI_Min)); + } + + + } + } + else + { + pDM_DigTable->rx_gain_range_max = dm_dig_max; + DIG_Dynamic_MIN = dm_dig_min; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : No Link\n")); + } + + //1 Modify DIG lower bound, deal with abnorally large false alarm + if(pFalseAlmCnt->Cnt_all > 10000) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n")); + + if(pDM_DigTable->LargeFAHit != 3) + pDM_DigTable->LargeFAHit++; + if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue) + { + pDM_DigTable->ForbiddenIGI = (u1Byte)CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue; + pDM_DigTable->LargeFAHit = 1; + } + + if(pDM_DigTable->LargeFAHit >= 3) + { + if((pDM_DigTable->ForbiddenIGI+1) >pDM_DigTable->rx_gain_range_max) + pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max; + else + pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1); + pDM_DigTable->Recover_cnt = 3600; //3600=2hr + } + + } + else + { + //Recovery mechanism for IGI lower bound + if(pDM_DigTable->Recover_cnt != 0) + pDM_DigTable->Recover_cnt --; + else + { + if(pDM_DigTable->LargeFAHit < 3) + { + if((pDM_DigTable->ForbiddenIGI -1) < DIG_Dynamic_MIN) //DM_DIG_MIN) + { + pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN; + pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n")); + } + else + { + pDM_DigTable->ForbiddenIGI --; + pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n")); + } + } + else + { + pDM_DigTable->LargeFAHit = 0; + } + } + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->LargeFAHit=%d\n",pDM_DigTable->LargeFAHit)); + + if((pDM_Odm->SupportPlatform&(ODM_MP|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 10)) + pDM_DigTable->rx_gain_range_min = dm_dig_min; + + if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max) + pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max; + + //1 Adjust initial gain by false alarm + if(pDM_Odm->bLinked) + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG AfterLink\n")); + if(FirstConnect) + { + if(pDM_Odm->RSSI_Min <= DIG_MaxOfMin) + CurrentIGI = pDM_Odm->RSSI_Min; + else + CurrentIGI = DIG_MaxOfMin; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG: First Connect\n")); + + //ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF); + } + else + { + if(pDM_Odm->SupportICType == ODM_RTL8192D) + { + if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2_92D) + CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2; + else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_92D) + CurrentIGI = CurrentIGI + 2; //pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1; + else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_92D) + CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1; + } + else + { + //FA for Combo IC--NeilChen--2012--09--28 + if(pDM_Odm->SupportICType == ODM_RTL8723A) + { + //WLAN and BT ConCurrent + if(pDM_Odm->bBtLimitedDig) + { + if(pFalseAlmCnt->Cnt_all > 0x300) + CurrentIGI = CurrentIGI + 4; + else if (pFalseAlmCnt->Cnt_all > 0x250) + CurrentIGI = CurrentIGI + 2; + else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0) + CurrentIGI = CurrentIGI -2; + } + else //Not Concurrent + { + if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2) + CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2; + else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1) + CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1; + else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0) + CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1; + } + } + else + { + if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2) + CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2; + else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1) + CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1; + else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0) + CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1; + + if((pDM_Odm->SupportPlatform&(ODM_MP|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 10) + &&(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1)) + { + CurrentIGI = pDM_DigTable->rx_gain_range_min; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Beacon is less than 10 and FA is less than 768, IGI GOES TO 0x1E!!!!!!!!!!!!\n")); + } + } + } + } + } + else + { + //CurrentIGI = pDM_DigTable->rx_gain_range_min;//pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_min + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG BeforeLink\n")); + if(FirstDisConnect) + { + CurrentIGI = pDM_DigTable->rx_gain_range_min; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First DisConnect \n")); + } + else + { + //2012.03.30 LukeLee: enable DIG before link but with very high thresholds + if(pFalseAlmCnt->Cnt_all > 10000) + CurrentIGI = CurrentIGI + 4; + else if (pFalseAlmCnt->Cnt_all > 8000) + CurrentIGI = CurrentIGI + 2; + else if(pFalseAlmCnt->Cnt_all < 500) + CurrentIGI = CurrentIGI - 2; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): England DIG \n")); + } + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG End Adjust IGI\n")); + //1 Check initial gain by upper/lower bound + + if(CurrentIGI > pDM_DigTable->rx_gain_range_max) + CurrentIGI = pDM_DigTable->rx_gain_range_max; + if(CurrentIGI < pDM_DigTable->rx_gain_range_min) + CurrentIGI = pDM_DigTable->rx_gain_range_min; + + if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) + { + if(CurrentIGI > Adap_IGI_Upper) + CurrentIGI = Adap_IGI_Upper; + + if(CurrentIGI > (pDM_Odm->IGI_target + 4)) + CurrentIGI = (u1Byte)pDM_Odm->IGI_target + 4; + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): rx_gain_range_max=0x%x, rx_gain_range_min=0x%x\n", + pDM_DigTable->rx_gain_range_max, pDM_DigTable->rx_gain_range_min)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TotalFA=%d\n", pFalseAlmCnt->Cnt_all)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x\n", CurrentIGI)); + //2 High power RSSI threshold +#if (DM_ODM_SUPPORT_TYPE & ODM_MP) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter); + //PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo); + // for LC issue to dymanic modify DIG lower bound----------LC Mocca Issue + u8Byte curTxOkCnt=0, curRxOkCnt=0; + static u8Byte lastTxOkCnt=0, lastRxOkCnt=0; - if((RegC50 > 0x28 && RegC58 > 0x28) || - ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26)) || - (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28)) + //u8Byte OKCntAll=0; + //static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0; + //u8Byte CurByteCnt=0, PreByteCnt=0; + + curTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast - lastTxOkCnt; + curRxOkCnt =pAdapter->RxStats.NumRxBytesUnicast - lastRxOkCnt; + lastTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast; + lastRxOkCnt = pAdapter->RxStats.NumRxBytesUnicast; + //----------------------------------------------------------end for LC Mocca issue + if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD)) { - if(!pHalData->bPreEdccaEnable) + // High power IGI lower bound + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB)); + if(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND) { - odm_EnableEDCCA(pDM_Odm); - pHalData->bPreEdccaEnable = TRUE; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue)); + //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND; + CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND; } - } - else if((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25)) + if((pDM_Odm->SupportICType & ODM_RTL8723A) && + IS_WIRELESS_MODE_G(pAdapter)) + { + if(pHalData->UndecoratedSmoothedPWDB > 0x28) + { + if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND) + { + //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND; + CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND; + } + } + } +#if 0 + if((pDM_Odm->SupportICType & ODM_RTL8723A)&&(pMgntInfo->CustomerID = RT_CID_LENOVO_CHINA)) { - if(pHalData->bPreEdccaEnable) + OKCntAll = (curTxOkCnt+curRxOkCnt); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", CurrentIGI)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): OKCntAll(%#x)\n", OKCntAll)); + //8723AS_VAU + if(pDM_Odm->SupportInterface==ODM_ITRF_USB) { - odm_DisableEDCCA(pDM_Odm); - pHalData->bPreEdccaEnable = FALSE; + if(pHalData->UndecoratedSmoothedPWDB < 12) + { + if(CurrentIGI > DM_DIG_MIN_NIC) + { + if(OKCntAll >= 1500000) // >=6Mbps + CurrentIGI=0x1B; + else if(OKCntAll >= 1000000) //4Mbps + CurrentIGI=0x1A; + else if(OKCntAll >= 500000) //2Mbps + CurrentIGI=0x19; + else if(OKCntAll >= 250000) //1Mbps + CurrentIGI=0x18; + else + { + CurrentIGI=0x17; //SCAN mode + } + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Modify---->CurIGValue(%#x)\n", CurrentIGI)); + } } - } + } +#endif } - - -#endif // end MP platform support - -VOID -ODM_Write_DIG( - IN PDM_ODM_T pDM_Odm, - IN u1Byte CurrentIGI - ) -{ - pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_REG(IGI_A,pDM_Odm)=0x%x, ODM_BIT(IGI,pDM_Odm)=0x%x \n", - ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm))); - - if(pDM_DigTable->CurIGValue != CurrentIGI)//if(pDM_DigTable->PreIGValue != CurrentIGI) +#endif + +#if (RTL8192D_SUPPORT==1) + if(pDM_Odm->SupportICType == ODM_RTL8192D) { - if(pDM_Odm->SupportPlatform & (ODM_CE|ODM_MP)) - { - ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); - if(pDM_Odm->SupportICType != ODM_RTL8188E) - ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); + //sherry delete DualMacSmartConncurrent 20110517 + if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP) + { + ODM_Write_DIG_DMSP(pDM_Odm, (u1Byte)CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue); + if(*(pDM_Odm->pbMasterOfDMSP)) + { + pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked; + pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN; + } + else + { + pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked; + pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN; + } } - else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL)) + else { - switch(*(pDM_Odm->pOnePathCCA)) + ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); + if(*(pDM_Odm->pBandType) == ODM_BAND_5G) { - case ODM_CCA_2R: - ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); - if(pDM_Odm->SupportICType != ODM_RTL8188E) - ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); - break; - case ODM_CCA_1R_A: - ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); - if(pDM_Odm->SupportICType != ODM_RTL8188E) - ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI)); - break; - case ODM_CCA_1R_B: - ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI)); - if(pDM_Odm->SupportICType != ODM_RTL8188E) - ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI); - break; - } + pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked; + pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN; + } + else + { + pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked; + pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN; + } } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurrentIGI(0x%02x). \n",CurrentIGI)); - //pDM_DigTable->PreIGValue = pDM_DigTable->CurIGValue; - pDM_DigTable->CurIGValue = CurrentIGI; } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG():CurrentIGI=0x%x \n",CurrentIGI)); - -// Add by Neil Chen to enable edcca to MP Platform -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) - // Adjust EDCCA. - if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES) - odm_DynamicEDCCA(pDM_Odm); + else #endif - - + { + #if(BT_30_SUPPORT == 1) + if(pDM_Odm->bBtHsOperation) + { + if(pDM_Odm->bLinked) + { + if(pDM_DigTable->BT30_CurIGI > (CurrentIGI)) + { + ODM_Write_DIG(pDM_Odm, CurrentIGI); + + } + else + { + ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI); + } + pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked; + pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN; + } + else + { + if(pDM_Odm->bLinkInProcess) + { + ODM_Write_DIG(pDM_Odm, 0x1c); + } + else if(pDM_Odm->bBtConnectProcess) + { + ODM_Write_DIG(pDM_Odm, 0x28); + } + else + { + ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); + } + } + } + else // BT is not using + #endif + { + ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); + pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked; + pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN; + } + } } -//Need LPS mode for CE platform --2012--08--24--- -//8723AS/8189ES -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - -VOID -odm_DIGbyRSSI_LPS( +BOOLEAN +odm_DigAbort( IN PDM_ODM_T pDM_Odm ) { - PADAPTER pAdapter =pDM_Odm->Adapter; - pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; - PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt; - -#if 0 //and 2.3.5 coding rule - struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; -#endif - - u1Byte RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C - u1Byte bFwCurrentInPSMode = FALSE; - u1Byte CurrentIGI=pDM_Odm->RSSI_Min; - - if(! (pDM_Odm->SupportICType & (ODM_RTL8723A |ODM_RTL8188E))) - return; - - //if((pDM_Odm->SupportInterface==ODM_ITRF_PCIE)||(pDM_Odm->SupportInterface ==ODM_ITRF_USB)) - // return; +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) +// This should be moved out of OUTSRC + PADAPTER pAdapter = pDM_Odm->Adapter; + pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table; - CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG; -#ifdef CONFIG_LPS - bFwCurrentInPSMode = pAdapter->pwrctrlpriv.bFwCurrentInPSMode; +#if OS_WIN_FROM_WIN7(OS_VERSION) + if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Is AP mode or In HCT Test \n")); + return TRUE; + } #endif - - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG_LPS, ODM_DBG_LOUD, ("odm_DIG()==>\n")); - // Using FW PS mode to make IGI - if(bFwCurrentInPSMode) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Neil---odm_DIG is in LPS mode\n")); - //Adjust by FA in LPS MODE - if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS) - CurrentIGI = CurrentIGI+2; - else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS) - CurrentIGI = CurrentIGI+1; - else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS) - CurrentIGI = CurrentIGI-1; - } - else + if(pRX_HP_Table->RXHP_flag == 1) { - CurrentIGI = RSSI_Lower; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In RXHP Operation \n")); + return TRUE; } - //Lower bound checking - - //RSSI Lower bound check - if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC) - RSSI_Lower =(pDM_Odm->RSSI_Min-10); - else - RSSI_Lower =DM_DIG_MIN_NIC; - - //Upper and Lower Bound checking - if(CurrentIGI > DM_DIG_MAX_NIC) - CurrentIGI=DM_DIG_MAX_NIC; - else if(CurrentIGI < RSSI_Lower) - CurrentIGI =RSSI_Lower; - - ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); + return FALSE; +#else // For Other team any special case for DIG? + return FALSE; +#endif + } -#endif +#else VOID odm_DIGInit( IN PDM_ODM_T pDM_Odm @@ -1803,7 +2715,7 @@ odm_DIGInit( pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH; pDM_DigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW; pDM_DigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH; - if(pDM_Odm->BoardType == ODM_BOARD_HIGHPWR) + if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)) { pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC; pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC; @@ -1964,7 +2876,7 @@ odm_DIG( //1 Boundary Decision if((pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723A)) && - ((pDM_Odm->BoardType == ODM_BOARD_HIGHPWR) || pDM_Odm->ExtLNA)) + ((if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA))) || pDM_Odm->ExtLNA)) { if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL)) { @@ -2328,7 +3240,7 @@ odm_DIG( } } - +#endif //3============================================================ //3 FASLE ALARM CHECK //3============================================================ @@ -2851,7 +3763,8 @@ u4Byte ODM_Get_Rate_Bitmap( else rate_bitmap = 0x00000ff5; break; - + + case (ODM_WM_G|ODM_WM_N24G) : case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G) : case (ODM_WM_A|ODM_WM_B|ODM_WM_G|ODM_WM_N24G) : { @@ -3100,6 +4013,8 @@ odm_RefreshRateAdaptiveMaskCE( for(i=0; ipODM_StaInfo[i]; if(IS_STA_VALID(pstat) ) { + if(IS_MCAST( pstat->hwaddr)) //if(psta->mac_id ==1) + continue; if( TRUE == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, FALSE , &pstat->rssi_level) ) { ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level)); @@ -4258,9 +5173,13 @@ odm_RSSIMonitorCheckCE( #if 1 struct sta_info *psta; - for(i=0; ipODM_StaInfo[i])) { + if(IS_MCAST( psta->hwaddr)) //if(psta->mac_id ==1) + continue; + if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; @@ -4377,8 +5296,8 @@ odm_RSSIMonitorCheckCE( #if(RTL8192D_SUPPORT==1) FindMinimumRSSI_Dmsp(Adapter); #endif - - ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); + pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM; + //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); #endif//if (DM_ODM_SUPPORT_TYPE == ODM_CE) } VOID @@ -4583,7 +5502,22 @@ odm_TXPowerTrackingThermalMeterInit( #endif #endif - pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE; + pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE; + pDM_Odm->RFCalibrateInfo.DeltaPowerIndex = 0; + pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast = 0; + pDM_Odm->RFCalibrateInfo.PowerIndexOffset = 0; + pDM_Odm->RFCalibrateInfo.ThermalValue = 0; + pDM_Odm->DefaultOfdmIndex = 12; + pDM_Odm->DefaultCckIndex = 12; + pDM_Odm->BbSwingIdxOfdmBase = pDM_Odm->DefaultOfdmIndex; + pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex; + pDM_Odm->BbSwingIdxOfdm = pDM_Odm->DefaultOfdmIndex; + pDM_Odm->BbSwingIdxCck = pDM_Odm->DefaultCckIndex; + + pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex; + pDM_Odm->RFCalibrateInfo.OFDM_index[RF_PATH_A] = pDM_Odm->DefaultOfdmIndex; + pDM_Odm->RFCalibrateInfo.OFDM_index[RF_PATH_B] = pDM_Odm->DefaultOfdmIndex; + } diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.h index 84d288065b24..4ceb6afbfdd0 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.h @@ -1,1985 +1,2061 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - - -#ifndef __HALDMOUTSRC_H__ -#define __HALDMOUTSRC_H__ - -//============================================================ -// Definition -//============================================================ -// -// 2011/09/22 MH Define all team supprt ability. -// - -// -// 2011/09/22 MH Define for all teams. Please Define the constan in your precomp header. -// -//#define DM_ODM_SUPPORT_AP 0 -//#define DM_ODM_SUPPORT_ADSL 0 -//#define DM_ODM_SUPPORT_CE 0 -//#define DM_ODM_SUPPORT_MP 1 - -// -// 2011/09/28 MH Define ODM SW team support flag. -// - - - -// -// Antenna Switch Relative Definition. -// - -// -// 20100503 Joseph: -// Add new function SwAntDivCheck8192C(). -// This is the main function of Antenna diversity function before link. -// Mainly, it just retains last scan result and scan again. -// After that, it compares the scan result to see which one gets better RSSI. -// It selects antenna with better receiving power and returns better scan result. -// -#define TP_MODE 0 -#define RSSI_MODE 1 -#define TRAFFIC_LOW 0 -#define TRAFFIC_HIGH 1 - - -//============================================================ -//3 Tx Power Tracking -//3============================================================ -#define DPK_DELTA_MAPPING_NUM 13 -#define index_mapping_HP_NUM 15 - - -//============================================================ -//3 PSD Handler -//3============================================================ - -#define AFH_PSD 1 //0:normal PSD scan, 1: only do 20 pts PSD -#define MODE_40M 0 //0:20M, 1:40M -#define PSD_TH2 3 -#define PSD_CHMIN 20 // Minimum channel number for BT AFH -#define SIR_STEP_SIZE 3 -#define Smooth_Size_1 5 -#define Smooth_TH_1 3 -#define Smooth_Size_2 10 -#define Smooth_TH_2 4 -#define Smooth_Size_3 20 -#define Smooth_TH_3 4 -#define Smooth_Step_Size 5 -#define Adaptive_SIR 1 -#if(RTL8723_FPGA_VERIFICATION == 1) -#define PSD_RESCAN 1 -#else -#define PSD_RESCAN 4 -#endif -#define PSD_SCAN_INTERVAL 700 //ms - - - -//8723A High Power IGI Setting -#define DM_DIG_HIGH_PWR_IGI_LOWER_BOUND 0x22 -#define DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND 0x28 -#define DM_DIG_HIGH_PWR_THRESHOLD 0x3a - -// LPS define -#define DM_DIG_FA_TH0_LPS 4 //-> 4 in lps -#define DM_DIG_FA_TH1_LPS 15 //-> 15 lps -#define DM_DIG_FA_TH2_LPS 30 //-> 30 lps -#define RSSI_OFFSET_DIG 0x05; - -//ANT Test -#define ANTTESTALL 0x00 //Ant A or B will be Testing -#define ANTTESTA 0x01 //Ant A will be Testing -#define ANTTESTB 0x02 //Ant B will be testing - - -//============================================================ -// structure and define -//============================================================ - -// -// 2011/09/20 MH Add for AP/ADSLpseudo DM structuer requirement. -// We need to remove to other position??? -// -#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) -typedef struct rtl8192cd_priv { - u1Byte temp; - -}rtl8192cd_priv, *prtl8192cd_priv; -#endif - - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -typedef struct _ADAPTER{ - u1Byte temp; - #ifdef AP_BUILD_WORKAROUND - HAL_DATA_TYPE* temp2; - prtl8192cd_priv priv; - #endif -}ADAPTER, *PADAPTER; -#endif - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - -typedef struct _WLAN_STA{ - u1Byte temp; -} WLAN_STA, *PRT_WLAN_STA; - -#endif - -typedef struct _Dynamic_Initial_Gain_Threshold_ -{ - u1Byte Dig_Enable_Flag; - u1Byte Dig_Ext_Port_Stage; - - int RssiLowThresh; - int RssiHighThresh; - - u4Byte FALowThresh; - u4Byte FAHighThresh; - - u1Byte CurSTAConnectState; - u1Byte PreSTAConnectState; - u1Byte CurMultiSTAConnectState; - - u1Byte PreIGValue; - u1Byte CurIGValue; - u1Byte BackupIGValue; - - s1Byte BackoffVal; - s1Byte BackoffVal_range_max; - s1Byte BackoffVal_range_min; - u1Byte rx_gain_range_max; - u1Byte rx_gain_range_min; - u1Byte Rssi_val_min; - - u1Byte PreCCK_CCAThres; - u1Byte CurCCK_CCAThres; - u1Byte PreCCKPDState; - u1Byte CurCCKPDState; - - u1Byte LargeFAHit; - u1Byte ForbiddenIGI; - u4Byte Recover_cnt; - - u1Byte DIG_Dynamic_MIN_0; - u1Byte DIG_Dynamic_MIN_1; - BOOLEAN bMediaConnect_0; - BOOLEAN bMediaConnect_1; - - u4Byte AntDiv_RSSI_max; - u4Byte RSSI_max; -}DIG_T,*pDIG_T; - -typedef struct _Dynamic_Power_Saving_ -{ - u1Byte PreCCAState; - u1Byte CurCCAState; - - u1Byte PreRFState; - u1Byte CurRFState; - - int Rssi_val_min; - - u1Byte initialize; - u4Byte Reg874,RegC70,Reg85C,RegA74; - -}PS_T,*pPS_T; - -typedef struct _FALSE_ALARM_STATISTICS{ - u4Byte Cnt_Parity_Fail; - u4Byte Cnt_Rate_Illegal; - u4Byte Cnt_Crc8_fail; - u4Byte Cnt_Mcs_fail; - u4Byte Cnt_Ofdm_fail; - u4Byte Cnt_Cck_fail; - u4Byte Cnt_all; - u4Byte Cnt_Fast_Fsync; - u4Byte Cnt_SB_Search_fail; - u4Byte Cnt_OFDM_CCA; - u4Byte Cnt_CCK_CCA; - u4Byte Cnt_CCA_all; - u4Byte Cnt_BW_USC; //Gary - u4Byte Cnt_BW_LSC; //Gary -}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; - -typedef struct _Dynamic_Primary_CCA{ - u1Byte PriCCA_flag; - u1Byte intf_flag; - u1Byte intf_type; - u1Byte DupRTS_flag; - u1Byte Monitor_flag; -}Pri_CCA_T, *pPri_CCA_T; - -typedef struct _RX_High_Power_ -{ - u1Byte RXHP_flag; - u1Byte PSD_func_trigger; - u1Byte PSD_bitmap_RXHP[80]; - u1Byte Pre_IGI; - u1Byte Cur_IGI; - u1Byte Pre_pw_th; - u1Byte Cur_pw_th; - BOOLEAN First_time_enter; - BOOLEAN RXHP_enable; - u1Byte TP_Mode; - RT_TIMER PSDTimer; -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) - #if USE_WORKITEM - RT_WORK_ITEM PSDTimeWorkitem; - #endif -#endif - -}RXHP_T, *pRXHP_T; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_CE)) -#define ASSOCIATE_ENTRY_NUM 32 // Max size of AsocEntry[]. -#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM - -#elif(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -#define ASSOCIATE_ENTRY_NUM NUM_STAT -#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1 - -#else -// -// 2012/01/12 MH Revise for compatiable with other SW team. -// 0 is for STA 1-n is for AP clients. -// -#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1// Default port only one -#endif - -//#ifdef CONFIG_ANTENNA_DIVERSITY -// This indicates two different the steps. -// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. -// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK -// with original RSSI to determine if it is necessary to switch antenna. -#define SWAW_STEP_PEAK 0 -#define SWAW_STEP_DETERMINE 1 - -#define TP_MODE 0 -#define RSSI_MODE 1 -#define TRAFFIC_LOW 0 -#define TRAFFIC_HIGH 1 - -typedef struct _SW_Antenna_Switch_ -{ - u1Byte try_flag; - s4Byte PreRSSI; - u1Byte CurAntenna; - u1Byte PreAntenna; - u1Byte RSSI_Trying; - u1Byte TestMode; - u1Byte bTriggerAntennaSwitch; - u1Byte SelectAntennaMap; - u1Byte RSSI_target; - - // Before link Antenna Switch check - u1Byte SWAS_NoLink_State; - u4Byte SWAS_NoLink_BK_Reg860; - BOOLEAN ANTA_ON; //To indicate Ant A is or not - BOOLEAN ANTB_ON; //To indicate Ant B is on or not - - s4Byte RSSI_sum_A; - s4Byte RSSI_sum_B; - s4Byte RSSI_cnt_A; - s4Byte RSSI_cnt_B; - - u8Byte lastTxOkCnt; - u8Byte lastRxOkCnt; - u8Byte TXByteCnt_A; - u8Byte TXByteCnt_B; - u8Byte RXByteCnt_A; - u8Byte RXByteCnt_B; - u1Byte TrafficLoad; - RT_TIMER SwAntennaSwitchTimer; -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) - #if USE_WORKITEM - RT_WORK_ITEM SwAntennaSwitchWorkitem; - #endif -#endif -/* CE Platform use -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - _timer SwAntennaSwitchTimer; - u8Byte lastTxOkCnt; - u8Byte lastRxOkCnt; - u8Byte TXByteCnt_A; - u8Byte TXByteCnt_B; - u8Byte RXByteCnt_A; - u8Byte RXByteCnt_B; - u1Byte DoubleComfirm; - u1Byte TrafficLoad; - //SW Antenna Switch - - -#endif -*/ -#ifdef CONFIG_HW_ANTENNA_DIVERSITY - //Hybrid Antenna Diversity - u4Byte CCK_Ant1_Cnt[ASSOCIATE_ENTRY_NUM]; - u4Byte CCK_Ant2_Cnt[ASSOCIATE_ENTRY_NUM]; - u4Byte OFDM_Ant1_Cnt[ASSOCIATE_ENTRY_NUM]; - u4Byte OFDM_Ant2_Cnt[ASSOCIATE_ENTRY_NUM]; - u4Byte RSSI_Ant1_Sum[ASSOCIATE_ENTRY_NUM]; - u4Byte RSSI_Ant2_Sum[ASSOCIATE_ENTRY_NUM]; - u1Byte TxAnt[ASSOCIATE_ENTRY_NUM]; - u1Byte TargetSTA; - u1Byte antsel; - u1Byte RxIdleAnt; - -#endif - -}SWAT_T, *pSWAT_T; -//#endif - -typedef struct _EDCA_TURBO_ -{ - BOOLEAN bCurrentTurboEDCA; - BOOLEAN bIsCurRDLState; - #if(DM_ODM_SUPPORT_TYPE == ODM_CE ) - u4Byte prv_traffic_idx; // edca turbo - #endif - -}EDCA_T,*pEDCA_T; - -typedef struct _ODM_RATE_ADAPTIVE -{ - u1Byte Type; // DM_Type_ByFW/DM_Type_ByDriver - u1Byte HighRSSIThresh; // if RSSI > HighRSSIThresh => RATRState is DM_RATR_STA_HIGH - u1Byte LowRSSIThresh; // if RSSI <= LowRSSIThresh => RATRState is DM_RATR_STA_LOW - u1Byte RATRState; // Current RSSI level, DM_RATR_STA_HIGH/DM_RATR_STA_MIDDLE/DM_RATR_STA_LOW - u4Byte LastRATR; // RATR Register Content - -} ODM_RATE_ADAPTIVE, *PODM_RATE_ADAPTIVE; - - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - - -#ifdef ADSL_AP_BUILD_WORKAROUND -#define MAX_TOLERANCE 5 -#define IQK_DELAY_TIME 1 //ms -#endif - -// -// Indicate different AP vendor for IOT issue. -// -typedef enum _HT_IOT_PEER -{ - HT_IOT_PEER_UNKNOWN = 0, - HT_IOT_PEER_REALTEK = 1, - HT_IOT_PEER_REALTEK_92SE = 2, - HT_IOT_PEER_BROADCOM = 3, - HT_IOT_PEER_RALINK = 4, - HT_IOT_PEER_ATHEROS = 5, - HT_IOT_PEER_CISCO = 6, - HT_IOT_PEER_MERU = 7, - HT_IOT_PEER_MARVELL = 8, - HT_IOT_PEER_REALTEK_SOFTAP = 9,// peer is RealTek SOFT_AP, by Bohn, 2009.12.17 - HT_IOT_PEER_SELF_SOFTAP = 10, // Self is SoftAP - HT_IOT_PEER_AIRGO = 11, - HT_IOT_PEER_INTEL = 12, - HT_IOT_PEER_RTK_APCLIENT = 13, - HT_IOT_PEER_REALTEK_81XX = 14, - HT_IOT_PEER_REALTEK_WOW = 15, - HT_IOT_PEER_MAX = 16 -}HT_IOT_PEER_E, *PHTIOT_PEER_E; -#endif//#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - - - -#define IQK_MAC_REG_NUM 4 -#define IQK_ADDA_REG_NUM 16 -#define IQK_BB_REG_NUM_MAX 10 -#if (RTL8192D_SUPPORT==1) -#define IQK_BB_REG_NUM 10 -#else -#define IQK_BB_REG_NUM 9 -#endif -#define HP_THERMAL_NUM 8 - -#define AVG_THERMAL_NUM 8 -#define IQK_Matrix_REG_NUM 8 -#define IQK_Matrix_Settings_NUM 1+24+21 - -#define DM_Type_ByFW 0 -#define DM_Type_ByDriver 1 - -// -// Declare for common info -// -// Declare for common info -// -#define MAX_PATH_NUM_92CS 2 - -typedef struct _ODM_Phy_Status_Info_ -{ - u1Byte RxPWDBAll; - u1Byte SignalQuality; // in 0-100 index. - u1Byte RxMIMOSignalQuality[MAX_PATH_NUM_92CS]; //EVM - u1Byte RxMIMOSignalStrength[MAX_PATH_NUM_92CS];// in 0~100 index -#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) - s1Byte RxPower; // in dBm Translate from PWdB - s1Byte RecvSignalPower;// Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures. - u1Byte BTRxRSSIPercentage; - u1Byte SignalStrength; // in 0-100 index. - u1Byte RxPwr[MAX_PATH_NUM_92CS];//per-path's pwdb -#endif - u1Byte RxSNR[MAX_PATH_NUM_92CS];//per-path's SNR -}ODM_PHY_INFO_T,*PODM_PHY_INFO_T; - - -typedef struct _ODM_Phy_Dbg_Info_ -{ - //ODM Write,debug info - s1Byte RxSNRdB[MAX_PATH_NUM_92CS]; - u8Byte NumQryPhyStatus; - u8Byte NumQryPhyStatusCCK; - u8Byte NumQryPhyStatusOFDM; - //Others - s4Byte RxEVM[MAX_PATH_NUM_92CS]; - -}ODM_PHY_DBG_INFO_T; - -typedef struct _ODM_Per_Pkt_Info_ -{ - u1Byte Rate; - u1Byte StationID; - BOOLEAN bPacketMatchBSSID; - BOOLEAN bPacketToSelf; - BOOLEAN bPacketBeacon; -}ODM_PACKET_INFO_T,*PODM_PACKET_INFO_T; - -typedef struct _ODM_Mac_Status_Info_ -{ - u1Byte test; - -}ODM_MAC_INFO; - - -typedef enum tag_Dynamic_ODM_Support_Ability_Type -{ - // BB Team - ODM_DIG = 0x00000001, - ODM_HIGH_POWER = 0x00000002, - ODM_CCK_CCA_TH = 0x00000004, - ODM_FA_STATISTICS = 0x00000008, - ODM_RAMASK = 0x00000010, - ODM_RSSI_MONITOR = 0x00000020, - ODM_SW_ANTDIV = 0x00000040, - ODM_HW_ANTDIV = 0x00000080, - ODM_BB_PWRSV = 0x00000100, - ODM_2TPATHDIV = 0x00000200, - ODM_1TPATHDIV = 0x00000400, - ODM_PSD2AFH = 0x00000800 -}ODM_Ability_E; - -// -// 2011/20/20 MH For MP driver RT_WLAN_STA = STA_INFO_T -// Please declare below ODM relative info in your STA info structure. -// -#if 1 -typedef struct _ODM_STA_INFO{ - // Driver Write - BOOLEAN bUsed; // record the sta status link or not? - //u1Byte WirelessMode; // - u1Byte IOTPeer; // Enum value. HT_IOT_PEER_E - - // ODM Write - //1 PHY_STATUS_INFO - u1Byte RSSI_Path[4]; // - u1Byte RSSI_Ave; - u1Byte RXEVM[4]; - u1Byte RXSNR[4]; - - // ODM Write - //1 TX_INFO (may changed by IC) - //TX_INFO_T pTxInfo; // Define in IC folder. Move lower layer. -#if 0 - u1Byte ANTSEL_A; //in Jagar: 4bit; others: 2bit - u1Byte ANTSEL_B; //in Jagar: 4bit; others: 2bit - u1Byte ANTSEL_C; //only in Jagar: 4bit - u1Byte ANTSEL_D; //only in Jagar: 4bit - u1Byte TX_ANTL; //not in Jagar: 2bit - u1Byte TX_ANT_HT; //not in Jagar: 2bit - u1Byte TX_ANT_CCK; //not in Jagar: 2bit - u1Byte TXAGC_A; //not in Jagar: 4bit - u1Byte TXAGC_B; //not in Jagar: 4bit - u1Byte TXPWR_OFFSET; //only in Jagar: 3bit - u1Byte TX_ANT; //only in Jagar: 4bit for TX_ANTL/TX_ANTHT/TX_ANT_CCK -#endif - - // - // Please use compile flag to disabe the strcutrue for other IC except 88E. - // Move To lower layer. - // - // ODM Write Wilson will handle this part(said by Luke.Lee) - //TX_RPT_T pTxRpt; // Define in IC folder. Move lower layer. -#if 0 - //1 For 88E RA (don't redefine the naming) - u1Byte rate_id; - u1Byte rate_SGI; - u1Byte rssi_sta_ra; - u1Byte SGI_enable; - u1Byte Decision_rate; - u1Byte Pre_rate; - u1Byte Active; - - // Driver write Wilson handle. - //1 TX_RPT (don't redefine the naming) - u2Byte RTY[4]; // ??? - u2Byte TOTAL; // ??? - u2Byte DROP; // ??? - // - // Please use compile flag to disabe the strcutrue for other IC except 88E. - // -#endif - -}ODM_STA_INFO_T, *PODM_STA_INFO_T; -#endif - -// -// 2011/10/20 MH Define Common info enum for all team. -// -typedef enum _ODM_Common_Info_Definition -{ -//-------------REMOVED CASE-----------// - //ODM_CMNINFO_CCK_HP, - //ODM_CMNINFO_RFPATH_ENABLE, // Define as ODM write??? - //ODM_CMNINFO_BT_COEXIST, // ODM_BT_COEXIST_E - //ODM_CMNINFO_OP_MODE, // ODM_OPERATION_MODE_E -//-------------REMOVED CASE-----------// - - // - // Fixed value: - // - - //-----------HOOK BEFORE REG INIT-----------// - ODM_CMNINFO_PLATFORM = 0, - ODM_CMNINFO_ABILITY, // ODM_ABILITY_E - ODM_CMNINFO_INTERFACE, // ODM_INTERFACE_E - ODM_CMNINFO_MP_TEST_CHIP, - ODM_CMNINFO_IC_TYPE, // ODM_IC_TYPE_E - ODM_CMNINFO_CUT_VER, // ODM_CUT_VERSION_E - ODM_CMNINFO_FAB_VER, // ODM_FAB_E - ODM_CMNINFO_RF_TYPE, // ODM_RF_PATH_E or ODM_RF_TYPE_E? - ODM_CMNINFO_BOARD_TYPE, // ODM_BOARD_TYPE_E - ODM_CMNINFO_EXT_LNA, // TRUE - ODM_CMNINFO_EXT_PA, - ODM_CMNINFO_EXT_TRSW, - ODM_CMNINFO_PATCH_ID, //CUSTOMER ID - ODM_CMNINFO_BINHCT_TEST, - ODM_CMNINFO_BWIFI_TEST, - ODM_CMNINFO_SMART_CONCURRENT, - //-----------HOOK BEFORE REG INIT-----------// - - - // - // Dynamic value: - // -//--------- POINTER REFERENCE-----------// - ODM_CMNINFO_MAC_PHY_MODE, // ODM_MAC_PHY_MODE_E - ODM_CMNINFO_TX_UNI, - ODM_CMNINFO_RX_UNI, - ODM_CMNINFO_WM_MODE, // ODM_WIRELESS_MODE_E - ODM_CMNINFO_BAND, // ODM_BAND_TYPE_E - ODM_CMNINFO_SEC_CHNL_OFFSET, // ODM_SEC_CHNL_OFFSET_E - ODM_CMNINFO_SEC_MODE, // ODM_SECURITY_E - ODM_CMNINFO_BW, // ODM_BW_E - ODM_CMNINFO_CHNL, - - ODM_CMNINFO_DMSP_GET_VALUE, - ODM_CMNINFO_BUDDY_ADAPTOR, - ODM_CMNINFO_DMSP_IS_MASTER, - ODM_CMNINFO_SCAN, - ODM_CMNINFO_POWER_SAVING, - ODM_CMNINFO_ONE_PATH_CCA, // ODM_CCA_PATH_E - ODM_CMNINFO_DRV_STOP, - ODM_CMNINFO_PNP_IN, - ODM_CMNINFO_INIT_ON, - ODM_CMNINFO_ANT_TEST, - ODM_CMNINFO_NET_CLOSED, - ODM_CMNINFO_MP_MODE, -//--------- POINTER REFERENCE-----------// - -//------------CALL BY VALUE-------------// - ODM_CMNINFO_WIFI_DIRECT, - ODM_CMNINFO_WIFI_DISPLAY, - ODM_CMNINFO_LINK, - ODM_CMNINFO_RSSI_MIN, - ODM_CMNINFO_DBG_COMP, // u8Byte - ODM_CMNINFO_DBG_LEVEL, // u4Byte - ODM_CMNINFO_RA_THRESHOLD_HIGH, // u1Byte - ODM_CMNINFO_RA_THRESHOLD_LOW, // u1Byte - ODM_CMNINFO_RF_ANTENNA_TYPE, // u1Byte - ODM_CMNINFO_BT_DISABLED, - ODM_CMNINFO_BT_OPERATION, - ODM_CMNINFO_BT_DIG, - ODM_CMNINFO_BT_BUSY, //Check Bt is using or not//neil - ODM_CMNINFO_BT_DISABLE_EDCA, -//------------CALL BY VALUE-------------// - - // - // Dynamic ptr array hook itms. - // - ODM_CMNINFO_STA_STATUS, - ODM_CMNINFO_PHY_STATUS, - ODM_CMNINFO_MAC_STATUS, - - ODM_CMNINFO_MAX, - - -}ODM_CMNINFO_E; - -// -// 2011/10/20 MH Define ODM support ability. ODM_CMNINFO_ABILITY -// -typedef enum _ODM_Support_Ability_Definition -{ - // - // BB ODM section BIT 0-15 - // - ODM_BB_DIG = BIT0, - ODM_BB_RA_MASK = BIT1, - ODM_BB_DYNAMIC_TXPWR = BIT2, - ODM_BB_FA_CNT = BIT3, - ODM_BB_RSSI_MONITOR = BIT4, - ODM_BB_CCK_PD = BIT5, - ODM_BB_ANT_DIV = BIT6, - ODM_BB_PWR_SAVE = BIT7, - ODM_BB_PWR_TRAIN = BIT8, - ODM_BB_RATE_ADAPTIVE = BIT9, - ODM_BB_PATH_DIV = BIT10, - ODM_BB_PSD = BIT11, - ODM_BB_RXHP = BIT12, - - // - // MAC DM section BIT 16-23 - // - ODM_MAC_EDCA_TURBO = BIT16, - ODM_MAC_EARLY_MODE = BIT17, - - // - // RF ODM section BIT 24-31 - // - ODM_RF_TX_PWR_TRACK = BIT24, - ODM_RF_RX_GAIN_TRACK = BIT25, - ODM_RF_CALIBRATION = BIT26, - -}ODM_ABILITY_E; - -// ODM_CMNINFO_INTERFACE -typedef enum tag_ODM_Support_Interface_Definition -{ - ODM_ITRF_PCIE = 0x1, - ODM_ITRF_USB = 0x2, - ODM_ITRF_SDIO = 0x4, - ODM_ITRF_ALL = 0x7, -}ODM_INTERFACE_E; - -// ODM_CMNINFO_IC_TYPE -typedef enum tag_ODM_Support_IC_Type_Definition -{ - ODM_RTL8192S = BIT0, - ODM_RTL8192C = BIT1, - ODM_RTL8192D = BIT2, - ODM_RTL8723A = BIT3, - ODM_RTL8188E = BIT4, - ODM_RTL8812 = BIT5, - ODM_RTL8821 = BIT6, -}ODM_IC_TYPE_E; - -#define ODM_IC_11N_SERIES (ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E) -#define ODM_IC_11AC_SERIES (ODM_RTL8812) - -//ODM_CMNINFO_CUT_VER -typedef enum tag_ODM_Cut_Version_Definition -{ - ODM_CUT_A = 1, - ODM_CUT_B = 2, - ODM_CUT_C = 3, - ODM_CUT_D = 4, - ODM_CUT_E = 5, - ODM_CUT_F = 6, - ODM_CUT_TEST = 7, -}ODM_CUT_VERSION_E; - -// ODM_CMNINFO_FAB_VER -typedef enum tag_ODM_Fab_Version_Definition -{ - ODM_TSMC = 0, - ODM_UMC = 1, -}ODM_FAB_E; - -// ODM_CMNINFO_RF_TYPE -// -// For example 1T2R (A+AB = BIT0|BIT4|BIT5) -// -typedef enum tag_ODM_RF_Path_Bit_Definition -{ - ODM_RF_TX_A = BIT0, - ODM_RF_TX_B = BIT1, - ODM_RF_TX_C = BIT2, - ODM_RF_TX_D = BIT3, - ODM_RF_RX_A = BIT4, - ODM_RF_RX_B = BIT5, - ODM_RF_RX_C = BIT6, - ODM_RF_RX_D = BIT7, -}ODM_RF_PATH_E; - - -typedef enum tag_ODM_RF_Type_Definition -{ - ODM_1T1R = 0, - ODM_1T2R = 1, - ODM_2T2R = 2, - ODM_2T3R = 3, - ODM_2T4R = 4, - ODM_3T3R = 5, - ODM_3T4R = 6, - ODM_4T4R = 7, -}ODM_RF_TYPE_E; - - -// -// ODM Dynamic common info value definition -// - -//typedef enum _MACPHY_MODE_8192D{ -// SINGLEMAC_SINGLEPHY, -// DUALMAC_DUALPHY, -// DUALMAC_SINGLEPHY, -//}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D; -// Above is the original define in MP driver. Please use the same define. THX. -typedef enum tag_ODM_MAC_PHY_Mode_Definition -{ - ODM_SMSP = 0, - ODM_DMSP = 1, - ODM_DMDP = 2, -}ODM_MAC_PHY_MODE_E; - - -typedef enum tag_BT_Coexist_Definition -{ - ODM_BT_BUSY = 1, - ODM_BT_ON = 2, - ODM_BT_OFF = 3, - ODM_BT_NONE = 4, -}ODM_BT_COEXIST_E; - -// ODM_CMNINFO_OP_MODE -typedef enum tag_Operation_Mode_Definition -{ - ODM_NO_LINK = BIT0, - ODM_LINK = BIT1, - ODM_SCAN = BIT2, - ODM_POWERSAVE = BIT3, - ODM_AP_MODE = BIT4, - ODM_CLIENT_MODE = BIT5, - ODM_AD_HOC = BIT6, - ODM_WIFI_DIRECT = BIT7, - ODM_WIFI_DISPLAY = BIT8, -}ODM_OPERATION_MODE_E; - -// ODM_CMNINFO_WM_MODE -typedef enum tag_Wireless_Mode_Definition -{ - ODM_WM_UNKNOW = 0x0, - ODM_WM_B = BIT0, - ODM_WM_G = BIT1, - ODM_WM_A = BIT2, - ODM_WM_N24G = BIT3, - ODM_WM_N5G = BIT4, - ODM_WM_AUTO = BIT5, - ODM_WM_AC = BIT6, -}ODM_WIRELESS_MODE_E; - -// ODM_CMNINFO_BAND -typedef enum tag_Band_Type_Definition -{ - ODM_BAND_2_4G = BIT0, - ODM_BAND_5G = BIT1, - -}ODM_BAND_TYPE_E; - -// ODM_CMNINFO_SEC_CHNL_OFFSET -typedef enum tag_Secondary_Channel_Offset_Definition -{ - ODM_DONT_CARE = 0, - ODM_BELOW = 1, - ODM_ABOVE = 2 -}ODM_SEC_CHNL_OFFSET_E; - -// ODM_CMNINFO_SEC_MODE -typedef enum tag_Security_Definition -{ - ODM_SEC_OPEN = 0, - ODM_SEC_WEP40 = 1, - ODM_SEC_TKIP = 2, - ODM_SEC_RESERVE = 3, - ODM_SEC_AESCCMP = 4, - ODM_SEC_WEP104 = 5, - ODM_WEP_WPA_MIXED = 6, // WEP + WPA - ODM_SEC_SMS4 = 7, -}ODM_SECURITY_E; - -// ODM_CMNINFO_BW -typedef enum tag_Bandwidth_Definition -{ - ODM_BW20M = 0, - ODM_BW40M = 1, - ODM_BW80M = 2, - ODM_BW160M = 3, - ODM_BW10M = 4, -}ODM_BW_E; - -// ODM_CMNINFO_CHNL - -// ODM_CMNINFO_BOARD_TYPE -typedef enum tag_Board_Definition -{ - ODM_BOARD_NORMAL = 0, - ODM_BOARD_HIGHPWR = 1, - ODM_BOARD_MINICARD = 2, - ODM_BOARD_SLIM = 3, - ODM_BOARD_COMBO = 4, - -}ODM_BOARD_TYPE_E; - -// ODM_CMNINFO_ONE_PATH_CCA -typedef enum tag_CCA_Path -{ - ODM_CCA_2R = 0, - ODM_CCA_1R_A = 1, - ODM_CCA_1R_B = 2, -}ODM_CCA_PATH_E; - - -typedef struct _ODM_RA_Info_ -{ - u1Byte RateID; - u4Byte RateMask; - u4Byte RAUseRate; - u1Byte RateSGI; - u1Byte RssiStaRA; - u1Byte PreRssiStaRA; - u1Byte SGIEnable; - u1Byte DecisionRate; - u1Byte PreRate; - u1Byte HighestRate; - u1Byte LowestRate; - u4Byte NscUp; - u4Byte NscDown; - u2Byte RTY[5]; - u4Byte TOTAL; - u2Byte DROP; - u1Byte Active; - u2Byte RptTime; - u1Byte RAWaitingCounter; - u1Byte RAPendingCounter; -#if 1 //POWER_TRAINING_ACTIVE == 1 // For compile pass only~! - u1Byte PTActive; // on or off - u1Byte PTTryState; // 0 trying state, 1 for decision state - u1Byte PTStage; // 0~6 - u1Byte PTStopCount; //Stop PT counter - u1Byte PTPreRate; // if rate change do PT - u1Byte PTPreRssi; // if RSSI change 5% do PT - u1Byte PTModeSS; // decide whitch rate should do PT - u1Byte RAstage; // StageRA, decide how many times RA will be done between PT - u1Byte PTSmoothFactor; -#endif -} ODM_RA_INFO_T,*PODM_RA_INFO_T; - -typedef struct _IQK_MATRIX_REGS_SETTING{ - BOOLEAN bIQKDone; - s4Byte Value[1][IQK_Matrix_REG_NUM]; -}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING; - -#if (DM_ODM_SUPPORT_TYPE & ODM_MP) -typedef struct _PathDiv_Parameter_define_ -{ - u4Byte org_5g_RegE30; - u4Byte org_5g_RegC14; - u4Byte org_5g_RegCA0; - u4Byte swt_5g_RegE30; - u4Byte swt_5g_RegC14; - u4Byte swt_5g_RegCA0; - //for 2G IQK information - u4Byte org_2g_RegC80; - u4Byte org_2g_RegC4C; - u4Byte org_2g_RegC94; - u4Byte org_2g_RegC14; - u4Byte org_2g_RegCA0; - - u4Byte swt_2g_RegC80; - u4Byte swt_2g_RegC4C; - u4Byte swt_2g_RegC94; - u4Byte swt_2g_RegC14; - u4Byte swt_2g_RegCA0; -}PATHDIV_PARA,*pPATHDIV_PARA; -#endif - - -typedef struct ODM_RF_Calibration_Structure -{ - //for tx power tracking - - u4Byte RegA24; // for TempCCK - s4Byte RegE94; - s4Byte RegE9C; - s4Byte RegEB4; - s4Byte RegEBC; - - //u1Byte bTXPowerTracking; - u1Byte TXPowercount; - BOOLEAN bTXPowerTrackingInit; - BOOLEAN bTXPowerTracking; - u1Byte TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default - u1Byte TM_Trigger; - u1Byte InternalPA5G[2]; //pathA / pathB - - u1Byte ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 - u1Byte ThermalValue; - u1Byte ThermalValue_LCK; - u1Byte ThermalValue_IQK; - u1Byte ThermalValue_DPK; - u1Byte ThermalValue_AVG[AVG_THERMAL_NUM]; - u1Byte ThermalValue_AVG_index; - u1Byte ThermalValue_RxGain; - u1Byte ThermalValue_Crystal; - u1Byte ThermalValue_DPKstore; - u1Byte ThermalValue_DPKtrack; - BOOLEAN TxPowerTrackingInProgress; - BOOLEAN bDPKenable; - - BOOLEAN bReloadtxpowerindex; - u1Byte bRfPiEnable; - u4Byte TXPowerTrackingCallbackCnt; //cosa add for debug - - u1Byte bCCKinCH14; - u1Byte CCK_index; - u1Byte OFDM_index[2]; - BOOLEAN bDoneTxpower; - - u1Byte ThermalValue_HP[HP_THERMAL_NUM]; - u1Byte ThermalValue_HP_index; - IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; - - u1Byte Delta_IQK; - u1Byte Delta_LCK; - - //for IQK - u4Byte RegC04; - u4Byte Reg874; - u4Byte RegC08; - u4Byte RegB68; - u4Byte RegB6C; - u4Byte Reg870; - u4Byte Reg860; - u4Byte Reg864; - - BOOLEAN bIQKInitialized; - BOOLEAN bLCKInProgress; - BOOLEAN bAntennaDetected; - u4Byte ADDA_backup[IQK_ADDA_REG_NUM]; - u4Byte IQK_MAC_backup[IQK_MAC_REG_NUM]; - u4Byte IQK_BB_backup_recover[9]; - u4Byte IQK_BB_backup[IQK_BB_REG_NUM]; - - //for APK - u4Byte APKoutput[2][2]; //path A/B; output1_1a/output1_2a - u1Byte bAPKdone; - u1Byte bAPKThermalMeterIgnore; - u1Byte bDPdone; - u1Byte bDPPathAOK; - u1Byte bDPPathBOK; -}ODM_RF_CAL_T,*PODM_RF_CAL_T; -// -// ODM Dynamic common info value definition -// - -typedef struct _FAST_ANTENNA_TRAINNING_ -{ - u1Byte Bssid[6]; - u1Byte antsel_rx_keep_0; - u1Byte antsel_rx_keep_1; - u1Byte antsel_rx_keep_2; - u4Byte antSumRSSI[7]; - u4Byte antRSSIcnt[7]; - u4Byte antAveRSSI[7]; - u1Byte FAT_State; - u4Byte TrainIdx; - u1Byte antsel_a[ODM_ASSOCIATE_ENTRY_NUM]; - u1Byte antsel_b[ODM_ASSOCIATE_ENTRY_NUM]; - u1Byte antsel_c[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte MainAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte AuxAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte MainAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; - u4Byte AuxAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; - u1Byte RxIdleAnt; - BOOLEAN bBecomeLinked; - -}FAT_T,*pFAT_T; - -typedef enum _FAT_STATE -{ - FAT_NORMAL_STATE = 0, - FAT_TRAINING_STATE = 1, -}FAT_STATE_E, *PFAT_STATE_E; - -typedef enum _ANT_DIV_TYPE -{ - NO_ANTDIV = 0xFF, - CG_TRX_HW_ANTDIV = 0x01, - CGCS_RX_HW_ANTDIV = 0x02, - FIXED_HW_ANTDIV = 0x03, - CG_TRX_SMART_ANTDIV = 0x04, - CGCS_RX_SW_ANTDIV = 0x05, - -}ANT_DIV_TYPE_E, *PANT_DIV_TYPE_E; - - - - - - - - - - - - - -// -// 2011/09/22 MH Copy from SD4 defined structure. We use to support PHY DM integration. -// -#if(DM_ODM_SUPPORT_TYPE & ODM_MP) -#if (RT_PLATFORM != PLATFORM_LINUX) -typedef -#endif -struct DM_Out_Source_Dynamic_Mechanism_Structure -#else// for AP,ADSL,CE Team -typedef struct DM_Out_Source_Dynamic_Mechanism_Structure -#endif -{ - //RT_TIMER FastAntTrainingTimer; - // - // Add for different team use temporarily - // - PADAPTER Adapter; // For CE/NIC team - prtl8192cd_priv priv; // For AP/ADSL team - // WHen you use Adapter or priv pointer, you must make sure the pointer is ready. - BOOLEAN odm_ready; - -#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) - rtl8192cd_priv fake_priv; -#endif -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - // ADSL_AP_BUILD_WORKAROUND - ADAPTER fake_adapter; -#endif - - u8Byte DebugComponents; - u4Byte DebugLevel; - -//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------// - BOOLEAN bCckHighPower; - u1Byte RFPathRxEnable; // ODM_CMNINFO_RFPATH_ENABLE - u1Byte ControlChannel; -//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------// - -//--------REMOVED COMMON INFO----------// - //u1Byte PseudoMacPhyMode; - //BOOLEAN *BTCoexist; - //BOOLEAN PseudoBtCoexist; - //u1Byte OPMode; - //BOOLEAN bAPMode; - //BOOLEAN bClientMode; - //BOOLEAN bAdHocMode; - //BOOLEAN bSlaveOfDMSP; -//--------REMOVED COMMON INFO----------// - - -//1 COMMON INFORMATION - - // - // Init Value - // -//-----------HOOK BEFORE REG INIT-----------// - // ODM Platform info AP/ADSL/CE/MP = 1/2/3/4 - u1Byte SupportPlatform; - // ODM Support Ability DIG/RATR/TX_PWR_TRACK/ ¡K¡K = 1/2/3/¡K - u4Byte SupportAbility; - // ODM PCIE/USB/SDIO/GSPI = 0/1/2/3 - u1Byte SupportInterface; - // ODM composite or independent. Bit oriented/ 92C+92D+ .... or any other type = 1/2/3/... - u4Byte SupportICType; - // Cut Version TestChip/A-cut/B-cut... = 0/1/2/3/... - u1Byte CutVersion; - // Fab Version TSMC/UMC = 0/1 - u1Byte FabVersion; - // RF Type 4T4R/3T3R/2T2R/1T2R/1T1R/... - u1Byte RFType; - // Board Type Normal/HighPower/MiniCard/SLIM/Combo/... = 0/1/2/3/4/... - u1Byte BoardType; - // with external LNA NO/Yes = 0/1 - u1Byte ExtLNA; - // with external PA NO/Yes = 0/1 - u1Byte ExtPA; - // with external TRSW NO/Yes = 0/1 - u1Byte ExtTRSW; - u1Byte PatchID; //Customer ID - BOOLEAN bInHctTest; - BOOLEAN bWIFITest; - - BOOLEAN bDualMacSmartConcurrent; - u4Byte BK_SupportAbility; - u1Byte AntDivType; -//-----------HOOK BEFORE REG INIT-----------// - - // - // Dynamic Value - // -//--------- POINTER REFERENCE-----------// - - u1Byte u1Byte_temp; - BOOLEAN BOOLEAN_temp; - PADAPTER PADAPTER_temp; - - // MAC PHY Mode SMSP/DMSP/DMDP = 0/1/2 - u1Byte *pMacPhyMode; - //TX Unicast byte count - u8Byte *pNumTxBytesUnicast; - //RX Unicast byte count - u8Byte *pNumRxBytesUnicast; - // Wireless mode B/G/A/N = BIT0/BIT1/BIT2/BIT3 - u1Byte *pWirelessMode; //ODM_WIRELESS_MODE_E - // Frequence band 2.4G/5G = 0/1 - u1Byte *pBandType; - // Secondary channel offset don't_care/below/above = 0/1/2 - u1Byte *pSecChOffset; - // Security mode Open/WEP/AES/TKIP = 0/1/2/3 - u1Byte *pSecurity; - // BW info 20M/40M/80M = 0/1/2 - u1Byte *pBandWidth; - // Central channel location Ch1/Ch2/.... - u1Byte *pChannel; //central channel number - // Common info for 92D DMSP - - BOOLEAN *pbGetValueFromOtherMac; - PADAPTER *pBuddyAdapter; - BOOLEAN *pbMasterOfDMSP; //MAC0: master, MAC1: slave - // Common info for Status - BOOLEAN *pbScanInProcess; - BOOLEAN *pbPowerSaving; - // CCA Path 2-path/path-A/path-B = 0/1/2; using ODM_CCA_PATH_E. - u1Byte *pOnePathCCA; - //pMgntInfo->AntennaTest - u1Byte *pAntennaTest; - BOOLEAN *pbNet_closed; -//--------- POINTER REFERENCE-----------// - // -//------------CALL BY VALUE-------------// - BOOLEAN bWIFI_Direct; - BOOLEAN bWIFI_Display; - BOOLEAN bLinked; - u1Byte RSSI_Min; - u1Byte InterfaceIndex; // Add for 92D dual MAC: 0--Mac0 1--Mac1 - BOOLEAN bIsMPChip; - BOOLEAN bOneEntryOnly; - // Common info for BTDM - BOOLEAN bBtDisabled; // BT is disabled - BOOLEAN bBtHsOperation; // BT HS mode is under progress - u1Byte btHsDigVal; // use BT rssi to decide the DIG value - BOOLEAN bBtDisableEdcaTurbo; // Under some condition, don't enable the EDCA Turbo - BOOLEAN bBtBusy; // BT is busy. -//------------CALL BY VALUE-------------// - - //2 Define STA info. - // _ODM_STA_INFO - // 2012/01/12 MH For MP, we need to reduce one array pointer for default port.?? - PSTA_INFO_T pODM_StaInfo[ODM_ASSOCIATE_ENTRY_NUM]; - -#if (RATE_ADAPTIVE_SUPPORT == 1) - u2Byte CurrminRptTime; - ODM_RA_INFO_T RAInfo[ODM_ASSOCIATE_ENTRY_NUM]; //Use MacID as array index. STA MacID=0, VWiFi Client MacID={1, ODM_ASSOCIATE_ENTRY_NUM-1} //YJ,add,120119 -#endif - // - // 2012/02/14 MH Add to share 88E ra with other SW team. - // We need to colelct all support abilit to a proper area. - // - BOOLEAN RaSupport88E; - - // Define ........... - - // Latest packet phy info (ODM write) - ODM_PHY_DBG_INFO_T PhyDbgInfo; - //PHY_INFO_88E PhyInfo; - - // Latest packet phy info (ODM write) - ODM_MAC_INFO *pMacInfo; - //MAC_INFO_88E MacInfo; - - // Different Team independt structure?? - - // - //TX_RTP_CMN TX_retrpo; - //TX_RTP_88E TX_retrpo; - //TX_RTP_8195 TX_retrpo; - - // - //ODM Structure - // - FAT_T DM_FatTable; - DIG_T DM_DigTable; - PS_T DM_PSTable; - Pri_CCA_T DM_PriCCA; - RXHP_T DM_RXHP_Table; - FALSE_ALARM_STATISTICS FalseAlmCnt; - FALSE_ALARM_STATISTICS FlaseAlmCntBuddyAdapter; - //#ifdef CONFIG_ANTENNA_DIVERSITY - SWAT_T DM_SWAT_Table; - BOOLEAN RSSI_test; - //#endif - -#if (DM_ODM_SUPPORT_TYPE & ODM_MP) - //Path Div Struct - PATHDIV_PARA pathIQK; -#endif - - EDCA_T DM_EDCA_Table; - u4Byte WMMEDCA_BE; - // Copy from SD4 structure - // - // ================================================== - // - - //common - //u1Byte DM_Type; - //u1Byte PSD_Report_RXHP[80]; // Add By Gary - //u1Byte PSD_func_flag; // Add By Gary - //for DIG - //u1Byte bDMInitialGainEnable; - //u1Byte binitialized; // for dm_initial_gain_Multi_STA use. - //for Antenna diversity - //u8 AntDivCfg;// 0:OFF , 1:ON, 2:by efuse - //PSTA_INFO_T RSSI_target; - - BOOLEAN *pbDriverStopped; - BOOLEAN *pbDriverIsGoingToPnpSetPowerSleep; - BOOLEAN *pinit_adpt_in_progress; - - //PSD - BOOLEAN bUserAssignLevel; - RT_TIMER PSDTimer; - u1Byte RSSI_BT; //come from BT - BOOLEAN bPSDinProcess; - BOOLEAN bDMInitialGainEnable; - - //for rate adaptive, in fact, 88c/92c fw will handle this - u1Byte bUseRAMask; - - ODM_RATE_ADAPTIVE RateAdaptive; - - - ODM_RF_CAL_T RFCalibrateInfo; - - // - // TX power tracking - // - u1Byte BbSwingIdxOfdm; - u1Byte BbSwingIdxOfdmCurrent; - u1Byte BbSwingIdxOfdmBase; - BOOLEAN BbSwingFlagOfdm; - u1Byte BbSwingIdxCck; - u1Byte BbSwingIdxCckCurrent; - u1Byte BbSwingIdxCckBase; - BOOLEAN BbSwingFlagCck; - u1Byte *mp_mode; - // - // ODM system resource. - // - - // ODM relative time. - RT_TIMER PathDivSwitchTimer; - //2011.09.27 add for Path Diversity - RT_TIMER CCKPathDiversityTimer; - RT_TIMER FastAntTrainingTimer; - - // ODM relative workitem. -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) - #if USE_WORKITEM - RT_WORK_ITEM PathDivSwitchWorkitem; - RT_WORK_ITEM CCKPathDiversityWorkitem; - RT_WORK_ITEM FastAntTrainingWorkitem; - #endif -#endif - -#if(DM_ODM_SUPPORT_TYPE & ODM_MP) - -#if (RT_PLATFORM != PLATFORM_LINUX) -} DM_ODM_T, *PDM_ODM_T; // DM_Dynamic_Mechanism_Structure -#else -}; -#endif - -#else// for AP,ADSL,CE Team -} DM_ODM_T, *PDM_ODM_T; // DM_Dynamic_Mechanism_Structure -#endif - - - -#if 1 //92c-series -#define ODM_RF_PATH_MAX 2 -#else //jaguar - series -#define ODM_RF_PATH_MAX 4 -#endif - -typedef enum _ODM_RF_RADIO_PATH { - ODM_RF_PATH_A = 0, //Radio Path A - ODM_RF_PATH_B = 1, //Radio Path B - ODM_RF_PATH_C = 2, //Radio Path C - ODM_RF_PATH_D = 3, //Radio Path D - // ODM_RF_PATH_MAX, //Max RF number 90 support -} ODM_RF_RADIO_PATH_E, *PODM_RF_RADIO_PATH_E; - - typedef enum _ODM_RF_CONTENT{ - odm_radioa_txt = 0x1000, - odm_radiob_txt = 0x1001, - odm_radioc_txt = 0x1002, - odm_radiod_txt = 0x1003 -} ODM_RF_CONTENT; - -typedef enum _ODM_BB_Config_Type{ - CONFIG_BB_PHY_REG, - CONFIG_BB_AGC_TAB, - CONFIG_BB_AGC_TAB_2G, - CONFIG_BB_AGC_TAB_5G, - CONFIG_BB_PHY_REG_PG, -} ODM_BB_Config_Type, *PODM_BB_Config_Type; - -// Status code -#if (DM_ODM_SUPPORT_TYPE != ODM_MP) -typedef enum _RT_STATUS{ - RT_STATUS_SUCCESS, - RT_STATUS_FAILURE, - RT_STATUS_PENDING, - RT_STATUS_RESOURCE, - RT_STATUS_INVALID_CONTEXT, - RT_STATUS_INVALID_PARAMETER, - RT_STATUS_NOT_SUPPORT, - RT_STATUS_OS_API_FAILED, -}RT_STATUS,*PRT_STATUS; -#endif // end of RT_STATUS definition - -#ifdef REMOVE_PACK -#pragma pack() -#endif - -//#include "odm_function.h" - -//3=========================================================== -//3 DIG -//3=========================================================== - -typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition -{ - DIG_TYPE_THRESH_HIGH = 0, - DIG_TYPE_THRESH_LOW = 1, - DIG_TYPE_BACKOFF = 2, - DIG_TYPE_RX_GAIN_MIN = 3, - DIG_TYPE_RX_GAIN_MAX = 4, - DIG_TYPE_ENABLE = 5, - DIG_TYPE_DISABLE = 6, - DIG_OP_TYPE_MAX -}DM_DIG_OP_E; -/* -typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition -{ - CCK_PD_STAGE_LowRssi = 0, - CCK_PD_STAGE_HighRssi = 1, - CCK_PD_STAGE_MAX = 3, -}DM_CCK_PDTH_E; - -typedef enum tag_DIG_EXT_PORT_ALGO_Definition -{ - DIG_EXT_PORT_STAGE_0 = 0, - DIG_EXT_PORT_STAGE_1 = 1, - DIG_EXT_PORT_STAGE_2 = 2, - DIG_EXT_PORT_STAGE_3 = 3, - DIG_EXT_PORT_STAGE_MAX = 4, -}DM_DIG_EXT_PORT_ALG_E; - -typedef enum tag_DIG_Connect_Definition -{ - DIG_STA_DISCONNECT = 0, - DIG_STA_CONNECT = 1, - DIG_STA_BEFORE_CONNECT = 2, - DIG_MultiSTA_DISCONNECT = 3, - DIG_MultiSTA_CONNECT = 4, - DIG_CONNECT_MAX -}DM_DIG_CONNECT_E; - - -#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;} - -#define DM_MultiSTA_InitGainChangeNotify_CONNECT(_ADAPTER) \ - DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_CONNECT) - -#define DM_MultiSTA_InitGainChangeNotify_DISCONNECT(_ADAPTER) \ - DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_DISCONNECT) -*/ -#define DM_DIG_THRESH_HIGH 40 -#define DM_DIG_THRESH_LOW 35 - -#define DM_SCAN_RSSI_TH 0x14 //scan return issue for LC - - -#define DM_FALSEALARM_THRESH_LOW 400 -#define DM_FALSEALARM_THRESH_HIGH 1000 - -#define DM_DIG_MAX_NIC 0x3e -#define DM_DIG_MIN_NIC 0x1e //0x22//0x1c - -#define DM_DIG_MAX_AP 0x32 -#define DM_DIG_MIN_AP 0x20 - -#define DM_DIG_MAX_NIC_HP 0x46 -#define DM_DIG_MIN_NIC_HP 0x2e - -#define DM_DIG_MAX_AP_HP 0x42 -#define DM_DIG_MIN_AP_HP 0x30 - -//vivi 92c&92d has different definition, 20110504 -//this is for 92c -#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV -#define DM_DIG_FA_TH0 0x80//0x20 -#else -#define DM_DIG_FA_TH0 0x200//0x20 -#endif -#define DM_DIG_FA_TH1 0x300//0x100 -#define DM_DIG_FA_TH2 0x400//0x200 -//this is for 92d -#define DM_DIG_FA_TH0_92D 0x100 -#define DM_DIG_FA_TH1_92D 0x400 -#define DM_DIG_FA_TH2_92D 0x600 - -#define DM_DIG_BACKOFF_MAX 12 -#define DM_DIG_BACKOFF_MIN -4 -#define DM_DIG_BACKOFF_DEFAULT 10 - -//3=========================================================== -//3 AGC RX High Power Mode -//3=========================================================== -#define LNA_Low_Gain_1 0x64 -#define LNA_Low_Gain_2 0x5A -#define LNA_Low_Gain_3 0x58 - -#define FA_RXHP_TH1 5000 -#define FA_RXHP_TH2 1500 -#define FA_RXHP_TH3 800 -#define FA_RXHP_TH4 600 -#define FA_RXHP_TH5 500 - -//3=========================================================== -//3 EDCA -//3=========================================================== - -//3=========================================================== -//3 Dynamic Tx Power -//3=========================================================== -//Dynamic Tx Power Control Threshold -#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 -#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 -#define TX_POWER_NEAR_FIELD_THRESH_AP 0x3F - -#define TxHighPwrLevel_Normal 0 -#define TxHighPwrLevel_Level1 1 -#define TxHighPwrLevel_Level2 2 -#define TxHighPwrLevel_BT1 3 -#define TxHighPwrLevel_BT2 4 -#define TxHighPwrLevel_15 5 -#define TxHighPwrLevel_35 6 -#define TxHighPwrLevel_50 7 -#define TxHighPwrLevel_70 8 -#define TxHighPwrLevel_100 9 - -//3=========================================================== -//3 Tx Power Tracking -//3=========================================================== -#if 0 //mask this, since these have been defined in typdef.h, vivi -#define OFDM_TABLE_SIZE 37 -#define OFDM_TABLE_SIZE_92D 43 -#define CCK_TABLE_SIZE 33 -#endif - - -//3=========================================================== -//3 Rate Adaptive -//3=========================================================== -#define DM_RATR_STA_INIT 0 -#define DM_RATR_STA_HIGH 1 -#define DM_RATR_STA_MIDDLE 2 -#define DM_RATR_STA_LOW 3 - -//3=========================================================== -//3 BB Power Save -//3=========================================================== - - -typedef enum tag_1R_CCA_Type_Definition -{ - CCA_1R =0, - CCA_2R = 1, - CCA_MAX = 2, -}DM_1R_CCA_E; - -typedef enum tag_RF_Type_Definition -{ - RF_Save =0, - RF_Normal = 1, - RF_MAX = 2, -}DM_RF_E; - -//3=========================================================== -//3 Antenna Diversity -//3=========================================================== -typedef enum tag_SW_Antenna_Switch_Definition -{ - Antenna_A = 1, - Antenna_B = 2, - Antenna_MAX = 3, -}DM_SWAS_E; - - -// Maximal number of antenna detection mechanism needs to perform, added by Roger, 2011.12.28. -#define MAX_ANTENNA_DETECTION_CNT 10 - -// -// Extern Global Variables. -// -#define OFDM_TABLE_SIZE_92C 37 -#define OFDM_TABLE_SIZE_92D 43 -#define CCK_TABLE_SIZE 33 - -extern u4Byte OFDMSwingTable[OFDM_TABLE_SIZE_92D]; -extern u1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8]; -extern u1Byte CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]; - - - -// -// check Sta pointer valid or not -// -#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -#define IS_STA_VALID(pSta) (pSta && pSta->expire_to) -#elif (DM_ODM_SUPPORT_TYPE & ODM_MP) -#define IS_STA_VALID(pSta) (pSta && pSta->bUsed) -#else -#define IS_STA_VALID(pSta) (pSta) -#endif -// 20100514 Joseph: Add definition for antenna switching test after link. -// This indicates two different the steps. -// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. -// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK -// with original RSSI to determine if it is necessary to switch antenna. -#define SWAW_STEP_PEAK 0 -#define SWAW_STEP_DETERMINE 1 - -VOID ODM_Write_DIG(IN PDM_ODM_T pDM_Odm, IN u1Byte CurrentIGI); -VOID ODM_Write_CCK_CCA_Thres(IN PDM_ODM_T pDM_Odm, IN u1Byte CurCCK_CCAThres); - -VOID -ODM_SetAntenna( - IN PDM_ODM_T pDM_Odm, - IN u1Byte Antenna); - - -#define dm_RF_Saving ODM_RF_Saving -void ODM_RF_Saving( IN PDM_ODM_T pDM_Odm, - IN u1Byte bForceInNormal ); - -#define SwAntDivRestAfterLink ODM_SwAntDivRestAfterLink -VOID ODM_SwAntDivRestAfterLink( IN PDM_ODM_T pDM_Odm); - -#define dm_CheckTXPowerTracking ODM_TXPowerTrackingCheck -VOID -ODM_TXPowerTrackingCheck( - IN PDM_ODM_T pDM_Odm - ); - -BOOLEAN -ODM_RAStateCheck( - IN PDM_ODM_T pDM_Odm, - IN s4Byte RSSI, - IN BOOLEAN bForceUpdate, - OUT pu1Byte pRATRState - ); - -#if(DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_AP|ODM_ADSL)) -//============================================================ -// function prototype -//============================================================ -//#define DM_ChangeDynamicInitGainThresh ODM_ChangeDynamicInitGainThresh -//void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter, -// IN INT32 DM_Type, -// IN INT32 DM_Value); -VOID -ODM_ChangeDynamicInitGainThresh( - IN PDM_ODM_T pDM_Odm, - IN u4Byte DM_Type, - IN u4Byte DM_Value - ); - -BOOLEAN -ODM_CheckPowerStatus( - IN PADAPTER Adapter - ); - - -#if (DM_ODM_SUPPORT_TYPE != ODM_ADSL) -VOID -ODM_RateAdaptiveStateApInit( - IN PADAPTER Adapter , - IN PRT_WLAN_STA pEntry - ); -#endif -#define AP_InitRateAdaptiveState ODM_RateAdaptiveStateApInit - - -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) -#ifdef WIFI_WMM -VOID -ODM_IotEdcaSwitch( - IN PDM_ODM_T pDM_Odm, - IN unsigned char enable - ); -#endif - -BOOLEAN -ODM_ChooseIotMainSTA( - IN PDM_ODM_T pDM_Odm, - IN PSTA_INFO_T pstat - ); -#endif - -#if(DM_ODM_SUPPORT_TYPE==ODM_AP) -#ifdef HW_ANT_SWITCH -u1Byte -ODM_Diversity_AntennaSelect( - IN PDM_ODM_T pDM_Odm, - IN u1Byte *data -); -#endif -#endif - -#define SwAntDivResetBeforeLink ODM_SwAntDivResetBeforeLink -VOID ODM_SwAntDivResetBeforeLink(IN PDM_ODM_T pDM_Odm); - -//#define SwAntDivCheckBeforeLink8192C ODM_SwAntDivCheckBeforeLink8192C -#define SwAntDivCheckBeforeLink ODM_SwAntDivCheckBeforeLink8192C -BOOLEAN -ODM_SwAntDivCheckBeforeLink8192C( - IN PDM_ODM_T pDM_Odm - ); - - -#endif - -#define dm_SWAW_RSSI_Check ODM_SwAntDivChkPerPktRssi -VOID ODM_SwAntDivChkPerPktRssi( - IN PDM_ODM_T pDM_Odm, - IN u1Byte StationID, - IN PODM_PHY_INFO_T pPhyInfo - ); - -#if((DM_ODM_SUPPORT_TYPE==ODM_MP)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) - -u4Byte ConvertTo_dB(u4Byte Value); - -u4Byte -GetPSDData( - PDM_ODM_T pDM_Odm, - unsigned int point, - u1Byte initial_gain_psd); - -#endif - -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - -VOID -odm_DIGbyRSSI_LPS( - IN PDM_ODM_T pDM_Odm - ); - -u4Byte ODM_Get_Rate_Bitmap( - IN PDM_ODM_T pDM_Odm, - IN u4Byte macid, - IN u4Byte ra_mask, - IN u1Byte rssi_level); -#endif - - -#if(DM_ODM_SUPPORT_TYPE & (ODM_MP)) -#define dm_PSDMonitorCallback odm_PSDMonitorCallback -VOID odm_PSDMonitorCallback(PRT_TIMER pTimer); - -VOID -odm_PSDMonitorWorkItemCallback( - IN PVOID pContext - ); - - -VOID -PatchDCTone( - IN PDM_ODM_T pDM_Odm, - pu4Byte PSD_report, - u1Byte initial_gain_psd -); -VOID -ODM_PSDMonitor( - IN PDM_ODM_T pDM_Odm - ); -VOID odm_PSD_Monitor(PDM_ODM_T pDM_Odm); -VOID odm_PSDMonitorInit(PDM_ODM_T pDM_Odm); - -VOID -ODM_PSDDbgControl( - IN PADAPTER Adapter, - IN u4Byte mode, - IN u4Byte btRssi - ); - -#endif // DM_ODM_SUPPORT_TYPE - - - -VOID ODM_DMInit( IN PDM_ODM_T pDM_Odm); - -VOID -ODM_DMWatchdog( - IN PDM_ODM_T pDM_Odm // For common use in the future - ); - -VOID -ODM_CmnInfoInit( - IN PDM_ODM_T pDM_Odm, - IN ODM_CMNINFO_E CmnInfo, - IN u4Byte Value - ); - -VOID -ODM_CmnInfoHook( - IN PDM_ODM_T pDM_Odm, - IN ODM_CMNINFO_E CmnInfo, - IN PVOID pValue - ); - -VOID -ODM_CmnInfoPtrArrayHook( - IN PDM_ODM_T pDM_Odm, - IN ODM_CMNINFO_E CmnInfo, - IN u2Byte Index, - IN PVOID pValue - ); - -VOID -ODM_CmnInfoUpdate( - IN PDM_ODM_T pDM_Odm, - IN u4Byte CmnInfo, - IN u8Byte Value - ); - -VOID -ODM_InitAllTimers( - IN PDM_ODM_T pDM_Odm - ); - -VOID -ODM_CancelAllTimers( - IN PDM_ODM_T pDM_Odm - ); - -VOID -ODM_ReleaseAllTimers( - IN PDM_ODM_T pDM_Odm - ); - -VOID -ODM_ResetIQKResult( - IN PDM_ODM_T pDM_Odm - ); - - -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) -VOID ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm ); -VOID ODM_FreeAllWorkItems(IN PDM_ODM_T pDM_Odm ); - -VOID odm_PathDivChkAntSwitch(PDM_ODM_T pDM_Odm); -VOID ODM_PathDivRestAfterLink( - IN PDM_ODM_T pDM_Odm - ); - - -//===========================================// -// Neil Chen----2011--06--15-- - -//3 Path Diversity -//=========================================================== - -#define TP_MODE 0 -#define RSSI_MODE 1 -#define TRAFFIC_LOW 0 -#define TRAFFIC_HIGH 1 - -//#define PATHDIV_ENABLE 1 - -//VOID odm_PathDivChkAntSwitch(PADAPTER Adapter,u1Byte Step); -VOID ODM_PathDivRestAfterLink( - IN PDM_ODM_T pDM_Odm - ); - -#define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi -VOID ODM_PathDivChkPerPktRssi(PADAPTER Adapter, - BOOLEAN bIsDefPort, - BOOLEAN bMatchBSSID, - PRT_WLAN_STA pEntry, - PRT_RFD pRfd ); - -u8Byte -PlatformDivision64( - IN u8Byte x, - IN u8Byte y -); - - -// 20100514 Joseph: Add definition for antenna switching test after link. -// This indicates two different the steps. -// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. -// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK -// with original RSSI to determine if it is necessary to switch antenna. -#define SWAW_STEP_PEAK 0 -#define SWAW_STEP_DETERMINE 1 - -//==================================================== -//3 PathDiV End -//==================================================== - -#define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C -BOOLEAN -ODM_PathDiversityBeforeLink92C( - //IN PADAPTER Adapter - IN PDM_ODM_T pDM_Odm - ); - -#define DM_ChangeDynamicInitGainThresh ODM_ChangeDynamicInitGainThresh -//void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter, -// IN INT32 DM_Type, -// IN INT32 DM_Value); -// - - -VOID -ODM_CCKPathDiversityChkPerPktRssi( - PADAPTER Adapter, - BOOLEAN bIsDefPort, - BOOLEAN bMatchBSSID, - PRT_WLAN_STA pEntry, - PRT_RFD pRfd, - pu1Byte pDesc - ); - - -typedef enum tag_DIG_Connect_Definition -{ - DIG_STA_DISCONNECT = 0, - DIG_STA_CONNECT = 1, - DIG_STA_BEFORE_CONNECT = 2, - DIG_MultiSTA_DISCONNECT = 3, - DIG_MultiSTA_CONNECT = 4, - DIG_CONNECT_MAX -}DM_DIG_CONNECT_E; - - -VOID -ODM_FillTXPathInTXDESC( - IN PADAPTER Adapter, - IN PRT_TCB pTcb, - IN pu1Byte pDesc -); - - -#define dm_SWAW_RSSI_Check ODM_SwAntDivChkPerPktRssi - -// -// 2012/01/12 MH Check afapter status. Temp fix BSOD. -// -#define HAL_ADAPTER_STS_CHK(pDM_Odm)\ - if (pDM_Odm->Adapter == NULL)\ - {\ - return;\ - }\ - - -// -// For new definition in MP temporarily fro power tracking, -// -#define odm_TXPowerTrackingDirectCall(_Adapter) \ - IS_HARDWARE_TYPE_8192D(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92D(_Adapter) : \ - IS_HARDWARE_TYPE_8192C(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92C(_Adapter) : \ - IS_HARDWARE_TYPE_8723A(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_8723A(_Adapter) :\ - odm_TXPowerTrackingCallback_ThermalMeter_8188E(_Adapter) - -VOID -ODM_SetTxAntByTxInfo_88C_92D( - IN PDM_ODM_T pDM_Odm, - IN pu1Byte pDesc, - IN u1Byte macId - ); -#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_MP) -VOID -ODM_AntselStatistics_88C( - IN PDM_ODM_T pDM_Odm, - IN u1Byte MacId, - IN u4Byte PWDBAll, - IN BOOLEAN isCCKrate -); - -#if( DM_ODM_SUPPORT_TYPE & (ODM_MP |ODM_CE)) - -VOID -ODM_SingleDualAntennaDefaultSetting( - IN PDM_ODM_T pDM_Odm - ); - -BOOLEAN -ODM_SingleDualAntennaDetection( - IN PDM_ODM_T pDM_Odm, - IN u1Byte mode - ); - -#endif // #if((DM_ODM_SUPPORT_TYPE==ODM_MP)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) - -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) -void odm_dtc(PDM_ODM_T pDM_Odm); -#endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */ - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __HALDMOUTSRC_H__ +#define __HALDMOUTSRC_H__ + +//============================================================ +// Definition +//============================================================ +// +// 2011/09/22 MH Define all team supprt ability. +// + +// +// 2011/09/22 MH Define for all teams. Please Define the constan in your precomp header. +// +//#define DM_ODM_SUPPORT_AP 0 +//#define DM_ODM_SUPPORT_ADSL 0 +//#define DM_ODM_SUPPORT_CE 0 +//#define DM_ODM_SUPPORT_MP 1 + +// +// 2011/09/28 MH Define ODM SW team support flag. +// + + + +// +// Antenna Switch Relative Definition. +// + +// +// 20100503 Joseph: +// Add new function SwAntDivCheck8192C(). +// This is the main function of Antenna diversity function before link. +// Mainly, it just retains last scan result and scan again. +// After that, it compares the scan result to see which one gets better RSSI. +// It selects antenna with better receiving power and returns better scan result. +// +#define TP_MODE 0 +#define RSSI_MODE 1 +#define TRAFFIC_LOW 0 +#define TRAFFIC_HIGH 1 + + +//============================================================ +//3 Tx Power Tracking +//3============================================================ +#define DPK_DELTA_MAPPING_NUM 13 +#define index_mapping_HP_NUM 15 + + +//============================================================ +//3 PSD Handler +//3============================================================ + +#define AFH_PSD 1 //0:normal PSD scan, 1: only do 20 pts PSD +#define MODE_40M 0 //0:20M, 1:40M +#define PSD_TH2 3 +#define PSD_CHMIN 20 // Minimum channel number for BT AFH +#define SIR_STEP_SIZE 3 +#define Smooth_Size_1 5 +#define Smooth_TH_1 3 +#define Smooth_Size_2 10 +#define Smooth_TH_2 4 +#define Smooth_Size_3 20 +#define Smooth_TH_3 4 +#define Smooth_Step_Size 5 +#define Adaptive_SIR 1 +#if(RTL8723_FPGA_VERIFICATION == 1) +#define PSD_RESCAN 1 +#else +#define PSD_RESCAN 4 +#endif +#define PSD_SCAN_INTERVAL 700 //ms + + + +//8723A High Power IGI Setting +#define DM_DIG_HIGH_PWR_IGI_LOWER_BOUND 0x22 +#define DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND 0x28 +#define DM_DIG_HIGH_PWR_THRESHOLD 0x3a +#define DM_DIG_LOW_PWR_THRESHOLD 0x14 + +//ANT Test +#define ANTTESTALL 0x00 //Ant A or B will be Testing +#define ANTTESTA 0x01 //Ant A will be Testing +#define ANTTESTB 0x02 //Ant B will be testing + +// LPS define +#define DM_DIG_FA_TH0_LPS 4 //-> 4 in lps +#define DM_DIG_FA_TH1_LPS 15 //-> 15 lps +#define DM_DIG_FA_TH2_LPS 30 //-> 30 lps +#define RSSI_OFFSET_DIG 0x05; + +//ANT Test +#define ANTTESTALL 0x00 //Ant A or B will be Testing +#define ANTTESTA 0x01 //Ant A will be Testing +#define ANTTESTB 0x02 //Ant B will be testing + + +//============================================================ +// structure and define +//============================================================ + +// +// 2011/09/20 MH Add for AP/ADSLpseudo DM structuer requirement. +// We need to remove to other position??? +// +#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) +typedef struct rtl8192cd_priv { + u1Byte temp; + +}rtl8192cd_priv, *prtl8192cd_priv; +#endif + + +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +typedef struct _ADAPTER{ + u1Byte temp; + #ifdef AP_BUILD_WORKAROUND + HAL_DATA_TYPE* temp2; + prtl8192cd_priv priv; + #endif +}ADAPTER, *PADAPTER; +#endif + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) + +typedef struct _WLAN_STA{ + u1Byte temp; +} WLAN_STA, *PRT_WLAN_STA; + +#endif + +typedef struct _Dynamic_Initial_Gain_Threshold_ +{ + u1Byte Dig_Enable_Flag; + u1Byte Dig_Ext_Port_Stage; + + int RssiLowThresh; + int RssiHighThresh; + + u4Byte FALowThresh; + u4Byte FAHighThresh; + + u1Byte CurSTAConnectState; + u1Byte PreSTAConnectState; + u1Byte CurMultiSTAConnectState; + + u1Byte PreIGValue; + u1Byte CurIGValue; + u1Byte BT30_CurIGI; + u1Byte BackupIGValue; + + s1Byte BackoffVal; + s1Byte BackoffVal_range_max; + s1Byte BackoffVal_range_min; + u1Byte rx_gain_range_max; + u1Byte rx_gain_range_min; + u1Byte Rssi_val_min; + + u1Byte PreCCK_CCAThres; + u1Byte CurCCK_CCAThres; + u1Byte PreCCKPDState; + u1Byte CurCCKPDState; + + u1Byte LargeFAHit; + u1Byte ForbiddenIGI; + u4Byte Recover_cnt; + + u1Byte DIG_Dynamic_MIN_0; + u1Byte DIG_Dynamic_MIN_1; + BOOLEAN bMediaConnect_0; + BOOLEAN bMediaConnect_1; + + u4Byte AntDiv_RSSI_max; + u4Byte RSSI_max; +}DIG_T,*pDIG_T; + +typedef struct _Dynamic_Power_Saving_ +{ + u1Byte PreCCAState; + u1Byte CurCCAState; + + u1Byte PreRFState; + u1Byte CurRFState; + + int Rssi_val_min; + + u1Byte initialize; + u4Byte Reg874,RegC70,Reg85C,RegA74; + +}PS_T,*pPS_T; + +typedef struct _FALSE_ALARM_STATISTICS{ + u4Byte Cnt_Parity_Fail; + u4Byte Cnt_Rate_Illegal; + u4Byte Cnt_Crc8_fail; + u4Byte Cnt_Mcs_fail; + u4Byte Cnt_Ofdm_fail; + u4Byte Cnt_Cck_fail; + u4Byte Cnt_all; + u4Byte Cnt_Fast_Fsync; + u4Byte Cnt_SB_Search_fail; + u4Byte Cnt_OFDM_CCA; + u4Byte Cnt_CCK_CCA; + u4Byte Cnt_CCA_all; + u4Byte Cnt_BW_USC; //Gary + u4Byte Cnt_BW_LSC; //Gary +}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; + +typedef struct _Dynamic_Primary_CCA{ + u1Byte PriCCA_flag; + u1Byte intf_flag; + u1Byte intf_type; + u1Byte DupRTS_flag; + u1Byte Monitor_flag; +}Pri_CCA_T, *pPri_CCA_T; + +typedef struct _RX_High_Power_ +{ + u1Byte RXHP_flag; + u1Byte PSD_func_trigger; + u1Byte PSD_bitmap_RXHP[80]; + u1Byte Pre_IGI; + u1Byte Cur_IGI; + u1Byte Pre_pw_th; + u1Byte Cur_pw_th; + BOOLEAN First_time_enter; + BOOLEAN RXHP_enable; + u1Byte TP_Mode; + RT_TIMER PSDTimer; +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + #if USE_WORKITEM + RT_WORK_ITEM PSDTimeWorkitem; + #endif +#endif + +}RXHP_T, *pRXHP_T; + +#if(DM_ODM_SUPPORT_TYPE & (ODM_CE)) +#define ASSOCIATE_ENTRY_NUM 32 // Max size of AsocEntry[]. +#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM + +#elif(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#define ASSOCIATE_ENTRY_NUM NUM_STAT +#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1 + +#else +// +// 2012/01/12 MH Revise for compatiable with other SW team. +// 0 is for STA 1-n is for AP clients. +// +#define ODM_ASSOCIATE_ENTRY_NUM ASSOCIATE_ENTRY_NUM+1// Default port only one +#endif + +//#ifdef CONFIG_ANTENNA_DIVERSITY +// This indicates two different the steps. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK +// with original RSSI to determine if it is necessary to switch antenna. +#define SWAW_STEP_PEAK 0 +#define SWAW_STEP_DETERMINE 1 + +#define TP_MODE 0 +#define RSSI_MODE 1 +#define TRAFFIC_LOW 0 +#define TRAFFIC_HIGH 1 + +typedef struct _SW_Antenna_Switch_ +{ + u1Byte try_flag; + s4Byte PreRSSI; + u1Byte CurAntenna; + u1Byte PreAntenna; + u1Byte RSSI_Trying; + u1Byte TestMode; + u1Byte bTriggerAntennaSwitch; + u1Byte SelectAntennaMap; + u1Byte RSSI_target; + + // Before link Antenna Switch check + u1Byte SWAS_NoLink_State; + u4Byte SWAS_NoLink_BK_Reg860; + BOOLEAN ANTA_ON; //To indicate Ant A is or not + BOOLEAN ANTB_ON; //To indicate Ant B is on or not + + s4Byte RSSI_sum_A; + s4Byte RSSI_sum_B; + s4Byte RSSI_cnt_A; + s4Byte RSSI_cnt_B; + + u8Byte lastTxOkCnt; + u8Byte lastRxOkCnt; + u8Byte TXByteCnt_A; + u8Byte TXByteCnt_B; + u8Byte RXByteCnt_A; + u8Byte RXByteCnt_B; + u1Byte TrafficLoad; + RT_TIMER SwAntennaSwitchTimer; +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + #if USE_WORKITEM + RT_WORK_ITEM SwAntennaSwitchWorkitem; + #endif +#endif +/* CE Platform use +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + _timer SwAntennaSwitchTimer; + u8Byte lastTxOkCnt; + u8Byte lastRxOkCnt; + u8Byte TXByteCnt_A; + u8Byte TXByteCnt_B; + u8Byte RXByteCnt_A; + u8Byte RXByteCnt_B; + u1Byte DoubleComfirm; + u1Byte TrafficLoad; + //SW Antenna Switch + + +#endif +*/ +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + //Hybrid Antenna Diversity + u4Byte CCK_Ant1_Cnt[ASSOCIATE_ENTRY_NUM]; + u4Byte CCK_Ant2_Cnt[ASSOCIATE_ENTRY_NUM]; + u4Byte OFDM_Ant1_Cnt[ASSOCIATE_ENTRY_NUM]; + u4Byte OFDM_Ant2_Cnt[ASSOCIATE_ENTRY_NUM]; + u4Byte RSSI_Ant1_Sum[ASSOCIATE_ENTRY_NUM]; + u4Byte RSSI_Ant2_Sum[ASSOCIATE_ENTRY_NUM]; + u1Byte TxAnt[ASSOCIATE_ENTRY_NUM]; + u1Byte TargetSTA; + u1Byte antsel; + u1Byte RxIdleAnt; + +#endif + +}SWAT_T, *pSWAT_T; +//#endif + +typedef struct _EDCA_TURBO_ +{ + BOOLEAN bCurrentTurboEDCA; + BOOLEAN bIsCurRDLState; + #if(DM_ODM_SUPPORT_TYPE == ODM_CE ) + u4Byte prv_traffic_idx; // edca turbo + #endif + +}EDCA_T,*pEDCA_T; + +typedef struct _ODM_RATE_ADAPTIVE +{ + u1Byte Type; // DM_Type_ByFW/DM_Type_ByDriver + u1Byte HighRSSIThresh; // if RSSI > HighRSSIThresh => RATRState is DM_RATR_STA_HIGH + u1Byte LowRSSIThresh; // if RSSI <= LowRSSIThresh => RATRState is DM_RATR_STA_LOW + u1Byte RATRState; // Current RSSI level, DM_RATR_STA_HIGH/DM_RATR_STA_MIDDLE/DM_RATR_STA_LOW + u4Byte LastRATR; // RATR Register Content + +} ODM_RATE_ADAPTIVE, *PODM_RATE_ADAPTIVE; + + +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + + +#ifdef ADSL_AP_BUILD_WORKAROUND +#define MAX_TOLERANCE 5 +#define IQK_DELAY_TIME 1 //ms +#endif + +// +// Indicate different AP vendor for IOT issue. +// +typedef enum _HT_IOT_PEER +{ + HT_IOT_PEER_UNKNOWN = 0, + HT_IOT_PEER_REALTEK = 1, + HT_IOT_PEER_REALTEK_92SE = 2, + HT_IOT_PEER_BROADCOM = 3, + HT_IOT_PEER_RALINK = 4, + HT_IOT_PEER_ATHEROS = 5, + HT_IOT_PEER_CISCO = 6, + HT_IOT_PEER_MERU = 7, + HT_IOT_PEER_MARVELL = 8, + HT_IOT_PEER_REALTEK_SOFTAP = 9,// peer is RealTek SOFT_AP, by Bohn, 2009.12.17 + HT_IOT_PEER_SELF_SOFTAP = 10, // Self is SoftAP + HT_IOT_PEER_AIRGO = 11, + HT_IOT_PEER_INTEL = 12, + HT_IOT_PEER_RTK_APCLIENT = 13, + HT_IOT_PEER_REALTEK_81XX = 14, + HT_IOT_PEER_REALTEK_WOW = 15, + HT_IOT_PEER_MAX = 16 +}HT_IOT_PEER_E, *PHTIOT_PEER_E; +#endif//#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + + + +#define IQK_MAC_REG_NUM 4 +#define IQK_ADDA_REG_NUM 16 +#define IQK_BB_REG_NUM_MAX 10 +#if (RTL8192D_SUPPORT==1) +#define IQK_BB_REG_NUM 10 +#else +#define IQK_BB_REG_NUM 9 +#endif +#define HP_THERMAL_NUM 8 + +#define AVG_THERMAL_NUM 8 +#define IQK_Matrix_REG_NUM 8 +#define IQK_Matrix_Settings_NUM 1+24+21 + +#define DM_Type_ByFW 0 +#define DM_Type_ByDriver 1 + +// +// Declare for common info +// +// Declare for common info +// +#define MAX_PATH_NUM_92CS 2 + +typedef struct _ODM_Phy_Status_Info_ +{ + u1Byte RxPWDBAll; + u1Byte SignalQuality; // in 0-100 index. + u1Byte RxMIMOSignalQuality[MAX_PATH_NUM_92CS]; //EVM + u1Byte RxMIMOSignalStrength[MAX_PATH_NUM_92CS];// in 0~100 index +#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) + s1Byte RxPower; // in dBm Translate from PWdB + s1Byte RecvSignalPower;// Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures. + u1Byte BTRxRSSIPercentage; + u1Byte SignalStrength; // in 0-100 index. + u1Byte RxPwr[MAX_PATH_NUM_92CS];//per-path's pwdb +#endif + u1Byte RxSNR[MAX_PATH_NUM_92CS];//per-path's SNR +}ODM_PHY_INFO_T,*PODM_PHY_INFO_T; + + +typedef struct _ODM_Phy_Dbg_Info_ +{ + //ODM Write,debug info + s1Byte RxSNRdB[MAX_PATH_NUM_92CS]; + u8Byte NumQryPhyStatus; + u8Byte NumQryPhyStatusCCK; + u8Byte NumQryPhyStatusOFDM; + u1Byte NumQryBeaconPkt; + //Others + s4Byte RxEVM[MAX_PATH_NUM_92CS]; + +}ODM_PHY_DBG_INFO_T; + + +typedef struct _ODM_Per_Pkt_Info_ +{ + u1Byte Rate; + u1Byte StationID; + BOOLEAN bPacketMatchBSSID; + BOOLEAN bPacketToSelf; + BOOLEAN bPacketBeacon; +}ODM_PACKET_INFO_T,*PODM_PACKET_INFO_T; + +typedef struct _ODM_Mac_Status_Info_ +{ + u1Byte test; + +}ODM_MAC_INFO; + + +typedef enum tag_Dynamic_ODM_Support_Ability_Type +{ + // BB Team + ODM_DIG = 0x00000001, + ODM_HIGH_POWER = 0x00000002, + ODM_CCK_CCA_TH = 0x00000004, + ODM_FA_STATISTICS = 0x00000008, + ODM_RAMASK = 0x00000010, + ODM_RSSI_MONITOR = 0x00000020, + ODM_SW_ANTDIV = 0x00000040, + ODM_HW_ANTDIV = 0x00000080, + ODM_BB_PWRSV = 0x00000100, + ODM_2TPATHDIV = 0x00000200, + ODM_1TPATHDIV = 0x00000400, + ODM_PSD2AFH = 0x00000800 +}ODM_Ability_E; + +// +// 2011/20/20 MH For MP driver RT_WLAN_STA = STA_INFO_T +// Please declare below ODM relative info in your STA info structure. +// +#if 1 +typedef struct _ODM_STA_INFO{ + // Driver Write + BOOLEAN bUsed; // record the sta status link or not? + //u1Byte WirelessMode; // + u1Byte IOTPeer; // Enum value. HT_IOT_PEER_E + + // ODM Write + //1 PHY_STATUS_INFO + u1Byte RSSI_Path[4]; // + u1Byte RSSI_Ave; + u1Byte RXEVM[4]; + u1Byte RXSNR[4]; + + // ODM Write + //1 TX_INFO (may changed by IC) + //TX_INFO_T pTxInfo; // Define in IC folder. Move lower layer. +#if 0 + u1Byte ANTSEL_A; //in Jagar: 4bit; others: 2bit + u1Byte ANTSEL_B; //in Jagar: 4bit; others: 2bit + u1Byte ANTSEL_C; //only in Jagar: 4bit + u1Byte ANTSEL_D; //only in Jagar: 4bit + u1Byte TX_ANTL; //not in Jagar: 2bit + u1Byte TX_ANT_HT; //not in Jagar: 2bit + u1Byte TX_ANT_CCK; //not in Jagar: 2bit + u1Byte TXAGC_A; //not in Jagar: 4bit + u1Byte TXAGC_B; //not in Jagar: 4bit + u1Byte TXPWR_OFFSET; //only in Jagar: 3bit + u1Byte TX_ANT; //only in Jagar: 4bit for TX_ANTL/TX_ANTHT/TX_ANT_CCK +#endif + + // + // Please use compile flag to disabe the strcutrue for other IC except 88E. + // Move To lower layer. + // + // ODM Write Wilson will handle this part(said by Luke.Lee) + //TX_RPT_T pTxRpt; // Define in IC folder. Move lower layer. +#if 0 + //1 For 88E RA (don't redefine the naming) + u1Byte rate_id; + u1Byte rate_SGI; + u1Byte rssi_sta_ra; + u1Byte SGI_enable; + u1Byte Decision_rate; + u1Byte Pre_rate; + u1Byte Active; + + // Driver write Wilson handle. + //1 TX_RPT (don't redefine the naming) + u2Byte RTY[4]; // ??? + u2Byte TOTAL; // ??? + u2Byte DROP; // ??? + // + // Please use compile flag to disabe the strcutrue for other IC except 88E. + // +#endif + +}ODM_STA_INFO_T, *PODM_STA_INFO_T; +#endif + +// +// 2011/10/20 MH Define Common info enum for all team. +// +typedef enum _ODM_Common_Info_Definition +{ +//-------------REMOVED CASE-----------// + //ODM_CMNINFO_CCK_HP, + //ODM_CMNINFO_RFPATH_ENABLE, // Define as ODM write??? + //ODM_CMNINFO_BT_COEXIST, // ODM_BT_COEXIST_E + //ODM_CMNINFO_OP_MODE, // ODM_OPERATION_MODE_E +//-------------REMOVED CASE-----------// + + // + // Fixed value: + // + + //-----------HOOK BEFORE REG INIT-----------// + ODM_CMNINFO_PLATFORM = 0, + ODM_CMNINFO_ABILITY, // ODM_ABILITY_E + ODM_CMNINFO_INTERFACE, // ODM_INTERFACE_E + ODM_CMNINFO_MP_TEST_CHIP, + ODM_CMNINFO_IC_TYPE, // ODM_IC_TYPE_E + ODM_CMNINFO_CUT_VER, // ODM_CUT_VERSION_E + ODM_CMNINFO_FAB_VER, // ODM_FAB_E + ODM_CMNINFO_RF_TYPE, // ODM_RF_PATH_E or ODM_RF_TYPE_E? + ODM_CMNINFO_BOARD_TYPE, // ODM_BOARD_TYPE_E + ODM_CMNINFO_EXT_LNA, // TRUE + ODM_CMNINFO_EXT_PA, + ODM_CMNINFO_EXT_TRSW, + ODM_CMNINFO_PATCH_ID, //CUSTOMER ID + ODM_CMNINFO_BINHCT_TEST, + ODM_CMNINFO_BWIFI_TEST, + ODM_CMNINFO_SMART_CONCURRENT, + //-----------HOOK BEFORE REG INIT-----------// + + + // + // Dynamic value: + // +//--------- POINTER REFERENCE-----------// + ODM_CMNINFO_MAC_PHY_MODE, // ODM_MAC_PHY_MODE_E + ODM_CMNINFO_TX_UNI, + ODM_CMNINFO_RX_UNI, + ODM_CMNINFO_WM_MODE, // ODM_WIRELESS_MODE_E + ODM_CMNINFO_BAND, // ODM_BAND_TYPE_E + ODM_CMNINFO_SEC_CHNL_OFFSET, // ODM_SEC_CHNL_OFFSET_E + ODM_CMNINFO_SEC_MODE, // ODM_SECURITY_E + ODM_CMNINFO_BW, // ODM_BW_E + ODM_CMNINFO_CHNL, + + ODM_CMNINFO_DMSP_GET_VALUE, + ODM_CMNINFO_BUDDY_ADAPTOR, + ODM_CMNINFO_DMSP_IS_MASTER, + ODM_CMNINFO_SCAN, + ODM_CMNINFO_POWER_SAVING, + ODM_CMNINFO_ONE_PATH_CCA, // ODM_CCA_PATH_E + ODM_CMNINFO_DRV_STOP, + ODM_CMNINFO_PNP_IN, + ODM_CMNINFO_INIT_ON, + ODM_CMNINFO_ANT_TEST, + ODM_CMNINFO_NET_CLOSED, + ODM_CMNINFO_MP_MODE, +//--------- POINTER REFERENCE-----------// + +//------------CALL BY VALUE-------------// + ODM_CMNINFO_WIFI_DIRECT, + ODM_CMNINFO_WIFI_DISPLAY, + ODM_CMNINFO_LINK, + ODM_CMNINFO_RSSI_MIN, + ODM_CMNINFO_DBG_COMP, // u8Byte + ODM_CMNINFO_DBG_LEVEL, // u4Byte + ODM_CMNINFO_RA_THRESHOLD_HIGH, // u1Byte + ODM_CMNINFO_RA_THRESHOLD_LOW, // u1Byte + ODM_CMNINFO_RF_ANTENNA_TYPE, // u1Byte + ODM_CMNINFO_BT_DISABLED, + ODM_CMNINFO_BT_OPERATION, + ODM_CMNINFO_BT_DIG, + ODM_CMNINFO_BT_BUSY, //Check Bt is using or not//neil + ODM_CMNINFO_BT_DISABLE_EDCA, +//------------CALL BY VALUE-------------// + + // + // Dynamic ptr array hook itms. + // + ODM_CMNINFO_STA_STATUS, + ODM_CMNINFO_PHY_STATUS, + ODM_CMNINFO_MAC_STATUS, + + ODM_CMNINFO_MAX, + + +}ODM_CMNINFO_E; + +// +// 2011/10/20 MH Define ODM support ability. ODM_CMNINFO_ABILITY +// +typedef enum _ODM_Support_Ability_Definition +{ + // + // BB ODM section BIT 0-15 + // + ODM_BB_DIG = BIT0, + ODM_BB_RA_MASK = BIT1, + ODM_BB_DYNAMIC_TXPWR = BIT2, + ODM_BB_FA_CNT = BIT3, + ODM_BB_RSSI_MONITOR = BIT4, + ODM_BB_CCK_PD = BIT5, + ODM_BB_ANT_DIV = BIT6, + ODM_BB_PWR_SAVE = BIT7, + ODM_BB_PWR_TRAIN = BIT8, + ODM_BB_RATE_ADAPTIVE = BIT9, + ODM_BB_PATH_DIV = BIT10, + ODM_BB_PSD = BIT11, + ODM_BB_RXHP = BIT12, + ODM_BB_ADAPTIVITY = BIT13, + ODM_BB_DYNAMIC_ATC = BIT14, + + // + // MAC DM section BIT 16-23 + // + ODM_MAC_EDCA_TURBO = BIT16, + ODM_MAC_EARLY_MODE = BIT17, + + // + // RF ODM section BIT 24-31 + // + ODM_RF_TX_PWR_TRACK = BIT24, + ODM_RF_RX_GAIN_TRACK = BIT25, + ODM_RF_CALIBRATION = BIT26, + +}ODM_ABILITY_E; + +// ODM_CMNINFO_INTERFACE +typedef enum tag_ODM_Support_Interface_Definition +{ + ODM_ITRF_PCIE = 0x1, + ODM_ITRF_USB = 0x2, + ODM_ITRF_SDIO = 0x4, + ODM_ITRF_ALL = 0x7, +}ODM_INTERFACE_E; + +// ODM_CMNINFO_IC_TYPE +typedef enum tag_ODM_Support_IC_Type_Definition +{ + ODM_RTL8192S = BIT0, + ODM_RTL8192C = BIT1, + ODM_RTL8192D = BIT2, + ODM_RTL8723A = BIT3, + ODM_RTL8188E = BIT4, + ODM_RTL8812 = BIT5, + ODM_RTL8821 = BIT6, + ODM_RTL8192E = BIT7, + ODM_RTL8723B = BIT8, + ODM_RTL8813A = BIT9, + ODM_RTL8881A = BIT10 +}ODM_IC_TYPE_E; + +#define ODM_IC_11N_SERIES (ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E) +#define ODM_IC_11AC_SERIES (ODM_RTL8812) + +//ODM_CMNINFO_CUT_VER +typedef enum tag_ODM_Cut_Version_Definition +{ + ODM_CUT_A = 1, + ODM_CUT_B = 2, + ODM_CUT_C = 3, + ODM_CUT_D = 4, + ODM_CUT_E = 5, + ODM_CUT_F = 6, + ODM_CUT_TEST = 7, +}ODM_CUT_VERSION_E; + +// ODM_CMNINFO_FAB_VER +typedef enum tag_ODM_Fab_Version_Definition +{ + ODM_TSMC = 0, + ODM_UMC = 1, +}ODM_FAB_E; + +// ODM_CMNINFO_RF_TYPE +// +// For example 1T2R (A+AB = BIT0|BIT4|BIT5) +// +typedef enum tag_ODM_RF_Path_Bit_Definition +{ + ODM_RF_TX_A = BIT0, + ODM_RF_TX_B = BIT1, + ODM_RF_TX_C = BIT2, + ODM_RF_TX_D = BIT3, + ODM_RF_RX_A = BIT4, + ODM_RF_RX_B = BIT5, + ODM_RF_RX_C = BIT6, + ODM_RF_RX_D = BIT7, +}ODM_RF_PATH_E; + + +typedef enum tag_ODM_RF_Type_Definition +{ + ODM_1T1R = 0, + ODM_1T2R = 1, + ODM_2T2R = 2, + ODM_2T3R = 3, + ODM_2T4R = 4, + ODM_3T3R = 5, + ODM_3T4R = 6, + ODM_4T4R = 7, +}ODM_RF_TYPE_E; + + +// +// ODM Dynamic common info value definition +// + +//typedef enum _MACPHY_MODE_8192D{ +// SINGLEMAC_SINGLEPHY, +// DUALMAC_DUALPHY, +// DUALMAC_SINGLEPHY, +//}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D; +// Above is the original define in MP driver. Please use the same define. THX. +typedef enum tag_ODM_MAC_PHY_Mode_Definition +{ + ODM_SMSP = 0, + ODM_DMSP = 1, + ODM_DMDP = 2, +}ODM_MAC_PHY_MODE_E; + + +typedef enum tag_BT_Coexist_Definition +{ + ODM_BT_BUSY = 1, + ODM_BT_ON = 2, + ODM_BT_OFF = 3, + ODM_BT_NONE = 4, +}ODM_BT_COEXIST_E; + +// ODM_CMNINFO_OP_MODE +typedef enum tag_Operation_Mode_Definition +{ + ODM_NO_LINK = BIT0, + ODM_LINK = BIT1, + ODM_SCAN = BIT2, + ODM_POWERSAVE = BIT3, + ODM_AP_MODE = BIT4, + ODM_CLIENT_MODE = BIT5, + ODM_AD_HOC = BIT6, + ODM_WIFI_DIRECT = BIT7, + ODM_WIFI_DISPLAY = BIT8, +}ODM_OPERATION_MODE_E; + +// ODM_CMNINFO_WM_MODE +typedef enum tag_Wireless_Mode_Definition +{ + ODM_WM_UNKNOW = 0x0, + ODM_WM_B = BIT0, + ODM_WM_G = BIT1, + ODM_WM_A = BIT2, + ODM_WM_N24G = BIT3, + ODM_WM_N5G = BIT4, + ODM_WM_AUTO = BIT5, + ODM_WM_AC = BIT6, +}ODM_WIRELESS_MODE_E; + +// ODM_CMNINFO_BAND +typedef enum tag_Band_Type_Definition +{ + ODM_BAND_2_4G = BIT0, + ODM_BAND_5G = BIT1, + +}ODM_BAND_TYPE_E; + +// ODM_CMNINFO_SEC_CHNL_OFFSET +typedef enum tag_Secondary_Channel_Offset_Definition +{ + ODM_DONT_CARE = 0, + ODM_BELOW = 1, + ODM_ABOVE = 2 +}ODM_SEC_CHNL_OFFSET_E; + +// ODM_CMNINFO_SEC_MODE +typedef enum tag_Security_Definition +{ + ODM_SEC_OPEN = 0, + ODM_SEC_WEP40 = 1, + ODM_SEC_TKIP = 2, + ODM_SEC_RESERVE = 3, + ODM_SEC_AESCCMP = 4, + ODM_SEC_WEP104 = 5, + ODM_WEP_WPA_MIXED = 6, // WEP + WPA + ODM_SEC_SMS4 = 7, +}ODM_SECURITY_E; + +// ODM_CMNINFO_BW +typedef enum tag_Bandwidth_Definition +{ + ODM_BW20M = 0, + ODM_BW40M = 1, + ODM_BW80M = 2, + ODM_BW160M = 3, + ODM_BW10M = 4, +}ODM_BW_E; + +// ODM_CMNINFO_CHNL + +// ODM_CMNINFO_BOARD_TYPE +#if 1 +typedef enum tag_Board_Definition +{ + ODM_BOARD_DEFAULT = 0, // The DEFAULT case. + ODM_BOARD_MINICARD = BIT(0), // 0 = non-mini card, 1= mini card. + ODM_BOARD_SLIM = BIT(1), // 0 = non-slim card, 1 = slim card + ODM_BOARD_BT = BIT(2), // 0 = without BT card, 1 = with BT + ODM_BOARD_EXT_PA = BIT(3), // 0 = no 2G ext-PA, 1 = existing 2G ext-PA + ODM_BOARD_EXT_LNA = BIT(4), // 0 = no 2G ext-LNA, 1 = existing 2G ext-LNA + ODM_BOARD_EXT_TRSW = BIT(5), // 0 = no ext-TRSW, 1 = existing ext-TRSW + ODM_BOARD_EXT_PA_5G = BIT(6), // 0 = no 5G ext-PA, 1 = existing 5G ext-PA + ODM_BOARD_EXT_LNA_5G = BIT(7), // 0 = no 5G ext-LNA, 1 = existing 5G ext-LNA +}ODM_BOARD_TYPE_E; +#else +typedef enum tag_Board_Definition +{ + ODM_BOARD_NORMAL = 0, + ODM_BOARD_HIGHPWR = 1, + ODM_BOARD_MINICARD = 2, + ODM_BOARD_SLIM = 3, + ODM_BOARD_COMBO = 4, + +}ODM_BOARD_TYPE_E; +#endif + + + +// ODM_CMNINFO_ONE_PATH_CCA +typedef enum tag_CCA_Path +{ + ODM_CCA_2R = 0, + ODM_CCA_1R_A = 1, + ODM_CCA_1R_B = 2, +}ODM_CCA_PATH_E; + + +typedef struct _ODM_RA_Info_ +{ + u1Byte RateID; + u4Byte RateMask; + u4Byte RAUseRate; + u1Byte RateSGI; + u1Byte RssiStaRA; + u1Byte PreRssiStaRA; + u1Byte SGIEnable; + u1Byte DecisionRate; + u1Byte PreRate; + u1Byte HighestRate; + u1Byte LowestRate; + u4Byte NscUp; + u4Byte NscDown; + u2Byte RTY[5]; + u4Byte TOTAL; + u2Byte DROP;//Retry over or drop + u2Byte DROP1;//LifeTime over + u1Byte Active; + u2Byte RptTime; + u1Byte RAWaitingCounter; + u1Byte RAPendingCounter; +#if 1 //POWER_TRAINING_ACTIVE == 1 // For compile pass only~! + u1Byte PTActive; // on or off + u1Byte PTTryState; // 0 trying state, 1 for decision state + u1Byte PTStage; // 0~6 + u1Byte PTStopCount; //Stop PT counter + u1Byte PTPreRate; // if rate change do PT + u1Byte PTPreRssi; // if RSSI change 5% do PT + u1Byte PTModeSS; // decide whitch rate should do PT + u1Byte RAstage; // StageRA, decide how many times RA will be done between PT + u1Byte PTSmoothFactor; +#endif +} ODM_RA_INFO_T,*PODM_RA_INFO_T; + +typedef struct _IQK_MATRIX_REGS_SETTING{ + BOOLEAN bIQKDone; + s4Byte Value[1][IQK_Matrix_REG_NUM]; +}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING; + +#if (DM_ODM_SUPPORT_TYPE & ODM_MP) +typedef struct _PathDiv_Parameter_define_ +{ + u4Byte org_5g_RegE30; + u4Byte org_5g_RegC14; + u4Byte org_5g_RegCA0; + u4Byte swt_5g_RegE30; + u4Byte swt_5g_RegC14; + u4Byte swt_5g_RegCA0; + //for 2G IQK information + u4Byte org_2g_RegC80; + u4Byte org_2g_RegC4C; + u4Byte org_2g_RegC94; + u4Byte org_2g_RegC14; + u4Byte org_2g_RegCA0; + + u4Byte swt_2g_RegC80; + u4Byte swt_2g_RegC4C; + u4Byte swt_2g_RegC94; + u4Byte swt_2g_RegC14; + u4Byte swt_2g_RegCA0; +}PATHDIV_PARA,*pPATHDIV_PARA; +#endif + + +typedef struct ODM_RF_Calibration_Structure +{ + //for tx power tracking + + u4Byte RegA24; // for TempCCK + s4Byte RegE94; + s4Byte RegE9C; + s4Byte RegEB4; + s4Byte RegEBC; + + //u1Byte bTXPowerTracking; + u1Byte TXPowercount; + BOOLEAN bTXPowerTrackingInit; + BOOLEAN bTXPowerTracking; + u1Byte TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default + u1Byte TM_Trigger; + u1Byte InternalPA5G[2]; //pathA / pathB + + u1Byte ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 + u1Byte ThermalValue; + u1Byte ThermalValue_LCK; + u1Byte ThermalValue_IQK; + u1Byte ThermalValue_DPK; + u1Byte ThermalValue_AVG[AVG_THERMAL_NUM]; + u1Byte ThermalValue_AVG_index; + u1Byte ThermalValue_RxGain; + u1Byte ThermalValue_Crystal; + u1Byte ThermalValue_DPKstore; + u1Byte ThermalValue_DPKtrack; + BOOLEAN TxPowerTrackingInProgress; + BOOLEAN bDPKenable; + + BOOLEAN bReloadtxpowerindex; + u1Byte bRfPiEnable; + u4Byte TXPowerTrackingCallbackCnt; //cosa add for debug + + u1Byte bCCKinCH14; + u1Byte CCK_index; + u1Byte OFDM_index[2]; + BOOLEAN bDoneTxpower; + s1Byte PowerIndexOffset; + s1Byte DeltaPowerIndex; + s1Byte DeltaPowerIndexLast; + BOOLEAN bTxPowerChanged; + + u1Byte ThermalValue_HP[HP_THERMAL_NUM]; + u1Byte ThermalValue_HP_index; + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; + + u1Byte Delta_IQK; + u1Byte Delta_LCK; + + //for IQK + u4Byte RegC04; + u4Byte Reg874; + u4Byte RegC08; + u4Byte RegB68; + u4Byte RegB6C; + u4Byte Reg870; + u4Byte Reg860; + u4Byte Reg864; + + BOOLEAN bIQKInitialized; + BOOLEAN bLCKInProgress; + BOOLEAN bAntennaDetected; + u4Byte ADDA_backup[IQK_ADDA_REG_NUM]; + u4Byte IQK_MAC_backup[IQK_MAC_REG_NUM]; + u4Byte IQK_BB_backup_recover[9]; + u4Byte IQK_BB_backup[IQK_BB_REG_NUM]; + + //for APK + u4Byte APKoutput[2][2]; //path A/B; output1_1a/output1_2a + u1Byte bAPKdone; + u1Byte bAPKThermalMeterIgnore; + u1Byte bDPdone; + u1Byte bDPPathAOK; + u1Byte bDPPathBOK; +}ODM_RF_CAL_T,*PODM_RF_CAL_T; +// +// ODM Dynamic common info value definition +// + +typedef struct _FAST_ANTENNA_TRAINNING_ +{ + u1Byte Bssid[6]; + u1Byte antsel_rx_keep_0; + u1Byte antsel_rx_keep_1; + u1Byte antsel_rx_keep_2; + u4Byte antSumRSSI[7]; + u4Byte antRSSIcnt[7]; + u4Byte antAveRSSI[7]; + u1Byte FAT_State; + u4Byte TrainIdx; + u1Byte antsel_a[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte antsel_b[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte antsel_c[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte MainAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte AuxAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte MainAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u4Byte AuxAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM]; + u1Byte RxIdleAnt; + BOOLEAN bBecomeLinked; + +}FAT_T,*pFAT_T; + +typedef enum _FAT_STATE +{ + FAT_NORMAL_STATE = 0, + FAT_TRAINING_STATE = 1, +}FAT_STATE_E, *PFAT_STATE_E; + +typedef enum _ANT_DIV_TYPE +{ + NO_ANTDIV = 0xFF, + CG_TRX_HW_ANTDIV = 0x01, + CGCS_RX_HW_ANTDIV = 0x02, + FIXED_HW_ANTDIV = 0x03, + CG_TRX_SMART_ANTDIV = 0x04, + CGCS_RX_SW_ANTDIV = 0x05, + +}ANT_DIV_TYPE_E, *PANT_DIV_TYPE_E; + + + + + + + + + + + + + +// +// 2011/09/22 MH Copy from SD4 defined structure. We use to support PHY DM integration. +// +#if(DM_ODM_SUPPORT_TYPE & ODM_MP) +#if (RT_PLATFORM != PLATFORM_LINUX) +typedef +#endif +struct DM_Out_Source_Dynamic_Mechanism_Structure +#else// for AP,ADSL,CE Team +typedef struct DM_Out_Source_Dynamic_Mechanism_Structure +#endif +{ + //RT_TIMER FastAntTrainingTimer; + // + // Add for different team use temporarily + // + PADAPTER Adapter; // For CE/NIC team + prtl8192cd_priv priv; // For AP/ADSL team + // WHen you use Adapter or priv pointer, you must make sure the pointer is ready. + BOOLEAN odm_ready; + +#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) + rtl8192cd_priv fake_priv; +#endif +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + // ADSL_AP_BUILD_WORKAROUND + ADAPTER fake_adapter; +#endif + + u8Byte DebugComponents; + u4Byte DebugLevel; + +//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------// + BOOLEAN bCckHighPower; + u1Byte RFPathRxEnable; // ODM_CMNINFO_RFPATH_ENABLE + u1Byte ControlChannel; +//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------// + +//--------REMOVED COMMON INFO----------// + //u1Byte PseudoMacPhyMode; + //BOOLEAN *BTCoexist; + //BOOLEAN PseudoBtCoexist; + //u1Byte OPMode; + //BOOLEAN bAPMode; + //BOOLEAN bClientMode; + //BOOLEAN bAdHocMode; + //BOOLEAN bSlaveOfDMSP; +//--------REMOVED COMMON INFO----------// + + +//1 COMMON INFORMATION + + // + // Init Value + // +//-----------HOOK BEFORE REG INIT-----------// + // ODM Platform info AP/ADSL/CE/MP = 1/2/3/4 + u1Byte SupportPlatform; + // ODM Support Ability DIG/RATR/TX_PWR_TRACK/ ¡K¡K = 1/2/3/¡K + u4Byte SupportAbility; + // ODM PCIE/USB/SDIO/GSPI = 0/1/2/3 + u1Byte SupportInterface; + // ODM composite or independent. Bit oriented/ 92C+92D+ .... or any other type = 1/2/3/... + u4Byte SupportICType; + // Cut Version TestChip/A-cut/B-cut... = 0/1/2/3/... + u1Byte CutVersion; + // Fab Version TSMC/UMC = 0/1 + u1Byte FabVersion; + // RF Type 4T4R/3T3R/2T2R/1T2R/1T1R/... + u1Byte RFType; + // Board Type Normal/HighPower/MiniCard/SLIM/Combo/... = 0/1/2/3/4/... + u1Byte BoardType; + // with external LNA NO/Yes = 0/1 + u1Byte ExtLNA; + // with external PA NO/Yes = 0/1 + u1Byte ExtPA; + // with external TRSW NO/Yes = 0/1 + u1Byte ExtTRSW; + u1Byte PatchID; //Customer ID + BOOLEAN bInHctTest; + BOOLEAN bWIFITest; + + BOOLEAN bDualMacSmartConcurrent; + u4Byte BK_SupportAbility; + u1Byte AntDivType; +//-----------HOOK BEFORE REG INIT-----------// + + // + // Dynamic Value + // +//--------- POINTER REFERENCE-----------// + + u1Byte u1Byte_temp; + BOOLEAN BOOLEAN_temp; + PADAPTER PADAPTER_temp; + + // MAC PHY Mode SMSP/DMSP/DMDP = 0/1/2 + u1Byte *pMacPhyMode; + //TX Unicast byte count + u8Byte *pNumTxBytesUnicast; + //RX Unicast byte count + u8Byte *pNumRxBytesUnicast; + // Wireless mode B/G/A/N = BIT0/BIT1/BIT2/BIT3 + u1Byte *pWirelessMode; //ODM_WIRELESS_MODE_E + // Frequence band 2.4G/5G = 0/1 + u1Byte *pBandType; + // Secondary channel offset don't_care/below/above = 0/1/2 + u1Byte *pSecChOffset; + // Security mode Open/WEP/AES/TKIP = 0/1/2/3 + u1Byte *pSecurity; + // BW info 20M/40M/80M = 0/1/2 + u1Byte *pBandWidth; + // Central channel location Ch1/Ch2/.... + u1Byte *pChannel; //central channel number + // Common info for 92D DMSP + + BOOLEAN *pbGetValueFromOtherMac; + PADAPTER *pBuddyAdapter; + BOOLEAN *pbMasterOfDMSP; //MAC0: master, MAC1: slave + // Common info for Status + BOOLEAN *pbScanInProcess; + BOOLEAN *pbPowerSaving; + // CCA Path 2-path/path-A/path-B = 0/1/2; using ODM_CCA_PATH_E. + u1Byte *pOnePathCCA; + //pMgntInfo->AntennaTest + u1Byte *pAntennaTest; + BOOLEAN *pbNet_closed; +//--------- POINTER REFERENCE-----------// + // +//------------CALL BY VALUE-------------// + BOOLEAN bLinkInProcess; + BOOLEAN bWIFI_Direct; + BOOLEAN bWIFI_Display; + BOOLEAN bLinked; + u1Byte RSSI_Min; + u1Byte InterfaceIndex; // Add for 92D dual MAC: 0--Mac0 1--Mac1 + BOOLEAN bIsMPChip; + BOOLEAN bOneEntryOnly; + // Common info for BTDM + BOOLEAN bBtDisabled; // BT is disabled + BOOLEAN bBtConnectProcess; // BT HS is under connection progress. + u1Byte btHsRssi; // BT HS mode wifi rssi value. + BOOLEAN bBtHsOperation; // BT HS mode is under progress + u1Byte btHsDigVal; // use BT rssi to decide the DIG value + BOOLEAN bBtDisableEdcaTurbo; // Under some condition, don't enable the EDCA Turbo + BOOLEAN bBtLimitedDig; // BT is busy. +//------------CALL BY VALUE-------------// + u1Byte RSSI_A; + u1Byte RSSI_B; + u8Byte RSSI_TRSW; + u8Byte RSSI_TRSW_H; + u8Byte RSSI_TRSW_L; + u8Byte RSSI_TRSW_iso; + + u1Byte RxRate; + BOOLEAN StopDIG; + u1Byte TxRate; + u1Byte LinkedInterval; + u1Byte preChannel; + u4Byte TxagcOffsetValueA; + BOOLEAN IsTxagcOffsetPositiveA; + u4Byte TxagcOffsetValueB; + BOOLEAN IsTxagcOffsetPositiveB; + u8Byte lastTxOkCnt; + u8Byte lastRxOkCnt; + u4Byte BbSwingOffsetA; + BOOLEAN IsBbSwingOffsetPositiveA; + u4Byte BbSwingOffsetB; + BOOLEAN IsBbSwingOffsetPositiveB; + s1Byte TH_L2H_ini; + s1Byte TH_EDCCA_HL_diff; + u4Byte IGI_Base; + u4Byte IGI_target; + BOOLEAN ForceEDCCA; + u1Byte AdapEn_RSSI; + u1Byte AntType; + u1Byte antdiv_rssi; + u1Byte antdiv_period; + u4Byte Force_TH_H; + u4Byte Force_TH_L; + u1Byte IGI_LowerBound; + + //2 Define STA info. + // _ODM_STA_INFO + // 2012/01/12 MH For MP, we need to reduce one array pointer for default port.?? + PSTA_INFO_T pODM_StaInfo[ODM_ASSOCIATE_ENTRY_NUM]; + +#if (RATE_ADAPTIVE_SUPPORT == 1) + u2Byte CurrminRptTime; + ODM_RA_INFO_T RAInfo[ODM_ASSOCIATE_ENTRY_NUM]; //Use MacID as array index. STA MacID=0, VWiFi Client MacID={1, ODM_ASSOCIATE_ENTRY_NUM-1} //YJ,add,120119 +#endif + // + // 2012/02/14 MH Add to share 88E ra with other SW team. + // We need to colelct all support abilit to a proper area. + // + BOOLEAN RaSupport88E; + + // Define ........... + + // Latest packet phy info (ODM write) + ODM_PHY_DBG_INFO_T PhyDbgInfo; + //PHY_INFO_88E PhyInfo; + + // Latest packet phy info (ODM write) + ODM_MAC_INFO *pMacInfo; + //MAC_INFO_88E MacInfo; + + // Different Team independt structure?? + + // + //TX_RTP_CMN TX_retrpo; + //TX_RTP_88E TX_retrpo; + //TX_RTP_8195 TX_retrpo; + + // + //ODM Structure + // + FAT_T DM_FatTable; + DIG_T DM_DigTable; + PS_T DM_PSTable; + Pri_CCA_T DM_PriCCA; + RXHP_T DM_RXHP_Table; + FALSE_ALARM_STATISTICS FalseAlmCnt; + FALSE_ALARM_STATISTICS FlaseAlmCntBuddyAdapter; + //#ifdef CONFIG_ANTENNA_DIVERSITY + SWAT_T DM_SWAT_Table; + BOOLEAN RSSI_test; + //#endif + +#if (DM_ODM_SUPPORT_TYPE & ODM_MP) + //Path Div Struct + PATHDIV_PARA pathIQK; +#endif + + EDCA_T DM_EDCA_Table; + u4Byte WMMEDCA_BE; + // Copy from SD4 structure + // + // ================================================== + // + + //common + //u1Byte DM_Type; + //u1Byte PSD_Report_RXHP[80]; // Add By Gary + //u1Byte PSD_func_flag; // Add By Gary + //for DIG + //u1Byte bDMInitialGainEnable; + //u1Byte binitialized; // for dm_initial_gain_Multi_STA use. + //for Antenna diversity + //u8 AntDivCfg;// 0:OFF , 1:ON, 2:by efuse + //PSTA_INFO_T RSSI_target; + + BOOLEAN *pbDriverStopped; + BOOLEAN *pbDriverIsGoingToPnpSetPowerSleep; + BOOLEAN *pinit_adpt_in_progress; + + //PSD + BOOLEAN bUserAssignLevel; + RT_TIMER PSDTimer; + u1Byte RSSI_BT; //come from BT + BOOLEAN bPSDinProcess; + BOOLEAN bDMInitialGainEnable; + + //for rate adaptive, in fact, 88c/92c fw will handle this + u1Byte bUseRAMask; + + ODM_RATE_ADAPTIVE RateAdaptive; + + + ODM_RF_CAL_T RFCalibrateInfo; + + // + // TX power tracking + // + u1Byte BbSwingIdxOfdm; + u1Byte BbSwingIdxOfdmCurrent; + u1Byte BbSwingIdxOfdmBase; + BOOLEAN BbSwingFlagOfdm; + u1Byte BbSwingIdxCck; + u1Byte BbSwingIdxCckCurrent; + u1Byte BbSwingIdxCckBase; + u1Byte DefaultOfdmIndex; + u1Byte DefaultCckIndex; + BOOLEAN BbSwingFlagCck; + + + u1Byte *mp_mode; + // + // ODM system resource. + // + + // ODM relative time. + RT_TIMER PathDivSwitchTimer; + //2011.09.27 add for Path Diversity + RT_TIMER CCKPathDiversityTimer; + RT_TIMER FastAntTrainingTimer; + + // ODM relative workitem. +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + #if USE_WORKITEM + RT_WORK_ITEM PathDivSwitchWorkitem; + RT_WORK_ITEM CCKPathDiversityWorkitem; + RT_WORK_ITEM FastAntTrainingWorkitem; + #endif +#endif + +#if(DM_ODM_SUPPORT_TYPE & ODM_MP) + +#if (RT_PLATFORM != PLATFORM_LINUX) +} DM_ODM_T, *PDM_ODM_T; // DM_Dynamic_Mechanism_Structure +#else +}; +#endif + +#else// for AP,ADSL,CE Team +} DM_ODM_T, *PDM_ODM_T; // DM_Dynamic_Mechanism_Structure +#endif + + + +#if 1 //92c-series +#define ODM_RF_PATH_MAX 2 +#else //jaguar - series +#define ODM_RF_PATH_MAX 4 +#endif + +typedef enum _ODM_RF_RADIO_PATH { + ODM_RF_PATH_A = 0, //Radio Path A + ODM_RF_PATH_B = 1, //Radio Path B + ODM_RF_PATH_C = 2, //Radio Path C + ODM_RF_PATH_D = 3, //Radio Path D + // ODM_RF_PATH_MAX, //Max RF number 90 support +} ODM_RF_RADIO_PATH_E, *PODM_RF_RADIO_PATH_E; + + typedef enum _ODM_RF_CONTENT{ + odm_radioa_txt = 0x1000, + odm_radiob_txt = 0x1001, + odm_radioc_txt = 0x1002, + odm_radiod_txt = 0x1003 +} ODM_RF_CONTENT; + +typedef enum _ODM_BB_Config_Type{ + CONFIG_BB_PHY_REG, + CONFIG_BB_AGC_TAB, + CONFIG_BB_AGC_TAB_2G, + CONFIG_BB_AGC_TAB_5G, + CONFIG_BB_PHY_REG_PG, +} ODM_BB_Config_Type, *PODM_BB_Config_Type; + +// Status code +#if (DM_ODM_SUPPORT_TYPE != ODM_MP) +typedef enum _RT_STATUS{ + RT_STATUS_SUCCESS, + RT_STATUS_FAILURE, + RT_STATUS_PENDING, + RT_STATUS_RESOURCE, + RT_STATUS_INVALID_CONTEXT, + RT_STATUS_INVALID_PARAMETER, + RT_STATUS_NOT_SUPPORT, + RT_STATUS_OS_API_FAILED, +}RT_STATUS,*PRT_STATUS; +#endif // end of RT_STATUS definition + +#ifdef REMOVE_PACK +#pragma pack() +#endif + +//#include "odm_function.h" + +//3=========================================================== +//3 DIG +//3=========================================================== + +typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition +{ + DIG_TYPE_THRESH_HIGH = 0, + DIG_TYPE_THRESH_LOW = 1, + DIG_TYPE_BACKOFF = 2, + DIG_TYPE_RX_GAIN_MIN = 3, + DIG_TYPE_RX_GAIN_MAX = 4, + DIG_TYPE_ENABLE = 5, + DIG_TYPE_DISABLE = 6, + DIG_OP_TYPE_MAX +}DM_DIG_OP_E; +/* +typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition +{ + CCK_PD_STAGE_LowRssi = 0, + CCK_PD_STAGE_HighRssi = 1, + CCK_PD_STAGE_MAX = 3, +}DM_CCK_PDTH_E; + +typedef enum tag_DIG_EXT_PORT_ALGO_Definition +{ + DIG_EXT_PORT_STAGE_0 = 0, + DIG_EXT_PORT_STAGE_1 = 1, + DIG_EXT_PORT_STAGE_2 = 2, + DIG_EXT_PORT_STAGE_3 = 3, + DIG_EXT_PORT_STAGE_MAX = 4, +}DM_DIG_EXT_PORT_ALG_E; + +typedef enum tag_DIG_Connect_Definition +{ + DIG_STA_DISCONNECT = 0, + DIG_STA_CONNECT = 1, + DIG_STA_BEFORE_CONNECT = 2, + DIG_MultiSTA_DISCONNECT = 3, + DIG_MultiSTA_CONNECT = 4, + DIG_CONNECT_MAX +}DM_DIG_CONNECT_E; + + +#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;} + +#define DM_MultiSTA_InitGainChangeNotify_CONNECT(_ADAPTER) \ + DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_CONNECT) + +#define DM_MultiSTA_InitGainChangeNotify_DISCONNECT(_ADAPTER) \ + DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_DISCONNECT) +*/ + +#define DM_DIG_THRESH_HIGH 40 +#define DM_DIG_THRESH_LOW 35 + +#define DM_FALSEALARM_THRESH_LOW 400 +#define DM_FALSEALARM_THRESH_HIGH 1000 + +#define DM_DIG_MAX_NIC 0x4A +#define DM_DIG_MIN_NIC 0x1e //0x22//0x1c + +#define DM_DIG_MAX_AP 0x32 +#define DM_DIG_MIN_AP 0x20 + +#define DM_DIG_MAX_NIC_HP 0x46 +#define DM_DIG_MIN_NIC_HP 0x2e + +#define DM_DIG_MAX_AP_HP 0x42 +#define DM_DIG_MIN_AP_HP 0x30 + +//vivi 92c&92d has different definition, 20110504 +//this is for 92c +#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV +#define DM_DIG_FA_TH0 0x80//0x20 +#else +#define DM_DIG_FA_TH0 0x200//0x20 +#endif +#define DM_DIG_FA_TH1 0x300//0x100 +#define DM_DIG_FA_TH2 0x400//0x200 +//this is for 92d +#define DM_DIG_FA_TH0_92D 0x100 +#define DM_DIG_FA_TH1_92D 0x400 +#define DM_DIG_FA_TH2_92D 0x600 + +#define DM_DIG_BACKOFF_MAX 12 +#define DM_DIG_BACKOFF_MIN -4 +#define DM_DIG_BACKOFF_DEFAULT 10 + +//3=========================================================== +//3 AGC RX High Power Mode +//3=========================================================== +#define LNA_Low_Gain_1 0x64 +#define LNA_Low_Gain_2 0x5A +#define LNA_Low_Gain_3 0x58 + +#define FA_RXHP_TH1 5000 +#define FA_RXHP_TH2 1500 +#define FA_RXHP_TH3 800 +#define FA_RXHP_TH4 600 +#define FA_RXHP_TH5 500 + +//3=========================================================== +//3 EDCA +//3=========================================================== + +//3=========================================================== +//3 Dynamic Tx Power +//3=========================================================== +//Dynamic Tx Power Control Threshold +#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 +#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 +#define TX_POWER_NEAR_FIELD_THRESH_AP 0x3F + +#define TxHighPwrLevel_Normal 0 +#define TxHighPwrLevel_Level1 1 +#define TxHighPwrLevel_Level2 2 +#define TxHighPwrLevel_BT1 3 +#define TxHighPwrLevel_BT2 4 +#define TxHighPwrLevel_15 5 +#define TxHighPwrLevel_35 6 +#define TxHighPwrLevel_50 7 +#define TxHighPwrLevel_70 8 +#define TxHighPwrLevel_100 9 + +//3=========================================================== +//3 Tx Power Tracking +//3=========================================================== +#if 0 //mask this, since these have been defined in typdef.h, vivi +#define OFDM_TABLE_SIZE 37 +#define OFDM_TABLE_SIZE_92D 43 +#define CCK_TABLE_SIZE 33 +#endif + + +//3=========================================================== +//3 Rate Adaptive +//3=========================================================== +#define DM_RATR_STA_INIT 0 +#define DM_RATR_STA_HIGH 1 +#define DM_RATR_STA_MIDDLE 2 +#define DM_RATR_STA_LOW 3 + +//3=========================================================== +//3 BB Power Save +//3=========================================================== + + +typedef enum tag_1R_CCA_Type_Definition +{ + CCA_1R =0, + CCA_2R = 1, + CCA_MAX = 2, +}DM_1R_CCA_E; + +typedef enum tag_RF_Type_Definition +{ + RF_Save =0, + RF_Normal = 1, + RF_MAX = 2, +}DM_RF_E; + +//3=========================================================== +//3 Antenna Diversity +//3=========================================================== +typedef enum tag_SW_Antenna_Switch_Definition +{ + Antenna_A = 1, + Antenna_B = 2, + Antenna_MAX = 3, +}DM_SWAS_E; + + +// Maximal number of antenna detection mechanism needs to perform, added by Roger, 2011.12.28. +#define MAX_ANTENNA_DETECTION_CNT 10 + +// +// Extern Global Variables. +// +#define OFDM_TABLE_SIZE_92C 37 +#define OFDM_TABLE_SIZE_92D 43 +#define CCK_TABLE_SIZE 33 + +extern u4Byte OFDMSwingTable[OFDM_TABLE_SIZE_92D]; +extern u1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8]; +extern u1Byte CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]; + + + +// +// check Sta pointer valid or not +// +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#define IS_STA_VALID(pSta) (pSta && pSta->expire_to) +#elif (DM_ODM_SUPPORT_TYPE & ODM_MP) +#define IS_STA_VALID(pSta) (pSta && pSta->bUsed) +#else +#define IS_STA_VALID(pSta) (pSta) +#endif +// 20100514 Joseph: Add definition for antenna switching test after link. +// This indicates two different the steps. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK +// with original RSSI to determine if it is necessary to switch antenna. +#define SWAW_STEP_PEAK 0 +#define SWAW_STEP_DETERMINE 1 + +VOID ODM_Write_DIG(IN PDM_ODM_T pDM_Odm, IN u1Byte CurrentIGI); +VOID ODM_Write_CCK_CCA_Thres(IN PDM_ODM_T pDM_Odm, IN u1Byte CurCCK_CCAThres); + +VOID +ODM_SetAntenna( + IN PDM_ODM_T pDM_Odm, + IN u1Byte Antenna); + + +#define dm_RF_Saving ODM_RF_Saving +void ODM_RF_Saving( IN PDM_ODM_T pDM_Odm, + IN u1Byte bForceInNormal ); + +#define SwAntDivRestAfterLink ODM_SwAntDivRestAfterLink +VOID ODM_SwAntDivRestAfterLink( IN PDM_ODM_T pDM_Odm); + +#define dm_CheckTXPowerTracking ODM_TXPowerTrackingCheck +VOID +ODM_TXPowerTrackingCheck( + IN PDM_ODM_T pDM_Odm + ); + +BOOLEAN +ODM_RAStateCheck( + IN PDM_ODM_T pDM_Odm, + IN s4Byte RSSI, + IN BOOLEAN bForceUpdate, + OUT pu1Byte pRATRState + ); + +#if(DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_AP|ODM_ADSL)) +//============================================================ +// function prototype +//============================================================ +//#define DM_ChangeDynamicInitGainThresh ODM_ChangeDynamicInitGainThresh +//void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter, +// IN INT32 DM_Type, +// IN INT32 DM_Value); +VOID +ODM_ChangeDynamicInitGainThresh( + IN PDM_ODM_T pDM_Odm, + IN u4Byte DM_Type, + IN u4Byte DM_Value + ); + +BOOLEAN +ODM_CheckPowerStatus( + IN PADAPTER Adapter + ); + + +#if (DM_ODM_SUPPORT_TYPE != ODM_ADSL) +VOID +ODM_RateAdaptiveStateApInit( + IN PADAPTER Adapter , + IN PRT_WLAN_STA pEntry + ); +#endif +#define AP_InitRateAdaptiveState ODM_RateAdaptiveStateApInit + + +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) +#ifdef WIFI_WMM +VOID +ODM_IotEdcaSwitch( + IN PDM_ODM_T pDM_Odm, + IN unsigned char enable + ); +#endif + +BOOLEAN +ODM_ChooseIotMainSTA( + IN PDM_ODM_T pDM_Odm, + IN PSTA_INFO_T pstat + ); +#endif + +#if(DM_ODM_SUPPORT_TYPE==ODM_AP) +#ifdef HW_ANT_SWITCH +u1Byte +ODM_Diversity_AntennaSelect( + IN PDM_ODM_T pDM_Odm, + IN u1Byte *data +); +#endif +#endif + +#define SwAntDivResetBeforeLink ODM_SwAntDivResetBeforeLink +VOID ODM_SwAntDivResetBeforeLink(IN PDM_ODM_T pDM_Odm); + +//#define SwAntDivCheckBeforeLink8192C ODM_SwAntDivCheckBeforeLink8192C +#define SwAntDivCheckBeforeLink ODM_SwAntDivCheckBeforeLink8192C +BOOLEAN +ODM_SwAntDivCheckBeforeLink8192C( + IN PDM_ODM_T pDM_Odm + ); + + +#endif + +#define dm_SWAW_RSSI_Check ODM_SwAntDivChkPerPktRssi +VOID ODM_SwAntDivChkPerPktRssi( + IN PDM_ODM_T pDM_Odm, + IN u1Byte StationID, + IN PODM_PHY_INFO_T pPhyInfo + ); + +#if((DM_ODM_SUPPORT_TYPE==ODM_MP)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) + +u4Byte ConvertTo_dB(u4Byte Value); + +u4Byte +GetPSDData( + PDM_ODM_T pDM_Odm, + unsigned int point, + u1Byte initial_gain_psd); + +#endif + +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + +VOID +odm_DIGbyRSSI_LPS( + IN PDM_ODM_T pDM_Odm + ); + +u4Byte ODM_Get_Rate_Bitmap( + IN PDM_ODM_T pDM_Odm, + IN u4Byte macid, + IN u4Byte ra_mask, + IN u1Byte rssi_level); +#endif + + +#if(DM_ODM_SUPPORT_TYPE & (ODM_MP)) +#define dm_PSDMonitorCallback odm_PSDMonitorCallback +VOID odm_PSDMonitorCallback(PRT_TIMER pTimer); + +VOID +odm_PSDMonitorWorkItemCallback( + IN PVOID pContext + ); + + +VOID +PatchDCTone( + IN PDM_ODM_T pDM_Odm, + pu4Byte PSD_report, + u1Byte initial_gain_psd +); +VOID +ODM_PSDMonitor( + IN PDM_ODM_T pDM_Odm + ); +VOID odm_PSD_Monitor(PDM_ODM_T pDM_Odm); +VOID odm_PSDMonitorInit(PDM_ODM_T pDM_Odm); + +VOID +ODM_PSDDbgControl( + IN PADAPTER Adapter, + IN u4Byte mode, + IN u4Byte btRssi + ); + +#endif // DM_ODM_SUPPORT_TYPE + + + +VOID ODM_DMInit( IN PDM_ODM_T pDM_Odm); + +VOID +ODM_DMWatchdog( + IN PDM_ODM_T pDM_Odm // For common use in the future + ); + +VOID +ODM_CmnInfoInit( + IN PDM_ODM_T pDM_Odm, + IN ODM_CMNINFO_E CmnInfo, + IN u4Byte Value + ); + +VOID +ODM_CmnInfoHook( + IN PDM_ODM_T pDM_Odm, + IN ODM_CMNINFO_E CmnInfo, + IN PVOID pValue + ); + +VOID +ODM_CmnInfoPtrArrayHook( + IN PDM_ODM_T pDM_Odm, + IN ODM_CMNINFO_E CmnInfo, + IN u2Byte Index, + IN PVOID pValue + ); + +VOID +ODM_CmnInfoUpdate( + IN PDM_ODM_T pDM_Odm, + IN u4Byte CmnInfo, + IN u8Byte Value + ); + +VOID +ODM_InitAllTimers( + IN PDM_ODM_T pDM_Odm + ); + +VOID +ODM_CancelAllTimers( + IN PDM_ODM_T pDM_Odm + ); + +VOID +ODM_ReleaseAllTimers( + IN PDM_ODM_T pDM_Odm + ); + +VOID +ODM_ResetIQKResult( + IN PDM_ODM_T pDM_Odm + ); + + +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) +VOID ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm ); +VOID ODM_FreeAllWorkItems(IN PDM_ODM_T pDM_Odm ); + +VOID odm_PathDivChkAntSwitch(PDM_ODM_T pDM_Odm); +VOID ODM_PathDivRestAfterLink( + IN PDM_ODM_T pDM_Odm + ); + + +//===========================================// +// Neil Chen----2011--06--15-- + +//3 Path Diversity +//=========================================================== + +#define TP_MODE 0 +#define RSSI_MODE 1 +#define TRAFFIC_LOW 0 +#define TRAFFIC_HIGH 1 + +//#define PATHDIV_ENABLE 1 + +//VOID odm_PathDivChkAntSwitch(PADAPTER Adapter,u1Byte Step); +VOID ODM_PathDivRestAfterLink( + IN PDM_ODM_T pDM_Odm + ); + +#define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi +VOID ODM_PathDivChkPerPktRssi(PADAPTER Adapter, + BOOLEAN bIsDefPort, + BOOLEAN bMatchBSSID, + PRT_WLAN_STA pEntry, + PRT_RFD pRfd ); + +u8Byte +PlatformDivision64( + IN u8Byte x, + IN u8Byte y +); + + +// 20100514 Joseph: Add definition for antenna switching test after link. +// This indicates two different the steps. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK +// with original RSSI to determine if it is necessary to switch antenna. +#define SWAW_STEP_PEAK 0 +#define SWAW_STEP_DETERMINE 1 + +//==================================================== +//3 PathDiV End +//==================================================== + +#define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C +BOOLEAN +ODM_PathDiversityBeforeLink92C( + //IN PADAPTER Adapter + IN PDM_ODM_T pDM_Odm + ); + +#define DM_ChangeDynamicInitGainThresh ODM_ChangeDynamicInitGainThresh +//void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter, +// IN INT32 DM_Type, +// IN INT32 DM_Value); +// + + +VOID +ODM_CCKPathDiversityChkPerPktRssi( + PADAPTER Adapter, + BOOLEAN bIsDefPort, + BOOLEAN bMatchBSSID, + PRT_WLAN_STA pEntry, + PRT_RFD pRfd, + pu1Byte pDesc + ); + + +typedef enum tag_DIG_Connect_Definition +{ + DIG_STA_DISCONNECT = 0, + DIG_STA_CONNECT = 1, + DIG_STA_BEFORE_CONNECT = 2, + DIG_MultiSTA_DISCONNECT = 3, + DIG_MultiSTA_CONNECT = 4, + DIG_CONNECT_MAX +}DM_DIG_CONNECT_E; + + +VOID +ODM_FillTXPathInTXDESC( + IN PADAPTER Adapter, + IN PRT_TCB pTcb, + IN pu1Byte pDesc +); + + +#define dm_SWAW_RSSI_Check ODM_SwAntDivChkPerPktRssi + +// +// 2012/01/12 MH Check afapter status. Temp fix BSOD. +// +#define HAL_ADAPTER_STS_CHK(pDM_Odm)\ + if (pDM_Odm->Adapter == NULL)\ + {\ + return;\ + }\ + + +// +// For new definition in MP temporarily fro power tracking, +// +#define odm_TXPowerTrackingDirectCall(_Adapter) \ + IS_HARDWARE_TYPE_8192D(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92D(_Adapter) : \ + IS_HARDWARE_TYPE_8192C(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92C(_Adapter) : \ + IS_HARDWARE_TYPE_8723A(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_8723A(_Adapter) :\ + odm_TXPowerTrackingCallback_ThermalMeter_8188E(_Adapter) + +VOID +ODM_SetTxAntByTxInfo_88C_92D( + IN PDM_ODM_T pDM_Odm, + IN pu1Byte pDesc, + IN u1Byte macId + ); +#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_MP) +VOID +ODM_AntselStatistics_88C( + IN PDM_ODM_T pDM_Odm, + IN u1Byte MacId, + IN u4Byte PWDBAll, + IN BOOLEAN isCCKrate +); + +#if( DM_ODM_SUPPORT_TYPE & (ODM_MP |ODM_CE)) + +VOID +ODM_SingleDualAntennaDefaultSetting( + IN PDM_ODM_T pDM_Odm + ); + +BOOLEAN +ODM_SingleDualAntennaDetection( + IN PDM_ODM_T pDM_Odm, + IN u1Byte mode + ); + +#endif // #if((DM_ODM_SUPPORT_TYPE==ODM_MP)||(DM_ODM_SUPPORT_TYPE==ODM_CE)) + +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) +void odm_dtc(PDM_ODM_T pDM_Odm); +#endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */ + +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.c index 2360c16ef3b5..745cad1956ef 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.c @@ -1,1184 +1,1191 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -//============================================================ -// include files -//============================================================ - -#include "odm_precomp.h" - -#if (RTL8188E_FOR_TEST_CHIP > 1) - #define READ_AND_CONFIG(ic, txt) do {\ - if (pDM_Odm->bIsMPChip)\ - READ_AND_CONFIG_MP(ic,txt);\ - else\ - READ_AND_CONFIG_TC(ic,txt);\ - } while(0) -#elif (RTL8188E_FOR_TEST_CHIP == 1) - #define READ_AND_CONFIG READ_AND_CONFIG_TC -#else - #define READ_AND_CONFIG READ_AND_CONFIG_MP -#endif - -#define READ_AND_CONFIG_MP(ic, txt) (ODM_ReadAndConfig##txt##ic(pDM_Odm)) -#define READ_AND_CONFIG_TC(ic, txt) (ODM_ReadAndConfig_TC##txt##ic(pDM_Odm)) - -u1Byte -odm_QueryRxPwrPercentage( - IN s1Byte AntPower - ) -{ - if ((AntPower <= -100) || (AntPower >= 20)) - { - return 0; - } - else if (AntPower >= 0) - { - return 100; - } - else - { - return (100+AntPower); - } - -} - -#if (DM_ODM_SUPPORT_TYPE != ODM_MP) -// -// 2012/01/12 MH MOve some signal strength smooth method to MP HAL layer. -// IF other SW team do not support the feature, remove this section.?? -// -s4Byte -odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo( - IN OUT PDM_ODM_T pDM_Odm, - s4Byte CurrSig -) -{ - s4Byte RetSig; -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) - //if(pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - { - // Step 1. Scale mapping. - // 20100611 Joseph: Re-tunning RSSI presentation for Lenovo. - // 20100426 Joseph: Modify Signal strength mapping. - // This modification makes the RSSI indication similar to Intel solution. - // 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE. - if(CurrSig >= 54 && CurrSig <= 100) - { - RetSig = 100; - } - else if(CurrSig>=42 && CurrSig <= 53 ) - { - RetSig = 95; - } - else if(CurrSig>=36 && CurrSig <= 41 ) - { - RetSig = 74 + ((CurrSig - 36) *20)/6; - } - else if(CurrSig>=33 && CurrSig <= 35 ) - { - RetSig = 65 + ((CurrSig - 33) *8)/2; - } - else if(CurrSig>=18 && CurrSig <= 32 ) - { - RetSig = 62 + ((CurrSig - 18) *2)/15; - } - else if(CurrSig>=15 && CurrSig <= 17 ) - { - RetSig = 33 + ((CurrSig - 15) *28)/2; - } - else if(CurrSig>=10 && CurrSig <= 14 ) - { - RetSig = 39; - } - else if(CurrSig>=8 && CurrSig <= 9 ) - { - RetSig = 33; - } - else if(CurrSig <= 8 ) - { - RetSig = 19; - } - } -#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_MP) - return RetSig; -} - -s4Byte -odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore( - IN OUT PDM_ODM_T pDM_Odm, - s4Byte CurrSig -) -{ - s4Byte RetSig; -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) - //if(pDM_Odm->SupportInterface == ODM_ITRF_USB) - { - // Netcore request this modification because 2009.04.13 SU driver use it. - if(CurrSig >= 31 && CurrSig <= 100) - { - RetSig = 100; - } - else if(CurrSig >= 21 && CurrSig <= 30) - { - RetSig = 90 + ((CurrSig - 20) / 1); - } - else if(CurrSig >= 11 && CurrSig <= 20) - { - RetSig = 80 + ((CurrSig - 10) / 1); - } - else if(CurrSig >= 7 && CurrSig <= 10) - { - RetSig = 69 + (CurrSig - 7); - } - else if(CurrSig == 6) - { - RetSig = 54; - } - else if(CurrSig == 5) - { - RetSig = 45; - } - else if(CurrSig == 4) - { - RetSig = 36; - } - else if(CurrSig == 3) - { - RetSig = 27; - } - else if(CurrSig == 2) - { - RetSig = 18; - } - else if(CurrSig == 1) - { - RetSig = 9; - } - else - { - RetSig = CurrSig; - } - } -#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_MP) - return RetSig; -} - - -s4Byte -odm_SignalScaleMapping_92CSeries( - IN OUT PDM_ODM_T pDM_Odm, - IN s4Byte CurrSig -) -{ - s4Byte RetSig; -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) - if(pDM_Odm->SupportInterface == ODM_ITRF_PCIE) - { - // Step 1. Scale mapping. - if(CurrSig >= 61 && CurrSig <= 100) - { - RetSig = 90 + ((CurrSig - 60) / 4); - } - else if(CurrSig >= 41 && CurrSig <= 60) - { - RetSig = 78 + ((CurrSig - 40) / 2); - } - else if(CurrSig >= 31 && CurrSig <= 40) - { - RetSig = 66 + (CurrSig - 30); - } - else if(CurrSig >= 21 && CurrSig <= 30) - { - RetSig = 54 + (CurrSig - 20); - } - else if(CurrSig >= 5 && CurrSig <= 20) - { - RetSig = 42 + (((CurrSig - 5) * 2) / 3); - } - else if(CurrSig == 4) - { - RetSig = 36; - } - else if(CurrSig == 3) - { - RetSig = 27; - } - else if(CurrSig == 2) - { - RetSig = 18; - } - else if(CurrSig == 1) - { - RetSig = 9; - } - else - { - RetSig = CurrSig; - } - } -#endif - -#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) ||(DEV_BUS_TYPE == RT_SDIO_INTERFACE)) - if((pDM_Odm->SupportInterface == ODM_ITRF_USB) || (pDM_Odm->SupportInterface == ODM_ITRF_SDIO) ) - { - if(CurrSig >= 51 && CurrSig <= 100) - { - RetSig = 100; - } - else if(CurrSig >= 41 && CurrSig <= 50) - { - RetSig = 80 + ((CurrSig - 40)*2); - } - else if(CurrSig >= 31 && CurrSig <= 40) - { - RetSig = 66 + (CurrSig - 30); - } - else if(CurrSig >= 21 && CurrSig <= 30) - { - RetSig = 54 + (CurrSig - 20); - } - else if(CurrSig >= 10 && CurrSig <= 20) - { - RetSig = 42 + (((CurrSig - 10) * 2) / 3); - } - else if(CurrSig >= 5 && CurrSig <= 9) - { - RetSig = 22 + (((CurrSig - 5) * 3) / 2); - } - else if(CurrSig >= 1 && CurrSig <= 4) - { - RetSig = 6 + (((CurrSig - 1) * 3) / 2); - } - else - { - RetSig = CurrSig; - } +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +//============================================================ +// include files +//============================================================ + +#include "odm_precomp.h" + +#if (RTL8188E_FOR_TEST_CHIP > 1) + #define READ_AND_CONFIG(ic, txt) do {\ + if (pDM_Odm->bIsMPChip)\ + READ_AND_CONFIG_MP(ic,txt);\ + else\ + READ_AND_CONFIG_TC(ic,txt);\ + } while(0) +#elif (RTL8188E_FOR_TEST_CHIP == 1) + #define READ_AND_CONFIG READ_AND_CONFIG_TC +#else + #define READ_AND_CONFIG READ_AND_CONFIG_MP +#endif + +#define READ_AND_CONFIG_MP(ic, txt) (ODM_ReadAndConfig##txt##ic(pDM_Odm)) +#define READ_AND_CONFIG_TC(ic, txt) (ODM_ReadAndConfig_TC##txt##ic(pDM_Odm)) + +u1Byte +odm_QueryRxPwrPercentage( + IN s1Byte AntPower + ) +{ + if ((AntPower <= -100) || (AntPower >= 20)) + { + return 0; } -#endif - return RetSig; -} -s4Byte -odm_SignalScaleMapping( - IN OUT PDM_ODM_T pDM_Odm, - IN s4Byte CurrSig -) -{ - if( (pDM_Odm->SupportPlatform == ODM_MP) && - (pDM_Odm->SupportInterface != ODM_ITRF_PCIE) && //USB & SDIO - (pDM_Odm->PatchID==10))//pMgntInfo->CustomerID == RT_CID_819x_Netcore - { - return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore(pDM_Odm,CurrSig); - } - else if( (pDM_Odm->SupportPlatform == ODM_MP) && - (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) && - (pDM_Odm->PatchID==19))//pMgntInfo->CustomerID == RT_CID_819x_Lenovo) - { - return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo(pDM_Odm, CurrSig); - } - else{ - return odm_SignalScaleMapping_92CSeries(pDM_Odm,CurrSig); - } - -} -#endif - -//pMgntInfo->CustomerID == RT_CID_819x_Lenovo -static u1Byte odm_SQ_process_patch_RT_CID_819x_Lenovo( - IN PDM_ODM_T pDM_Odm, - IN u1Byte isCCKrate, - IN u1Byte PWDB_ALL, - IN u1Byte path, - IN u1Byte RSSI -) -{ - u1Byte SQ; -#if (DM_ODM_SUPPORT_TYPE & ODM_MP) - // mapping to 5 bars for vista signal strength - // signal quality in driver will be displayed to signal strength - if(isCCKrate){ - // in vista. - if(PWDB_ALL >= 50) - SQ = 100; - else if(PWDB_ALL >= 35 && PWDB_ALL < 50) - SQ = 80; - else if(PWDB_ALL >= 22 && PWDB_ALL < 35) - SQ = 60; - else if(PWDB_ALL >= 18 && PWDB_ALL < 22) - SQ = 40; - else - SQ = 20; - } - else{//OFDM rate - - // mapping to 5 bars for vista signal strength - // signal quality in driver will be displayed to signal strength - // in vista. - if(RSSI >= 50) - SQ = 100; - else if(RSSI >= 35 && RSSI < 50) - SQ = 80; - else if(RSSI >= 22 && RSSI < 35) - SQ = 60; - else if(RSSI >= 18 && RSSI < 22) - SQ = 40; - else - SQ = 20; - } -#endif - return SQ; -} - -static u1Byte -odm_EVMdbToPercentage( - IN s1Byte Value - ) -{ - // - // -33dB~0dB to 0%~99% - // - s1Byte ret_val; - - ret_val = Value; - //ret_val /= 2; - - //ODM_RTPRINT(FRX, RX_PHY_SQ, ("EVMdbToPercentage92C Value=%d / %x \n", ret_val, ret_val)); - - if(ret_val >= 0) - ret_val = 0; - if(ret_val <= -33) - ret_val = -33; - - ret_val = 0 - ret_val; - ret_val*=3; - - if(ret_val == 99) - ret_val = 100; - - return(ret_val); -} - - - -VOID -odm_RxPhyStatus92CSeries_Parsing( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - u1Byte i, Max_spatial_stream; - s1Byte rx_pwr[4], rx_pwr_all=0; - u1Byte EVM, PWDB_ALL = 0, PWDB_ALL_BT; - u1Byte RSSI, total_rssi=0; - u1Byte isCCKrate=0; - u1Byte rf_rx_num = 0; - u1Byte cck_highpwr = 0; - u1Byte LNA_idx, VGA_idx; - - PPHY_STATUS_RPT_8192CD_T pPhyStaRpt = (PPHY_STATUS_RPT_8192CD_T)pPhyStatus; - - isCCKrate = ((pPktinfo->Rate >= DESC92C_RATE1M ) && (pPktinfo->Rate <= DESC92C_RATE11M ))?TRUE :FALSE; - - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; - - - if(isCCKrate) - { - u1Byte report; - u1Byte cck_agc_rpt; - - pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++; - // - // (1)Hardware does not provide RSSI for CCK - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - - //if(pHalData->eRFPowerState == eRfOn) - cck_highpwr = pDM_Odm->bCckHighPower; - //else - // cck_highpwr = FALSE; - - cck_agc_rpt = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a ; - - //2011.11.28 LukeLee: 88E use different LNA & VGA gain table - //The RSSI formula should be modified according to the gain table - //In 88E, cck_highpwr is always set to 1 - if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8812)) - { - LNA_idx = ((cck_agc_rpt & 0xE0) >>5); - VGA_idx = (cck_agc_rpt & 0x1F); - switch(LNA_idx) - { - case 7: - if(VGA_idx <= 27) - rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 - else - rx_pwr_all = -100; - break; - case 6: - rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0 - break; - case 5: - rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5 - break; - case 4: - rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4 - break; - case 3: - //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0 - rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0 - break; - case 2: - if(cck_highpwr) - rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 - else - rx_pwr_all = -6+ 2*(5-VGA_idx); - break; - case 1: - rx_pwr_all = 8-2*VGA_idx; - break; - case 0: - rx_pwr_all = 14-2*VGA_idx; - break; - default: - //DbgPrint("CCK Exception default\n"); - break; - } - rx_pwr_all += 6; - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - if(cck_highpwr == FALSE) - { - if(PWDB_ALL >= 80) - PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; - else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) - PWDB_ALL += 3; - if(PWDB_ALL>100) - PWDB_ALL = 100; - } - } - else - { - if(!cck_highpwr) - { - report =( cck_agc_rpt & 0xc0 )>>6; - switch(report) - { - // 03312009 modified by cosa - // Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion - // Note: different RF with the different RNA gain. - case 0x3: - rx_pwr_all = -46 - (cck_agc_rpt & 0x3e); - break; - case 0x2: - rx_pwr_all = -26 - (cck_agc_rpt & 0x3e); - break; - case 0x1: - rx_pwr_all = -12 - (cck_agc_rpt & 0x3e); - break; - case 0x0: - rx_pwr_all = 16 - (cck_agc_rpt & 0x3e); - break; - } - } - else - { - //report = pDrvInfo->cfosho[0] & 0x60; - //report = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a& 0x60; - - report = (cck_agc_rpt & 0x60)>>5; - switch(report) - { - case 0x3: - rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f)<<1) ; - break; - case 0x2: - rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f)<<1); - break; - case 0x1: - rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f)<<1) ; - break; - case 0x0: - rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f)<<1) ; - break; - } - } - - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - - //Modification for ext-LNA board - if(pDM_Odm->BoardType == ODM_BOARD_HIGHPWR) - { - if((cck_agc_rpt>>7) == 0){ - PWDB_ALL = (PWDB_ALL>94)?100:(PWDB_ALL +6); - } - else - { - if(PWDB_ALL > 38) - PWDB_ALL -= 16; - else - PWDB_ALL = (PWDB_ALL<=16)?(PWDB_ALL>>2):(PWDB_ALL -12); - } - - //CCK modification - if(PWDB_ALL > 25 && PWDB_ALL <= 60) - PWDB_ALL += 6; - //else if (PWDB_ALL <= 25) - // PWDB_ALL += 8; - } - else//Modification for int-LNA board - { - if(PWDB_ALL > 99) - PWDB_ALL -= 8; - else if(PWDB_ALL > 50 && PWDB_ALL <= 68) - PWDB_ALL += 4; - } - } - - pPhyInfo->RxPWDBAll = PWDB_ALL; -#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) - pPhyInfo->BTRxRSSIPercentage = PWDB_ALL; - pPhyInfo->RecvSignalPower = rx_pwr_all; -#endif - // - // (3) Get Signal Quality (EVM) - // - if(pPktinfo->bPacketMatchBSSID) - { - u1Byte SQ,SQ_rpt; - - if((pDM_Odm->SupportPlatform == ODM_MP) &&(pDM_Odm->PatchID==19)){//pMgntInfo->CustomerID == RT_CID_819x_Lenovo - SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0); - } - else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){ - SQ = 100; - } - else{ - SQ_rpt = pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all; - - if(SQ_rpt > 64) - SQ = 0; - else if (SQ_rpt < 20) - SQ = 100; - else - SQ = ((64-SQ_rpt) * 100) / 44; - - } - - //DbgPrint("cck SQ = %d\n", SQ); - pPhyInfo->SignalQuality = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ; - pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; - } - } - else //is OFDM rate - { - pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; - - // - // (1)Get RSSI for HT rate - // - - for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) - { - // 2008/01/30 MH we will judge RF RX path now. - if (pDM_Odm->RFPathRxEnable & BIT(i)) - rf_rx_num++; - //else - //continue; - - rx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain& 0x3F)*2) - 110; - - #if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) - pPhyInfo->RxPwr[i] = rx_pwr[i]; - #endif - - /* Translate DBM to percentage. */ - RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); - total_rssi += RSSI; - //RTPRINT(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI)); - - //Modification for ext-LNA board - if(pDM_Odm->BoardType == ODM_BOARD_HIGHPWR) - { - if((pPhyStaRpt->path_agc[i].trsw) == 1) - RSSI = (RSSI>94)?100:(RSSI +6); - else - RSSI = (RSSI<=16)?(RSSI>>3):(RSSI -16); - - if((RSSI <= 34) && (RSSI >=4)) - RSSI -= 4; - } - - pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI; - - #if (DM_ODM_SUPPORT_TYPE & (/*ODM_MP|*/ODM_CE|ODM_AP|ODM_ADSL)) - //Get Rx snr value in DB - pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = (s4Byte)(pPhyStaRpt->path_rxsnr[i]/2); - #endif - - /* Record Signal Strength for next packet */ - if(pPktinfo->bPacketMatchBSSID) - { - if((pDM_Odm->SupportPlatform == ODM_MP) &&(pDM_Odm->PatchID==19)) - { - if(i==ODM_RF_PATH_A) - pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI); - - } - - } - } - - - // - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1 )& 0x7f) -110; - //RTPRINT(FRX, RX_PHY_SS, ("PWDB_ALL=%d\n", PWDB_ALL)); - - PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - //RTPRINT(FRX, RX_PHY_SS, ("PWDB_ALL=%d\n",PWDB_ALL)); - - pPhyInfo->RxPWDBAll = PWDB_ALL; - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll)); - #if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) - pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT; - pPhyInfo->RxPower = rx_pwr_all; - pPhyInfo->RecvSignalPower = rx_pwr_all; - #endif - - if((pDM_Odm->SupportPlatform == ODM_MP) &&(pDM_Odm->PatchID==19)){ - //do nothing - } - else{//pMgntInfo->CustomerID != RT_CID_819x_Lenovo - // - // (3)EVM of HT rate - // - if(pPktinfo->Rate >=DESC92C_RATEMCS8 && pPktinfo->Rate <=DESC92C_RATEMCS15) - Max_spatial_stream = 2; //both spatial stream make sense - else - Max_spatial_stream = 1; //only spatial stream 1 makes sense - - for(i=0; i>= 1" because the compilor of free build environment - // fill most significant bit to "zero" when doing shifting operation which may change a negative - // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. - EVM = odm_EVMdbToPercentage( (pPhyStaRpt->stream_rxevm[i] )); //dbm - - //RTPRINT(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", - //GET_RX_STATUS_DESC_RX_MCS(pDesc), pDrvInfo->rxevm[i], "%", EVM)); - - if(pPktinfo->bPacketMatchBSSID) - { - if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only - { - pPhyInfo->SignalQuality = (u1Byte)(EVM & 0xff); - } - pPhyInfo->RxMIMOSignalQuality[i] = (u1Byte)(EVM & 0xff); - } - } - } - - } -#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) - //UI BSS List signal strength(in percentage), make it good looking, from 0~100. - //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). - if(isCCKrate) - { -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL; -#else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL; -#endif - } - else - { - if (rf_rx_num != 0) - { -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) - // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ - pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL; -#else - pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num)); -#endif - } - } -#endif - - //For 92C/92D HW (Hybrid) Antenna Diversity -#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) - pDM_SWAT_Table->antsel = pPhyStaRpt->ant_sel; - //For 88E HW Antenna Diversity - pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->ant_sel; - pDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->ant_sel_b; - pDM_Odm->DM_FatTable.antsel_rx_keep_2 = pPhyStaRpt->antsel_rx_keep_2; -#endif -} - -VOID -odm_Init_RSSIForDM( - IN OUT PDM_ODM_T pDM_Odm - ) -{ - -} - -VOID -odm_Process_RSSIForDM( - IN OUT PDM_ODM_T pDM_Odm, - IN PODM_PHY_INFO_T pPhyInfo, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - - s4Byte UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK, UndecoratedSmoothedOFDM, RSSI_Ave; - u1Byte isCCKrate=0; - u1Byte RSSI_max, RSSI_min, i; - u4Byte OFDM_pkt=0; - u4Byte Weighting=0; - - PSTA_INFO_T pEntry; - - if(pPktinfo->StationID == 0xFF) - return; - - // 2011/11/17 MH Need to debug - //if (pDM_Odm->SupportPlatform == ODM_MP) - { - - } - - pEntry = pDM_Odm->pODM_StaInfo[pPktinfo->StationID]; - if(!IS_STA_VALID(pEntry) ){ - return; - } - if((!pPktinfo->bPacketMatchBSSID) ) - { - return; - } - - isCCKrate = ((pPktinfo->Rate >= DESC92C_RATE1M ) && (pPktinfo->Rate <= DESC92C_RATE11M ))?TRUE :FALSE; - -#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) -#if ((RTL8192C_SUPPORT == 1) ||(RTL8192D_SUPPORT == 1)) - if(pDM_Odm->SupportICType & ODM_RTL8192C|ODM_RTL8192D) - { - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) - { - //if(pPktinfo->bPacketBeacon) - //{ - // DbgPrint("This is beacon, isCCKrate=%d\n", isCCKrate); - //} - ODM_AntselStatistics_88C(pDM_Odm, pPktinfo->StationID, pPhyInfo->RxPWDBAll, isCCKrate); - } - } -#endif - //-----------------Smart Antenna Debug Message------------------// -#if (RTL8188E_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - u1Byte antsel_tr_mux; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; - - if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) - { - if(pDM_FatTable->FAT_State == FAT_TRAINING_STATE) - { - if(pPktinfo->bPacketToSelf) //(pPktinfo->bPacketMatchBSSID && (!pPktinfo->bPacketBeacon)) - { - antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0; - pDM_FatTable->antSumRSSI[antsel_tr_mux] += pPhyInfo->RxPWDBAll; - pDM_FatTable->antRSSIcnt[antsel_tr_mux]++; - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("isCCKrate=%d, PWDB_ALL=%d\n",isCCKrate, pPhyInfo->RxPWDBAll)); - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n", - //pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0)); - - } - } - } - else if((pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)||(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)) - { - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) - { - antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0; - //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n", - // pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0)); - - ODM_AntselStatistics_88E(pDM_Odm, antsel_tr_mux, pPktinfo->StationID, pPhyInfo->RxPWDBAll); - } - } - - } -#endif -#endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) - //-----------------Smart Antenna Debug Message------------------// - - UndecoratedSmoothedCCK = pEntry->rssi_stat.UndecoratedSmoothedCCK; - UndecoratedSmoothedOFDM = pEntry->rssi_stat.UndecoratedSmoothedOFDM; - UndecoratedSmoothedPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB; - - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) - { - - if(!isCCKrate)//ofdm rate - { - if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B] == 0){ - RSSI_Ave = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - } - else - { - //DbgPrint("pRfd->Status.RxMIMOSignalStrength[0] = %d, pRfd->Status.RxMIMOSignalStrength[1] = %d \n", - //pRfd->Status.RxMIMOSignalStrength[0], pRfd->Status.RxMIMOSignalStrength[1]); - - - if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A] > pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]) - { - RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; - } - else - { - RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; - RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; - } - if((RSSI_max -RSSI_min) < 3) - RSSI_Ave = RSSI_max; - else if((RSSI_max -RSSI_min) < 6) - RSSI_Ave = RSSI_max - 1; - else if((RSSI_max -RSSI_min) < 10) - RSSI_Ave = RSSI_max - 2; - else - RSSI_Ave = RSSI_max - 3; - } - - //1 Process OFDM RSSI - if(UndecoratedSmoothedOFDM <= 0) // initialize - { - UndecoratedSmoothedOFDM = pPhyInfo->RxPWDBAll; - } - else - { - if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedOFDM) - { - UndecoratedSmoothedOFDM = - ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + - (RSSI_Ave)) /(Rx_Smooth_Factor); - UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM + 1; - } - else - { - UndecoratedSmoothedOFDM = - ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + - (RSSI_Ave)) /(Rx_Smooth_Factor); - } - } - - pEntry->rssi_stat.PacketMap = (pEntry->rssi_stat.PacketMap<<1) | BIT0; - - } - else - { - RSSI_Ave = pPhyInfo->RxPWDBAll; - - //1 Process CCK RSSI - if(UndecoratedSmoothedCCK <= 0) // initialize - { - UndecoratedSmoothedCCK = pPhyInfo->RxPWDBAll; - } - else - { - if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedCCK) - { - UndecoratedSmoothedCCK = - ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + - (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor); - UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1; - } - else - { - UndecoratedSmoothedCCK = - ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + - (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor); - } - } - pEntry->rssi_stat.PacketMap = pEntry->rssi_stat.PacketMap<<1; - } - - //if(pEntry) - { - //2011.07.28 LukeLee: modified to prevent unstable CCK RSSI - if(pEntry->rssi_stat.ValidBit >= 64) - pEntry->rssi_stat.ValidBit = 64; - else - pEntry->rssi_stat.ValidBit++; - - for(i=0; irssi_stat.ValidBit; i++) - OFDM_pkt += (u1Byte)(pEntry->rssi_stat.PacketMap>>i)&BIT0; - - if(pEntry->rssi_stat.ValidBit == 64) - { - Weighting = ((OFDM_pkt<<4) > 64)?64:(OFDM_pkt<<4); - UndecoratedSmoothedPWDB = (Weighting*UndecoratedSmoothedOFDM+(64-Weighting)*UndecoratedSmoothedCCK)>>6; - } - else - { - if(pEntry->rssi_stat.ValidBit != 0) - UndecoratedSmoothedPWDB = (OFDM_pkt*UndecoratedSmoothedOFDM+(pEntry->rssi_stat.ValidBit-OFDM_pkt)*UndecoratedSmoothedCCK)/pEntry->rssi_stat.ValidBit; - else - UndecoratedSmoothedPWDB = 0; - } - - pEntry->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; - pEntry->rssi_stat.UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM; - pEntry->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; - - //DbgPrint("OFDM_pkt=%d, Weighting=%d\n", OFDM_pkt, Weighting); - //DbgPrint("UndecoratedSmoothedOFDM=%d, UndecoratedSmoothedPWDB=%d, UndecoratedSmoothedCCK=%d\n", - // UndecoratedSmoothedOFDM, UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK); - - } - - } -} - - -// -// Endianness before calling this API -// -VOID -ODM_PhyStatusQuery_92CSeries( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - - odm_RxPhyStatus92CSeries_Parsing( - pDM_Odm, - pPhyInfo, - pPhyStatus, - pPktinfo); - - if( pDM_Odm->RSSI_test == TRUE) - { - // Select the packets to do RSSI checking for antenna switching. - if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon ) - { - /* - #if 0//(DM_ODM_SUPPORT_TYPE == ODM_MP) - dm_SWAW_RSSI_Check( - Adapter, - (tmppAdapter!=NULL)?(tmppAdapter==Adapter):TRUE, - bPacketMatchBSSID, - pEntry, - pRfd); - #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - // Select the packets to do RSSI checking for antenna switching. - //odm_SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll); - #endif - */ - ODM_SwAntDivChkPerPktRssi(pDM_Odm,pPktinfo->StationID,pPhyInfo); - } - } - else - { - odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo); - } - -} - - - -// -// Endianness before calling this API -// -VOID -ODM_PhyStatusQuery_JaguarSeries( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ - - -} - -VOID -ODM_PhyStatusQuery( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ) -{ -#if 0 // How to jaguar jugar series?? - if(pDM_Odm->SupportICType >= ODM_RTL8195 ) - { - ODM_PhyStatusQuery_JaguarSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); - } - else -#endif - { - ODM_PhyStatusQuery_92CSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); - } -} - -// For future use. -VOID -ODM_MacStatusQuery( - IN OUT PDM_ODM_T pDM_Odm, - IN pu1Byte pMacStatus, - IN u1Byte MacID, - IN BOOLEAN bPacketMatchBSSID, - IN BOOLEAN bPacketToSelf, - IN BOOLEAN bPacketBeacon - ) -{ - // 2011/10/19 Driver team will handle in the future. - -} - -#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE|ODM_AP)) - -HAL_STATUS -ODM_ConfigRFWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E Content, - IN ODM_RF_RADIO_PATH_E eRFPath - ) -{ - //RT_STATUS rtStatus = RT_STATUS_SUCCESS; - - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===>ODM_ConfigRFWithHeaderFile\n")); -#if (RTL8723A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723A) - { - if(eRFPath == ODM_RF_PATH_A) - READ_AND_CONFIG_MP(8723A,_RadioA_1T_); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> ODM_ConfigRFWithHeaderFile() Radio_A:Rtl8723RadioA_1TArray\n")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> ODM_ConfigRFWithHeaderFile() Radio_B:Rtl8723RadioB_1TArray\n")); - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("ODM_ConfigRFWithHeaderFile: Radio No %x\n", eRFPath)); - //rtStatus = RT_STATUS_SUCCESS; -#endif -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - { - if(eRFPath == ODM_RF_PATH_A) - READ_AND_CONFIG(8188E,_RadioA_1T_); - //else if(eRFPath == ODM_RF_PATH_B) - // READ_AND_CONFIG(8188E,_RadioB_1T_); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> ODM_ConfigRFWithHeaderFile() Radio_A:Rtl8188ERadioA_1TArray\n")); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> ODM_ConfigRFWithHeaderFile() Radio_B:Rtl8188ERadioB_1TArray\n")); - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("ODM_ConfigRFWithHeaderFile: Radio No %x\n", eRFPath)); - //rtStatus = RT_STATUS_SUCCESS; -#endif - return HAL_STATUS_SUCCESS; -} - - -HAL_STATUS -ODM_ConfigBBWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_BB_Config_Type ConfigType - ) -{ -#if (RTL8723A_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8723A) - { - - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG_MP(8723A,_PHY_REG_1T_); - } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG_MP(8723A,_AGC_TAB_1T_); - } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8723AGCTAB_1TArray\n")); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8723PHY_REG_1TArray\n")); - } -#endif - -#if (RTL8188E_SUPPORT == 1) - if(pDM_Odm->SupportICType == ODM_RTL8188E) - { - - if(ConfigType == CONFIG_BB_PHY_REG) - { - READ_AND_CONFIG(8188E,_PHY_REG_1T_); - } -// else if(ConfigType == ODM_BaseBand_Config_PHY_REG_MP) -// { - //READ_AND_CONFIG(8188E,_PHY_REG_MP_); -// } - else if(ConfigType == CONFIG_BB_AGC_TAB) - { - READ_AND_CONFIG(8188E,_AGC_TAB_1T_); - } - else if(ConfigType == CONFIG_BB_PHY_REG_PG) - { - READ_AND_CONFIG(8188E,_PHY_REG_PG_); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8188EPHY_REG_PGArray\n")); - } - } -#endif - - return HAL_STATUS_SUCCESS; -} - -HAL_STATUS -ODM_ConfigMACWithHeaderFile( - IN PDM_ODM_T pDM_Odm - ) -{ - u1Byte result = HAL_STATUS_SUCCESS; -#if (RTL8723A_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8723A) - { - READ_AND_CONFIG_MP(8723A,_MAC_REG_); - } -#endif -#if (RTL8188E_SUPPORT == 1) - if (pDM_Odm->SupportICType == ODM_RTL8188E) - { - result = READ_AND_CONFIG(8188E,_MAC_REG_); - } -#endif - - return result; -} - - -#endif // end of (#if DM_ODM_SUPPORT_TYPE) - + else if (AntPower >= 0) + { + return 100; + } + else + { + return (100+AntPower); + } + +} + +#if (DM_ODM_SUPPORT_TYPE != ODM_MP) +// +// 2012/01/12 MH MOve some signal strength smooth method to MP HAL layer. +// IF other SW team do not support the feature, remove this section.?? +// +s4Byte +odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo( + IN OUT PDM_ODM_T pDM_Odm, + s4Byte CurrSig +) +{ + s4Byte RetSig; +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + //if(pDM_Odm->SupportInterface == ODM_ITRF_PCIE) + { + // Step 1. Scale mapping. + // 20100611 Joseph: Re-tunning RSSI presentation for Lenovo. + // 20100426 Joseph: Modify Signal strength mapping. + // This modification makes the RSSI indication similar to Intel solution. + // 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE. + if(CurrSig >= 54 && CurrSig <= 100) + { + RetSig = 100; + } + else if(CurrSig>=42 && CurrSig <= 53 ) + { + RetSig = 95; + } + else if(CurrSig>=36 && CurrSig <= 41 ) + { + RetSig = 74 + ((CurrSig - 36) *20)/6; + } + else if(CurrSig>=33 && CurrSig <= 35 ) + { + RetSig = 65 + ((CurrSig - 33) *8)/2; + } + else if(CurrSig>=18 && CurrSig <= 32 ) + { + RetSig = 62 + ((CurrSig - 18) *2)/15; + } + else if(CurrSig>=15 && CurrSig <= 17 ) + { + RetSig = 33 + ((CurrSig - 15) *28)/2; + } + else if(CurrSig>=10 && CurrSig <= 14 ) + { + RetSig = 39; + } + else if(CurrSig>=8 && CurrSig <= 9 ) + { + RetSig = 33; + } + else if(CurrSig <= 8 ) + { + RetSig = 19; + } + } +#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_MP) + return RetSig; +} + +s4Byte +odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore( + IN OUT PDM_ODM_T pDM_Odm, + s4Byte CurrSig +) +{ + s4Byte RetSig; +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + //if(pDM_Odm->SupportInterface == ODM_ITRF_USB) + { + // Netcore request this modification because 2009.04.13 SU driver use it. + if(CurrSig >= 31 && CurrSig <= 100) + { + RetSig = 100; + } + else if(CurrSig >= 21 && CurrSig <= 30) + { + RetSig = 90 + ((CurrSig - 20) / 1); + } + else if(CurrSig >= 11 && CurrSig <= 20) + { + RetSig = 80 + ((CurrSig - 10) / 1); + } + else if(CurrSig >= 7 && CurrSig <= 10) + { + RetSig = 69 + (CurrSig - 7); + } + else if(CurrSig == 6) + { + RetSig = 54; + } + else if(CurrSig == 5) + { + RetSig = 45; + } + else if(CurrSig == 4) + { + RetSig = 36; + } + else if(CurrSig == 3) + { + RetSig = 27; + } + else if(CurrSig == 2) + { + RetSig = 18; + } + else if(CurrSig == 1) + { + RetSig = 9; + } + else + { + RetSig = CurrSig; + } + } +#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_MP) + return RetSig; +} + + +s4Byte +odm_SignalScaleMapping_92CSeries( + IN OUT PDM_ODM_T pDM_Odm, + IN s4Byte CurrSig +) +{ + s4Byte RetSig; +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) + if(pDM_Odm->SupportInterface == ODM_ITRF_PCIE) + { + // Step 1. Scale mapping. + if(CurrSig >= 61 && CurrSig <= 100) + { + RetSig = 90 + ((CurrSig - 60) / 4); + } + else if(CurrSig >= 41 && CurrSig <= 60) + { + RetSig = 78 + ((CurrSig - 40) / 2); + } + else if(CurrSig >= 31 && CurrSig <= 40) + { + RetSig = 66 + (CurrSig - 30); + } + else if(CurrSig >= 21 && CurrSig <= 30) + { + RetSig = 54 + (CurrSig - 20); + } + else if(CurrSig >= 5 && CurrSig <= 20) + { + RetSig = 42 + (((CurrSig - 5) * 2) / 3); + } + else if(CurrSig == 4) + { + RetSig = 36; + } + else if(CurrSig == 3) + { + RetSig = 27; + } + else if(CurrSig == 2) + { + RetSig = 18; + } + else if(CurrSig == 1) + { + RetSig = 9; + } + else + { + RetSig = CurrSig; + } + } +#endif + +#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) ||(DEV_BUS_TYPE == RT_SDIO_INTERFACE)) + if((pDM_Odm->SupportInterface == ODM_ITRF_USB) || (pDM_Odm->SupportInterface == ODM_ITRF_SDIO) ) + { + if(CurrSig >= 51 && CurrSig <= 100) + { + RetSig = 100; + } + else if(CurrSig >= 41 && CurrSig <= 50) + { + RetSig = 80 + ((CurrSig - 40)*2); + } + else if(CurrSig >= 31 && CurrSig <= 40) + { + RetSig = 66 + (CurrSig - 30); + } + else if(CurrSig >= 21 && CurrSig <= 30) + { + RetSig = 54 + (CurrSig - 20); + } + else if(CurrSig >= 10 && CurrSig <= 20) + { + RetSig = 42 + (((CurrSig - 10) * 2) / 3); + } + else if(CurrSig >= 5 && CurrSig <= 9) + { + RetSig = 22 + (((CurrSig - 5) * 3) / 2); + } + else if(CurrSig >= 1 && CurrSig <= 4) + { + RetSig = 6 + (((CurrSig - 1) * 3) / 2); + } + else + { + RetSig = CurrSig; + } + } +#endif + return RetSig; +} +s4Byte +odm_SignalScaleMapping( + IN OUT PDM_ODM_T pDM_Odm, + IN s4Byte CurrSig +) +{ + if( (pDM_Odm->SupportPlatform == ODM_MP) && + (pDM_Odm->SupportInterface != ODM_ITRF_PCIE) && //USB & SDIO + (pDM_Odm->PatchID==10))//pMgntInfo->CustomerID == RT_CID_819x_Netcore + { + return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore(pDM_Odm,CurrSig); + } + else if( (pDM_Odm->SupportPlatform == ODM_MP) && + (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) && + (pDM_Odm->PatchID==19))//pMgntInfo->CustomerID == RT_CID_819x_Lenovo) + { + return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo(pDM_Odm, CurrSig); + } + else{ + return odm_SignalScaleMapping_92CSeries(pDM_Odm,CurrSig); + } + +} +#endif + +//pMgntInfo->CustomerID == RT_CID_819x_Lenovo +static u1Byte odm_SQ_process_patch_RT_CID_819x_Lenovo( + IN PDM_ODM_T pDM_Odm, + IN u1Byte isCCKrate, + IN u1Byte PWDB_ALL, + IN u1Byte path, + IN u1Byte RSSI +) +{ + u1Byte SQ; +#if (DM_ODM_SUPPORT_TYPE & ODM_MP) + // mapping to 5 bars for vista signal strength + // signal quality in driver will be displayed to signal strength + if(isCCKrate){ + // in vista. + if(PWDB_ALL >= 50) + SQ = 100; + else if(PWDB_ALL >= 35 && PWDB_ALL < 50) + SQ = 80; + else if(PWDB_ALL >= 22 && PWDB_ALL < 35) + SQ = 60; + else if(PWDB_ALL >= 18 && PWDB_ALL < 22) + SQ = 40; + else + SQ = 20; + } + else{//OFDM rate + + // mapping to 5 bars for vista signal strength + // signal quality in driver will be displayed to signal strength + // in vista. + if(RSSI >= 50) + SQ = 100; + else if(RSSI >= 35 && RSSI < 50) + SQ = 80; + else if(RSSI >= 22 && RSSI < 35) + SQ = 60; + else if(RSSI >= 18 && RSSI < 22) + SQ = 40; + else + SQ = 20; + } +#endif + return SQ; +} + +static u1Byte +odm_EVMdbToPercentage( + IN s1Byte Value + ) +{ + // + // -33dB~0dB to 0%~99% + // + s1Byte ret_val; + + ret_val = Value; + //ret_val /= 2; + + //ODM_RTPRINT(FRX, RX_PHY_SQ, ("EVMdbToPercentage92C Value=%d / %x \n", ret_val, ret_val)); + + if(ret_val >= 0) + ret_val = 0; + if(ret_val <= -33) + ret_val = -33; + + ret_val = 0 - ret_val; + ret_val*=3; + + if(ret_val == 99) + ret_val = 100; + + return(ret_val); +} + + + +VOID +odm_RxPhyStatus92CSeries_Parsing( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ + SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; + u1Byte i, Max_spatial_stream; + s1Byte rx_pwr[4], rx_pwr_all=0; + u1Byte EVM, PWDB_ALL = 0, PWDB_ALL_BT; + u1Byte RSSI, total_rssi=0; + u1Byte isCCKrate=0; + u1Byte rf_rx_num = 0; + u1Byte cck_highpwr = 0; + u1Byte LNA_idx, VGA_idx; + + PPHY_STATUS_RPT_8192CD_T pPhyStaRpt = (PPHY_STATUS_RPT_8192CD_T)pPhyStatus; + + isCCKrate = ((pPktinfo->Rate >= DESC92C_RATE1M ) && (pPktinfo->Rate <= DESC92C_RATE11M ))?TRUE :FALSE; + + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; + + + if(isCCKrate) + { + u1Byte report; + u1Byte cck_agc_rpt; + + pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++; + // + // (1)Hardware does not provide RSSI for CCK + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) + // + + //if(pHalData->eRFPowerState == eRfOn) + cck_highpwr = pDM_Odm->bCckHighPower; + //else + // cck_highpwr = FALSE; + + cck_agc_rpt = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a ; + + //2011.11.28 LukeLee: 88E use different LNA & VGA gain table + //The RSSI formula should be modified according to the gain table + //In 88E, cck_highpwr is always set to 1 + if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8812)) + { + LNA_idx = ((cck_agc_rpt & 0xE0) >>5); + VGA_idx = (cck_agc_rpt & 0x1F); + switch(LNA_idx) + { + case 7: + if(VGA_idx <= 27) + rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2 + else + rx_pwr_all = -100; + break; + case 6: + rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0 + break; + case 5: + rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5 + break; + case 4: + rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4 + break; + case 3: + //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0 + rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0 + break; + case 2: + if(cck_highpwr) + rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0 + else + rx_pwr_all = -6+ 2*(5-VGA_idx); + break; + case 1: + rx_pwr_all = 8-2*VGA_idx; + break; + case 0: + rx_pwr_all = 14-2*VGA_idx; + break; + default: + //DbgPrint("CCK Exception default\n"); + break; + } + rx_pwr_all += 6; + PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + if(cck_highpwr == FALSE) + { + if(PWDB_ALL >= 80) + PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80; + else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20)) + PWDB_ALL += 3; + if(PWDB_ALL>100) + PWDB_ALL = 100; + } + } + else + { + if(!cck_highpwr) + { + report =( cck_agc_rpt & 0xc0 )>>6; + switch(report) + { + // 03312009 modified by cosa + // Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion + // Note: different RF with the different RNA gain. + case 0x3: + rx_pwr_all = -46 - (cck_agc_rpt & 0x3e); + break; + case 0x2: + rx_pwr_all = -26 - (cck_agc_rpt & 0x3e); + break; + case 0x1: + rx_pwr_all = -12 - (cck_agc_rpt & 0x3e); + break; + case 0x0: + rx_pwr_all = 16 - (cck_agc_rpt & 0x3e); + break; + } + } + else + { + //report = pDrvInfo->cfosho[0] & 0x60; + //report = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a& 0x60; + + report = (cck_agc_rpt & 0x60)>>5; + switch(report) + { + case 0x3: + rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f)<<1) ; + break; + case 0x2: + rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f)<<1); + break; + case 0x1: + rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f)<<1) ; + break; + case 0x0: + rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f)<<1) ; + break; + } + } + + PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + + //Modification for ext-LNA board + if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)) + { + if((cck_agc_rpt>>7) == 0){ + PWDB_ALL = (PWDB_ALL>94)?100:(PWDB_ALL +6); + } + else + { + if(PWDB_ALL > 38) + PWDB_ALL -= 16; + else + PWDB_ALL = (PWDB_ALL<=16)?(PWDB_ALL>>2):(PWDB_ALL -12); + } + + //CCK modification + if(PWDB_ALL > 25 && PWDB_ALL <= 60) + PWDB_ALL += 6; + //else if (PWDB_ALL <= 25) + // PWDB_ALL += 8; + } + else//Modification for int-LNA board + { + if(PWDB_ALL > 99) + PWDB_ALL -= 8; + else if(PWDB_ALL > 50 && PWDB_ALL <= 68) + PWDB_ALL += 4; + } + } + + pPhyInfo->RxPWDBAll = PWDB_ALL; +#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) + pPhyInfo->BTRxRSSIPercentage = PWDB_ALL; + pPhyInfo->RecvSignalPower = rx_pwr_all; +#endif + // + // (3) Get Signal Quality (EVM) + // + if(pPktinfo->bPacketMatchBSSID) + { + u1Byte SQ,SQ_rpt; + + if((pDM_Odm->SupportPlatform == ODM_MP) &&(pDM_Odm->PatchID==19)){//pMgntInfo->CustomerID == RT_CID_819x_Lenovo + SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0); + } + else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){ + SQ = 100; + } + else{ + SQ_rpt = pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all; + + if(SQ_rpt > 64) + SQ = 0; + else if (SQ_rpt < 20) + SQ = 100; + else + SQ = ((64-SQ_rpt) * 100) / 44; + + } + + //DbgPrint("cck SQ = %d\n", SQ); + pPhyInfo->SignalQuality = SQ; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ; + pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1; + } + } + else //is OFDM rate + { + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; + + // + // (1)Get RSSI for HT rate + // + + for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) + { + // 2008/01/30 MH we will judge RF RX path now. + if (pDM_Odm->RFPathRxEnable & BIT(i)) + rf_rx_num++; + //else + //continue; + + rx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain& 0x3F)*2) - 110; + + #if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) + pPhyInfo->RxPwr[i] = rx_pwr[i]; + #endif + + /* Translate DBM to percentage. */ + RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); + total_rssi += RSSI; + //RTPRINT(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI)); + + //Modification for ext-LNA board + if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)) + { + if((pPhyStaRpt->path_agc[i].trsw) == 1) + RSSI = (RSSI>94)?100:(RSSI +6); + else + RSSI = (RSSI<=16)?(RSSI>>3):(RSSI -16); + + if((RSSI <= 34) && (RSSI >=4)) + RSSI -= 4; + } + + pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI; + + #if (DM_ODM_SUPPORT_TYPE & (/*ODM_MP|*/ODM_CE|ODM_AP|ODM_ADSL)) + //Get Rx snr value in DB + pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = (s4Byte)(pPhyStaRpt->path_rxsnr[i]/2); + #endif + + /* Record Signal Strength for next packet */ + if(pPktinfo->bPacketMatchBSSID) + { + if((pDM_Odm->SupportPlatform == ODM_MP) &&(pDM_Odm->PatchID==19)) + { + if(i==ODM_RF_PATH_A) + pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI); + + } + + } + } + + + // + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) + // + rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1 )& 0x7f) -110; + //RTPRINT(FRX, RX_PHY_SS, ("PWDB_ALL=%d\n", PWDB_ALL)); + + PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); + //RTPRINT(FRX, RX_PHY_SS, ("PWDB_ALL=%d\n",PWDB_ALL)); + + pPhyInfo->RxPWDBAll = PWDB_ALL; + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll)); + #if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) + pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT; + pPhyInfo->RxPower = rx_pwr_all; + pPhyInfo->RecvSignalPower = rx_pwr_all; + #endif + + if((pDM_Odm->SupportPlatform == ODM_MP) &&(pDM_Odm->PatchID==19)){ + //do nothing + } + else{//pMgntInfo->CustomerID != RT_CID_819x_Lenovo + // + // (3)EVM of HT rate + // + if(pPktinfo->Rate >=DESC92C_RATEMCS8 && pPktinfo->Rate <=DESC92C_RATEMCS15) + Max_spatial_stream = 2; //both spatial stream make sense + else + Max_spatial_stream = 1; //only spatial stream 1 makes sense + + for(i=0; i>= 1" because the compilor of free build environment + // fill most significant bit to "zero" when doing shifting operation which may change a negative + // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. + EVM = odm_EVMdbToPercentage( (pPhyStaRpt->stream_rxevm[i] )); //dbm + + //RTPRINT(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", + //GET_RX_STATUS_DESC_RX_MCS(pDesc), pDrvInfo->rxevm[i], "%", EVM)); + + if(pPktinfo->bPacketMatchBSSID) + { + if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only + { + pPhyInfo->SignalQuality = (u1Byte)(EVM & 0xff); + } + pPhyInfo->RxMIMOSignalQuality[i] = (u1Byte)(EVM & 0xff); + } + } + } + + } +#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) + //UI BSS List signal strength(in percentage), make it good looking, from 0~100. + //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). + if(isCCKrate) + { +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ + pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL; +#else + pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL; +#endif + } + else + { + if (rf_rx_num != 0) + { +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ + pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL; +#else + pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num)); +#endif + } + } +#endif + + //For 92C/92D HW (Hybrid) Antenna Diversity +#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) + pDM_SWAT_Table->antsel = pPhyStaRpt->ant_sel; + //For 88E HW Antenna Diversity + pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->ant_sel; + pDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->ant_sel_b; + pDM_Odm->DM_FatTable.antsel_rx_keep_2 = pPhyStaRpt->antsel_rx_keep_2; +#endif +} + +VOID +odm_Init_RSSIForDM( + IN OUT PDM_ODM_T pDM_Odm + ) +{ + +} + +VOID +odm_Process_RSSIForDM( + IN OUT PDM_ODM_T pDM_Odm, + IN PODM_PHY_INFO_T pPhyInfo, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ + + s4Byte UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK, UndecoratedSmoothedOFDM, RSSI_Ave; + u1Byte isCCKrate=0; + u1Byte RSSI_max, RSSI_min, i; + u4Byte OFDM_pkt=0; + u4Byte Weighting=0; + + PSTA_INFO_T pEntry; + + if(pPktinfo->StationID == 0xFF) + return; + + // 2011/11/17 MH Need to debug + //if (pDM_Odm->SupportPlatform == ODM_MP) + { + + } + + pEntry = pDM_Odm->pODM_StaInfo[pPktinfo->StationID]; + if(!IS_STA_VALID(pEntry) ){ + return; + } + if((!pPktinfo->bPacketMatchBSSID) ) + { + return; + } + + isCCKrate = ((pPktinfo->Rate >= DESC92C_RATE1M ) && (pPktinfo->Rate <= DESC92C_RATE11M ))?TRUE :FALSE; + if(pPktinfo->bPacketBeacon) + pDM_Odm->PhyDbgInfo.NumQryBeaconPkt++; + + pDM_Odm->RxRate = pPktinfo->Rate; +#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) +#if ((RTL8192C_SUPPORT == 1) ||(RTL8192D_SUPPORT == 1)) + if(pDM_Odm->SupportICType & ODM_RTL8192C|ODM_RTL8192D) + { + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) + { + //if(pPktinfo->bPacketBeacon) + //{ + // DbgPrint("This is beacon, isCCKrate=%d\n", isCCKrate); + //} + ODM_AntselStatistics_88C(pDM_Odm, pPktinfo->StationID, pPhyInfo->RxPWDBAll, isCCKrate); + } + } +#endif + //-----------------Smart Antenna Debug Message------------------// +#if (RTL8188E_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8188E) + { + u1Byte antsel_tr_mux; + pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; + + if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) + { + if(pDM_FatTable->FAT_State == FAT_TRAINING_STATE) + { + if(pPktinfo->bPacketToSelf) //(pPktinfo->bPacketMatchBSSID && (!pPktinfo->bPacketBeacon)) + { + antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0; + pDM_FatTable->antSumRSSI[antsel_tr_mux] += pPhyInfo->RxPWDBAll; + pDM_FatTable->antRSSIcnt[antsel_tr_mux]++; + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("isCCKrate=%d, PWDB_ALL=%d\n",isCCKrate, pPhyInfo->RxPWDBAll)); + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n", + //pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0)); + + } + } + } + else if((pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)||(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)) + { + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) + { + antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0; + //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n", + // pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0)); + + ODM_AntselStatistics_88E(pDM_Odm, antsel_tr_mux, pPktinfo->StationID, pPhyInfo->RxPWDBAll); + } + } + + } +#endif +#endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY)) + //-----------------Smart Antenna Debug Message------------------// + + UndecoratedSmoothedCCK = pEntry->rssi_stat.UndecoratedSmoothedCCK; + UndecoratedSmoothedOFDM = pEntry->rssi_stat.UndecoratedSmoothedOFDM; + UndecoratedSmoothedPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB; + + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) + { + + if(!isCCKrate)//ofdm rate + { + if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B] == 0){ + RSSI_Ave = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; + pDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; + pDM_Odm->RSSI_B = 0; + } + else + { + //DbgPrint("pRfd->Status.RxMIMOSignalStrength[0] = %d, pRfd->Status.RxMIMOSignalStrength[1] = %d \n", + //pRfd->Status.RxMIMOSignalStrength[0], pRfd->Status.RxMIMOSignalStrength[1]); + pDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; + pDM_Odm->RSSI_B = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; + + if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A] > pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]) + { + RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; + RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; + } + else + { + RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]; + RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]; + } + if((RSSI_max -RSSI_min) < 3) + RSSI_Ave = RSSI_max; + else if((RSSI_max -RSSI_min) < 6) + RSSI_Ave = RSSI_max - 1; + else if((RSSI_max -RSSI_min) < 10) + RSSI_Ave = RSSI_max - 2; + else + RSSI_Ave = RSSI_max - 3; + } + + //1 Process OFDM RSSI + if(UndecoratedSmoothedOFDM <= 0) // initialize + { + UndecoratedSmoothedOFDM = pPhyInfo->RxPWDBAll; + } + else + { + if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedOFDM) + { + UndecoratedSmoothedOFDM = + ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + + (RSSI_Ave)) /(Rx_Smooth_Factor); + UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM + 1; + } + else + { + UndecoratedSmoothedOFDM = + ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + + (RSSI_Ave)) /(Rx_Smooth_Factor); + } + } + + pEntry->rssi_stat.PacketMap = (pEntry->rssi_stat.PacketMap<<1) | BIT0; + + } + else + { + RSSI_Ave = pPhyInfo->RxPWDBAll; + pDM_Odm->RSSI_A = (u1Byte) pPhyInfo->RxPWDBAll; + pDM_Odm->RSSI_B = 0xFF; + + //1 Process CCK RSSI + if(UndecoratedSmoothedCCK <= 0) // initialize + { + UndecoratedSmoothedCCK = pPhyInfo->RxPWDBAll; + } + else + { + if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedCCK) + { + UndecoratedSmoothedCCK = + ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + + (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor); + UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1; + } + else + { + UndecoratedSmoothedCCK = + ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + + (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor); + } + } + pEntry->rssi_stat.PacketMap = pEntry->rssi_stat.PacketMap<<1; + } + + //if(pEntry) + { + //2011.07.28 LukeLee: modified to prevent unstable CCK RSSI + if(pEntry->rssi_stat.ValidBit >= 64) + pEntry->rssi_stat.ValidBit = 64; + else + pEntry->rssi_stat.ValidBit++; + + for(i=0; irssi_stat.ValidBit; i++) + OFDM_pkt += (u1Byte)(pEntry->rssi_stat.PacketMap>>i)&BIT0; + + if(pEntry->rssi_stat.ValidBit == 64) + { + Weighting = ((OFDM_pkt<<4) > 64)?64:(OFDM_pkt<<4); + UndecoratedSmoothedPWDB = (Weighting*UndecoratedSmoothedOFDM+(64-Weighting)*UndecoratedSmoothedCCK)>>6; + } + else + { + if(pEntry->rssi_stat.ValidBit != 0) + UndecoratedSmoothedPWDB = (OFDM_pkt*UndecoratedSmoothedOFDM+(pEntry->rssi_stat.ValidBit-OFDM_pkt)*UndecoratedSmoothedCCK)/pEntry->rssi_stat.ValidBit; + else + UndecoratedSmoothedPWDB = 0; + } + + pEntry->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; + pEntry->rssi_stat.UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM; + pEntry->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; + + //DbgPrint("OFDM_pkt=%d, Weighting=%d\n", OFDM_pkt, Weighting); + //DbgPrint("UndecoratedSmoothedOFDM=%d, UndecoratedSmoothedPWDB=%d, UndecoratedSmoothedCCK=%d\n", + // UndecoratedSmoothedOFDM, UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK); + + } + + } +} + +// +// Endianness before calling this API +// +VOID +ODM_PhyStatusQuery_92CSeries( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ + + odm_RxPhyStatus92CSeries_Parsing( + pDM_Odm, + pPhyInfo, + pPhyStatus, + pPktinfo); + + if( pDM_Odm->RSSI_test == TRUE) + { + // Select the packets to do RSSI checking for antenna switching. + if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon ) + { + /* + #if 0//(DM_ODM_SUPPORT_TYPE == ODM_MP) + dm_SWAW_RSSI_Check( + Adapter, + (tmppAdapter!=NULL)?(tmppAdapter==Adapter):TRUE, + bPacketMatchBSSID, + pEntry, + pRfd); + #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + // Select the packets to do RSSI checking for antenna switching. + //odm_SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll); + #endif + */ + ODM_SwAntDivChkPerPktRssi(pDM_Odm,pPktinfo->StationID,pPhyInfo); + } + } + else + { + odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo); + } + +} + + + +// +// Endianness before calling this API +// +VOID +ODM_PhyStatusQuery_JaguarSeries( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ + + +} + +VOID +ODM_PhyStatusQuery( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ) +{ +#if 0 // How to jaguar jugar series?? + if(pDM_Odm->SupportICType >= ODM_RTL8195 ) + { + ODM_PhyStatusQuery_JaguarSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); + } + else +#endif + { + ODM_PhyStatusQuery_92CSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo); + } +} + +// For future use. +VOID +ODM_MacStatusQuery( + IN OUT PDM_ODM_T pDM_Odm, + IN pu1Byte pMacStatus, + IN u1Byte MacID, + IN BOOLEAN bPacketMatchBSSID, + IN BOOLEAN bPacketToSelf, + IN BOOLEAN bPacketBeacon + ) +{ + // 2011/10/19 Driver team will handle in the future. + +} + +#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE|ODM_AP)) + +HAL_STATUS +ODM_ConfigRFWithHeaderFile( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E Content, + IN ODM_RF_RADIO_PATH_E eRFPath + ) +{ + //RT_STATUS rtStatus = RT_STATUS_SUCCESS; + + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===>ODM_ConfigRFWithHeaderFile\n")); +#if (RTL8723A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8723A) + { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG_MP(8723A,_RadioA_1T_); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> ODM_ConfigRFWithHeaderFile() Radio_A:Rtl8723RadioA_1TArray\n")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> ODM_ConfigRFWithHeaderFile() Radio_B:Rtl8723RadioB_1TArray\n")); + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("ODM_ConfigRFWithHeaderFile: Radio No %x\n", eRFPath)); + //rtStatus = RT_STATUS_SUCCESS; +#endif +#if (RTL8188E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188E) + { + if(eRFPath == ODM_RF_PATH_A) + READ_AND_CONFIG(8188E,_RadioA_1T_); + //else if(eRFPath == ODM_RF_PATH_B) + // READ_AND_CONFIG(8188E,_RadioB_1T_); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> ODM_ConfigRFWithHeaderFile() Radio_A:Rtl8188ERadioA_1TArray\n")); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> ODM_ConfigRFWithHeaderFile() Radio_B:Rtl8188ERadioB_1TArray\n")); + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("ODM_ConfigRFWithHeaderFile: Radio No %x\n", eRFPath)); + //rtStatus = RT_STATUS_SUCCESS; +#endif + return HAL_STATUS_SUCCESS; +} + + +HAL_STATUS +ODM_ConfigBBWithHeaderFile( + IN PDM_ODM_T pDM_Odm, + IN ODM_BB_Config_Type ConfigType + ) +{ +#if (RTL8723A_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8723A) + { + + if(ConfigType == CONFIG_BB_PHY_REG) + { + READ_AND_CONFIG_MP(8723A,_PHY_REG_1T_); + } + else if(ConfigType == CONFIG_BB_AGC_TAB) + { + READ_AND_CONFIG_MP(8723A,_AGC_TAB_1T_); + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8723AGCTAB_1TArray\n")); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8723PHY_REG_1TArray\n")); + } +#endif + +#if (RTL8188E_SUPPORT == 1) + if(pDM_Odm->SupportICType == ODM_RTL8188E) + { + + if(ConfigType == CONFIG_BB_PHY_REG) + { + READ_AND_CONFIG(8188E,_PHY_REG_1T_); + } +// else if(ConfigType == ODM_BaseBand_Config_PHY_REG_MP) +// { + //READ_AND_CONFIG(8188E,_PHY_REG_MP_); +// } + else if(ConfigType == CONFIG_BB_AGC_TAB) + { + READ_AND_CONFIG(8188E,_AGC_TAB_1T_); + } + else if(ConfigType == CONFIG_BB_PHY_REG_PG) + { + READ_AND_CONFIG(8188E,_PHY_REG_PG_); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8188EPHY_REG_PGArray\n")); + } + } +#endif + + return HAL_STATUS_SUCCESS; +} + +HAL_STATUS +ODM_ConfigMACWithHeaderFile( + IN PDM_ODM_T pDM_Odm + ) +{ + u1Byte result = HAL_STATUS_SUCCESS; +#if (RTL8723A_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8723A) + { + READ_AND_CONFIG_MP(8723A,_MAC_REG_); + } +#endif +#if (RTL8188E_SUPPORT == 1) + if (pDM_Odm->SupportICType == ODM_RTL8188E) + { + result = READ_AND_CONFIG(8188E,_MAC_REG_); + } +#endif + + return result; +} + + +#endif // end of (#if DM_ODM_SUPPORT_TYPE) + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.h index 3014a6cb9484..9b53a8aa3361 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.h @@ -1,195 +1,195 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - - -#ifndef __HALHWOUTSRC_H__ -#define __HALHWOUTSRC_H__ - -//============================================================ -// Definition -//============================================================ -// -//----------------------------------------------------------- -// CCK Rates, TxHT = 0 -#define DESC92C_RATE1M 0x00 -#define DESC92C_RATE2M 0x01 -#define DESC92C_RATE5_5M 0x02 -#define DESC92C_RATE11M 0x03 - -// OFDM Rates, TxHT = 0 -#define DESC92C_RATE6M 0x04 -#define DESC92C_RATE9M 0x05 -#define DESC92C_RATE12M 0x06 -#define DESC92C_RATE18M 0x07 -#define DESC92C_RATE24M 0x08 -#define DESC92C_RATE36M 0x09 -#define DESC92C_RATE48M 0x0a -#define DESC92C_RATE54M 0x0b - -// MCS Rates, TxHT = 1 -#define DESC92C_RATEMCS0 0x0c -#define DESC92C_RATEMCS1 0x0d -#define DESC92C_RATEMCS2 0x0e -#define DESC92C_RATEMCS3 0x0f -#define DESC92C_RATEMCS4 0x10 -#define DESC92C_RATEMCS5 0x11 -#define DESC92C_RATEMCS6 0x12 -#define DESC92C_RATEMCS7 0x13 -#define DESC92C_RATEMCS8 0x14 -#define DESC92C_RATEMCS9 0x15 -#define DESC92C_RATEMCS10 0x16 -#define DESC92C_RATEMCS11 0x17 -#define DESC92C_RATEMCS12 0x18 -#define DESC92C_RATEMCS13 0x19 -#define DESC92C_RATEMCS14 0x1a -#define DESC92C_RATEMCS15 0x1b -#define DESC92C_RATEMCS15_SG 0x1c -#define DESC92C_RATEMCS32 0x20 - - -//============================================================ -// structure and define -//============================================================ - -typedef struct _Phy_Rx_AGC_Info -{ - #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) - u1Byte gain:7,trsw:1; - #else - u1Byte trsw:1,gain:7; - #endif -} PHY_RX_AGC_INFO_T,*pPHY_RX_AGC_INFO_T; - -typedef struct _Phy_Status_Rpt_8192cd -{ - PHY_RX_AGC_INFO_T path_agc[2]; - u1Byte ch_corr[2]; - u1Byte cck_sig_qual_ofdm_pwdb_all; - u1Byte cck_agc_rpt_ofdm_cfosho_a; - u1Byte cck_rpt_b_ofdm_cfosho_b; - u1Byte rsvd_1;//ch_corr_msb; - u1Byte noise_power_db_msb; - u1Byte path_cfotail[2]; - u1Byte pcts_mask[2]; - s1Byte stream_rxevm[2]; - u1Byte path_rxsnr[2]; - u1Byte noise_power_db_lsb; - u1Byte rsvd_2[3]; - u1Byte stream_csi[2]; - u1Byte stream_target_csi[2]; - s1Byte sig_evm; - u1Byte rsvd_3; - -#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) - u1Byte antsel_rx_keep_2:1; //ex_intf_flg:1; - u1Byte sgi_en:1; - u1Byte rxsc:2; - u1Byte idle_long:1; - u1Byte r_ant_train_en:1; - u1Byte ant_sel_b:1; - u1Byte ant_sel:1; -#else // _BIG_ENDIAN_ - u1Byte ant_sel:1; - u1Byte ant_sel_b:1; - u1Byte r_ant_train_en:1; - u1Byte idle_long:1; - u1Byte rxsc:2; - u1Byte sgi_en:1; - u1Byte antsel_rx_keep_2:1; //ex_intf_flg:1; -#endif -} PHY_STATUS_RPT_8192CD_T,*PPHY_STATUS_RPT_8192CD_T; - - -typedef struct _Phy_Status_Rpt_8195 -{ - PHY_RX_AGC_INFO_T path_agc[2]; - u1Byte ch_num[2]; - u1Byte cck_sig_qual_ofdm_pwdb_all; - u1Byte cck_agc_rpt_ofdm_cfosho_a; - u1Byte cck_bb_pwr_ofdm_cfosho_b; - u1Byte cck_rx_path; //CCK_RX_PATH [3:0] (with regA07[3:0] definition) - u1Byte rsvd_1; - u1Byte path_cfotail[2]; - u1Byte pcts_mask[2]; - s1Byte stream_rxevm[2]; - u1Byte path_rxsnr[2]; - u1Byte rsvd_2[2]; - u1Byte stream_snr[2]; - u1Byte stream_csi[2]; - u1Byte rsvd_3[2]; - s1Byte sig_evm; - u1Byte rsvd_4; -#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) - u1Byte antidx_anta:3; - u1Byte antidx_antb:3; - u1Byte rsvd_5:2; -#else // _BIG_ENDIAN_ - u1Byte rsvd_5:2; - u1Byte antidx_antb:3; - u1Byte antidx_anta:3; -#endif -} PHY_STATUS_RPT_8195_T,*pPHY_STATUS_RPT_8195_T; - - -VOID -odm_Init_RSSIForDM( - IN OUT PDM_ODM_T pDM_Odm - ); - -VOID -ODM_PhyStatusQuery( - IN OUT PDM_ODM_T pDM_Odm, - OUT PODM_PHY_INFO_T pPhyInfo, - IN pu1Byte pPhyStatus, - IN PODM_PACKET_INFO_T pPktinfo - ); - -VOID -ODM_MacStatusQuery( - IN OUT PDM_ODM_T pDM_Odm, - IN pu1Byte pMacStatus, - IN u1Byte MacID, - IN BOOLEAN bPacketMatchBSSID, - IN BOOLEAN bPacketToSelf, - IN BOOLEAN bPacketBeacon - ); -#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE|ODM_AP)) -HAL_STATUS -ODM_ConfigRFWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E Content, - IN ODM_RF_RADIO_PATH_E eRFPath - ); - -HAL_STATUS -ODM_ConfigBBWithHeaderFile( - IN PDM_ODM_T pDM_Odm, - IN ODM_BB_Config_Type ConfigType - ); - -HAL_STATUS -ODM_ConfigMACWithHeaderFile( - IN PDM_ODM_T pDM_Odm - ); -#endif - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __HALHWOUTSRC_H__ +#define __HALHWOUTSRC_H__ + +//============================================================ +// Definition +//============================================================ +// +//----------------------------------------------------------- +// CCK Rates, TxHT = 0 +#define DESC92C_RATE1M 0x00 +#define DESC92C_RATE2M 0x01 +#define DESC92C_RATE5_5M 0x02 +#define DESC92C_RATE11M 0x03 + +// OFDM Rates, TxHT = 0 +#define DESC92C_RATE6M 0x04 +#define DESC92C_RATE9M 0x05 +#define DESC92C_RATE12M 0x06 +#define DESC92C_RATE18M 0x07 +#define DESC92C_RATE24M 0x08 +#define DESC92C_RATE36M 0x09 +#define DESC92C_RATE48M 0x0a +#define DESC92C_RATE54M 0x0b + +// MCS Rates, TxHT = 1 +#define DESC92C_RATEMCS0 0x0c +#define DESC92C_RATEMCS1 0x0d +#define DESC92C_RATEMCS2 0x0e +#define DESC92C_RATEMCS3 0x0f +#define DESC92C_RATEMCS4 0x10 +#define DESC92C_RATEMCS5 0x11 +#define DESC92C_RATEMCS6 0x12 +#define DESC92C_RATEMCS7 0x13 +#define DESC92C_RATEMCS8 0x14 +#define DESC92C_RATEMCS9 0x15 +#define DESC92C_RATEMCS10 0x16 +#define DESC92C_RATEMCS11 0x17 +#define DESC92C_RATEMCS12 0x18 +#define DESC92C_RATEMCS13 0x19 +#define DESC92C_RATEMCS14 0x1a +#define DESC92C_RATEMCS15 0x1b +#define DESC92C_RATEMCS15_SG 0x1c +#define DESC92C_RATEMCS32 0x20 + + +//============================================================ +// structure and define +//============================================================ + +typedef struct _Phy_Rx_AGC_Info +{ + #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte gain:7,trsw:1; + #else + u1Byte trsw:1,gain:7; + #endif +} PHY_RX_AGC_INFO_T,*pPHY_RX_AGC_INFO_T; + +typedef struct _Phy_Status_Rpt_8192cd +{ + PHY_RX_AGC_INFO_T path_agc[2]; + u1Byte ch_corr[2]; + u1Byte cck_sig_qual_ofdm_pwdb_all; + u1Byte cck_agc_rpt_ofdm_cfosho_a; + u1Byte cck_rpt_b_ofdm_cfosho_b; + u1Byte rsvd_1;//ch_corr_msb; + u1Byte noise_power_db_msb; + u1Byte path_cfotail[2]; + u1Byte pcts_mask[2]; + s1Byte stream_rxevm[2]; + u1Byte path_rxsnr[2]; + u1Byte noise_power_db_lsb; + u1Byte rsvd_2[3]; + u1Byte stream_csi[2]; + u1Byte stream_target_csi[2]; + s1Byte sig_evm; + u1Byte rsvd_3; + +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte antsel_rx_keep_2:1; //ex_intf_flg:1; + u1Byte sgi_en:1; + u1Byte rxsc:2; + u1Byte idle_long:1; + u1Byte r_ant_train_en:1; + u1Byte ant_sel_b:1; + u1Byte ant_sel:1; +#else // _BIG_ENDIAN_ + u1Byte ant_sel:1; + u1Byte ant_sel_b:1; + u1Byte r_ant_train_en:1; + u1Byte idle_long:1; + u1Byte rxsc:2; + u1Byte sgi_en:1; + u1Byte antsel_rx_keep_2:1; //ex_intf_flg:1; +#endif +} PHY_STATUS_RPT_8192CD_T,*PPHY_STATUS_RPT_8192CD_T; + + +typedef struct _Phy_Status_Rpt_8195 +{ + PHY_RX_AGC_INFO_T path_agc[2]; + u1Byte ch_num[2]; + u1Byte cck_sig_qual_ofdm_pwdb_all; + u1Byte cck_agc_rpt_ofdm_cfosho_a; + u1Byte cck_bb_pwr_ofdm_cfosho_b; + u1Byte cck_rx_path; //CCK_RX_PATH [3:0] (with regA07[3:0] definition) + u1Byte rsvd_1; + u1Byte path_cfotail[2]; + u1Byte pcts_mask[2]; + s1Byte stream_rxevm[2]; + u1Byte path_rxsnr[2]; + u1Byte rsvd_2[2]; + u1Byte stream_snr[2]; + u1Byte stream_csi[2]; + u1Byte rsvd_3[2]; + s1Byte sig_evm; + u1Byte rsvd_4; +#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE) + u1Byte antidx_anta:3; + u1Byte antidx_antb:3; + u1Byte rsvd_5:2; +#else // _BIG_ENDIAN_ + u1Byte rsvd_5:2; + u1Byte antidx_antb:3; + u1Byte antidx_anta:3; +#endif +} PHY_STATUS_RPT_8195_T,*pPHY_STATUS_RPT_8195_T; + + +VOID +odm_Init_RSSIForDM( + IN OUT PDM_ODM_T pDM_Odm + ); + +VOID +ODM_PhyStatusQuery( + IN OUT PDM_ODM_T pDM_Odm, + OUT PODM_PHY_INFO_T pPhyInfo, + IN pu1Byte pPhyStatus, + IN PODM_PACKET_INFO_T pPktinfo + ); + +VOID +ODM_MacStatusQuery( + IN OUT PDM_ODM_T pDM_Odm, + IN pu1Byte pMacStatus, + IN u1Byte MacID, + IN BOOLEAN bPacketMatchBSSID, + IN BOOLEAN bPacketToSelf, + IN BOOLEAN bPacketBeacon + ); +#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE|ODM_AP)) +HAL_STATUS +ODM_ConfigRFWithHeaderFile( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E Content, + IN ODM_RF_RADIO_PATH_E eRFPath + ); + +HAL_STATUS +ODM_ConfigBBWithHeaderFile( + IN PDM_ODM_T pDM_Odm, + IN ODM_BB_Config_Type ConfigType + ); + +HAL_STATUS +ODM_ConfigMACWithHeaderFile( + IN PDM_ODM_T pDM_Odm + ); +#endif + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_RegDefine11AC.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_RegDefine11AC.h index 8de1d501f127..b2a318a9b93d 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_RegDefine11AC.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_RegDefine11AC.h @@ -1,55 +1,55 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __ODM_REGDEFINE11AC_H__ -#define __ODM_REGDEFINE11AC_H__ - -//2 RF REG LIST - - - -//2 BB REG LIST -//PAGE 8 -//PAGE 9 -#define ODM_REG_OFDM_FA_RST_11AC 0x9A4 -//PAGE A -#define ODM_REG_CCK_CCA_11AC 0xA0A -#define ODM_REG_CCK_FA_RST_11AC 0xA2C -#define ODM_REG_CCK_FA_11AC 0xA5C -//PAGE C -#define ODM_REG_IGI_A_11AC 0xC50 -//PAGE E -#define ODM_REG_IGI_B_11AC 0xE50 -//PAGE F -#define ODM_REG_OFDM_FA_11AC 0xF48 - - -//2 MAC REG LIST - - - - -//DIG Related -#define ODM_BIT_IGI_11AC 0xFFFFFFFF - - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __ODM_REGDEFINE11AC_H__ +#define __ODM_REGDEFINE11AC_H__ + +//2 RF REG LIST + + + +//2 BB REG LIST +//PAGE 8 +//PAGE 9 +#define ODM_REG_OFDM_FA_RST_11AC 0x9A4 +//PAGE A +#define ODM_REG_CCK_CCA_11AC 0xA0A +#define ODM_REG_CCK_FA_RST_11AC 0xA2C +#define ODM_REG_CCK_FA_11AC 0xA5C +//PAGE C +#define ODM_REG_IGI_A_11AC 0xC50 +//PAGE E +#define ODM_REG_IGI_B_11AC 0xE50 +//PAGE F +#define ODM_REG_OFDM_FA_11AC 0xF48 + + +//2 MAC REG LIST + + + + +//DIG Related +#define ODM_BIT_IGI_11AC 0xFFFFFFFF + + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_RegDefine11N.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_RegDefine11N.h index 6e360123190e..841b1b42d843 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_RegDefine11N.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_RegDefine11N.h @@ -1,172 +1,172 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __ODM_REGDEFINE11N_H__ -#define __ODM_REGDEFINE11N_H__ - - -//2 RF REG LIST -#define ODM_REG_RF_MODE_11N 0x00 -#define ODM_REG_RF_0B_11N 0x0B -#define ODM_REG_CHNBW_11N 0x18 -#define ODM_REG_T_METER_11N 0x24 -#define ODM_REG_RF_25_11N 0x25 -#define ODM_REG_RF_26_11N 0x26 -#define ODM_REG_RF_27_11N 0x27 -#define ODM_REG_RF_2B_11N 0x2B -#define ODM_REG_RF_2C_11N 0x2C -#define ODM_REG_RXRF_A3_11N 0x3C -#define ODM_REG_T_METER_92D_11N 0x42 -#define ODM_REG_T_METER_88E_11N 0x42 - - - -//2 BB REG LIST -//PAGE 8 -#define ODM_REG_BB_CTRL_11N 0x800 -#define ODM_REG_RF_PIN_11N 0x804 -#define ODM_REG_PSD_CTRL_11N 0x808 -#define ODM_REG_TX_ANT_CTRL_11N 0x80C -#define ODM_REG_BB_PWR_SAV5_11N 0x818 -#define ODM_REG_CCK_RPT_FORMAT_11N 0x824 -#define ODM_REG_RX_DEFUALT_A_11N 0x858 -#define ODM_REG_RX_DEFUALT_B_11N 0x85A -#define ODM_REG_BB_PWR_SAV3_11N 0x85C -#define ODM_REG_ANTSEL_CTRL_11N 0x860 -#define ODM_REG_RX_ANT_CTRL_11N 0x864 -#define ODM_REG_PIN_CTRL_11N 0x870 -#define ODM_REG_BB_PWR_SAV1_11N 0x874 -#define ODM_REG_ANTSEL_PATH_11N 0x878 -#define ODM_REG_BB_3WIRE_11N 0x88C -#define ODM_REG_SC_CNT_11N 0x8C4 -#define ODM_REG_PSD_DATA_11N 0x8B4 -//PAGE 9 -#define ODM_REG_ANT_MAPPING1_11N 0x914 -#define ODM_REG_ANT_MAPPING2_11N 0x918 -//PAGE A -#define ODM_REG_CCK_ANTDIV_PARA1_11N 0xA00 -#define ODM_REG_CCK_CCA_11N 0xA0A -#define ODM_REG_CCK_ANTDIV_PARA2_11N 0xA0C -#define ODM_REG_CCK_ANTDIV_PARA3_11N 0xA10 -#define ODM_REG_CCK_ANTDIV_PARA4_11N 0xA14 -#define ODM_REG_CCK_FILTER_PARA1_11N 0xA22 -#define ODM_REG_CCK_FILTER_PARA2_11N 0xA23 -#define ODM_REG_CCK_FILTER_PARA3_11N 0xA24 -#define ODM_REG_CCK_FILTER_PARA4_11N 0xA25 -#define ODM_REG_CCK_FILTER_PARA5_11N 0xA26 -#define ODM_REG_CCK_FILTER_PARA6_11N 0xA27 -#define ODM_REG_CCK_FILTER_PARA7_11N 0xA28 -#define ODM_REG_CCK_FILTER_PARA8_11N 0xA29 -#define ODM_REG_CCK_FA_RST_11N 0xA2C -#define ODM_REG_CCK_FA_MSB_11N 0xA58 -#define ODM_REG_CCK_FA_LSB_11N 0xA5C -#define ODM_REG_CCK_CCA_CNT_11N 0xA60 -#define ODM_REG_BB_PWR_SAV4_11N 0xA74 -//PAGE B -#define ODM_REG_LNA_SWITCH_11N 0xB2C -#define ODM_REG_PATH_SWITCH_11N 0xB30 -#define ODM_REG_RSSI_CTRL_11N 0xB38 -#define ODM_REG_CONFIG_ANTA_11N 0xB68 -#define ODM_REG_RSSI_BT_11N 0xB9C -//PAGE C -#define ODM_REG_OFDM_FA_HOLDC_11N 0xC00 -#define ODM_REG_RX_PATH_11N 0xC04 -#define ODM_REG_TRMUX_11N 0xC08 -#define ODM_REG_OFDM_FA_RSTC_11N 0xC0C -#define ODM_REG_RXIQI_MATRIX_11N 0xC14 -#define ODM_REG_TXIQK_MATRIX_LSB1_11N 0xC4C -#define ODM_REG_IGI_A_11N 0xC50 -#define ODM_REG_ANTDIV_PARA2_11N 0xC54 -#define ODM_REG_IGI_B_11N 0xC58 -#define ODM_REG_ANTDIV_PARA3_11N 0xC5C -#define ODM_REG_BB_PWR_SAV2_11N 0xC70 -#define ODM_REG_RX_OFF_11N 0xC7C -#define ODM_REG_TXIQK_MATRIXA_11N 0xC80 -#define ODM_REG_TXIQK_MATRIXB_11N 0xC88 -#define ODM_REG_TXIQK_MATRIXA_LSB2_11N 0xC94 -#define ODM_REG_TXIQK_MATRIXB_LSB2_11N 0xC9C -#define ODM_REG_RXIQK_MATRIX_LSB_11N 0xCA0 -#define ODM_REG_ANTDIV_PARA1_11N 0xCA4 -#define ODM_REG_OFDM_FA_TYPE1_11N 0xCF0 -//PAGE D -#define ODM_REG_OFDM_FA_RSTD_11N 0xD00 -#define ODM_REG_OFDM_FA_TYPE2_11N 0xDA0 -#define ODM_REG_OFDM_FA_TYPE3_11N 0xDA4 -#define ODM_REG_OFDM_FA_TYPE4_11N 0xDA8 -//PAGE E -#define ODM_REG_TXAGC_A_6_18_11N 0xE00 -#define ODM_REG_TXAGC_A_24_54_11N 0xE04 -#define ODM_REG_TXAGC_A_1_MCS32_11N 0xE08 -#define ODM_REG_TXAGC_A_MCS0_3_11N 0xE10 -#define ODM_REG_TXAGC_A_MCS4_7_11N 0xE14 -#define ODM_REG_TXAGC_A_MCS8_11_11N 0xE18 -#define ODM_REG_TXAGC_A_MCS12_15_11N 0xE1C -#define ODM_REG_FPGA0_IQK_11N 0xE28 -#define ODM_REG_TXIQK_TONE_A_11N 0xE30 -#define ODM_REG_RXIQK_TONE_A_11N 0xE34 -#define ODM_REG_TXIQK_PI_A_11N 0xE38 -#define ODM_REG_RXIQK_PI_A_11N 0xE3C -#define ODM_REG_TXIQK_11N 0xE40 -#define ODM_REG_RXIQK_11N 0xE44 -#define ODM_REG_IQK_AGC_PTS_11N 0xE48 -#define ODM_REG_IQK_AGC_RSP_11N 0xE4C -#define ODM_REG_BLUETOOTH_11N 0xE6C -#define ODM_REG_RX_WAIT_CCA_11N 0xE70 -#define ODM_REG_TX_CCK_RFON_11N 0xE74 -#define ODM_REG_TX_CCK_BBON_11N 0xE78 -#define ODM_REG_OFDM_RFON_11N 0xE7C -#define ODM_REG_OFDM_BBON_11N 0xE80 -#define ODM_REG_TX2RX_11N 0xE84 -#define ODM_REG_TX2TX_11N 0xE88 -#define ODM_REG_RX_CCK_11N 0xE8C -#define ODM_REG_RX_OFDM_11N 0xED0 -#define ODM_REG_RX_WAIT_RIFS_11N 0xED4 -#define ODM_REG_RX2RX_11N 0xED8 -#define ODM_REG_STANDBY_11N 0xEDC -#define ODM_REG_SLEEP_11N 0xEE0 -#define ODM_REG_PMPD_ANAEN_11N 0xEEC - - - - - - - -//2 MAC REG LIST -#define ODM_REG_BB_RST_11N 0x02 -#define ODM_REG_ANTSEL_PIN_11N 0x4C -#define ODM_REG_EARLY_MODE_11N 0x4D0 -#define ODM_REG_RSSI_MONITOR_11N 0x4FE -#define ODM_REG_EDCA_VO_11N 0x500 -#define ODM_REG_EDCA_VI_11N 0x504 -#define ODM_REG_EDCA_BE_11N 0x508 -#define ODM_REG_EDCA_BK_11N 0x50C -#define ODM_REG_TXPAUSE_11N 0x522 -#define ODM_REG_RESP_TX_11N 0x6D8 -#define ODM_REG_ANT_TRAIN_PARA1_11N 0x7b0 -#define ODM_REG_ANT_TRAIN_PARA2_11N 0x7b4 - - -//DIG Related -#define ODM_BIT_IGI_11N 0x0000007F - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __ODM_REGDEFINE11N_H__ +#define __ODM_REGDEFINE11N_H__ + + +//2 RF REG LIST +#define ODM_REG_RF_MODE_11N 0x00 +#define ODM_REG_RF_0B_11N 0x0B +#define ODM_REG_CHNBW_11N 0x18 +#define ODM_REG_T_METER_11N 0x24 +#define ODM_REG_RF_25_11N 0x25 +#define ODM_REG_RF_26_11N 0x26 +#define ODM_REG_RF_27_11N 0x27 +#define ODM_REG_RF_2B_11N 0x2B +#define ODM_REG_RF_2C_11N 0x2C +#define ODM_REG_RXRF_A3_11N 0x3C +#define ODM_REG_T_METER_92D_11N 0x42 +#define ODM_REG_T_METER_88E_11N 0x42 + + + +//2 BB REG LIST +//PAGE 8 +#define ODM_REG_BB_CTRL_11N 0x800 +#define ODM_REG_RF_PIN_11N 0x804 +#define ODM_REG_PSD_CTRL_11N 0x808 +#define ODM_REG_TX_ANT_CTRL_11N 0x80C +#define ODM_REG_BB_PWR_SAV5_11N 0x818 +#define ODM_REG_CCK_RPT_FORMAT_11N 0x824 +#define ODM_REG_RX_DEFUALT_A_11N 0x858 +#define ODM_REG_RX_DEFUALT_B_11N 0x85A +#define ODM_REG_BB_PWR_SAV3_11N 0x85C +#define ODM_REG_ANTSEL_CTRL_11N 0x860 +#define ODM_REG_RX_ANT_CTRL_11N 0x864 +#define ODM_REG_PIN_CTRL_11N 0x870 +#define ODM_REG_BB_PWR_SAV1_11N 0x874 +#define ODM_REG_ANTSEL_PATH_11N 0x878 +#define ODM_REG_BB_3WIRE_11N 0x88C +#define ODM_REG_SC_CNT_11N 0x8C4 +#define ODM_REG_PSD_DATA_11N 0x8B4 +//PAGE 9 +#define ODM_REG_ANT_MAPPING1_11N 0x914 +#define ODM_REG_ANT_MAPPING2_11N 0x918 +//PAGE A +#define ODM_REG_CCK_ANTDIV_PARA1_11N 0xA00 +#define ODM_REG_CCK_CCA_11N 0xA0A +#define ODM_REG_CCK_ANTDIV_PARA2_11N 0xA0C +#define ODM_REG_CCK_ANTDIV_PARA3_11N 0xA10 +#define ODM_REG_CCK_ANTDIV_PARA4_11N 0xA14 +#define ODM_REG_CCK_FILTER_PARA1_11N 0xA22 +#define ODM_REG_CCK_FILTER_PARA2_11N 0xA23 +#define ODM_REG_CCK_FILTER_PARA3_11N 0xA24 +#define ODM_REG_CCK_FILTER_PARA4_11N 0xA25 +#define ODM_REG_CCK_FILTER_PARA5_11N 0xA26 +#define ODM_REG_CCK_FILTER_PARA6_11N 0xA27 +#define ODM_REG_CCK_FILTER_PARA7_11N 0xA28 +#define ODM_REG_CCK_FILTER_PARA8_11N 0xA29 +#define ODM_REG_CCK_FA_RST_11N 0xA2C +#define ODM_REG_CCK_FA_MSB_11N 0xA58 +#define ODM_REG_CCK_FA_LSB_11N 0xA5C +#define ODM_REG_CCK_CCA_CNT_11N 0xA60 +#define ODM_REG_BB_PWR_SAV4_11N 0xA74 +//PAGE B +#define ODM_REG_LNA_SWITCH_11N 0xB2C +#define ODM_REG_PATH_SWITCH_11N 0xB30 +#define ODM_REG_RSSI_CTRL_11N 0xB38 +#define ODM_REG_CONFIG_ANTA_11N 0xB68 +#define ODM_REG_RSSI_BT_11N 0xB9C +//PAGE C +#define ODM_REG_OFDM_FA_HOLDC_11N 0xC00 +#define ODM_REG_RX_PATH_11N 0xC04 +#define ODM_REG_TRMUX_11N 0xC08 +#define ODM_REG_OFDM_FA_RSTC_11N 0xC0C +#define ODM_REG_RXIQI_MATRIX_11N 0xC14 +#define ODM_REG_TXIQK_MATRIX_LSB1_11N 0xC4C +#define ODM_REG_IGI_A_11N 0xC50 +#define ODM_REG_ANTDIV_PARA2_11N 0xC54 +#define ODM_REG_IGI_B_11N 0xC58 +#define ODM_REG_ANTDIV_PARA3_11N 0xC5C +#define ODM_REG_BB_PWR_SAV2_11N 0xC70 +#define ODM_REG_RX_OFF_11N 0xC7C +#define ODM_REG_TXIQK_MATRIXA_11N 0xC80 +#define ODM_REG_TXIQK_MATRIXB_11N 0xC88 +#define ODM_REG_TXIQK_MATRIXA_LSB2_11N 0xC94 +#define ODM_REG_TXIQK_MATRIXB_LSB2_11N 0xC9C +#define ODM_REG_RXIQK_MATRIX_LSB_11N 0xCA0 +#define ODM_REG_ANTDIV_PARA1_11N 0xCA4 +#define ODM_REG_OFDM_FA_TYPE1_11N 0xCF0 +//PAGE D +#define ODM_REG_OFDM_FA_RSTD_11N 0xD00 +#define ODM_REG_OFDM_FA_TYPE2_11N 0xDA0 +#define ODM_REG_OFDM_FA_TYPE3_11N 0xDA4 +#define ODM_REG_OFDM_FA_TYPE4_11N 0xDA8 +//PAGE E +#define ODM_REG_TXAGC_A_6_18_11N 0xE00 +#define ODM_REG_TXAGC_A_24_54_11N 0xE04 +#define ODM_REG_TXAGC_A_1_MCS32_11N 0xE08 +#define ODM_REG_TXAGC_A_MCS0_3_11N 0xE10 +#define ODM_REG_TXAGC_A_MCS4_7_11N 0xE14 +#define ODM_REG_TXAGC_A_MCS8_11_11N 0xE18 +#define ODM_REG_TXAGC_A_MCS12_15_11N 0xE1C +#define ODM_REG_FPGA0_IQK_11N 0xE28 +#define ODM_REG_TXIQK_TONE_A_11N 0xE30 +#define ODM_REG_RXIQK_TONE_A_11N 0xE34 +#define ODM_REG_TXIQK_PI_A_11N 0xE38 +#define ODM_REG_RXIQK_PI_A_11N 0xE3C +#define ODM_REG_TXIQK_11N 0xE40 +#define ODM_REG_RXIQK_11N 0xE44 +#define ODM_REG_IQK_AGC_PTS_11N 0xE48 +#define ODM_REG_IQK_AGC_RSP_11N 0xE4C +#define ODM_REG_BLUETOOTH_11N 0xE6C +#define ODM_REG_RX_WAIT_CCA_11N 0xE70 +#define ODM_REG_TX_CCK_RFON_11N 0xE74 +#define ODM_REG_TX_CCK_BBON_11N 0xE78 +#define ODM_REG_OFDM_RFON_11N 0xE7C +#define ODM_REG_OFDM_BBON_11N 0xE80 +#define ODM_REG_TX2RX_11N 0xE84 +#define ODM_REG_TX2TX_11N 0xE88 +#define ODM_REG_RX_CCK_11N 0xE8C +#define ODM_REG_RX_OFDM_11N 0xED0 +#define ODM_REG_RX_WAIT_RIFS_11N 0xED4 +#define ODM_REG_RX2RX_11N 0xED8 +#define ODM_REG_STANDBY_11N 0xEDC +#define ODM_REG_SLEEP_11N 0xEE0 +#define ODM_REG_PMPD_ANAEN_11N 0xEEC + + + + + + + +//2 MAC REG LIST +#define ODM_REG_BB_RST_11N 0x02 +#define ODM_REG_ANTSEL_PIN_11N 0x4C +#define ODM_REG_EARLY_MODE_11N 0x4D0 +#define ODM_REG_RSSI_MONITOR_11N 0x4FE +#define ODM_REG_EDCA_VO_11N 0x500 +#define ODM_REG_EDCA_VI_11N 0x504 +#define ODM_REG_EDCA_BE_11N 0x508 +#define ODM_REG_EDCA_BK_11N 0x50C +#define ODM_REG_TXPAUSE_11N 0x522 +#define ODM_REG_RESP_TX_11N 0x6D8 +#define ODM_REG_ANT_TRAIN_PARA1_11N 0x7b0 +#define ODM_REG_ANT_TRAIN_PARA2_11N 0x7b4 + + +//DIG Related +#define ODM_BIT_IGI_11N 0x0000007F + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_debug.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_debug.c index 6414f855157a..7db60cf5841b 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_debug.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_debug.c @@ -1,627 +1,627 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -//============================================================ -// include files -//============================================================ - -#include "odm_precomp.h" - -VOID -ODM_InitDebugSetting( - IN PDM_ODM_T pDM_Odm - ) -{ -pDM_Odm->DebugLevel = ODM_DBG_TRACE; - -pDM_Odm->DebugComponents = -\ -#if DBG -//BB Functions -// ODM_COMP_DIG | -// ODM_COMP_RA_MASK | -// ODM_COMP_DYNAMIC_TXPWR | -// ODM_COMP_FA_CNT | -// ODM_COMP_RSSI_MONITOR | -// ODM_COMP_CCK_PD | -// ODM_COMP_ANT_DIV | -// ODM_COMP_PWR_SAVE | -// ODM_COMP_PWR_TRAIN | -// ODM_COMP_RATE_ADAPTIVE | -// ODM_COMP_PATH_DIV | -// ODM_COMP_DYNAMIC_PRICCA | -// ODM_COMP_RXHP | - -//MAC Functions -// ODM_COMP_EDCA_TURBO | -// ODM_COMP_EARLY_MODE | -//RF Functions -// ODM_COMP_TX_PWR_TRACK | -// ODM_COMP_RX_GAIN_TRACK | -// ODM_COMP_CALIBRATION | -//Common -// ODM_COMP_COMMON | -// ODM_COMP_INIT | -#endif - 0; -} - -#if 0 -/*------------------Declare variable----------------------- -// Define debug flag array for common debug print macro. */ -u4Byte ODM_DBGP_Type[ODM_DBGP_TYPE_MAX]; - -/* Define debug print header for every service module. */ -ODM_DBGP_HEAD_T ODM_DBGP_Head; - - -/*----------------------------------------------------------------------------- - * Function: DBGP_Flag_Init - * - * Overview: Refresh all debug print control flag content to zero. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 10/20/2006 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void ODM_DBGP_Flag_Init(void) -{ - u1Byte i; - - for (i = 0; i < ODM_DBGP_TYPE_MAX; i++) - { - ODM_DBGP_Type[i] = 0; - } - -#ifndef ADSL_AP_BUILD_WORKAROUND -#if DBG - // 2010/06/02 MH Free build driver can not out any debug message!!! - // Init Debug flag enable condition - - ODM_DBGP_Type[FINIT] = \ -// INIT_EEPROM | -// INIT_TxPower | -// INIT_IQK | -// INIT_RF | - 0; - - ODM_DBGP_Type[FDM] = \ -// WA_IOT | -// DM_PWDB | -// DM_Monitor | -// DM_DIG | -// DM_EDCA_Turbo | -// DM_BT30 | - 0; - - ODM_DBGP_Type[FIOCTL] = \ -// IOCTL_IRP | -// IOCTL_IRP_DETAIL | -// IOCTL_IRP_STATISTICS | -// IOCTL_IRP_HANDLE | -// IOCTL_BT_HCICMD | -// IOCTL_BT_HCICMD_DETAIL | -// IOCTL_BT_HCICMD_EXT | -// IOCTL_BT_EVENT | -// IOCTL_BT_EVENT_DETAIL | -// IOCTL_BT_EVENT_PERIODICAL | -// IOCTL_BT_TX_ACLDATA | -// IOCTL_BT_TX_ACLDATA_DETAIL | -// IOCTL_BT_RX_ACLDATA | -// IOCTL_BT_RX_ACLDATA_DETAIL | -// IOCTL_BT_TP | -// IOCTL_STATE | -// IOCTL_BT_LOGO | -// IOCTL_CALLBACK_FUN | -// IOCTL_PARSE_BT_PKT | - 0; - - ODM_DBGP_Type[FBT] = \ -// BT_TRACE | - 0; - - ODM_DBGP_Type[FEEPROM] = \ -// EEPROM_W | -// EFUSE_PG | -// EFUSE_READ_ALL | -// EFUSE_ANALYSIS | -// EFUSE_PG_DETAIL | - 0; - - ODM_DBGP_Type[FDBG_CTRL] = \ -// DBG_CTRL_TRACE | -// DBG_CTRL_INBAND_NOISE | - 0; - - // 2011/07/20 MH Add for short cut - ODM_DBGP_Type[FSHORT_CUT] = \ -// SHCUT_TX | -// SHCUT_RX | - 0; - -#endif -#endif - /* Define debug header of every service module. */ - //ODM_DBGP_Head.pMANS = "\n\r[MANS] "; - //ODM_DBGP_Head.pRTOS = "\n\r[RTOS] "; - //ODM_DBGP_Head.pALM = "\n\r[ALM] "; - //ODM_DBGP_Head.pPEM = "\n\r[PEM] "; - //ODM_DBGP_Head.pCMPK = "\n\r[CMPK] "; - //ODM_DBGP_Head.pRAPD = "\n\r[RAPD] "; - //ODM_DBGP_Head.pTXPB = "\n\r[TXPB] "; - //ODM_DBGP_Head.pQUMG = "\n\r[QUMG] "; - -} /* DBGP_Flag_Init */ - -#endif - - -#if 0 -u4Byte GlobalDebugLevel = DBG_LOUD; -// -// 2009/06/22 MH Allow Fre build to print none debug info at init time. -// -#if DBG -u8Byte GlobalDebugComponents = \ -// COMP_TRACE | -// COMP_DBG | -// COMP_INIT | -// COMP_OID_QUERY | -// COMP_OID_SET | -// COMP_RECV | -// COMP_SEND | -// COMP_IO | -// COMP_POWER | -// COMP_MLME | -// COMP_SCAN | -// COMP_SYSTEM | -// COMP_SEC | -// COMP_AP | -// COMP_TURBO | -// COMP_QOS | -// COMP_AUTHENTICATOR | -// COMP_BEACON | -// COMP_ANTENNA | -// COMP_RATE | -// COMP_EVENTS | -// COMP_FPGA | -// COMP_RM | -// COMP_MP | -// COMP_RXDESC | -// COMP_CKIP | -// COMP_DIG | -// COMP_TXAGC | -// COMP_HIPWR | -// COMP_HALDM | -// COMP_RSNA | -// COMP_INDIC | -// COMP_LED | -// COMP_RF | -// COMP_DUALMACSWITCH | -// COMP_EASY_CONCURRENT | - -//1!!!!!!!!!!!!!!!!!!!!!!!!!!! -//1//1Attention Please!!!<11n or 8190 specific code should be put below this line> -//1!!!!!!!!!!!!!!!!!!!!!!!!!!! - -// COMP_HT | -// COMP_POWER_TRACKING | -// COMP_RX_REORDER | -// COMP_AMSDU | -// COMP_WPS | -// COMP_RATR | -// COMP_RESET | -// COMP_CMD | -// COMP_EFUSE | -// COMP_MESH_INTERWORKING | -// COMP_CCX | -// COMP_IOCTL | -// COMP_GP | -// COMP_TXAGG | -// COMP_BB_POWERSAVING | -// COMP_SWAS | -// COMP_P2P | -// COMP_MUX | -// COMP_FUNC | -// COMP_TDLS | -// COMP_OMNIPEEK | -// COMP_PSD | - 0; - - -#else -#define FuncEntry -#define FuncExit -u8Byte GlobalDebugComponents = 0; -#endif - -#if (RT_PLATFORM==PLATFORM_LINUX) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) -EXPORT_SYMBOL(GlobalDebugComponents); -EXPORT_SYMBOL(GlobalDebugLevel); -#endif -#endif - -/*------------------Declare variable----------------------- -// Define debug flag array for common debug print macro. */ -u4Byte DBGP_Type[DBGP_TYPE_MAX]; - -/* Define debug print header for every service module. */ -DBGP_HEAD_T DBGP_Head; - - -/*----------------------------------------------------------------------------- - * Function: DBGP_Flag_Init - * - * Overview: Refresh all debug print control flag content to zero. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 10/20/2006 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void DBGP_Flag_Init(void) -{ - u1Byte i; - - for (i = 0; i < DBGP_TYPE_MAX; i++) - { - DBGP_Type[i] = 0; - } - -#if DBG - // 2010/06/02 MH Free build driver can not out any debug message!!! - // Init Debug flag enable condition - - DBGP_Type[FINIT] = \ -// INIT_EEPROM | -// INIT_TxPower | -// INIT_IQK | -// INIT_RF | - 0; - - DBGP_Type[FDM] = \ -// WA_IOT | -// DM_PWDB | -// DM_Monitor | -// DM_DIG | -// DM_EDCA_Turbo | -// DM_BT30 | - 0; - - DBGP_Type[FIOCTL] = \ -// IOCTL_IRP | -// IOCTL_IRP_DETAIL | -// IOCTL_IRP_STATISTICS | -// IOCTL_IRP_HANDLE | -// IOCTL_BT_HCICMD | -// IOCTL_BT_HCICMD_DETAIL | -// IOCTL_BT_HCICMD_EXT | -// IOCTL_BT_EVENT | -// IOCTL_BT_EVENT_DETAIL | -// IOCTL_BT_EVENT_PERIODICAL | -// IOCTL_BT_TX_ACLDATA | -// IOCTL_BT_TX_ACLDATA_DETAIL | -// IOCTL_BT_RX_ACLDATA | -// IOCTL_BT_RX_ACLDATA_DETAIL | -// IOCTL_BT_TP | -// IOCTL_STATE | -// IOCTL_BT_LOGO | -// IOCTL_CALLBACK_FUN | -// IOCTL_PARSE_BT_PKT | - 0; - - DBGP_Type[FBT] = \ -// BT_TRACE | - 0; - - DBGP_Type[FEEPROM] = \ -// EEPROM_W | -// EFUSE_PG | -// EFUSE_READ_ALL | -// EFUSE_ANALYSIS | -// EFUSE_PG_DETAIL | - 0; - - DBGP_Type[FDBG_CTRL] = \ -// DBG_CTRL_TRACE | -// DBG_CTRL_INBAND_NOISE | - 0; - - // 2011/07/20 MH Add for short cut - DBGP_Type[FSHORT_CUT] = \ -// SHCUT_TX | -// SHCUT_RX | - 0; - -#endif - /* Define debug header of every service module. */ - DBGP_Head.pMANS = "\n\r[MANS] "; - DBGP_Head.pRTOS = "\n\r[RTOS] "; - DBGP_Head.pALM = "\n\r[ALM] "; - DBGP_Head.pPEM = "\n\r[PEM] "; - DBGP_Head.pCMPK = "\n\r[CMPK] "; - DBGP_Head.pRAPD = "\n\r[RAPD] "; - DBGP_Head.pTXPB = "\n\r[TXPB] "; - DBGP_Head.pQUMG = "\n\r[QUMG] "; - -} /* DBGP_Flag_Init */ - - -/*----------------------------------------------------------------------------- - * Function: DBG_PrintAllFlag - * - * Overview: Print All debug flag - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void DBG_PrintAllFlag(void) -{ - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 0 FQoS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 1 FTX\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 2 FRX\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 3 FSEC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 4 FMGNT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 5 FMLME\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 6 FRESOURCE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 7 FBEACON\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 8 FISR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 9 FPHY\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 11 FMP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 12 FPWR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 13 FDM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 14 FDBG_CTRL\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 15 FC2H\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 16 FBT\n")); -} // DBG_PrintAllFlag - - -extern void DBG_PrintAllComp(void) -{ - u1Byte i; - - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("GlobalDebugComponents Definition\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT0 COMP_TRACE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT1 COMP_DBG\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT2 COMP_INIT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT3 COMP_OID_QUERY\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT4 COMP_OID_SET\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT5 COMP_RECV\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT6 COMP_SEND\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT7 COMP_IO\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT8 COMP_POWER\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT9 COMP_MLME\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT10 COMP_SCAN\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT11 COMP_SYSTEM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT12 COMP_SEC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT13 COMP_AP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT14 COMP_TURBO\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT15 COMP_QOS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT16 COMP_AUTHENTICATOR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT17 COMP_BEACON\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT18 COMP_BEACON\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT19 COMP_RATE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT20 COMP_EVENTS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT21 COMP_FPGA\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT22 COMP_RM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT23 COMP_MP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT24 COMP_RXDESC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT25 COMP_CKIP\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT26 COMP_DIG\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT27 COMP_TXAGC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT28 COMP_HIPWR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT29 COMP_HALDM\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT30 COMP_RSNA\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT31 COMP_INDIC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT32 COMP_LED\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT33 COMP_RF\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT34 COMP_HT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT35 COMP_POWER_TRACKING\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT36 COMP_POWER_TRACKING\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT37 COMP_AMSDU\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT38 COMP_WPS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT39 COMP_RATR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT40 COMP_RESET\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT41 COMP_CMD\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT42 COMP_EFUSE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT43 COMP_MESH_INTERWORKING\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT43 COMP_CCX\n")); - - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("GlobalDebugComponents = %"i64fmt"x\n", GlobalDebugComponents)); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("Enable DBG COMP =")); - for (i = 0; i < 64; i++) - { - if (GlobalDebugComponents & ((u8Byte)0x1 << i) ) - { - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT%02d |\n", i)); - } - } - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("\n")); - -} // DBG_PrintAllComp - - -/*----------------------------------------------------------------------------- - * Function: DBG_PrintFlagEvent - * - * Overview: Print dedicated debug flag event - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern void DBG_PrintFlagEvent(u1Byte DbgFlag) -{ - switch(DbgFlag) - { - case FQoS: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 QoS_INIT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 QoS_VISTA\n")); - break; - - case FTX: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 TX_DESC\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 TX_DESC_TID\n")); - break; - - case FRX: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 RX_DATA\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 RX_PHY_STS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 RX_PHY_SS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 RX_PHY_SQ\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 RX_PHY_ASTS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 5 RX_ERR_LEN\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 6 RX_DEFRAG\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 7 RX_ERR_RATE\n")); - break; - - case FSEC: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("NA\n")); - break; - - case FMGNT: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("NA\n")); - break; - - case FMLME: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 MEDIA_STS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 LINK_STS\n")); - break; - - case FRESOURCE: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 OS_CHK\n")); - break; - - case FBEACON: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 BCN_SHOW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 BCN_PEER\n")); - break; - - case FISR: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 ISR_CHK\n")); - break; - - case FPHY: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 PHY_BBR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 PHY_BBW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 PHY_RFR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 PHY_RFW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 PHY_MACR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 5 PHY_MACW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 6 PHY_ALLR\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 7 PHY_ALLW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 8 PHY_TXPWR\n")); - break; - - case FMP: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 MP_RX\n")); - break; - - case FEEPROM: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 EEPROM_W\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 EFUSE_PG\n")); - break; - - case FPWR: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 LPS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 IPS\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 PWRSW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 PWRHW\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 PWRHAL\n")); - break; - - case FDM: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 WA_IOT\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 DM_PWDB\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 DM_Monitor\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 DM_DIG\n")); - break; - - case FDBG_CTRL: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 DBG_CTRL_TRACE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 DBG_CTRL_INBAND_NOISE\n")); - break; - - case FC2H: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 C2H_Summary\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 C2H_PacketData\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 C2H_ContentData\n")); - break; - - case FBT: - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 BT_TRACE\n")); - ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 BT_RFPoll\n")); - break; - - default: - break; - } - -} // DBG_PrintFlagEvent - - -extern void DBG_DumpMem(const u1Byte DbgComp, - const u1Byte DbgLevel, - pu1Byte pMem, - u2Byte Len) -{ - u2Byte i; - - for (i=0;i<((Len>>3) + 1);i++) - { - ODM_RT_TRACE(pDM_Odm,DbgComp, DbgLevel, ("%02X %02X %02X %02X %02X %02X %02X %02X\n", - *(pMem+(i*8)), *(pMem+(i*8+1)), *(pMem+(i*8+2)), *(pMem+(i*8+3)), - *(pMem+(i*8+4)), *(pMem+(i*8+5)), *(pMem+(i*8+6)), *(pMem+(i*8+7)))); - - } -} - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +//============================================================ +// include files +//============================================================ + +#include "odm_precomp.h" + +VOID +ODM_InitDebugSetting( + IN PDM_ODM_T pDM_Odm + ) +{ +pDM_Odm->DebugLevel = ODM_DBG_TRACE; + +pDM_Odm->DebugComponents = +\ +#if DBG +//BB Functions +// ODM_COMP_DIG | +// ODM_COMP_RA_MASK | +// ODM_COMP_DYNAMIC_TXPWR | +// ODM_COMP_FA_CNT | +// ODM_COMP_RSSI_MONITOR | +// ODM_COMP_CCK_PD | +// ODM_COMP_ANT_DIV | +// ODM_COMP_PWR_SAVE | +// ODM_COMP_PWR_TRAIN | +// ODM_COMP_RATE_ADAPTIVE | +// ODM_COMP_PATH_DIV | +// ODM_COMP_DYNAMIC_PRICCA | +// ODM_COMP_RXHP | + +//MAC Functions +// ODM_COMP_EDCA_TURBO | +// ODM_COMP_EARLY_MODE | +//RF Functions +// ODM_COMP_TX_PWR_TRACK | +// ODM_COMP_RX_GAIN_TRACK | +// ODM_COMP_CALIBRATION | +//Common +// ODM_COMP_COMMON | +// ODM_COMP_INIT | +#endif + 0; +} + +#if 0 +/*------------------Declare variable----------------------- +// Define debug flag array for common debug print macro. */ +u4Byte ODM_DBGP_Type[ODM_DBGP_TYPE_MAX]; + +/* Define debug print header for every service module. */ +ODM_DBGP_HEAD_T ODM_DBGP_Head; + + +/*----------------------------------------------------------------------------- + * Function: DBGP_Flag_Init + * + * Overview: Refresh all debug print control flag content to zero. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 10/20/2006 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +extern void ODM_DBGP_Flag_Init(void) +{ + u1Byte i; + + for (i = 0; i < ODM_DBGP_TYPE_MAX; i++) + { + ODM_DBGP_Type[i] = 0; + } + +#ifndef ADSL_AP_BUILD_WORKAROUND +#if DBG + // 2010/06/02 MH Free build driver can not out any debug message!!! + // Init Debug flag enable condition + + ODM_DBGP_Type[FINIT] = \ +// INIT_EEPROM | +// INIT_TxPower | +// INIT_IQK | +// INIT_RF | + 0; + + ODM_DBGP_Type[FDM] = \ +// WA_IOT | +// DM_PWDB | +// DM_Monitor | +// DM_DIG | +// DM_EDCA_Turbo | +// DM_BT30 | + 0; + + ODM_DBGP_Type[FIOCTL] = \ +// IOCTL_IRP | +// IOCTL_IRP_DETAIL | +// IOCTL_IRP_STATISTICS | +// IOCTL_IRP_HANDLE | +// IOCTL_BT_HCICMD | +// IOCTL_BT_HCICMD_DETAIL | +// IOCTL_BT_HCICMD_EXT | +// IOCTL_BT_EVENT | +// IOCTL_BT_EVENT_DETAIL | +// IOCTL_BT_EVENT_PERIODICAL | +// IOCTL_BT_TX_ACLDATA | +// IOCTL_BT_TX_ACLDATA_DETAIL | +// IOCTL_BT_RX_ACLDATA | +// IOCTL_BT_RX_ACLDATA_DETAIL | +// IOCTL_BT_TP | +// IOCTL_STATE | +// IOCTL_BT_LOGO | +// IOCTL_CALLBACK_FUN | +// IOCTL_PARSE_BT_PKT | + 0; + + ODM_DBGP_Type[FBT] = \ +// BT_TRACE | + 0; + + ODM_DBGP_Type[FEEPROM] = \ +// EEPROM_W | +// EFUSE_PG | +// EFUSE_READ_ALL | +// EFUSE_ANALYSIS | +// EFUSE_PG_DETAIL | + 0; + + ODM_DBGP_Type[FDBG_CTRL] = \ +// DBG_CTRL_TRACE | +// DBG_CTRL_INBAND_NOISE | + 0; + + // 2011/07/20 MH Add for short cut + ODM_DBGP_Type[FSHORT_CUT] = \ +// SHCUT_TX | +// SHCUT_RX | + 0; + +#endif +#endif + /* Define debug header of every service module. */ + //ODM_DBGP_Head.pMANS = "\n\r[MANS] "; + //ODM_DBGP_Head.pRTOS = "\n\r[RTOS] "; + //ODM_DBGP_Head.pALM = "\n\r[ALM] "; + //ODM_DBGP_Head.pPEM = "\n\r[PEM] "; + //ODM_DBGP_Head.pCMPK = "\n\r[CMPK] "; + //ODM_DBGP_Head.pRAPD = "\n\r[RAPD] "; + //ODM_DBGP_Head.pTXPB = "\n\r[TXPB] "; + //ODM_DBGP_Head.pQUMG = "\n\r[QUMG] "; + +} /* DBGP_Flag_Init */ + +#endif + + +#if 0 +u4Byte GlobalDebugLevel = DBG_LOUD; +// +// 2009/06/22 MH Allow Fre build to print none debug info at init time. +// +#if DBG +u8Byte GlobalDebugComponents = \ +// COMP_TRACE | +// COMP_DBG | +// COMP_INIT | +// COMP_OID_QUERY | +// COMP_OID_SET | +// COMP_RECV | +// COMP_SEND | +// COMP_IO | +// COMP_POWER | +// COMP_MLME | +// COMP_SCAN | +// COMP_SYSTEM | +// COMP_SEC | +// COMP_AP | +// COMP_TURBO | +// COMP_QOS | +// COMP_AUTHENTICATOR | +// COMP_BEACON | +// COMP_ANTENNA | +// COMP_RATE | +// COMP_EVENTS | +// COMP_FPGA | +// COMP_RM | +// COMP_MP | +// COMP_RXDESC | +// COMP_CKIP | +// COMP_DIG | +// COMP_TXAGC | +// COMP_HIPWR | +// COMP_HALDM | +// COMP_RSNA | +// COMP_INDIC | +// COMP_LED | +// COMP_RF | +// COMP_DUALMACSWITCH | +// COMP_EASY_CONCURRENT | + +//1!!!!!!!!!!!!!!!!!!!!!!!!!!! +//1//1Attention Please!!!<11n or 8190 specific code should be put below this line> +//1!!!!!!!!!!!!!!!!!!!!!!!!!!! + +// COMP_HT | +// COMP_POWER_TRACKING | +// COMP_RX_REORDER | +// COMP_AMSDU | +// COMP_WPS | +// COMP_RATR | +// COMP_RESET | +// COMP_CMD | +// COMP_EFUSE | +// COMP_MESH_INTERWORKING | +// COMP_CCX | +// COMP_IOCTL | +// COMP_GP | +// COMP_TXAGG | +// COMP_BB_POWERSAVING | +// COMP_SWAS | +// COMP_P2P | +// COMP_MUX | +// COMP_FUNC | +// COMP_TDLS | +// COMP_OMNIPEEK | +// COMP_PSD | + 0; + + +#else +#define FuncEntry +#define FuncExit +u8Byte GlobalDebugComponents = 0; +#endif + +#if (RT_PLATFORM==PLATFORM_LINUX) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) +EXPORT_SYMBOL(GlobalDebugComponents); +EXPORT_SYMBOL(GlobalDebugLevel); +#endif +#endif + +/*------------------Declare variable----------------------- +// Define debug flag array for common debug print macro. */ +u4Byte DBGP_Type[DBGP_TYPE_MAX]; + +/* Define debug print header for every service module. */ +DBGP_HEAD_T DBGP_Head; + + +/*----------------------------------------------------------------------------- + * Function: DBGP_Flag_Init + * + * Overview: Refresh all debug print control flag content to zero. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 10/20/2006 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +extern void DBGP_Flag_Init(void) +{ + u1Byte i; + + for (i = 0; i < DBGP_TYPE_MAX; i++) + { + DBGP_Type[i] = 0; + } + +#if DBG + // 2010/06/02 MH Free build driver can not out any debug message!!! + // Init Debug flag enable condition + + DBGP_Type[FINIT] = \ +// INIT_EEPROM | +// INIT_TxPower | +// INIT_IQK | +// INIT_RF | + 0; + + DBGP_Type[FDM] = \ +// WA_IOT | +// DM_PWDB | +// DM_Monitor | +// DM_DIG | +// DM_EDCA_Turbo | +// DM_BT30 | + 0; + + DBGP_Type[FIOCTL] = \ +// IOCTL_IRP | +// IOCTL_IRP_DETAIL | +// IOCTL_IRP_STATISTICS | +// IOCTL_IRP_HANDLE | +// IOCTL_BT_HCICMD | +// IOCTL_BT_HCICMD_DETAIL | +// IOCTL_BT_HCICMD_EXT | +// IOCTL_BT_EVENT | +// IOCTL_BT_EVENT_DETAIL | +// IOCTL_BT_EVENT_PERIODICAL | +// IOCTL_BT_TX_ACLDATA | +// IOCTL_BT_TX_ACLDATA_DETAIL | +// IOCTL_BT_RX_ACLDATA | +// IOCTL_BT_RX_ACLDATA_DETAIL | +// IOCTL_BT_TP | +// IOCTL_STATE | +// IOCTL_BT_LOGO | +// IOCTL_CALLBACK_FUN | +// IOCTL_PARSE_BT_PKT | + 0; + + DBGP_Type[FBT] = \ +// BT_TRACE | + 0; + + DBGP_Type[FEEPROM] = \ +// EEPROM_W | +// EFUSE_PG | +// EFUSE_READ_ALL | +// EFUSE_ANALYSIS | +// EFUSE_PG_DETAIL | + 0; + + DBGP_Type[FDBG_CTRL] = \ +// DBG_CTRL_TRACE | +// DBG_CTRL_INBAND_NOISE | + 0; + + // 2011/07/20 MH Add for short cut + DBGP_Type[FSHORT_CUT] = \ +// SHCUT_TX | +// SHCUT_RX | + 0; + +#endif + /* Define debug header of every service module. */ + DBGP_Head.pMANS = "\n\r[MANS] "; + DBGP_Head.pRTOS = "\n\r[RTOS] "; + DBGP_Head.pALM = "\n\r[ALM] "; + DBGP_Head.pPEM = "\n\r[PEM] "; + DBGP_Head.pCMPK = "\n\r[CMPK] "; + DBGP_Head.pRAPD = "\n\r[RAPD] "; + DBGP_Head.pTXPB = "\n\r[TXPB] "; + DBGP_Head.pQUMG = "\n\r[QUMG] "; + +} /* DBGP_Flag_Init */ + + +/*----------------------------------------------------------------------------- + * Function: DBG_PrintAllFlag + * + * Overview: Print All debug flag + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +extern void DBG_PrintAllFlag(void) +{ + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 0 FQoS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 1 FTX\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 2 FRX\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 3 FSEC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 4 FMGNT\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 5 FMLME\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 6 FRESOURCE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 7 FBEACON\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 8 FISR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 9 FPHY\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 11 FMP\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 12 FPWR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 13 FDM\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 14 FDBG_CTRL\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 15 FC2H\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("DBGFLAG 16 FBT\n")); +} // DBG_PrintAllFlag + + +extern void DBG_PrintAllComp(void) +{ + u1Byte i; + + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("GlobalDebugComponents Definition\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT0 COMP_TRACE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT1 COMP_DBG\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT2 COMP_INIT\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT3 COMP_OID_QUERY\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT4 COMP_OID_SET\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT5 COMP_RECV\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT6 COMP_SEND\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT7 COMP_IO\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT8 COMP_POWER\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT9 COMP_MLME\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT10 COMP_SCAN\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT11 COMP_SYSTEM\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT12 COMP_SEC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT13 COMP_AP\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT14 COMP_TURBO\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT15 COMP_QOS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT16 COMP_AUTHENTICATOR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT17 COMP_BEACON\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT18 COMP_BEACON\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT19 COMP_RATE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT20 COMP_EVENTS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT21 COMP_FPGA\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT22 COMP_RM\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT23 COMP_MP\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT24 COMP_RXDESC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT25 COMP_CKIP\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT26 COMP_DIG\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT27 COMP_TXAGC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT28 COMP_HIPWR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT29 COMP_HALDM\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT30 COMP_RSNA\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT31 COMP_INDIC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT32 COMP_LED\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT33 COMP_RF\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT34 COMP_HT\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT35 COMP_POWER_TRACKING\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT36 COMP_POWER_TRACKING\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT37 COMP_AMSDU\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT38 COMP_WPS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT39 COMP_RATR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT40 COMP_RESET\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT41 COMP_CMD\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT42 COMP_EFUSE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT43 COMP_MESH_INTERWORKING\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT43 COMP_CCX\n")); + + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("GlobalDebugComponents = %"i64fmt"x\n", GlobalDebugComponents)); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("Enable DBG COMP =")); + for (i = 0; i < 64; i++) + { + if (GlobalDebugComponents & ((u8Byte)0x1 << i) ) + { + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT%02d |\n", i)); + } + } + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("\n")); + +} // DBG_PrintAllComp + + +/*----------------------------------------------------------------------------- + * Function: DBG_PrintFlagEvent + * + * Overview: Print dedicated debug flag event + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +extern void DBG_PrintFlagEvent(u1Byte DbgFlag) +{ + switch(DbgFlag) + { + case FQoS: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 QoS_INIT\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 QoS_VISTA\n")); + break; + + case FTX: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 TX_DESC\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 TX_DESC_TID\n")); + break; + + case FRX: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 RX_DATA\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 RX_PHY_STS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 RX_PHY_SS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 RX_PHY_SQ\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 RX_PHY_ASTS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 5 RX_ERR_LEN\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 6 RX_DEFRAG\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 7 RX_ERR_RATE\n")); + break; + + case FSEC: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("NA\n")); + break; + + case FMGNT: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("NA\n")); + break; + + case FMLME: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 MEDIA_STS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 LINK_STS\n")); + break; + + case FRESOURCE: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 OS_CHK\n")); + break; + + case FBEACON: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 BCN_SHOW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 BCN_PEER\n")); + break; + + case FISR: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 ISR_CHK\n")); + break; + + case FPHY: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 PHY_BBR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 PHY_BBW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 PHY_RFR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 PHY_RFW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 PHY_MACR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 5 PHY_MACW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 6 PHY_ALLR\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 7 PHY_ALLW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 8 PHY_TXPWR\n")); + break; + + case FMP: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 MP_RX\n")); + break; + + case FEEPROM: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 EEPROM_W\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 EFUSE_PG\n")); + break; + + case FPWR: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 LPS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 IPS\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 PWRSW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 PWRHW\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 4 PWRHAL\n")); + break; + + case FDM: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 WA_IOT\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 DM_PWDB\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 DM_Monitor\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 3 DM_DIG\n")); + break; + + case FDBG_CTRL: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 DBG_CTRL_TRACE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 DBG_CTRL_INBAND_NOISE\n")); + break; + + case FC2H: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 C2H_Summary\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 C2H_PacketData\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 2 C2H_ContentData\n")); + break; + + case FBT: + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 0 BT_TRACE\n")); + ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD, ("BIT 1 BT_RFPoll\n")); + break; + + default: + break; + } + +} // DBG_PrintFlagEvent + + +extern void DBG_DumpMem(const u1Byte DbgComp, + const u1Byte DbgLevel, + pu1Byte pMem, + u2Byte Len) +{ + u2Byte i; + + for (i=0;i<((Len>>3) + 1);i++) + { + ODM_RT_TRACE(pDM_Odm,DbgComp, DbgLevel, ("%02X %02X %02X %02X %02X %02X %02X %02X\n", + *(pMem+(i*8)), *(pMem+(i*8+1)), *(pMem+(i*8+2)), *(pMem+(i*8+3)), + *(pMem+(i*8+4)), *(pMem+(i*8+5)), *(pMem+(i*8+6)), *(pMem+(i*8+7)))); + + } +} + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_debug.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_debug.h index 7b7ecfc7ed6a..f8670c9a30e7 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_debug.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_debug.h @@ -1,905 +1,905 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - - -#ifndef __ODM_DBG_H__ -#define __ODM_DBG_H__ - - -//----------------------------------------------------------------------------- -// Define the debug levels -// -// 1. DBG_TRACE and DBG_LOUD are used for normal cases. -// So that, they can help SW engineer to develope or trace states changed -// and also help HW enginner to trace every operation to and from HW, -// e.g IO, Tx, Rx. -// -// 2. DBG_WARNNING and DBG_SERIOUS are used for unusual or error cases, -// which help us to debug SW or HW. -// -//----------------------------------------------------------------------------- -// -// Never used in a call to ODM_RT_TRACE()! -// -#define ODM_DBG_OFF 1 - -// -// Fatal bug. -// For example, Tx/Rx/IO locked up, OS hangs, memory access violation, -// resource allocation failed, unexpected HW behavior, HW BUG and so on. -// -#define ODM_DBG_SERIOUS 2 - -// -// Abnormal, rare, or unexpeted cases. -// For example, IRP/Packet/OID canceled, device suprisely unremoved and so on. -// -#define ODM_DBG_WARNING 3 - -// -// Normal case with useful information about current SW or HW state. -// For example, Tx/Rx descriptor to fill, Tx/Rx descriptor completed status, -// SW protocol state change, dynamic mechanism state change and so on. -// -#define ODM_DBG_LOUD 4 - -// -// Normal case with detail execution flow or information. -// -#define ODM_DBG_TRACE 5 - -//----------------------------------------------------------------------------- -// Define the tracing components -// -//----------------------------------------------------------------------------- -//BB Functions -#define ODM_COMP_DIG BIT0 -#define ODM_COMP_RA_MASK BIT1 -#define ODM_COMP_DYNAMIC_TXPWR BIT2 -#define ODM_COMP_FA_CNT BIT3 -#define ODM_COMP_RSSI_MONITOR BIT4 -#define ODM_COMP_CCK_PD BIT5 -#define ODM_COMP_ANT_DIV BIT6 -#define ODM_COMP_PWR_SAVE BIT7 -#define ODM_COMP_PWR_TRAIN BIT8 -#define ODM_COMP_RATE_ADAPTIVE BIT9 -#define ODM_COMP_PATH_DIV BIT10 -#define ODM_COMP_PSD BIT11 -#define ODM_COMP_DYNAMIC_PRICCA BIT12 -#define ODM_COMP_RXHP BIT13 -//MAC Functions -#define ODM_COMP_EDCA_TURBO BIT16 -#define ODM_COMP_EARLY_MODE BIT17 -//RF Functions -#define ODM_COMP_TX_PWR_TRACK BIT24 -#define ODM_COMP_RX_GAIN_TRACK BIT25 -#define ODM_COMP_CALIBRATION BIT26 -//Common Functions -#define ODM_COMP_COMMON BIT30 -#define ODM_COMP_INIT BIT31 - -/*------------------------Export Marco Definition---------------------------*/ -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) -#define RT_PRINTK DbgPrint -#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - #define DbgPrint printk - #define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args); -#else - #define DbgPrint panic_printk -#define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args); -#endif - -#ifndef ASSERT - #define ASSERT(expr) -#endif - -#if DBG -#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt) \ - if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel)) \ - { \ - if(pDM_Odm->SupportICType == ODM_RTL8192C) \ - DbgPrint("[ODM-92C] "); \ - else if(pDM_Odm->SupportICType == ODM_RTL8192D) \ - DbgPrint("[ODM-92D] "); \ - else if(pDM_Odm->SupportICType == ODM_RTL8723A) \ - DbgPrint("[ODM-8723A] "); \ - else if(pDM_Odm->SupportICType == ODM_RTL8188E) \ - DbgPrint("[ODM-8188E] "); \ - else if(pDM_Odm->SupportICType == ODM_RTL8812) \ - DbgPrint("[ODM-8812] "); \ - else if(pDM_Odm->SupportICType == ODM_RTL8821) \ - DbgPrint("[ODM-8821] "); \ - RT_PRINTK fmt; \ - } - -#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt) \ - if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel)) \ - { \ - RT_PRINTK fmt; \ - } - -#define ODM_RT_ASSERT(pDM_Odm, expr, fmt) \ - if(!(expr)) { \ - DbgPrint( "Assertion failed! %s at ......\n", #expr); \ - DbgPrint( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \ - RT_PRINTK fmt; \ - ASSERT(FALSE); \ - } -#define ODM_dbg_enter() { DbgPrint("==> %s\n", __FUNCTION__); } -#define ODM_dbg_exit() { DbgPrint("<== %s\n", __FUNCTION__); } -#define ODM_dbg_trace(str) { DbgPrint("%s:%s\n", __FUNCTION__, str); } - -#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr) \ - if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel)) \ - { \ - int __i; \ - pu1Byte __ptr = (pu1Byte)ptr; \ - DbgPrint("[ODM] "); \ - DbgPrint(title_str); \ - DbgPrint(" "); \ - for( __i=0; __i<6; __i++ ) \ - DbgPrint("%02X%s", __ptr[__i], (__i==5)?"":"-"); \ - DbgPrint("\n"); \ - } -#else -#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt) -#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt) -#define ODM_RT_ASSERT(pDM_Odm, expr, fmt) -#define ODM_dbg_enter() -#define ODM_dbg_exit() -#define ODM_dbg_trace(str) -#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr) -#endif - - -VOID -ODM_InitDebugSetting( - IN PDM_ODM_T pDM_Odm - ); - - - -#if 0 -#if DBG -#define DbgPrint printk - -#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) \ - { \ - char *szTitle = _TitleString; \ - pu1Byte pbtHexData = _HexData; \ - u4Byte u4bHexDataLen = _HexDataLen; \ - u4Byte __i; \ - DbgPrint("%s", szTitle); \ - for (__i=0;__i=' ' &&_ch<='~' ) // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22. - -#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) \ - if(((_Comp) & ODM_GlobalDebugComponents) && (_Level <= ODM_GlobalDebugLevel)) \ - { \ - int __i; \ - u1Byte buffer[MAX_STR_LEN]; \ - int length = (_Len\n", _Len, buffer); \ - } - -#else // of #if DBG -#define DbgPrint(...) -#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) -#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) -#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr) -#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum) -#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) -#endif // of #if DBG - -#endif - - -#if 0 -/* Define debug print header for every service module.*/ -typedef struct tag_ODM_DBGP_Service_Module_Header_Name_Structure -{ - const char *pMANS; - const char *pRTOS; - const char *pALM; - const char *pPEM; - const char *pCMPK; - const char *pRAPD; - const char *pTXPB; - const char *pQUMG; -}ODM_DBGP_HEAD_T; - - -/* Define different debug flag for dedicated service modules in debug flag array. */ -// Each module has independt 32 bit debug flag you cnn define the flag as yout require. -typedef enum tag_ODM_DBGP_Flag_Type_Definition -{ - ODM_FTX = 0, - ODM_FRX , - ODM_FPHY , - ODM_FPWR , - ODM_FDM , - ODM_FC2H , - ODM_FBT , - ODM_DBGP_TYPE_MAX -}ODM_DBGP_FLAG_E; - - -// Define TX relative debug bit --> FTX -#define ODM_TX_DESC BIT0 -#define ODM_TX_DESC_TID BIT1 -#define ODM_TX_PATH BIT2 - -// Define RX relative debug bit --> FRX -#define ODM_RX_DATA BIT0 -#define ODM_RX_PHY_STS BIT1 -#define ODM_RX_PHY_SS BIT2 -#define ODM_RX_PHY_SQ BIT3 -#define ODM_RX_PHY_ASTS BIT4 -#define ODM_RX_ERR_LEN BIT5 -#define ODM_RX_DEFRAG BIT6 -#define ODM_RX_ERR_RATE BIT7 -#define ODM_RX_PATH BIT8 -#define ODM_RX_BEACON BIT9 - -// Define PHY-BB/RF/MAC check module bit --> FPHY -#define ODM_PHY_BBR BIT0 -#define ODM_PHY_BBW BIT1 -#define ODM_PHY_RFR BIT2 -#define ODM_PHY_RFW BIT3 -#define ODM_PHY_MACR BIT4 -#define ODM_PHY_MACW BIT5 -#define ODM_PHY_ALLR BIT6 -#define ODM_PHY_ALLW BIT7 -#define ODM_PHY_TXPWR BIT8 -#define ODM_PHY_PWRDIFF BIT9 -#define ODM_PHY_SICR BIT10 -#define ODM_PHY_SICW BIT11 - - - - -extern u4Byte ODM_GlobalDebugLevel; - - -#if DBG -extern u8Byte ODM_GlobalDebugComponents; -#endif -#endif -#if 0 - -//----------------------------------------------------------------------------- -// Define the debug levels -// -// 1. DBG_TRACE and DBG_LOUD are used for normal cases. -// So that, they can help SW engineer to develope or trace states changed -// and also help HW enginner to trace every operation to and from HW, -// e.g IO, Tx, Rx. -// -// 2. DBG_WARNNING and DBG_SERIOUS are used for unusual or error cases, -// which help us to debug SW or HW. -// -//----------------------------------------------------------------------------- -// -// Never used in a call to ODM_RT_TRACE(pDM_Odm,)! -// -#define DBG_OFF 0 - -// -// Deprecated! Don't use it! -// TODO: fix related debug message! -// -//#define DBG_SEC 1 - -// -// Fatal bug. -// For example, Tx/Rx/IO locked up, OS hangs, memory access violation, -// resource allocation failed, unexpected HW behavior, HW BUG and so on. -// -#define DBG_SERIOUS 2 - -// -// Abnormal, rare, or unexpeted cases. -// For example, IRP/Packet/OID canceled, device suprisely unremoved and so on. -// -#define DBG_WARNING 3 - -// -// Normal case with useful information about current SW or HW state. -// For example, Tx/Rx descriptor to fill, Tx/Rx descriptor completed status, -// SW protocol state change, dynamic mechanism state change and so on. -// -#define DBG_LOUD 4 - -// -// Normal case with detail execution flow or information. -// -#define DBG_TRACE 5 - - - -//----------------------------------------------------------------------------- -// Define the tracing components -// -//----------------------------------------------------------------------------- -#define COMP_TRACE BIT0 // For function call tracing. -#define COMP_DBG BIT1 // Only for temporary debug message. -#define COMP_INIT BIT2 // during driver initialization / halt / reset. -#define COMP_OID_QUERY BIT3 // Query OID. -#define COMP_OID_SET BIT4 // Set OID. -#define COMP_RECV BIT5 // Reveive part data path. -#define COMP_SEND BIT6 // Send part path. -#define COMP_IO BIT7 // I/O Related. Added by Annie, 2006-03-02. -#define COMP_POWER BIT8 // 802.11 Power Save mode or System/Device Power state related. -#define COMP_MLME BIT9 // 802.11 link related: join/start BSS, leave BSS. -#define COMP_SCAN BIT10 // For site survey. -#define COMP_SYSTEM BIT11 // For general platform function. -#define COMP_SEC BIT12 // For Security. -#define COMP_AP BIT13 // For AP mode related. -#define COMP_TURBO BIT14 // For Turbo Mode related. By Annie, 2005-10-21. -#define COMP_QOS BIT15 // For QoS. -#define COMP_AUTHENTICATOR BIT16 // For AP mode Authenticator. Added by Annie, 2006-01-30. -#define COMP_BEACON BIT17 // For Beacon related, by rcnjko. -#define COMP_ANTENNA BIT18 // For Antenna diversity related, by rcnjko. -#define COMP_RATE BIT19 // For Rate Adaptive mechanism, 2006.07.02, by rcnjko. #define COMP_EVENTS 0x00000080 // Event handling -#define COMP_EVENTS BIT20 // Event handling -#define COMP_FPGA BIT21 // For FPGA verfication -#define COMP_RM BIT22 // For Radio Measurement. -#define COMP_MP BIT23 // For mass production test, by shien chang, 2006.07.13 -#define COMP_RXDESC BIT24 // Show Rx desc information for SD3 debug. Added by Annie, 2006-07-15. -#define COMP_CKIP BIT25 // For CCX 1 S13: CKIP. Added by Annie, 2006-08-14. -#define COMP_DIG BIT26 // For DIG, 2006.09.25, by rcnjko. -#define COMP_TXAGC BIT27 // For Tx power, 060928, by rcnjko. -#define COMP_HIPWR BIT28 // For High Power Mechanism, 060928, by rcnjko. -#define COMP_HALDM BIT29 // For HW Dynamic Mechanism, 061010, by rcnjko. -#define COMP_RSNA BIT30 // For RSNA IBSS , 061201, by CCW. -#define COMP_INDIC BIT31 // For link indication -#define COMP_LED BIT32 // For LED. -#define COMP_RF BIT33 // For RF. -//1!!!!!!!!!!!!!!!!!!!!!!!!!!! -//1//1Attention Please!!!<11n or 8190 specific code should be put below this line> -//1!!!!!!!!!!!!!!!!!!!!!!!!!!! - -#define COMP_HT BIT34 // For 802.11n HT related information. by Emily 2006-8-11 -#define COMP_POWER_TRACKING BIT35 //FOR 8190 TX POWER TRACKING -#define COMP_RX_REORDER BIT36 // 8190 Rx Reorder -#define COMP_AMSDU BIT37 // For A-MSDU Debugging -#define COMP_WPS BIT38 //WPS Debug Message -#define COMP_RATR BIT39 -#define COMP_RESET BIT40 -// For debug command to print on dbgview!! -#define COMP_CMD BIT41 -#define COMP_EFUSE BIT42 -#define COMP_MESH_INTERWORKING BIT43 -#define COMP_CCX BIT44 //CCX Debug Flag -#define COMP_IOCTL BIT45 // IO Control -#define COMP_GP BIT46 // For generic parser. -#define COMP_TXAGG BIT47 -#define COMP_HVL BIT48 // For Ndis 6.2 Context Swirch and Hardware Virtualiztion Layer -#define COMP_TEST BIT49 -#define COMP_BB_POWERSAVING BIT50 -#define COMP_SWAS BIT51 // For SW Antenna Switch -#define COMP_P2P BIT52 -#define COMP_MUX BIT53 -#define COMP_FUNC BIT54 -#define COMP_TDLS BIT55 -#define COMP_OMNIPEEK BIT56 -#define COMP_DUALMACSWITCH BIT60 // 2010/12/27 Add for Dual mac mode debug -#define COMP_EASY_CONCURRENT BIT61 // 2010/12/27 Add for easy cncurrent mode debug -#define COMP_PSD BIT63 //2011/3/9 Add for WLAN PSD for BT AFH - -#define COMP_DFS BIT62 - -#define COMP_ALL UINT64_C(0xFFFFFFFFFFFFFFFF) // All components -// For debug print flag to use -/*------------------------------Define structure----------------------------*/ -/* 2007/07/13 MH *//*------For DeBuG Print modeue------*/ - -/* Defnie structure to store different debug flag variable. Every debug flag - is a UINT32 integer and you can assign 32 different events. */ -typedef struct tag_DBGP_Debug_Flag_Structure -{ - u4Byte Mans; /* Main Scheduler module. */ - u4Byte Rtos; /* RTOS module. */ - u4Byte Alarm; /* Alarm module. */ - u4Byte Pm; /* Performance monitor module. */ -}DBGP_FLAG_T; - -/* Define debug print header for every service module.*/ -typedef struct tag_DBGP_Service_Module_Header_Name_Structure -{ - const char *pMANS; - const char *pRTOS; - const char *pALM; - const char *pPEM; - const char *pCMPK; - const char *pRAPD; - const char *pTXPB; - const char *pQUMG; -}DBGP_HEAD_T; - - -/* Define different debug flag for dedicated service modules in debug flag array. */ -// Each module has independt 32 bit debug flag you cnn define the flag as yout require. -typedef enum tag_DBGP_Flag_Type_Definition -{ - FQoS = 0, - FTX = 1, - FRX = 2, - FSEC = 3, - FMGNT = 4, - FMLME = 5, - FRESOURCE = 6, - FBEACON = 7, - FISR = 8, - FPHY = 9, - FMP = 10, - FEEPROM = 11, - FPWR = 12, - FDM = 13, - FDBG_CTRL = 14, - FC2H = 15, - FBT = 16, - FINIT = 17, - FIOCTL = 18, - FSHORT_CUT = 19, - DBGP_TYPE_MAX -}DBGP_FLAG_E; - - -// Define Qos Relative debug flag bit --> FQoS -#define QoS_INIT BIT0 -#define QoS_VISTA BIT1 - -// Define TX relative debug bit --> FTX -#define TX_DESC BIT0 -#define TX_DESC_TID BIT1 -#define TX_PATH BIT2 - -// Define RX relative debug bit --> FRX -#define RX_DATA BIT0 -#define RX_PHY_STS BIT1 -#define RX_PHY_SS BIT2 -#define RX_PHY_SQ BIT3 -#define RX_PHY_ASTS BIT4 -#define RX_ERR_LEN BIT5 -#define RX_DEFRAG BIT6 -#define RX_ERR_RATE BIT7 -#define RX_PATH BIT8 -#define RX_BEACON BIT9 - -// Define Security relative debug bit --> FSEC - -// Define MGNT relative debug bit --> FMGNT - -// Define MLME relative debug bit --> FMLME -#define MEDIA_STS BIT0 -#define LINK_STS BIT1 - -// Define OS resource check module bit --> FRESOURCE -#define OS_CHK BIT0 - -// Define beacon content check module bit --> FBEACON -#define BCN_SHOW BIT0 -#define BCN_PEER BIT1 - -// Define ISR/IMR check module bit --> FISR -#define ISR_CHK BIT0 - -// Define PHY-BB/RF/MAC check module bit --> FPHY -#define PHY_BBR BIT0 -#define PHY_BBW BIT1 -#define PHY_RFR BIT2 -#define PHY_RFW BIT3 -#define PHY_MACR BIT4 -#define PHY_MACW BIT5 -#define PHY_ALLR BIT6 -#define PHY_ALLW BIT7 -#define PHY_TXPWR BIT8 -#define PHY_PWRDIFF BIT9 -#define PHY_SICR BIT10 -#define PHY_SICW BIT11 - -// Define MPT driver check module bit --> FMP -#define MP_RX BIT0 -#define MP_SWICH_CH BIT1 - -// Define EEPROM and EFUSE check module bit --> FEEPROM -#define EEPROM_W BIT0 -#define EFUSE_PG BIT1 -#define EFUSE_READ_ALL BIT2 -#define EFUSE_ANALYSIS BIT3 -#define EFUSE_PG_DETAIL BIT4 - -// Define power save check module bit --> FPWR -#define LPS BIT0 -#define IPS BIT1 -#define PWRSW BIT2 -#define PWRHW BIT3 -#define PWRHAL BIT4 - -// Define Dynamic Mechanism check module bit --> FDM -#define WA_IOT BIT0 -#define DM_PWDB BIT1 -#define DM_Monitor BIT2 -#define DM_DIG BIT3 -#define DM_EDCA_Turbo BIT4 -#define DM_BT30 BIT5 - -// Define Dbg Control module bit --> FDBG_CTRL -#define DBG_CTRL_TRACE BIT0 -#define DBG_CTRL_INBAND_NOISE BIT1 - -// Define FW C2H Cmd check module bit --> FC2H -#define C2H_Summary BIT0 -#define C2H_PacketData BIT1 -#define C2H_ContentData BIT2 -// Define BT Cmd check module bit --> FBT -#define BT_TRACE BIT0 -#define BT_RFPoll BIT1 - -// Define init check for module bit --> FINIT -#define INIT_EEPROM BIT0 -#define INIT_TxPower BIT1 -#define INIT_IQK BIT2 -#define INIT_RF BIT3 - -// Define IOCTL Cmd check module bit --> FIOCTL -// section 1 : IRP related -#define IOCTL_IRP BIT0 -#define IOCTL_IRP_DETAIL BIT1 -#define IOCTL_IRP_STATISTICS BIT2 -#define IOCTL_IRP_HANDLE BIT3 -// section 2 : HCI command/event -#define IOCTL_BT_HCICMD BIT8 -#define IOCTL_BT_HCICMD_DETAIL BIT9 -#define IOCTL_BT_HCICMD_EXT BIT10 -#define IOCTL_BT_EVENT BIT11 -#define IOCTL_BT_EVENT_DETAIL BIT12 -#define IOCTL_BT_EVENT_PERIODICAL BIT13 -// section 3 : BT tx/rx data and throughput -#define IOCTL_BT_TX_ACLDATA BIT16 -#define IOCTL_BT_TX_ACLDATA_DETAIL BIT17 -#define IOCTL_BT_RX_ACLDATA BIT18 -#define IOCTL_BT_RX_ACLDATA_DETAIL BIT19 -#define IOCTL_BT_TP BIT20 -// section 4 : BT connection state machine. -#define IOCTL_STATE BIT21 -#define IOCTL_BT_LOGO BIT22 -// section 5 : BT function trace -#define IOCTL_CALLBACK_FUN BIT24 -#define IOCTL_PARSE_BT_PKT BIT25 -#define IOCTL_BT_TX_PKT BIT26 -#define IOCTL_BT_FLAG_MON BIT27 - -// -// Define init check for module bit --> FSHORT_CUT -// 2011/07/20 MH Add for short but definition. -// -#define SHCUT_TX BIT0 -#define SHCUT_RX BIT1 - - -/* 2007/07/13 MH *//*------For DeBuG Print modeue------*/ -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export Marco Definition---------------------------*/ -#if (DM_ODM_SUPPORT_TYPE != ODM_MP) -#define RT_PRINTK(fmt, args...) printk( "%s(): " fmt, __FUNCTION__, ## args); - -#if DBG -#define ODM_RT_TRACE(pDM_Odm,comp, level, fmt) \ - if(((comp) & GlobalDebugComponents) && (level <= GlobalDebugLevel)) \ - { \ - RT_PRINTK fmt; \ - } - -#define RT_TRACE_F(comp, level, fmt) \ - if(((comp) & GlobalDebugComponents) && (level <= GlobalDebugLevel)) \ - { \ - RT_PRINTK fmt; \ - } - -#define RT_ASSERT(expr,fmt) \ - if(!(expr)) { \ - printk( "Assertion failed! %s at ......\n", #expr); \ - printk( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \ - } -#define dbg_enter() { printk("==> %s\n", __FUNCTION__); } -#define dbg_exit() { printk("<== %s\n", __FUNCTION__); } -#define dbg_trace(str) { printk("%s:%s\n", __FUNCTION__, str); } -#else -#define ODM_RT_TRACE(pDM_Odm,comp, level, fmt) -#define RT_TRACE_F(comp, level, fmt) -#define RT_ASSERT(expr, fmt) -#define dbg_enter() -#define dbg_exit() -#define dbg_trace(str) -#endif - -#if DBG -#define DbgPrint printk - -#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) \ - { \ - char *szTitle = _TitleString; \ - pu1Byte pbtHexData = _HexData; \ - u4Byte u4bHexDataLen = _HexDataLen; \ - u4Byte __i; \ - DbgPrint("%s", szTitle); \ - for (__i=0;__i=' ' &&_ch<='~' ) // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22. - -#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) \ - if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) \ - { \ - int __i; \ - u1Byte buffer[MAX_STR_LEN]; \ - int length = (_Len\n", _Len, buffer); \ - } - -#else // of #if DBG -#define DbgPrint(...) -#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) -#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) -#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr) -#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum) -#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) -#endif // of #if DBG - - - -#endif // #if (DM_ODM_SUPPORT_TYPE != ODM_MP) - -#define DEBUG_PRINT 1 - -// Please add new OS's print API by yourself - -//#if (RT_PLATFORM==PLATFORM_WINDOWS) -#if (DEBUG_PRINT == 1) && DBG -#define RTPRINT(dbgtype, dbgflag, printstr)\ -{\ - if (DBGP_Type[dbgtype] & dbgflag)\ - {\ - DbgPrint printstr;\ - }\ -} - -#define RTPRINT_ADDR(dbgtype, dbgflag, printstr, _Ptr)\ -{\ - if (DBGP_Type[dbgtype] & dbgflag)\ - {\ - int __i; \ - pu1Byte ptr = (pu1Byte)_Ptr; \ - DbgPrint printstr; \ - DbgPrint(" "); \ - for( __i=0; __i<6; __i++ ) \ - DbgPrint("%02X%s", ptr[__i], (__i==5)?"":"-"); \ - DbgPrint("\n"); \ - }\ -} - -#define RTPRINT_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)\ -{\ - if (DBGP_Type[dbgtype] & dbgflag)\ - {\ - int __i; \ - pu1Byte ptr = (pu1Byte)_HexData; \ - DbgPrint(_TitleString); \ - for( __i=0; __i<(int)_HexDataLen; __i++ ) \ - { \ - DbgPrint("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?" ":" ");\ - if (((__i + 1) % 16) == 0) DbgPrint("\n");\ - } \ - DbgPrint("\n"); \ - }\ -} -#define FuncEntry FunctionIn(COMP_FUNC) -#define FuncExit FunctionOut(COMP_FUNC) - -#define FunctionIn(_comp) ODM_RT_TRACE(pDM_Odm,(_comp), DBG_LOUD, ("==========> %s\n", __FUNCTION__)) -#define FunctionOut(_comp) ODM_RT_TRACE(pDM_Odm,(_comp), DBG_LOUD, ("<========== %s\n", __FUNCTION__)) - - -#else - -#define DBGP(dbgtype, dbgflag, printstr) -#define RTPRINT(dbgtype, dbgflag, printstr) -#define RTPRINT_ADDR(dbgtype, dbgflag, printstr, _Ptr) -#define RTPRINT_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen) -#define FuncEntry -#define FuncExit -#define FunctionIn(_comp) -#define FunctionOut(_comp) -#endif -/*------------------------Export Marco Definition---------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -extern u4Byte DBGP_Type[DBGP_TYPE_MAX]; -extern DBGP_HEAD_T DBGP_Head; - -/*------------------------Export global variable----------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ -extern void DBGP_Flag_Init(void); -extern void DBG_PrintAllFlag(void); -extern void DBG_PrintAllComp(void); -extern void DBG_PrintFlagEvent(u1Byte DbgFlag); -extern void DBG_DumpMem(const u1Byte DbgComp, - const u1Byte DbgLevel, - pu1Byte pMem, - u2Byte Len); - -/*--------------------------Exported Function prototype---------------------*/ - - - - - - - - - -extern u4Byte GlobalDebugLevel; -extern u8Byte GlobalDebugComponents; - - -#endif - - -#endif // __ODM_DBG_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __ODM_DBG_H__ +#define __ODM_DBG_H__ + + +//----------------------------------------------------------------------------- +// Define the debug levels +// +// 1. DBG_TRACE and DBG_LOUD are used for normal cases. +// So that, they can help SW engineer to develope or trace states changed +// and also help HW enginner to trace every operation to and from HW, +// e.g IO, Tx, Rx. +// +// 2. DBG_WARNNING and DBG_SERIOUS are used for unusual or error cases, +// which help us to debug SW or HW. +// +//----------------------------------------------------------------------------- +// +// Never used in a call to ODM_RT_TRACE()! +// +#define ODM_DBG_OFF 1 + +// +// Fatal bug. +// For example, Tx/Rx/IO locked up, OS hangs, memory access violation, +// resource allocation failed, unexpected HW behavior, HW BUG and so on. +// +#define ODM_DBG_SERIOUS 2 + +// +// Abnormal, rare, or unexpeted cases. +// For example, IRP/Packet/OID canceled, device suprisely unremoved and so on. +// +#define ODM_DBG_WARNING 3 + +// +// Normal case with useful information about current SW or HW state. +// For example, Tx/Rx descriptor to fill, Tx/Rx descriptor completed status, +// SW protocol state change, dynamic mechanism state change and so on. +// +#define ODM_DBG_LOUD 4 + +// +// Normal case with detail execution flow or information. +// +#define ODM_DBG_TRACE 5 + +//----------------------------------------------------------------------------- +// Define the tracing components +// +//----------------------------------------------------------------------------- +//BB Functions +#define ODM_COMP_DIG BIT0 +#define ODM_COMP_RA_MASK BIT1 +#define ODM_COMP_DYNAMIC_TXPWR BIT2 +#define ODM_COMP_FA_CNT BIT3 +#define ODM_COMP_RSSI_MONITOR BIT4 +#define ODM_COMP_CCK_PD BIT5 +#define ODM_COMP_ANT_DIV BIT6 +#define ODM_COMP_PWR_SAVE BIT7 +#define ODM_COMP_PWR_TRAIN BIT8 +#define ODM_COMP_RATE_ADAPTIVE BIT9 +#define ODM_COMP_PATH_DIV BIT10 +#define ODM_COMP_PSD BIT11 +#define ODM_COMP_DYNAMIC_PRICCA BIT12 +#define ODM_COMP_RXHP BIT13 +//MAC Functions +#define ODM_COMP_EDCA_TURBO BIT16 +#define ODM_COMP_EARLY_MODE BIT17 +//RF Functions +#define ODM_COMP_TX_PWR_TRACK BIT24 +#define ODM_COMP_RX_GAIN_TRACK BIT25 +#define ODM_COMP_CALIBRATION BIT26 +//Common Functions +#define ODM_COMP_COMMON BIT30 +#define ODM_COMP_INIT BIT31 + +/*------------------------Export Marco Definition---------------------------*/ +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) +#define RT_PRINTK DbgPrint +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + #define DbgPrint printk + #define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args); +#else + #define DbgPrint panic_printk +#define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args); +#endif + +#ifndef ASSERT + #define ASSERT(expr) +#endif + +#if DBG +#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt) \ + if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel)) \ + { \ + if(pDM_Odm->SupportICType == ODM_RTL8192C) \ + DbgPrint("[ODM-92C] "); \ + else if(pDM_Odm->SupportICType == ODM_RTL8192D) \ + DbgPrint("[ODM-92D] "); \ + else if(pDM_Odm->SupportICType == ODM_RTL8723A) \ + DbgPrint("[ODM-8723A] "); \ + else if(pDM_Odm->SupportICType == ODM_RTL8188E) \ + DbgPrint("[ODM-8188E] "); \ + else if(pDM_Odm->SupportICType == ODM_RTL8812) \ + DbgPrint("[ODM-8812] "); \ + else if(pDM_Odm->SupportICType == ODM_RTL8821) \ + DbgPrint("[ODM-8821] "); \ + RT_PRINTK fmt; \ + } + +#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt) \ + if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel)) \ + { \ + RT_PRINTK fmt; \ + } + +#define ODM_RT_ASSERT(pDM_Odm, expr, fmt) \ + if(!(expr)) { \ + DbgPrint( "Assertion failed! %s at ......\n", #expr); \ + DbgPrint( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \ + RT_PRINTK fmt; \ + ASSERT(FALSE); \ + } +#define ODM_dbg_enter() { DbgPrint("==> %s\n", __FUNCTION__); } +#define ODM_dbg_exit() { DbgPrint("<== %s\n", __FUNCTION__); } +#define ODM_dbg_trace(str) { DbgPrint("%s:%s\n", __FUNCTION__, str); } + +#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr) \ + if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel)) \ + { \ + int __i; \ + pu1Byte __ptr = (pu1Byte)ptr; \ + DbgPrint("[ODM] "); \ + DbgPrint(title_str); \ + DbgPrint(" "); \ + for( __i=0; __i<6; __i++ ) \ + DbgPrint("%02X%s", __ptr[__i], (__i==5)?"":"-"); \ + DbgPrint("\n"); \ + } +#else +#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt) +#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt) +#define ODM_RT_ASSERT(pDM_Odm, expr, fmt) +#define ODM_dbg_enter() +#define ODM_dbg_exit() +#define ODM_dbg_trace(str) +#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr) +#endif + + +VOID +ODM_InitDebugSetting( + IN PDM_ODM_T pDM_Odm + ); + + + +#if 0 +#if DBG +#define DbgPrint printk + +#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) \ + { \ + char *szTitle = _TitleString; \ + pu1Byte pbtHexData = _HexData; \ + u4Byte u4bHexDataLen = _HexDataLen; \ + u4Byte __i; \ + DbgPrint("%s", szTitle); \ + for (__i=0;__i=' ' &&_ch<='~' ) // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22. + +#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) \ + if(((_Comp) & ODM_GlobalDebugComponents) && (_Level <= ODM_GlobalDebugLevel)) \ + { \ + int __i; \ + u1Byte buffer[MAX_STR_LEN]; \ + int length = (_Len\n", _Len, buffer); \ + } + +#else // of #if DBG +#define DbgPrint(...) +#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) +#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) +#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr) +#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum) +#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) +#endif // of #if DBG + +#endif + + +#if 0 +/* Define debug print header for every service module.*/ +typedef struct tag_ODM_DBGP_Service_Module_Header_Name_Structure +{ + const char *pMANS; + const char *pRTOS; + const char *pALM; + const char *pPEM; + const char *pCMPK; + const char *pRAPD; + const char *pTXPB; + const char *pQUMG; +}ODM_DBGP_HEAD_T; + + +/* Define different debug flag for dedicated service modules in debug flag array. */ +// Each module has independt 32 bit debug flag you cnn define the flag as yout require. +typedef enum tag_ODM_DBGP_Flag_Type_Definition +{ + ODM_FTX = 0, + ODM_FRX , + ODM_FPHY , + ODM_FPWR , + ODM_FDM , + ODM_FC2H , + ODM_FBT , + ODM_DBGP_TYPE_MAX +}ODM_DBGP_FLAG_E; + + +// Define TX relative debug bit --> FTX +#define ODM_TX_DESC BIT0 +#define ODM_TX_DESC_TID BIT1 +#define ODM_TX_PATH BIT2 + +// Define RX relative debug bit --> FRX +#define ODM_RX_DATA BIT0 +#define ODM_RX_PHY_STS BIT1 +#define ODM_RX_PHY_SS BIT2 +#define ODM_RX_PHY_SQ BIT3 +#define ODM_RX_PHY_ASTS BIT4 +#define ODM_RX_ERR_LEN BIT5 +#define ODM_RX_DEFRAG BIT6 +#define ODM_RX_ERR_RATE BIT7 +#define ODM_RX_PATH BIT8 +#define ODM_RX_BEACON BIT9 + +// Define PHY-BB/RF/MAC check module bit --> FPHY +#define ODM_PHY_BBR BIT0 +#define ODM_PHY_BBW BIT1 +#define ODM_PHY_RFR BIT2 +#define ODM_PHY_RFW BIT3 +#define ODM_PHY_MACR BIT4 +#define ODM_PHY_MACW BIT5 +#define ODM_PHY_ALLR BIT6 +#define ODM_PHY_ALLW BIT7 +#define ODM_PHY_TXPWR BIT8 +#define ODM_PHY_PWRDIFF BIT9 +#define ODM_PHY_SICR BIT10 +#define ODM_PHY_SICW BIT11 + + + + +extern u4Byte ODM_GlobalDebugLevel; + + +#if DBG +extern u8Byte ODM_GlobalDebugComponents; +#endif +#endif +#if 0 + +//----------------------------------------------------------------------------- +// Define the debug levels +// +// 1. DBG_TRACE and DBG_LOUD are used for normal cases. +// So that, they can help SW engineer to develope or trace states changed +// and also help HW enginner to trace every operation to and from HW, +// e.g IO, Tx, Rx. +// +// 2. DBG_WARNNING and DBG_SERIOUS are used for unusual or error cases, +// which help us to debug SW or HW. +// +//----------------------------------------------------------------------------- +// +// Never used in a call to ODM_RT_TRACE(pDM_Odm,)! +// +#define DBG_OFF 0 + +// +// Deprecated! Don't use it! +// TODO: fix related debug message! +// +//#define DBG_SEC 1 + +// +// Fatal bug. +// For example, Tx/Rx/IO locked up, OS hangs, memory access violation, +// resource allocation failed, unexpected HW behavior, HW BUG and so on. +// +#define DBG_SERIOUS 2 + +// +// Abnormal, rare, or unexpeted cases. +// For example, IRP/Packet/OID canceled, device suprisely unremoved and so on. +// +#define DBG_WARNING 3 + +// +// Normal case with useful information about current SW or HW state. +// For example, Tx/Rx descriptor to fill, Tx/Rx descriptor completed status, +// SW protocol state change, dynamic mechanism state change and so on. +// +#define DBG_LOUD 4 + +// +// Normal case with detail execution flow or information. +// +#define DBG_TRACE 5 + + + +//----------------------------------------------------------------------------- +// Define the tracing components +// +//----------------------------------------------------------------------------- +#define COMP_TRACE BIT0 // For function call tracing. +#define COMP_DBG BIT1 // Only for temporary debug message. +#define COMP_INIT BIT2 // during driver initialization / halt / reset. +#define COMP_OID_QUERY BIT3 // Query OID. +#define COMP_OID_SET BIT4 // Set OID. +#define COMP_RECV BIT5 // Reveive part data path. +#define COMP_SEND BIT6 // Send part path. +#define COMP_IO BIT7 // I/O Related. Added by Annie, 2006-03-02. +#define COMP_POWER BIT8 // 802.11 Power Save mode or System/Device Power state related. +#define COMP_MLME BIT9 // 802.11 link related: join/start BSS, leave BSS. +#define COMP_SCAN BIT10 // For site survey. +#define COMP_SYSTEM BIT11 // For general platform function. +#define COMP_SEC BIT12 // For Security. +#define COMP_AP BIT13 // For AP mode related. +#define COMP_TURBO BIT14 // For Turbo Mode related. By Annie, 2005-10-21. +#define COMP_QOS BIT15 // For QoS. +#define COMP_AUTHENTICATOR BIT16 // For AP mode Authenticator. Added by Annie, 2006-01-30. +#define COMP_BEACON BIT17 // For Beacon related, by rcnjko. +#define COMP_ANTENNA BIT18 // For Antenna diversity related, by rcnjko. +#define COMP_RATE BIT19 // For Rate Adaptive mechanism, 2006.07.02, by rcnjko. #define COMP_EVENTS 0x00000080 // Event handling +#define COMP_EVENTS BIT20 // Event handling +#define COMP_FPGA BIT21 // For FPGA verfication +#define COMP_RM BIT22 // For Radio Measurement. +#define COMP_MP BIT23 // For mass production test, by shien chang, 2006.07.13 +#define COMP_RXDESC BIT24 // Show Rx desc information for SD3 debug. Added by Annie, 2006-07-15. +#define COMP_CKIP BIT25 // For CCX 1 S13: CKIP. Added by Annie, 2006-08-14. +#define COMP_DIG BIT26 // For DIG, 2006.09.25, by rcnjko. +#define COMP_TXAGC BIT27 // For Tx power, 060928, by rcnjko. +#define COMP_HIPWR BIT28 // For High Power Mechanism, 060928, by rcnjko. +#define COMP_HALDM BIT29 // For HW Dynamic Mechanism, 061010, by rcnjko. +#define COMP_RSNA BIT30 // For RSNA IBSS , 061201, by CCW. +#define COMP_INDIC BIT31 // For link indication +#define COMP_LED BIT32 // For LED. +#define COMP_RF BIT33 // For RF. +//1!!!!!!!!!!!!!!!!!!!!!!!!!!! +//1//1Attention Please!!!<11n or 8190 specific code should be put below this line> +//1!!!!!!!!!!!!!!!!!!!!!!!!!!! + +#define COMP_HT BIT34 // For 802.11n HT related information. by Emily 2006-8-11 +#define COMP_POWER_TRACKING BIT35 //FOR 8190 TX POWER TRACKING +#define COMP_RX_REORDER BIT36 // 8190 Rx Reorder +#define COMP_AMSDU BIT37 // For A-MSDU Debugging +#define COMP_WPS BIT38 //WPS Debug Message +#define COMP_RATR BIT39 +#define COMP_RESET BIT40 +// For debug command to print on dbgview!! +#define COMP_CMD BIT41 +#define COMP_EFUSE BIT42 +#define COMP_MESH_INTERWORKING BIT43 +#define COMP_CCX BIT44 //CCX Debug Flag +#define COMP_IOCTL BIT45 // IO Control +#define COMP_GP BIT46 // For generic parser. +#define COMP_TXAGG BIT47 +#define COMP_HVL BIT48 // For Ndis 6.2 Context Swirch and Hardware Virtualiztion Layer +#define COMP_TEST BIT49 +#define COMP_BB_POWERSAVING BIT50 +#define COMP_SWAS BIT51 // For SW Antenna Switch +#define COMP_P2P BIT52 +#define COMP_MUX BIT53 +#define COMP_FUNC BIT54 +#define COMP_TDLS BIT55 +#define COMP_OMNIPEEK BIT56 +#define COMP_DUALMACSWITCH BIT60 // 2010/12/27 Add for Dual mac mode debug +#define COMP_EASY_CONCURRENT BIT61 // 2010/12/27 Add for easy cncurrent mode debug +#define COMP_PSD BIT63 //2011/3/9 Add for WLAN PSD for BT AFH + +#define COMP_DFS BIT62 + +#define COMP_ALL UINT64_C(0xFFFFFFFFFFFFFFFF) // All components +// For debug print flag to use +/*------------------------------Define structure----------------------------*/ +/* 2007/07/13 MH *//*------For DeBuG Print modeue------*/ + +/* Defnie structure to store different debug flag variable. Every debug flag + is a UINT32 integer and you can assign 32 different events. */ +typedef struct tag_DBGP_Debug_Flag_Structure +{ + u4Byte Mans; /* Main Scheduler module. */ + u4Byte Rtos; /* RTOS module. */ + u4Byte Alarm; /* Alarm module. */ + u4Byte Pm; /* Performance monitor module. */ +}DBGP_FLAG_T; + +/* Define debug print header for every service module.*/ +typedef struct tag_DBGP_Service_Module_Header_Name_Structure +{ + const char *pMANS; + const char *pRTOS; + const char *pALM; + const char *pPEM; + const char *pCMPK; + const char *pRAPD; + const char *pTXPB; + const char *pQUMG; +}DBGP_HEAD_T; + + +/* Define different debug flag for dedicated service modules in debug flag array. */ +// Each module has independt 32 bit debug flag you cnn define the flag as yout require. +typedef enum tag_DBGP_Flag_Type_Definition +{ + FQoS = 0, + FTX = 1, + FRX = 2, + FSEC = 3, + FMGNT = 4, + FMLME = 5, + FRESOURCE = 6, + FBEACON = 7, + FISR = 8, + FPHY = 9, + FMP = 10, + FEEPROM = 11, + FPWR = 12, + FDM = 13, + FDBG_CTRL = 14, + FC2H = 15, + FBT = 16, + FINIT = 17, + FIOCTL = 18, + FSHORT_CUT = 19, + DBGP_TYPE_MAX +}DBGP_FLAG_E; + + +// Define Qos Relative debug flag bit --> FQoS +#define QoS_INIT BIT0 +#define QoS_VISTA BIT1 + +// Define TX relative debug bit --> FTX +#define TX_DESC BIT0 +#define TX_DESC_TID BIT1 +#define TX_PATH BIT2 + +// Define RX relative debug bit --> FRX +#define RX_DATA BIT0 +#define RX_PHY_STS BIT1 +#define RX_PHY_SS BIT2 +#define RX_PHY_SQ BIT3 +#define RX_PHY_ASTS BIT4 +#define RX_ERR_LEN BIT5 +#define RX_DEFRAG BIT6 +#define RX_ERR_RATE BIT7 +#define RX_PATH BIT8 +#define RX_BEACON BIT9 + +// Define Security relative debug bit --> FSEC + +// Define MGNT relative debug bit --> FMGNT + +// Define MLME relative debug bit --> FMLME +#define MEDIA_STS BIT0 +#define LINK_STS BIT1 + +// Define OS resource check module bit --> FRESOURCE +#define OS_CHK BIT0 + +// Define beacon content check module bit --> FBEACON +#define BCN_SHOW BIT0 +#define BCN_PEER BIT1 + +// Define ISR/IMR check module bit --> FISR +#define ISR_CHK BIT0 + +// Define PHY-BB/RF/MAC check module bit --> FPHY +#define PHY_BBR BIT0 +#define PHY_BBW BIT1 +#define PHY_RFR BIT2 +#define PHY_RFW BIT3 +#define PHY_MACR BIT4 +#define PHY_MACW BIT5 +#define PHY_ALLR BIT6 +#define PHY_ALLW BIT7 +#define PHY_TXPWR BIT8 +#define PHY_PWRDIFF BIT9 +#define PHY_SICR BIT10 +#define PHY_SICW BIT11 + +// Define MPT driver check module bit --> FMP +#define MP_RX BIT0 +#define MP_SWICH_CH BIT1 + +// Define EEPROM and EFUSE check module bit --> FEEPROM +#define EEPROM_W BIT0 +#define EFUSE_PG BIT1 +#define EFUSE_READ_ALL BIT2 +#define EFUSE_ANALYSIS BIT3 +#define EFUSE_PG_DETAIL BIT4 + +// Define power save check module bit --> FPWR +#define LPS BIT0 +#define IPS BIT1 +#define PWRSW BIT2 +#define PWRHW BIT3 +#define PWRHAL BIT4 + +// Define Dynamic Mechanism check module bit --> FDM +#define WA_IOT BIT0 +#define DM_PWDB BIT1 +#define DM_Monitor BIT2 +#define DM_DIG BIT3 +#define DM_EDCA_Turbo BIT4 +#define DM_BT30 BIT5 + +// Define Dbg Control module bit --> FDBG_CTRL +#define DBG_CTRL_TRACE BIT0 +#define DBG_CTRL_INBAND_NOISE BIT1 + +// Define FW C2H Cmd check module bit --> FC2H +#define C2H_Summary BIT0 +#define C2H_PacketData BIT1 +#define C2H_ContentData BIT2 +// Define BT Cmd check module bit --> FBT +#define BT_TRACE BIT0 +#define BT_RFPoll BIT1 + +// Define init check for module bit --> FINIT +#define INIT_EEPROM BIT0 +#define INIT_TxPower BIT1 +#define INIT_IQK BIT2 +#define INIT_RF BIT3 + +// Define IOCTL Cmd check module bit --> FIOCTL +// section 1 : IRP related +#define IOCTL_IRP BIT0 +#define IOCTL_IRP_DETAIL BIT1 +#define IOCTL_IRP_STATISTICS BIT2 +#define IOCTL_IRP_HANDLE BIT3 +// section 2 : HCI command/event +#define IOCTL_BT_HCICMD BIT8 +#define IOCTL_BT_HCICMD_DETAIL BIT9 +#define IOCTL_BT_HCICMD_EXT BIT10 +#define IOCTL_BT_EVENT BIT11 +#define IOCTL_BT_EVENT_DETAIL BIT12 +#define IOCTL_BT_EVENT_PERIODICAL BIT13 +// section 3 : BT tx/rx data and throughput +#define IOCTL_BT_TX_ACLDATA BIT16 +#define IOCTL_BT_TX_ACLDATA_DETAIL BIT17 +#define IOCTL_BT_RX_ACLDATA BIT18 +#define IOCTL_BT_RX_ACLDATA_DETAIL BIT19 +#define IOCTL_BT_TP BIT20 +// section 4 : BT connection state machine. +#define IOCTL_STATE BIT21 +#define IOCTL_BT_LOGO BIT22 +// section 5 : BT function trace +#define IOCTL_CALLBACK_FUN BIT24 +#define IOCTL_PARSE_BT_PKT BIT25 +#define IOCTL_BT_TX_PKT BIT26 +#define IOCTL_BT_FLAG_MON BIT27 + +// +// Define init check for module bit --> FSHORT_CUT +// 2011/07/20 MH Add for short but definition. +// +#define SHCUT_TX BIT0 +#define SHCUT_RX BIT1 + + +/* 2007/07/13 MH *//*------For DeBuG Print modeue------*/ +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export Marco Definition---------------------------*/ +#if (DM_ODM_SUPPORT_TYPE != ODM_MP) +#define RT_PRINTK(fmt, args...) printk( "%s(): " fmt, __FUNCTION__, ## args); + +#if DBG +#define ODM_RT_TRACE(pDM_Odm,comp, level, fmt) \ + if(((comp) & GlobalDebugComponents) && (level <= GlobalDebugLevel)) \ + { \ + RT_PRINTK fmt; \ + } + +#define RT_TRACE_F(comp, level, fmt) \ + if(((comp) & GlobalDebugComponents) && (level <= GlobalDebugLevel)) \ + { \ + RT_PRINTK fmt; \ + } + +#define RT_ASSERT(expr,fmt) \ + if(!(expr)) { \ + printk( "Assertion failed! %s at ......\n", #expr); \ + printk( " ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__); \ + } +#define dbg_enter() { printk("==> %s\n", __FUNCTION__); } +#define dbg_exit() { printk("<== %s\n", __FUNCTION__); } +#define dbg_trace(str) { printk("%s:%s\n", __FUNCTION__, str); } +#else +#define ODM_RT_TRACE(pDM_Odm,comp, level, fmt) +#define RT_TRACE_F(comp, level, fmt) +#define RT_ASSERT(expr, fmt) +#define dbg_enter() +#define dbg_exit() +#define dbg_trace(str) +#endif + +#if DBG +#define DbgPrint printk + +#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) \ + { \ + char *szTitle = _TitleString; \ + pu1Byte pbtHexData = _HexData; \ + u4Byte u4bHexDataLen = _HexDataLen; \ + u4Byte __i; \ + DbgPrint("%s", szTitle); \ + for (__i=0;__i=' ' &&_ch<='~' ) // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22. + +#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) \ + if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) \ + { \ + int __i; \ + u1Byte buffer[MAX_STR_LEN]; \ + int length = (_Len\n", _Len, buffer); \ + } + +#else // of #if DBG +#define DbgPrint(...) +#define PRINT_DATA(_TitleString, _HexData, _HexDataLen) +#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) +#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr) +#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum) +#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len) +#endif // of #if DBG + + + +#endif // #if (DM_ODM_SUPPORT_TYPE != ODM_MP) + +#define DEBUG_PRINT 1 + +// Please add new OS's print API by yourself + +//#if (RT_PLATFORM==PLATFORM_WINDOWS) +#if (DEBUG_PRINT == 1) && DBG +#define RTPRINT(dbgtype, dbgflag, printstr)\ +{\ + if (DBGP_Type[dbgtype] & dbgflag)\ + {\ + DbgPrint printstr;\ + }\ +} + +#define RTPRINT_ADDR(dbgtype, dbgflag, printstr, _Ptr)\ +{\ + if (DBGP_Type[dbgtype] & dbgflag)\ + {\ + int __i; \ + pu1Byte ptr = (pu1Byte)_Ptr; \ + DbgPrint printstr; \ + DbgPrint(" "); \ + for( __i=0; __i<6; __i++ ) \ + DbgPrint("%02X%s", ptr[__i], (__i==5)?"":"-"); \ + DbgPrint("\n"); \ + }\ +} + +#define RTPRINT_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)\ +{\ + if (DBGP_Type[dbgtype] & dbgflag)\ + {\ + int __i; \ + pu1Byte ptr = (pu1Byte)_HexData; \ + DbgPrint(_TitleString); \ + for( __i=0; __i<(int)_HexDataLen; __i++ ) \ + { \ + DbgPrint("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?" ":" ");\ + if (((__i + 1) % 16) == 0) DbgPrint("\n");\ + } \ + DbgPrint("\n"); \ + }\ +} +#define FuncEntry FunctionIn(COMP_FUNC) +#define FuncExit FunctionOut(COMP_FUNC) + +#define FunctionIn(_comp) ODM_RT_TRACE(pDM_Odm,(_comp), DBG_LOUD, ("==========> %s\n", __FUNCTION__)) +#define FunctionOut(_comp) ODM_RT_TRACE(pDM_Odm,(_comp), DBG_LOUD, ("<========== %s\n", __FUNCTION__)) + + +#else + +#define DBGP(dbgtype, dbgflag, printstr) +#define RTPRINT(dbgtype, dbgflag, printstr) +#define RTPRINT_ADDR(dbgtype, dbgflag, printstr, _Ptr) +#define RTPRINT_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen) +#define FuncEntry +#define FuncExit +#define FunctionIn(_comp) +#define FunctionOut(_comp) +#endif +/*------------------------Export Marco Definition---------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +extern u4Byte DBGP_Type[DBGP_TYPE_MAX]; +extern DBGP_HEAD_T DBGP_Head; + +/*------------------------Export global variable----------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ +extern void DBGP_Flag_Init(void); +extern void DBG_PrintAllFlag(void); +extern void DBG_PrintAllComp(void); +extern void DBG_PrintFlagEvent(u1Byte DbgFlag); +extern void DBG_DumpMem(const u1Byte DbgComp, + const u1Byte DbgLevel, + pu1Byte pMem, + u2Byte Len); + +/*--------------------------Exported Function prototype---------------------*/ + + + + + + + + + +extern u4Byte GlobalDebugLevel; +extern u8Byte GlobalDebugComponents; + + +#endif + + +#endif // __ODM_DBG_H__ + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_interface.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_interface.c index 2e56b50032b3..7f6dd58bced1 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_interface.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_interface.c @@ -1,666 +1,666 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -//============================================================ -// include files -//============================================================ - -#include "odm_precomp.h" -// -// ODM IO Relative API. -// - -u1Byte -ODM_Read1Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - return RTL_R8(RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - return rtw_read8(Adapter,RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - return PlatformEFIORead1Byte(Adapter, RegAddr); -#endif - -} - - -u2Byte -ODM_Read2Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - return RTL_R16(RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - return rtw_read16(Adapter,RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - return PlatformEFIORead2Byte(Adapter, RegAddr); -#endif - -} - - -u4Byte -ODM_Read4Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - return RTL_R32(RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - return rtw_read32(Adapter,RegAddr); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - return PlatformEFIORead4Byte(Adapter, RegAddr); -#endif - -} - - -VOID -ODM_Write1Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u1Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - RTL_W8(RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - rtw_write8(Adapter,RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformEFIOWrite1Byte(Adapter, RegAddr, Data); -#endif - -} - - -VOID -ODM_Write2Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u2Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - RTL_W16(RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - rtw_write16(Adapter,RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformEFIOWrite2Byte(Adapter, RegAddr, Data); -#endif - -} - - -VOID -ODM_Write4Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - prtl8192cd_priv priv = pDM_Odm->priv; - RTL_W32(RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - rtw_write32(Adapter,RegAddr, Data); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformEFIOWrite4Byte(Adapter, RegAddr, Data); -#endif - -} - - -VOID -ODM_SetMACReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) - PADAPTER Adapter = pDM_Odm->Adapter; - PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); -#endif -} - - -u4Byte -ODM_GetMACReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) - PADAPTER Adapter = pDM_Odm->Adapter; - return PHY_QueryBBReg(Adapter, RegAddr, BitMask); -#endif -} - - -VOID -ODM_SetBBReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) - PADAPTER Adapter = pDM_Odm->Adapter; - PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); -#endif -} - - -u4Byte -ODM_GetBBReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) - PADAPTER Adapter = pDM_Odm->Adapter; - return PHY_QueryBBReg(Adapter, RegAddr, BitMask); -#endif -} - - -VOID -ODM_SetRFReg( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E eRFPath, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - PHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) - PADAPTER Adapter = pDM_Odm->Adapter; - PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data); -#endif -} - - -u4Byte -ODM_GetRFReg( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E eRFPath, - IN u4Byte RegAddr, - IN u4Byte BitMask - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1); -#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) - PADAPTER Adapter = pDM_Odm->Adapter; - return PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask); -#endif -} - - - - -// -// ODM Memory relative API. -// -VOID -ODM_AllocateMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID *pPtr, - IN u4Byte length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - *pPtr = kmalloc(length, GFP_ATOMIC); -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - *pPtr = rtw_zvmalloc(length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformAllocateMemory(Adapter, pPtr, length); -#endif -} - -// length could be ignored, used to detect memory leakage. -VOID -ODM_FreeMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID pPtr, - IN u4Byte length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - kfree(pPtr); -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - rtw_vmfree(pPtr, length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - //PADAPTER Adapter = pDM_Odm->Adapter; - PlatformFreeMemory(pPtr, length); -#endif -} -s4Byte ODM_CompareMemory( - IN PDM_ODM_T pDM_Odm, - IN PVOID pBuf1, - IN PVOID pBuf2, - IN u4Byte length - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - return memcmp(pBuf1,pBuf2,length); -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - return _rtw_memcmp(pBuf1,pBuf2,length); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - return PlatformCompareMemory(pBuf1,pBuf2,length); -#endif -} - - - -// -// ODM MISC relative API. -// -VOID -ODM_AcquireSpinLock( - IN PDM_ODM_T pDM_Odm, - IN RT_SPINLOCK_TYPE type - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformAcquireSpinLock(Adapter, type); -#endif -} -VOID -ODM_ReleaseSpinLock( - IN PDM_ODM_T pDM_Odm, - IN RT_SPINLOCK_TYPE type - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformReleaseSpinLock(Adapter, type); -#endif -} - -// -// Work item relative API. FOr MP driver only~! -// -VOID -ODM_InitializeWorkItem( - IN PDM_ODM_T pDM_Odm, - IN PRT_WORK_ITEM pRtWorkItem, - IN RT_WORKITEM_CALL_BACK RtWorkItemCallback, - IN PVOID pContext, - IN const char* szID - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID); -#endif -} - - -VOID -ODM_StartWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PlatformStartWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_StopWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PlatformStopWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_FreeWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PlatformFreeWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_ScheduleWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PlatformScheduleWorkItem(pRtWorkItem); -#endif -} - - -VOID -ODM_IsWorkItemScheduled( - IN PRT_WORK_ITEM pRtWorkItem - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PlatformIsWorkItemScheduled(pRtWorkItem); -#endif -} - - - -// -// ODM Timer relative API. -// -VOID -ODM_StallExecution( - IN u4Byte usDelay - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_udelay_os(usDelay); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PlatformStallExecution(usDelay); -#endif -} - -VOID -ODM_delay_ms(IN u4Byte ms) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - delay_ms(ms); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_mdelay_os(ms); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - delay_ms(ms); -#endif -} - -VOID -ODM_delay_us(IN u4Byte us) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - delay_us(us); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_udelay_os(us); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PlatformStallExecution(us); -#endif -} - -VOID -ODM_sleep_ms(IN u4Byte ms) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_msleep_os(ms); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) -#endif -} - -VOID -ODM_sleep_us(IN u4Byte us) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - rtw_usleep_os(us); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) -#endif -} - -VOID -ODM_SetTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN u4Byte msDelay - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - mod_timer(pTimer, jiffies + (msDelay+9)/10); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - _set_timer(pTimer,msDelay ); //ms -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformSetTimer(Adapter, pTimer, msDelay); -#endif - -} - -VOID -ODM_InitializeTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN RT_TIMER_CALL_BACK CallBackFunc, - IN PVOID pContext, - IN const char* szID - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - pTimer->function = CallBackFunc; - pTimer->data = (unsigned long)pDM_Odm; - init_timer(pTimer); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - PADAPTER Adapter = pDM_Odm->Adapter; - _init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID); -#endif -} - - -VOID -ODM_CancelTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - del_timer_sync(pTimer); -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - _cancel_timer_ex(pTimer); -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - PADAPTER Adapter = pDM_Odm->Adapter; - PlatformCancelTimer(Adapter, pTimer); -#endif -} - - -VOID -ODM_ReleaseTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - - PADAPTER Adapter = pDM_Odm->Adapter; - - // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm. - // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail. - if (pTimer == 0) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\n")); - return; - } - - PlatformReleaseTimer(Adapter, pTimer); -#endif -} - - -// -// ODM FW relative API. -// -#if (DM_ODM_SUPPORT_TYPE & ODM_MP) -VOID -ODM_FillH2CCmd( - IN PADAPTER Adapter, - IN u1Byte ElementID, - IN u4Byte CmdLen, - IN pu1Byte pCmdBuffer -) -{ - if(IS_HARDWARE_TYPE_JAGUAR(Adapter)) - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer); - default: - break; - } - - } - else if(IS_HARDWARE_TYPE_8188E(Adapter)) - { - switch(ElementID) - { - case ODM_H2C_PSD_RESULT: - FillH2CCmd88E(Adapter, H2C_88E_PSD_RESULT, CmdLen, pCmdBuffer); - default: - break; - } - } - else - { - switch(ElementID) - { - case ODM_H2C_RSSI_REPORT: - FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); - case ODM_H2C_PSD_RESULT: - FillH2CCmd92C(Adapter, H2C_92C_PSD_RESULT, CmdLen, pCmdBuffer); - default: - break; - } - } -} -#else -u4Byte -ODM_FillH2CCmd( - IN pu1Byte pH2CBuffer, - IN u4Byte H2CBufferLen, - IN u4Byte CmdNum, - IN pu4Byte pElementID, - IN pu4Byte pCmdLen, - IN pu1Byte* pCmbBuffer, - IN pu1Byte CmdStartSeq - ) -{ -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) - -#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) - //FillH2CCmd(pH2CBuffer, H2CBufferLen, CmdNum, pElementID, pCmdLen, pCmbBuffer, CmdStartSeq); - return FALSE; -#endif - - return TRUE; -} -#endif - - - - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +//============================================================ +// include files +//============================================================ + +#include "odm_precomp.h" +// +// ODM IO Relative API. +// + +u1Byte +ODM_Read1Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + return RTL_R8(RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + return rtw_read8(Adapter,RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + return PlatformEFIORead1Byte(Adapter, RegAddr); +#endif + +} + + +u2Byte +ODM_Read2Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + return RTL_R16(RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + return rtw_read16(Adapter,RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + return PlatformEFIORead2Byte(Adapter, RegAddr); +#endif + +} + + +u4Byte +ODM_Read4Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + return RTL_R32(RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + return rtw_read32(Adapter,RegAddr); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + return PlatformEFIORead4Byte(Adapter, RegAddr); +#endif + +} + + +VOID +ODM_Write1Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u1Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + RTL_W8(RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + rtw_write8(Adapter,RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformEFIOWrite1Byte(Adapter, RegAddr, Data); +#endif + +} + + +VOID +ODM_Write2Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u2Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + RTL_W16(RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + rtw_write16(Adapter,RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformEFIOWrite2Byte(Adapter, RegAddr, Data); +#endif + +} + + +VOID +ODM_Write4Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + prtl8192cd_priv priv = pDM_Odm->priv; + RTL_W32(RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + rtw_write32(Adapter,RegAddr, Data); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformEFIOWrite4Byte(Adapter, RegAddr, Data); +#endif + +} + + +VOID +ODM_SetMACReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) + PADAPTER Adapter = pDM_Odm->Adapter; + PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); +#endif +} + + +u4Byte +ODM_GetMACReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) + PADAPTER Adapter = pDM_Odm->Adapter; + return PHY_QueryBBReg(Adapter, RegAddr, BitMask); +#endif +} + + +VOID +ODM_SetBBReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) + PADAPTER Adapter = pDM_Odm->Adapter; + PHY_SetBBReg(Adapter, RegAddr, BitMask, Data); +#endif +} + + +u4Byte +ODM_GetBBReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) + PADAPTER Adapter = pDM_Odm->Adapter; + return PHY_QueryBBReg(Adapter, RegAddr, BitMask); +#endif +} + + +VOID +ODM_SetRFReg( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E eRFPath, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + PHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) + PADAPTER Adapter = pDM_Odm->Adapter; + PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data); +#endif +} + + +u4Byte +ODM_GetRFReg( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E eRFPath, + IN u4Byte RegAddr, + IN u4Byte BitMask + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + return PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1); +#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP)) + PADAPTER Adapter = pDM_Odm->Adapter; + return PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask); +#endif +} + + + + +// +// ODM Memory relative API. +// +VOID +ODM_AllocateMemory( + IN PDM_ODM_T pDM_Odm, + OUT PVOID *pPtr, + IN u4Byte length + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + *pPtr = kmalloc(length, GFP_ATOMIC); +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + *pPtr = rtw_zvmalloc(length); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformAllocateMemory(Adapter, pPtr, length); +#endif +} + +// length could be ignored, used to detect memory leakage. +VOID +ODM_FreeMemory( + IN PDM_ODM_T pDM_Odm, + OUT PVOID pPtr, + IN u4Byte length + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + kfree(pPtr); +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + rtw_vmfree(pPtr, length); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + //PADAPTER Adapter = pDM_Odm->Adapter; + PlatformFreeMemory(pPtr, length); +#endif +} +s4Byte ODM_CompareMemory( + IN PDM_ODM_T pDM_Odm, + IN PVOID pBuf1, + IN PVOID pBuf2, + IN u4Byte length + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + return memcmp(pBuf1,pBuf2,length); +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + return _rtw_memcmp(pBuf1,pBuf2,length); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + return PlatformCompareMemory(pBuf1,pBuf2,length); +#endif +} + + + +// +// ODM MISC relative API. +// +VOID +ODM_AcquireSpinLock( + IN PDM_ODM_T pDM_Odm, + IN RT_SPINLOCK_TYPE type + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformAcquireSpinLock(Adapter, type); +#endif +} +VOID +ODM_ReleaseSpinLock( + IN PDM_ODM_T pDM_Odm, + IN RT_SPINLOCK_TYPE type + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformReleaseSpinLock(Adapter, type); +#endif +} + +// +// Work item relative API. FOr MP driver only~! +// +VOID +ODM_InitializeWorkItem( + IN PDM_ODM_T pDM_Odm, + IN PRT_WORK_ITEM pRtWorkItem, + IN RT_WORKITEM_CALL_BACK RtWorkItemCallback, + IN PVOID pContext, + IN const char* szID + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID); +#endif +} + + +VOID +ODM_StartWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PlatformStartWorkItem(pRtWorkItem); +#endif +} + + +VOID +ODM_StopWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PlatformStopWorkItem(pRtWorkItem); +#endif +} + + +VOID +ODM_FreeWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PlatformFreeWorkItem(pRtWorkItem); +#endif +} + + +VOID +ODM_ScheduleWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PlatformScheduleWorkItem(pRtWorkItem); +#endif +} + + +VOID +ODM_IsWorkItemScheduled( + IN PRT_WORK_ITEM pRtWorkItem + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PlatformIsWorkItemScheduled(pRtWorkItem); +#endif +} + + + +// +// ODM Timer relative API. +// +VOID +ODM_StallExecution( + IN u4Byte usDelay + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_udelay_os(usDelay); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PlatformStallExecution(usDelay); +#endif +} + +VOID +ODM_delay_ms(IN u4Byte ms) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + delay_ms(ms); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_mdelay_os(ms); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + delay_ms(ms); +#endif +} + +VOID +ODM_delay_us(IN u4Byte us) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + delay_us(us); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_udelay_os(us); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PlatformStallExecution(us); +#endif +} + +VOID +ODM_sleep_ms(IN u4Byte ms) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_msleep_os(ms); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) +#endif +} + +VOID +ODM_sleep_us(IN u4Byte us) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + rtw_usleep_os(us); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) +#endif +} + +VOID +ODM_SetTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer, + IN u4Byte msDelay + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + mod_timer(pTimer, jiffies + (msDelay+9)/10); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + _set_timer(pTimer,msDelay ); //ms +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformSetTimer(Adapter, pTimer, msDelay); +#endif + +} + +VOID +ODM_InitializeTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer, + IN RT_TIMER_CALL_BACK CallBackFunc, + IN PVOID pContext, + IN const char* szID + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + pTimer->function = CallBackFunc; + pTimer->data = (unsigned long)pDM_Odm; + init_timer(pTimer); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + PADAPTER Adapter = pDM_Odm->Adapter; + _init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID); +#endif +} + + +VOID +ODM_CancelTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + del_timer_sync(pTimer); +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + _cancel_timer_ex(pTimer); +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + PADAPTER Adapter = pDM_Odm->Adapter; + PlatformCancelTimer(Adapter, pTimer); +#endif +} + + +VOID +ODM_ReleaseTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + + PADAPTER Adapter = pDM_Odm->Adapter; + + // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm. + // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail. + if (pTimer == 0) + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\n")); + return; + } + + PlatformReleaseTimer(Adapter, pTimer); +#endif +} + + +// +// ODM FW relative API. +// +#if (DM_ODM_SUPPORT_TYPE & ODM_MP) +VOID +ODM_FillH2CCmd( + IN PADAPTER Adapter, + IN u1Byte ElementID, + IN u4Byte CmdLen, + IN pu1Byte pCmdBuffer +) +{ + if(IS_HARDWARE_TYPE_JAGUAR(Adapter)) + { + switch(ElementID) + { + case ODM_H2C_RSSI_REPORT: + FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer); + default: + break; + } + + } + else if(IS_HARDWARE_TYPE_8188E(Adapter)) + { + switch(ElementID) + { + case ODM_H2C_PSD_RESULT: + FillH2CCmd88E(Adapter, H2C_88E_PSD_RESULT, CmdLen, pCmdBuffer); + default: + break; + } + } + else + { + switch(ElementID) + { + case ODM_H2C_RSSI_REPORT: + FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); + case ODM_H2C_PSD_RESULT: + FillH2CCmd92C(Adapter, H2C_92C_PSD_RESULT, CmdLen, pCmdBuffer); + default: + break; + } + } +} +#else +u4Byte +ODM_FillH2CCmd( + IN pu1Byte pH2CBuffer, + IN u4Byte H2CBufferLen, + IN u4Byte CmdNum, + IN pu4Byte pElementID, + IN pu4Byte pCmdLen, + IN pu1Byte* pCmbBuffer, + IN pu1Byte CmdStartSeq + ) +{ +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_CE) + +#elif(DM_ODM_SUPPORT_TYPE & ODM_MP) + //FillH2CCmd(pH2CBuffer, H2CBufferLen, CmdNum, pElementID, pCmdLen, pCmbBuffer, CmdStartSeq); + return FALSE; +#endif + + return TRUE; +} +#endif + + + + + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_interface.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_interface.h index 73f61165bead..a5e8680100fb 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_interface.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_interface.h @@ -1,374 +1,374 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - - -#ifndef __ODM_INTERFACE_H__ -#define __ODM_INTERFACE_H__ - - - -// -// =========== Constant/Structure/Enum/... Define -// - - - -// -// =========== Macro Define -// - -#define _reg_all(_name) ODM_##_name -#define _reg_ic(_name, _ic) ODM_##_name##_ic -#define _bit_all(_name) BIT_##_name -#define _bit_ic(_name, _ic) BIT_##_name##_ic - -// _cat: implemented by Token-Pasting Operator. -#if 0 -#define _cat(_name, _ic_type, _func) \ - ( \ - _func##_all(_name) \ - ) -#endif - -/*=================================== - -#define ODM_REG_DIG_11N 0xC50 -#define ODM_REG_DIG_11AC 0xDDD - -ODM_REG(DIG,_pDM_Odm) -=====================================*/ - -#define _reg_11N(_name) ODM_REG_##_name##_11N -#define _reg_11AC(_name) ODM_REG_##_name##_11AC -#define _bit_11N(_name) ODM_BIT_##_name##_11N -#define _bit_11AC(_name) ODM_BIT_##_name##_11AC - -#if 1 //TODO: enable it if we need to support run-time to differentiate between 92C_SERIES and JAGUAR_SERIES. -#define _cat(_name, _ic_type, _func) \ - ( \ - ((_ic_type) & ODM_IC_11N_SERIES)? _func##_11N(_name): \ - _func##_11AC(_name) \ - ) -#endif -#if 0 // only sample code -#define _cat(_name, _ic_type, _func) \ - ( \ - ((_ic_type) & ODM_RTL8192C)? _func##_ic(_name, _8192C): \ - ((_ic_type) & ODM_RTL8192D)? _func##_ic(_name, _8192D): \ - ((_ic_type) & ODM_RTL8192S)? _func##_ic(_name, _8192S): \ - ((_ic_type) & ODM_RTL8723A)? _func##_ic(_name, _8723A): \ - ((_ic_type) & ODM_RTL8188E)? _func##_ic(_name, _8188E): \ - _func##_ic(_name, _8195) \ - ) -#endif - -// _name: name of register or bit. -// Example: "ODM_REG(R_A_AGC_CORE1, pDM_Odm)" -// gets "ODM_R_A_AGC_CORE1" or "ODM_R_A_AGC_CORE1_8192C", depends on SupportICType. -#define ODM_REG(_name, _pDM_Odm) _cat(_name, _pDM_Odm->SupportICType, _reg) -#define ODM_BIT(_name, _pDM_Odm) _cat(_name, _pDM_Odm->SupportICType, _bit) - -typedef enum _ODM_H2C_CMD -{ - ODM_H2C_RSSI_REPORT = 0, - ODM_H2C_PSD_RESULT=1, - ODM_H2C_PathDiv = 2, - ODM_MAX_H2CCMD -}ODM_H2C_CMD; - - -// -// 2012/02/17 MH For non-MP compile pass only. Linux does not support workitem. -// Suggest HW team to use thread instead of workitem. Windows also support the feature. -// -#if (DM_ODM_SUPPORT_TYPE != ODM_MP) -typedef void *PRT_WORK_ITEM ; -typedef void RT_WORKITEM_HANDLE,*PRT_WORKITEM_HANDLE; -typedef VOID (*RT_WORKITEM_CALL_BACK)(PVOID pContext); - -#if 0 -typedef struct tasklet_struct RT_WORKITEM_HANDLE, *PRT_WORKITEM_HANDLE; - -typedef struct _RT_WORK_ITEM -{ - - RT_WORKITEM_HANDLE Handle; // Platform-dependent handle for this workitem, e.g. Ndis Workitem object. - PVOID Adapter; // Pointer to Adapter object. - PVOID pContext; // Parameter to passed to CallBackFunc(). - RT_WORKITEM_CALL_BACK CallbackFunc; // Callback function of the workitem. - u1Byte RefCount; // 0: driver is going to unload, 1: No such workitem scheduled, 2: one workitem is schedueled. - PVOID pPlatformExt; // Pointer to platform-dependent extension. - BOOLEAN bFree; - char szID[36]; // An identity string of this workitem. -}RT_WORK_ITEM, *PRT_WORK_ITEM; - -#endif - - -#endif - -// -// =========== Extern Variable ??? It should be forbidden. -// - - -// -// =========== EXtern Function Prototype -// - - -u1Byte -ODM_Read1Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ); - -u2Byte -ODM_Read2Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ); - -u4Byte -ODM_Read4Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr - ); - -VOID -ODM_Write1Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u1Byte Data - ); - -VOID -ODM_Write2Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u2Byte Data - ); - -VOID -ODM_Write4Byte( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte Data - ); - -VOID -ODM_SetMACReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ); - -u4Byte -ODM_GetMACReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask - ); - -VOID -ODM_SetBBReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ); - -u4Byte -ODM_GetBBReg( - IN PDM_ODM_T pDM_Odm, - IN u4Byte RegAddr, - IN u4Byte BitMask - ); - -VOID -ODM_SetRFReg( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E eRFPath, - IN u4Byte RegAddr, - IN u4Byte BitMask, - IN u4Byte Data - ); - -u4Byte -ODM_GetRFReg( - IN PDM_ODM_T pDM_Odm, - IN ODM_RF_RADIO_PATH_E eRFPath, - IN u4Byte RegAddr, - IN u4Byte BitMask - ); - - -// -// Memory Relative Function. -// -VOID -ODM_AllocateMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID *pPtr, - IN u4Byte length - ); -VOID -ODM_FreeMemory( - IN PDM_ODM_T pDM_Odm, - OUT PVOID pPtr, - IN u4Byte length - ); - -s4Byte ODM_CompareMemory( - IN PDM_ODM_T pDM_Odm, - IN PVOID pBuf1, - IN PVOID pBuf2, - IN u4Byte length - ); - -// -// ODM MISC-spin lock relative API. -// -VOID -ODM_AcquireSpinLock( - IN PDM_ODM_T pDM_Odm, - IN RT_SPINLOCK_TYPE type - ); - -VOID -ODM_ReleaseSpinLock( - IN PDM_ODM_T pDM_Odm, - IN RT_SPINLOCK_TYPE type - ); - - -// -// ODM MISC-workitem relative API. -// -VOID -ODM_InitializeWorkItem( - IN PDM_ODM_T pDM_Odm, - IN PRT_WORK_ITEM pRtWorkItem, - IN RT_WORKITEM_CALL_BACK RtWorkItemCallback, - IN PVOID pContext, - IN const char* szID - ); - -VOID -ODM_StartWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ); - -VOID -ODM_StopWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ); - -VOID -ODM_FreeWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ); - -VOID -ODM_ScheduleWorkItem( - IN PRT_WORK_ITEM pRtWorkItem - ); - -VOID -ODM_IsWorkItemScheduled( - IN PRT_WORK_ITEM pRtWorkItem - ); - -// -// ODM Timer relative API. -// -VOID -ODM_StallExecution( - IN u4Byte usDelay - ); - -VOID -ODM_delay_ms(IN u4Byte ms); - - -VOID -ODM_delay_us(IN u4Byte us); - -VOID -ODM_sleep_ms(IN u4Byte ms); - -VOID -ODM_sleep_us(IN u4Byte us); - -VOID -ODM_SetTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN u4Byte msDelay - ); - -VOID -ODM_InitializeTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer, - IN RT_TIMER_CALL_BACK CallBackFunc, - IN PVOID pContext, - IN const char* szID - ); - -VOID -ODM_CancelTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer - ); - -VOID -ODM_ReleaseTimer( - IN PDM_ODM_T pDM_Odm, - IN PRT_TIMER pTimer - ); - - -// -// ODM FW relative API. -// -#if (DM_ODM_SUPPORT_TYPE & ODM_MP) -VOID -ODM_FillH2CCmd( - IN PADAPTER Adapter, - IN u1Byte ElementID, - IN u4Byte CmdLen, - IN pu1Byte pCmdBuffer -); -#else -u4Byte -ODM_FillH2CCmd( - IN pu1Byte pH2CBuffer, - IN u4Byte H2CBufferLen, - IN u4Byte CmdNum, - IN pu4Byte pElementID, - IN pu4Byte pCmdLen, - IN pu1Byte* pCmbBuffer, - IN pu1Byte CmdStartSeq - ); -#endif -#endif // __ODM_INTERFACE_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __ODM_INTERFACE_H__ +#define __ODM_INTERFACE_H__ + + + +// +// =========== Constant/Structure/Enum/... Define +// + + + +// +// =========== Macro Define +// + +#define _reg_all(_name) ODM_##_name +#define _reg_ic(_name, _ic) ODM_##_name##_ic +#define _bit_all(_name) BIT_##_name +#define _bit_ic(_name, _ic) BIT_##_name##_ic + +// _cat: implemented by Token-Pasting Operator. +#if 0 +#define _cat(_name, _ic_type, _func) \ + ( \ + _func##_all(_name) \ + ) +#endif + +/*=================================== + +#define ODM_REG_DIG_11N 0xC50 +#define ODM_REG_DIG_11AC 0xDDD + +ODM_REG(DIG,_pDM_Odm) +=====================================*/ + +#define _reg_11N(_name) ODM_REG_##_name##_11N +#define _reg_11AC(_name) ODM_REG_##_name##_11AC +#define _bit_11N(_name) ODM_BIT_##_name##_11N +#define _bit_11AC(_name) ODM_BIT_##_name##_11AC + +#if 1 //TODO: enable it if we need to support run-time to differentiate between 92C_SERIES and JAGUAR_SERIES. +#define _cat(_name, _ic_type, _func) \ + ( \ + ((_ic_type) & ODM_IC_11N_SERIES)? _func##_11N(_name): \ + _func##_11AC(_name) \ + ) +#endif +#if 0 // only sample code +#define _cat(_name, _ic_type, _func) \ + ( \ + ((_ic_type) & ODM_RTL8192C)? _func##_ic(_name, _8192C): \ + ((_ic_type) & ODM_RTL8192D)? _func##_ic(_name, _8192D): \ + ((_ic_type) & ODM_RTL8192S)? _func##_ic(_name, _8192S): \ + ((_ic_type) & ODM_RTL8723A)? _func##_ic(_name, _8723A): \ + ((_ic_type) & ODM_RTL8188E)? _func##_ic(_name, _8188E): \ + _func##_ic(_name, _8195) \ + ) +#endif + +// _name: name of register or bit. +// Example: "ODM_REG(R_A_AGC_CORE1, pDM_Odm)" +// gets "ODM_R_A_AGC_CORE1" or "ODM_R_A_AGC_CORE1_8192C", depends on SupportICType. +#define ODM_REG(_name, _pDM_Odm) _cat(_name, _pDM_Odm->SupportICType, _reg) +#define ODM_BIT(_name, _pDM_Odm) _cat(_name, _pDM_Odm->SupportICType, _bit) + +typedef enum _ODM_H2C_CMD +{ + ODM_H2C_RSSI_REPORT = 0, + ODM_H2C_PSD_RESULT=1, + ODM_H2C_PathDiv = 2, + ODM_MAX_H2CCMD +}ODM_H2C_CMD; + + +// +// 2012/02/17 MH For non-MP compile pass only. Linux does not support workitem. +// Suggest HW team to use thread instead of workitem. Windows also support the feature. +// +#if (DM_ODM_SUPPORT_TYPE != ODM_MP) +typedef void *PRT_WORK_ITEM ; +typedef void RT_WORKITEM_HANDLE,*PRT_WORKITEM_HANDLE; +typedef VOID (*RT_WORKITEM_CALL_BACK)(PVOID pContext); + +#if 0 +typedef struct tasklet_struct RT_WORKITEM_HANDLE, *PRT_WORKITEM_HANDLE; + +typedef struct _RT_WORK_ITEM +{ + + RT_WORKITEM_HANDLE Handle; // Platform-dependent handle for this workitem, e.g. Ndis Workitem object. + PVOID Adapter; // Pointer to Adapter object. + PVOID pContext; // Parameter to passed to CallBackFunc(). + RT_WORKITEM_CALL_BACK CallbackFunc; // Callback function of the workitem. + u1Byte RefCount; // 0: driver is going to unload, 1: No such workitem scheduled, 2: one workitem is schedueled. + PVOID pPlatformExt; // Pointer to platform-dependent extension. + BOOLEAN bFree; + char szID[36]; // An identity string of this workitem. +}RT_WORK_ITEM, *PRT_WORK_ITEM; + +#endif + + +#endif + +// +// =========== Extern Variable ??? It should be forbidden. +// + + +// +// =========== EXtern Function Prototype +// + + +u1Byte +ODM_Read1Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ); + +u2Byte +ODM_Read2Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ); + +u4Byte +ODM_Read4Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr + ); + +VOID +ODM_Write1Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u1Byte Data + ); + +VOID +ODM_Write2Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u2Byte Data + ); + +VOID +ODM_Write4Byte( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte Data + ); + +VOID +ODM_SetMACReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ); + +u4Byte +ODM_GetMACReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask + ); + +VOID +ODM_SetBBReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ); + +u4Byte +ODM_GetBBReg( + IN PDM_ODM_T pDM_Odm, + IN u4Byte RegAddr, + IN u4Byte BitMask + ); + +VOID +ODM_SetRFReg( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E eRFPath, + IN u4Byte RegAddr, + IN u4Byte BitMask, + IN u4Byte Data + ); + +u4Byte +ODM_GetRFReg( + IN PDM_ODM_T pDM_Odm, + IN ODM_RF_RADIO_PATH_E eRFPath, + IN u4Byte RegAddr, + IN u4Byte BitMask + ); + + +// +// Memory Relative Function. +// +VOID +ODM_AllocateMemory( + IN PDM_ODM_T pDM_Odm, + OUT PVOID *pPtr, + IN u4Byte length + ); +VOID +ODM_FreeMemory( + IN PDM_ODM_T pDM_Odm, + OUT PVOID pPtr, + IN u4Byte length + ); + +s4Byte ODM_CompareMemory( + IN PDM_ODM_T pDM_Odm, + IN PVOID pBuf1, + IN PVOID pBuf2, + IN u4Byte length + ); + +// +// ODM MISC-spin lock relative API. +// +VOID +ODM_AcquireSpinLock( + IN PDM_ODM_T pDM_Odm, + IN RT_SPINLOCK_TYPE type + ); + +VOID +ODM_ReleaseSpinLock( + IN PDM_ODM_T pDM_Odm, + IN RT_SPINLOCK_TYPE type + ); + + +// +// ODM MISC-workitem relative API. +// +VOID +ODM_InitializeWorkItem( + IN PDM_ODM_T pDM_Odm, + IN PRT_WORK_ITEM pRtWorkItem, + IN RT_WORKITEM_CALL_BACK RtWorkItemCallback, + IN PVOID pContext, + IN const char* szID + ); + +VOID +ODM_StartWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ); + +VOID +ODM_StopWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ); + +VOID +ODM_FreeWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ); + +VOID +ODM_ScheduleWorkItem( + IN PRT_WORK_ITEM pRtWorkItem + ); + +VOID +ODM_IsWorkItemScheduled( + IN PRT_WORK_ITEM pRtWorkItem + ); + +// +// ODM Timer relative API. +// +VOID +ODM_StallExecution( + IN u4Byte usDelay + ); + +VOID +ODM_delay_ms(IN u4Byte ms); + + +VOID +ODM_delay_us(IN u4Byte us); + +VOID +ODM_sleep_ms(IN u4Byte ms); + +VOID +ODM_sleep_us(IN u4Byte us); + +VOID +ODM_SetTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer, + IN u4Byte msDelay + ); + +VOID +ODM_InitializeTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer, + IN RT_TIMER_CALL_BACK CallBackFunc, + IN PVOID pContext, + IN const char* szID + ); + +VOID +ODM_CancelTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer + ); + +VOID +ODM_ReleaseTimer( + IN PDM_ODM_T pDM_Odm, + IN PRT_TIMER pTimer + ); + + +// +// ODM FW relative API. +// +#if (DM_ODM_SUPPORT_TYPE & ODM_MP) +VOID +ODM_FillH2CCmd( + IN PADAPTER Adapter, + IN u1Byte ElementID, + IN u4Byte CmdLen, + IN pu1Byte pCmdBuffer +); +#else +u4Byte +ODM_FillH2CCmd( + IN pu1Byte pH2CBuffer, + IN u4Byte H2CBufferLen, + IN u4Byte CmdNum, + IN pu4Byte pElementID, + IN pu4Byte pCmdLen, + IN pu1Byte* pCmbBuffer, + IN pu1Byte CmdStartSeq + ); +#endif +#endif // __ODM_INTERFACE_H__ + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_precomp.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_precomp.h index eb4f74361237..f40a12779e52 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_precomp.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_precomp.h @@ -1,222 +1,222 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __ODM_PRECOMP_H__ -#define __ODM_PRECOMP_H__ - -#include "odm_types.h" - -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) -#include "Precomp.h" // We need to include mp_precomp.h due to batch file setting. - -#else - -#define TEST_FALG___ 1 - -#endif - -//2 Config Flags and Structs - defined by each ODM Type - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - #include "../8192cd_cfg.h" - #include "../odm_inc.h" - - #include "../8192cd.h" - #include "../8192cd_util.h" - #ifdef _BIG_ENDIAN_ - #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG - #else - #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE - #endif - - #ifdef AP_BUILD_WORKAROUND - #include "../8192cd_headers.h" - #include "../8192cd_debug.h" - #endif - -#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) - // Flags - #include "../8192cd_cfg.h" // OUTSRC needs ADSL config flags. - #include "../odm_inc.h" // OUTSRC needs some extra flags. - // Data Structure - #include "../common_types.h" // OUTSRC and rtl8192cd both needs basic type such as UINT8 and BIT0. - #include "../8192cd.h" // OUTSRC needs basic ADSL struct definition. - #include "../8192cd_util.h" // OUTSRC needs basic I/O function. - #ifdef _BIG_ENDIAN_ - #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG - #else - #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE - #endif - - #ifdef ADSL_AP_BUILD_WORKAROUND - // NESTED_INC: Functions defined outside should not be included!! Marked by Annie, 2011-10-14. - #include "../8192cd_headers.h" - #include "../8192cd_debug.h" - #endif - -#elif (DM_ODM_SUPPORT_TYPE ==ODM_CE) - #include - #include - #include - #include - #include - -#elif (DM_ODM_SUPPORT_TYPE == ODM_MP) - #include "Mp_Precomp.h" - #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE -#endif - - -//2 Hardware Parameter Files - - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#if (RTL8192C_SUPPORT==1) - #include "rtl8192c/Hal8192CEFWImg_AP.h" - #include "rtl8192c/Hal8192CEPHYImg_AP.h" - #include "rtl8192c/Hal8192CEMACImg_AP.h" -#endif -#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) - #include "rtl8192c/Hal8192CEFWImg_ADSL.h" - #include "rtl8192c/Hal8192CEPHYImg_ADSL.h" - #include "rtl8192c/Hal8192CEMACImg_ADSL.h" - -#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - #if(RTL8192CE_SUPPORT ==1) - #include "rtl8192c/Hal8192CEFWImg_CE.h" - #include "rtl8192c/Hal8192CEPHYImg_CE.h" - #include "rtl8192c/Hal8192CEMACImg_CE.h" - #elif(RTL8192CU_SUPPORT ==1) - #include "rtl8192c/Hal8192CUFWImg_CE.h" - #include "rtl8192c/Hal8192CUPHYImg_CE.h" - #include "rtl8192c/Hal8192CUMACImg_CE.h" - #elif(RTL8192DE_SUPPORT ==1) - #include "rtl8192d/Hal8192DEFWImg_CE.h" - #include "rtl8192d/Hal8192DEPHYImg_CE.h" - #include "rtl8192d/Hal8192DEMACImg_CE.h" - #elif(RTL8192DU_SUPPORT ==1) - #include "rtl8192d/Hal8192DUFWImg_CE.h" - #include "rtl8192d/Hal8192DUPHYImg_CE.h" - #include "rtl8192d/Hal8192DUMACImg_CE.h" - #elif(RTL8723AS_SUPPORT==1) - #include "rtl8723a/Hal8723SHWImg_CE.h" - #elif(RTL8723AU_SUPPORT==1) - #include "rtl8723a/Hal8723UHWImg_CE.h" - #elif(RTL8188E_SUPPORT==1) - #include "rtl8188e/Hal8188EFWImg_CE.h" - #endif -#elif (DM_ODM_SUPPORT_TYPE == ODM_MP) - -#endif - - -//2 OutSrc Header Files - -#include "odm.h" -#include "odm_HWConfig.h" -#include "odm_debug.h" -#include "odm_RegDefine11AC.h" -#include "odm_RegDefine11N.h" - -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#if (RTL8192C_SUPPORT==1) - #include "rtl8192c/HalDMOutSrc8192C_AP.h" -#endif -#if (RTL8188E_SUPPORT==1) - #include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training -#endif - -#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) - #include "rtl8192c/HalDMOutSrc8192C_ADSL.h" - -#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - #include "HalPhyRf.h" - #if (RTL8192C_SUPPORT==1) - #ifdef CONFIG_INTEL_PROXIM - #include "../proxim/intel_proxim.h" - #endif - #include "rtl8192c/HalDMOutSrc8192C_CE.h" - #include - #elif (RTL8192D_SUPPORT==1) - #include "rtl8192d/HalDMOutSrc8192D_CE.h" - #include "rtl8192d_hal.h" - #elif (RTL8723A_SUPPORT==1) - #include "rtl8192c/HalDMOutSrc8192C_CE.h" //for IQK,LCK,Power-tracking - #include "rtl8723a_hal.h" - #elif (RTL8188E_SUPPORT==1) - #include "rtl8188e/HalPhyRf_8188e.h"//for IQK,LCK,Power-tracking - #include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training - #include "rtl8188e_hal.h" - #endif - -#endif - -#include "odm_interface.h" -#include "odm_reg.h" - -#if (RTL8192C_SUPPORT==1) -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) -#include "rtl8192c/Hal8192CHWImg_MAC.h" -#include "rtl8192c/Hal8192CHWImg_RF.h" -#include "rtl8192c/Hal8192CHWImg_BB.h" -#include "rtl8192c/Hal8192CHWImg_FW.h" -#endif -#include "rtl8192c/odm_RTL8192C.h" -#endif -#if (RTL8192D_SUPPORT==1) -#include "rtl8192d/odm_RTL8192D.h" -#endif - -#if (RTL8723A_SUPPORT==1) -#include "rtl8723a/HalHWImg8723A_MAC.h" -#include "rtl8723a/HalHWImg8723A_RF.h" -#include "rtl8723a/HalHWImg8723A_BB.h" -#include "rtl8723a/HalHWImg8723A_FW.h" -#include "rtl8723a/odm_RegConfig8723A.h" -#endif - -#if (RTL8188E_SUPPORT==1) -#include "rtl8188e/HalHWImg8188E_MAC.h" -#include "rtl8188e/HalHWImg8188E_RF.h" -#include "rtl8188e/HalHWImg8188E_BB.h" -#include "rtl8188e/Hal8188EReg.h" - -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) -#include "rtl8188e/HalPhyRf_8188e.h" -#endif - -#if (RTL8188E_FOR_TEST_CHIP >= 1) -#include "rtl8188e/HalHWImg8188E_TestChip_MAC.h" -#include "rtl8188e/HalHWImg8188E_TestChip_RF.h" -#include "rtl8188e/HalHWImg8188E_TestChip_BB.h" -#endif - -#ifdef CONFIG_WOWLAN -#if (RTL8188E_SUPPORT==1) -#include "rtl8188e/HalHWImg8188E_FW.h" -#endif -#endif //CONFIG_WOWLAN - -#include "rtl8188e/odm_RegConfig8188E.h" -#include "rtl8188e/odm_RTL8188E.h" -#endif - -#endif // __ODM_PRECOMP_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __ODM_PRECOMP_H__ +#define __ODM_PRECOMP_H__ + +#include "odm_types.h" + +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) +#include "Precomp.h" // We need to include mp_precomp.h due to batch file setting. + +#else + +#define TEST_FALG___ 1 + +#endif + +//2 Config Flags and Structs - defined by each ODM Type + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) + #include "../8192cd_cfg.h" + #include "../odm_inc.h" + + #include "../8192cd.h" + #include "../8192cd_util.h" + #ifdef _BIG_ENDIAN_ + #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG + #else + #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE + #endif + + #ifdef AP_BUILD_WORKAROUND + #include "../8192cd_headers.h" + #include "../8192cd_debug.h" + #endif + +#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) + // Flags + #include "../8192cd_cfg.h" // OUTSRC needs ADSL config flags. + #include "../odm_inc.h" // OUTSRC needs some extra flags. + // Data Structure + #include "../common_types.h" // OUTSRC and rtl8192cd both needs basic type such as UINT8 and BIT0. + #include "../8192cd.h" // OUTSRC needs basic ADSL struct definition. + #include "../8192cd_util.h" // OUTSRC needs basic I/O function. + #ifdef _BIG_ENDIAN_ + #define ODM_ENDIAN_TYPE ODM_ENDIAN_BIG + #else + #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE + #endif + + #ifdef ADSL_AP_BUILD_WORKAROUND + // NESTED_INC: Functions defined outside should not be included!! Marked by Annie, 2011-10-14. + #include "../8192cd_headers.h" + #include "../8192cd_debug.h" + #endif + +#elif (DM_ODM_SUPPORT_TYPE ==ODM_CE) + #include + #include + #include + #include + #include + +#elif (DM_ODM_SUPPORT_TYPE == ODM_MP) + #include "Mp_Precomp.h" + #define ODM_ENDIAN_TYPE ODM_ENDIAN_LITTLE +#endif + + +//2 Hardware Parameter Files + + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) +#if (RTL8192C_SUPPORT==1) + #include "rtl8192c/Hal8192CEFWImg_AP.h" + #include "rtl8192c/Hal8192CEPHYImg_AP.h" + #include "rtl8192c/Hal8192CEMACImg_AP.h" +#endif +#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) + #include "rtl8192c/Hal8192CEFWImg_ADSL.h" + #include "rtl8192c/Hal8192CEPHYImg_ADSL.h" + #include "rtl8192c/Hal8192CEMACImg_ADSL.h" + +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + #if(RTL8192CE_SUPPORT ==1) + #include "rtl8192c/Hal8192CEFWImg_CE.h" + #include "rtl8192c/Hal8192CEPHYImg_CE.h" + #include "rtl8192c/Hal8192CEMACImg_CE.h" + #elif(RTL8192CU_SUPPORT ==1) + #include "rtl8192c/Hal8192CUFWImg_CE.h" + #include "rtl8192c/Hal8192CUPHYImg_CE.h" + #include "rtl8192c/Hal8192CUMACImg_CE.h" + #elif(RTL8192DE_SUPPORT ==1) + #include "rtl8192d/Hal8192DEFWImg_CE.h" + #include "rtl8192d/Hal8192DEPHYImg_CE.h" + #include "rtl8192d/Hal8192DEMACImg_CE.h" + #elif(RTL8192DU_SUPPORT ==1) + #include "rtl8192d/Hal8192DUFWImg_CE.h" + #include "rtl8192d/Hal8192DUPHYImg_CE.h" + #include "rtl8192d/Hal8192DUMACImg_CE.h" + #elif(RTL8723AS_SUPPORT==1) + #include "rtl8723a/Hal8723SHWImg_CE.h" + #elif(RTL8723AU_SUPPORT==1) + #include "rtl8723a/Hal8723UHWImg_CE.h" + #elif(RTL8188E_SUPPORT==1) + #include "rtl8188e/Hal8188EFWImg_CE.h" + #endif +#elif (DM_ODM_SUPPORT_TYPE == ODM_MP) + +#endif + + +//2 OutSrc Header Files + +#include "odm.h" +#include "odm_HWConfig.h" +#include "odm_debug.h" +#include "odm_RegDefine11AC.h" +#include "odm_RegDefine11N.h" + +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) +#if (RTL8192C_SUPPORT==1) + #include "rtl8192c/HalDMOutSrc8192C_AP.h" +#endif +#if (RTL8188E_SUPPORT==1) + #include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training +#endif + +#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL) + #include "rtl8192c/HalDMOutSrc8192C_ADSL.h" + +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + #include "HalPhyRf.h" + #if (RTL8192C_SUPPORT==1) + #ifdef CONFIG_INTEL_PROXIM + #include "../proxim/intel_proxim.h" + #endif + #include "rtl8192c/HalDMOutSrc8192C_CE.h" + #include + #elif (RTL8192D_SUPPORT==1) + #include "rtl8192d/HalDMOutSrc8192D_CE.h" + #include "rtl8192d_hal.h" + #elif (RTL8723A_SUPPORT==1) + #include "rtl8192c/HalDMOutSrc8192C_CE.h" //for IQK,LCK,Power-tracking + #include "rtl8723a_hal.h" + #elif (RTL8188E_SUPPORT==1) + #include "rtl8188e/HalPhyRf_8188e.h"//for IQK,LCK,Power-tracking + #include "rtl8188e/Hal8188ERateAdaptive.h"//for RA,Power training + #include "rtl8188e_hal.h" + #endif + +#endif + +#include "odm_interface.h" +#include "odm_reg.h" + +#if (RTL8192C_SUPPORT==1) +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) +#include "rtl8192c/Hal8192CHWImg_MAC.h" +#include "rtl8192c/Hal8192CHWImg_RF.h" +#include "rtl8192c/Hal8192CHWImg_BB.h" +#include "rtl8192c/Hal8192CHWImg_FW.h" +#endif +#include "rtl8192c/odm_RTL8192C.h" +#endif +#if (RTL8192D_SUPPORT==1) +#include "rtl8192d/odm_RTL8192D.h" +#endif + +#if (RTL8723A_SUPPORT==1) +#include "rtl8723a/HalHWImg8723A_MAC.h" +#include "rtl8723a/HalHWImg8723A_RF.h" +#include "rtl8723a/HalHWImg8723A_BB.h" +#include "rtl8723a/HalHWImg8723A_FW.h" +#include "rtl8723a/odm_RegConfig8723A.h" +#endif + +#if (RTL8188E_SUPPORT==1) +#include "rtl8188e/HalHWImg8188E_MAC.h" +#include "rtl8188e/HalHWImg8188E_RF.h" +#include "rtl8188e/HalHWImg8188E_BB.h" +#include "rtl8188e/Hal8188EReg.h" + +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) +#include "rtl8188e/HalPhyRf_8188e.h" +#endif + +#if (RTL8188E_FOR_TEST_CHIP >= 1) +#include "rtl8188e/HalHWImg8188E_TestChip_MAC.h" +#include "rtl8188e/HalHWImg8188E_TestChip_RF.h" +#include "rtl8188e/HalHWImg8188E_TestChip_BB.h" +#endif + +#ifdef CONFIG_WOWLAN +#if (RTL8188E_SUPPORT==1) +#include "rtl8188e/HalHWImg8188E_FW.h" +#endif +#endif //CONFIG_WOWLAN + +#include "rtl8188e/odm_RegConfig8188E.h" +#include "rtl8188e/odm_RTL8188E.h" +#endif + +#endif // __ODM_PRECOMP_H__ + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_reg.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_reg.h index 41baf166de22..361ac79c6c39 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_reg.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_reg.h @@ -1,120 +1,120 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -//============================================================ -// File Name: odm_reg.h -// -// Description: -// -// This file is for general register definition. -// -// -//============================================================ -#ifndef __HAL_ODM_REG_H__ -#define __HAL_ODM_REG_H__ - -// -// Register Definition -// - -//MAC REG -#define ODM_BB_RESET 0x002 -#define ODM_DUMMY 0x4fe -#define ODM_EDCA_VO_PARAM 0x500 -#define ODM_EDCA_VI_PARAM 0x504 -#define ODM_EDCA_BE_PARAM 0x508 -#define ODM_EDCA_BK_PARAM 0x50C -#define ODM_TXPAUSE 0x522 - -//BB REG -#define ODM_FPGA_PHY0_PAGE8 0x800 -#define ODM_PSD_SETTING 0x808 -#define ODM_AFE_SETTING 0x818 -#define ODM_TXAGC_B_6_18 0x830 -#define ODM_TXAGC_B_24_54 0x834 -#define ODM_TXAGC_B_MCS32_5 0x838 -#define ODM_TXAGC_B_MCS0_MCS3 0x83c -#define ODM_TXAGC_B_MCS4_MCS7 0x848 -#define ODM_TXAGC_B_MCS8_MCS11 0x84c -#define ODM_ANALOG_REGISTER 0x85c -#define ODM_RF_INTERFACE_OUTPUT 0x860 -#define ODM_TXAGC_B_MCS12_MCS15 0x868 -#define ODM_TXAGC_B_11_A_2_11 0x86c -#define ODM_AD_DA_LSB_MASK 0x874 -#define ODM_ENABLE_3_WIRE 0x88c -#define ODM_PSD_REPORT 0x8b4 -#define ODM_R_ANT_SELECT 0x90c -#define ODM_CCK_ANT_SELECT 0xa07 -#define ODM_CCK_PD_THRESH 0xa0a -#define ODM_CCK_RF_REG1 0xa11 -#define ODM_CCK_MATCH_FILTER 0xa20 -#define ODM_CCK_RAKE_MAC 0xa2e -#define ODM_CCK_CNT_RESET 0xa2d -#define ODM_CCK_TX_DIVERSITY 0xa2f -#define ODM_CCK_FA_CNT_MSB 0xa5b -#define ODM_CCK_FA_CNT_LSB 0xa5c -#define ODM_CCK_NEW_FUNCTION 0xa75 -#define ODM_OFDM_PHY0_PAGE_C 0xc00 -#define ODM_OFDM_RX_ANT 0xc04 -#define ODM_R_A_RXIQI 0xc14 -#define ODM_R_A_AGC_CORE1 0xc50 -#define ODM_R_A_AGC_CORE2 0xc54 -#define ODM_R_B_AGC_CORE1 0xc58 -#define ODM_R_AGC_PAR 0xc70 -#define ODM_R_HTSTF_AGC_PAR 0xc7c -#define ODM_TX_PWR_TRAINING_A 0xc90 -#define ODM_TX_PWR_TRAINING_B 0xc98 -#define ODM_OFDM_FA_CNT1 0xcf0 -#define ODM_OFDM_PHY0_PAGE_D 0xd00 -#define ODM_OFDM_FA_CNT2 0xda0 -#define ODM_OFDM_FA_CNT3 0xda4 -#define ODM_OFDM_FA_CNT4 0xda8 -#define ODM_TXAGC_A_6_18 0xe00 -#define ODM_TXAGC_A_24_54 0xe04 -#define ODM_TXAGC_A_1_MCS32 0xe08 -#define ODM_TXAGC_A_MCS0_MCS3 0xe10 -#define ODM_TXAGC_A_MCS4_MCS7 0xe14 -#define ODM_TXAGC_A_MCS8_MCS11 0xe18 -#define ODM_TXAGC_A_MCS12_MCS15 0xe1c - -//RF REG -#define ODM_GAIN_SETTING 0x00 -#define ODM_CHANNEL 0x18 - -//Ant Detect Reg -#define ODM_DPDT 0x300 - -//PSD Init -#define ODM_PSDREG 0x808 - -//92D Path Div -#define PATHDIV_REG 0xB30 -#define PATHDIV_TRI 0xBA0 - - -// -// Bitmap Definition -// - -#define BIT_FA_RESET BIT0 - - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +//============================================================ +// File Name: odm_reg.h +// +// Description: +// +// This file is for general register definition. +// +// +//============================================================ +#ifndef __HAL_ODM_REG_H__ +#define __HAL_ODM_REG_H__ + +// +// Register Definition +// + +//MAC REG +#define ODM_BB_RESET 0x002 +#define ODM_DUMMY 0x4fe +#define ODM_EDCA_VO_PARAM 0x500 +#define ODM_EDCA_VI_PARAM 0x504 +#define ODM_EDCA_BE_PARAM 0x508 +#define ODM_EDCA_BK_PARAM 0x50C +#define ODM_TXPAUSE 0x522 + +//BB REG +#define ODM_FPGA_PHY0_PAGE8 0x800 +#define ODM_PSD_SETTING 0x808 +#define ODM_AFE_SETTING 0x818 +#define ODM_TXAGC_B_6_18 0x830 +#define ODM_TXAGC_B_24_54 0x834 +#define ODM_TXAGC_B_MCS32_5 0x838 +#define ODM_TXAGC_B_MCS0_MCS3 0x83c +#define ODM_TXAGC_B_MCS4_MCS7 0x848 +#define ODM_TXAGC_B_MCS8_MCS11 0x84c +#define ODM_ANALOG_REGISTER 0x85c +#define ODM_RF_INTERFACE_OUTPUT 0x860 +#define ODM_TXAGC_B_MCS12_MCS15 0x868 +#define ODM_TXAGC_B_11_A_2_11 0x86c +#define ODM_AD_DA_LSB_MASK 0x874 +#define ODM_ENABLE_3_WIRE 0x88c +#define ODM_PSD_REPORT 0x8b4 +#define ODM_R_ANT_SELECT 0x90c +#define ODM_CCK_ANT_SELECT 0xa07 +#define ODM_CCK_PD_THRESH 0xa0a +#define ODM_CCK_RF_REG1 0xa11 +#define ODM_CCK_MATCH_FILTER 0xa20 +#define ODM_CCK_RAKE_MAC 0xa2e +#define ODM_CCK_CNT_RESET 0xa2d +#define ODM_CCK_TX_DIVERSITY 0xa2f +#define ODM_CCK_FA_CNT_MSB 0xa5b +#define ODM_CCK_FA_CNT_LSB 0xa5c +#define ODM_CCK_NEW_FUNCTION 0xa75 +#define ODM_OFDM_PHY0_PAGE_C 0xc00 +#define ODM_OFDM_RX_ANT 0xc04 +#define ODM_R_A_RXIQI 0xc14 +#define ODM_R_A_AGC_CORE1 0xc50 +#define ODM_R_A_AGC_CORE2 0xc54 +#define ODM_R_B_AGC_CORE1 0xc58 +#define ODM_R_AGC_PAR 0xc70 +#define ODM_R_HTSTF_AGC_PAR 0xc7c +#define ODM_TX_PWR_TRAINING_A 0xc90 +#define ODM_TX_PWR_TRAINING_B 0xc98 +#define ODM_OFDM_FA_CNT1 0xcf0 +#define ODM_OFDM_PHY0_PAGE_D 0xd00 +#define ODM_OFDM_FA_CNT2 0xda0 +#define ODM_OFDM_FA_CNT3 0xda4 +#define ODM_OFDM_FA_CNT4 0xda8 +#define ODM_TXAGC_A_6_18 0xe00 +#define ODM_TXAGC_A_24_54 0xe04 +#define ODM_TXAGC_A_1_MCS32 0xe08 +#define ODM_TXAGC_A_MCS0_MCS3 0xe10 +#define ODM_TXAGC_A_MCS4_MCS7 0xe14 +#define ODM_TXAGC_A_MCS8_MCS11 0xe18 +#define ODM_TXAGC_A_MCS12_MCS15 0xe1c + +//RF REG +#define ODM_GAIN_SETTING 0x00 +#define ODM_CHANNEL 0x18 + +//Ant Detect Reg +#define ODM_DPDT 0x300 + +//PSD Init +#define ODM_PSDREG 0x808 + +//92D Path Div +#define PATHDIV_REG 0xB30 +#define PATHDIV_TRI 0xBA0 + + +// +// Bitmap Definition +// + +#define BIT_FA_RESET BIT0 + + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEMACImg_CE.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEMACImg_CE.c index f24e3531e5f5..83a07d3f7543 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEMACImg_CE.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEMACImg_CE.c @@ -1,94 +1,94 @@ -/*Created on 2011/ 6/16, 6: 8*/ - -#include "../odm_precomp.h" -// MAC reg V14 - 2011-11-23 -u4Byte Rtl8192CEMAC_2T_Array[Rtl8192CEMAC_2T_ArrayLength] = { -0x420,0x00000080, -0x423,0x00000000, -0x430,0x00000000, -0x431,0x00000000, -0x432,0x00000000, -0x433,0x00000001, -0x434,0x00000004, -0x435,0x00000005, -0x436,0x00000006, -0x437,0x00000007, -0x438,0x00000000, -0x439,0x00000000, -0x43a,0x00000000, -0x43b,0x00000001, -0x43c,0x00000004, -0x43d,0x00000005, -0x43e,0x00000006, -0x43f,0x00000007, -0x440,0x0000005d, -0x441,0x00000001, -0x442,0x00000000, -0x444,0x00000015, -0x445,0x000000f0, -0x446,0x0000000f, -0x447,0x00000000, -0x458,0x00000041, -0x459,0x000000a8, -0x45a,0x00000072, -0x45b,0x000000b9, -0x460,0x00000066, -0x461,0x00000066, -0x462,0x00000008, -0x463,0x00000003, -0x4c8,0x000000ff, -0x4c9,0x00000008, -0x4cc,0x000000ff, -0x4cd,0x000000ff, -0x4ce,0x00000001, -0x500,0x00000026, -0x501,0x000000a2, -0x502,0x0000002f, -0x503,0x00000000, -0x504,0x00000028, -0x505,0x000000a3, -0x506,0x0000005e, -0x507,0x00000000, -0x508,0x0000002b, -0x509,0x000000a4, -0x50a,0x0000005e, -0x50b,0x00000000, -0x50c,0x0000004f, -0x50d,0x000000a4, -0x50e,0x00000000, -0x50f,0x00000000, -0x512,0x0000001c, -0x514,0x0000000a, -0x515,0x00000010, -0x516,0x0000000a, -0x517,0x00000010, -0x51a,0x00000016, -0x524,0x0000000f, -0x525,0x0000004f, -0x546,0x00000040, -0x547,0x00000000, -0x550,0x00000010, -0x551,0x00000010, -0x559,0x00000002, -0x55a,0x00000002, -0x55d,0x000000ff, -0x605,0x00000030, -0x608,0x0000000e, -0x609,0x0000002a, -0x652,0x00000020, -0x652,0x00000020, -0x63c,0x00000008, -0x63d,0x00000008, -0x63e,0x0000000c, -0x63f,0x0000000c, -0x66e,0x00000005, -0x700,0x00000021, -0x701,0x00000043, -0x702,0x00000065, -0x703,0x00000087, -0x708,0x00000021, -0x709,0x00000043, -0x70a,0x00000065, -0x70b,0x00000087, -}; - +/*Created on 2011/ 6/16, 6: 8*/ + +#include "../odm_precomp.h" +// MAC reg V14 - 2011-11-23 +u4Byte Rtl8192CEMAC_2T_Array[Rtl8192CEMAC_2T_ArrayLength] = { +0x420,0x00000080, +0x423,0x00000000, +0x430,0x00000000, +0x431,0x00000000, +0x432,0x00000000, +0x433,0x00000001, +0x434,0x00000004, +0x435,0x00000005, +0x436,0x00000006, +0x437,0x00000007, +0x438,0x00000000, +0x439,0x00000000, +0x43a,0x00000000, +0x43b,0x00000001, +0x43c,0x00000004, +0x43d,0x00000005, +0x43e,0x00000006, +0x43f,0x00000007, +0x440,0x0000005d, +0x441,0x00000001, +0x442,0x00000000, +0x444,0x00000015, +0x445,0x000000f0, +0x446,0x0000000f, +0x447,0x00000000, +0x458,0x00000041, +0x459,0x000000a8, +0x45a,0x00000072, +0x45b,0x000000b9, +0x460,0x00000066, +0x461,0x00000066, +0x462,0x00000008, +0x463,0x00000003, +0x4c8,0x000000ff, +0x4c9,0x00000008, +0x4cc,0x000000ff, +0x4cd,0x000000ff, +0x4ce,0x00000001, +0x500,0x00000026, +0x501,0x000000a2, +0x502,0x0000002f, +0x503,0x00000000, +0x504,0x00000028, +0x505,0x000000a3, +0x506,0x0000005e, +0x507,0x00000000, +0x508,0x0000002b, +0x509,0x000000a4, +0x50a,0x0000005e, +0x50b,0x00000000, +0x50c,0x0000004f, +0x50d,0x000000a4, +0x50e,0x00000000, +0x50f,0x00000000, +0x512,0x0000001c, +0x514,0x0000000a, +0x515,0x00000010, +0x516,0x0000000a, +0x517,0x00000010, +0x51a,0x00000016, +0x524,0x0000000f, +0x525,0x0000004f, +0x546,0x00000040, +0x547,0x00000000, +0x550,0x00000010, +0x551,0x00000010, +0x559,0x00000002, +0x55a,0x00000002, +0x55d,0x000000ff, +0x605,0x00000030, +0x608,0x0000000e, +0x609,0x0000002a, +0x652,0x00000020, +0x652,0x00000020, +0x63c,0x00000008, +0x63d,0x00000008, +0x63e,0x0000000c, +0x63f,0x0000000c, +0x66e,0x00000005, +0x700,0x00000021, +0x701,0x00000043, +0x702,0x00000065, +0x703,0x00000087, +0x708,0x00000021, +0x709,0x00000043, +0x70a,0x00000065, +0x70b,0x00000087, +}; + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEMACImg_CE.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEMACImg_CE.h index 4176c3930e34..b237bcaea6b7 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEMACImg_CE.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEMACImg_CE.h @@ -1,10 +1,10 @@ -#ifndef __INC_HAL8192CE_MAC_IMG_H -#define __INC_HAL8192CE_MAC_IMG_H - -/*Created on 2011/ 6/16, 6: 8*/ - -#define Rtl8192CEMAC_2T_ArrayLength 174 -extern u4Byte Rtl8192CEMAC_2T_Array[Rtl8192CEMAC_2T_ArrayLength]; - -#endif //__INC_HAL8192CE_FW_IMG_H - +#ifndef __INC_HAL8192CE_MAC_IMG_H +#define __INC_HAL8192CE_MAC_IMG_H + +/*Created on 2011/ 6/16, 6: 8*/ + +#define Rtl8192CEMAC_2T_ArrayLength 174 +extern u4Byte Rtl8192CEMAC_2T_Array[Rtl8192CEMAC_2T_ArrayLength]; + +#endif //__INC_HAL8192CE_FW_IMG_H + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEPHYImg_CE.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEPHYImg_CE.c index 3892736f8355..500af054379b 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEPHYImg_CE.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEPHYImg_CE.c @@ -1,1198 +1,1198 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include "../odm_precomp.h" - - -u4Byte Rtl8192CEPHY_REG_2TArray[Rtl8192CEPHY_REG_2TArrayLength] = { -0x024,0x0011800f, -0x028,0x00ffdb83, -0x800,0x80040002, -0x804,0x00000003, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10000330, //for Broadcom AP IOT -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x01000100, -0x82c,0x00390004, -0x830,0x27272727, -0x834,0x27272727, -0x838,0x27272727, -0x83c,0x27272727, -0x840,0x00010000, -0x844,0x00010000, -0x848,0x27272727, -0x84c,0x27272727, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x0c1b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x27272727, -0x86c,0x2b2b2b27, -0x870,0x07000700, -0x874,0x22184000, -0x878,0x08080808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xcc0000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121313, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05633, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x69543420, -0xc54,0x43bc0094, -0xc58,0x69543420, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x218610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0xa0e40000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020403, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000010, -0xe68,0x001b25a4, -0xe6c,0x63db25a4, -0xe70,0x63db25a4, -0xe74,0x0c1b25a4, -0xe78,0x0c1b25a4, -0xe7c,0x0c1b25a4, -0xe80,0x0c1b25a4, -0xe84,0x63db25a4, -0xe88,0x0c1b25a4, -0xe8c,0x63db25a4, -0xed0,0x63db25a4, -0xed4,0x63db25a4, -0xed8,0x63db25a4, -0xedc,0x001b25a4, -0xee0,0x001b25a4, -0xeec,0x6fdb25a4, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u4Byte Rtl8192CEPHY_REG_1TArray[Rtl8192CEPHY_REG_1TArrayLength] = { -0x024,0x0011800f, -0x028,0x00ffdb83, -0x800,0x80040000, -0x804,0x00000001, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10000330, //for Broadcom AP IOT -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x32323200, -0x870,0x07000700, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x69543420, -0xc54,0x43bc0094, -0xc58,0x69543420, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00000740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u4Byte Rtl8192CEPHY_ChangeTo_1T1RArray[Rtl8192CEPHY_ChangeTo_1T1RArrayLength] = { -0x0, }; - -u4Byte Rtl8192CEPHY_ChangeTo_1T2RArray[Rtl8192CEPHY_ChangeTo_1T2RArrayLength] = { -0x0, }; - -u4Byte Rtl8192CEPHY_ChangeTo_2T2RArray[Rtl8192CEPHY_ChangeTo_2T2RArrayLength] = { -0x0, }; - -u4Byte Rtl8192CEPHY_REG_Array_PG[Rtl8192CEPHY_REG_Array_PGLength] = { -0xe00,0xffffffff,0x07090c0c, -0xe04,0xffffffff,0x01020405, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x0b0c0c0e, -0xe14,0xffffffff,0x01030506, -0xe18,0xffffffff,0x0b0c0d0e, -0xe1c,0xffffffff,0x01030509, -0x830,0xffffffff,0x07090c0c, -0x834,0xffffffff,0x01020405, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x0b0c0d0e, -0x848,0xffffffff,0x01030509, -0x84c,0xffffffff,0x0b0c0d0e, -0x868,0xffffffff,0x01030509, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x06060606, -0xe14,0xffffffff,0x00020406, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x06060606, -0x848,0xffffffff,0x00020406, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -}; - -u4Byte Rtl8192CEPHY_REG_Array_MP[Rtl8192CEPHY_REG_Array_MPLength] = { -0xc30,0x69e9ac4a, -0xc3c,0x0a979718, -}; - -u4Byte Rtl8192CERadioA_2TArray[Rtl8192CERadioA_2TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00010255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x000577c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u4Byte Rtl8192CERadioB_2TArray[Rtl8192CERadioB_2TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -}; - -u4Byte Rtl8192CERadioA_1TArray[Rtl8192CERadioA_1TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001af31, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00010255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x000577c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u4Byte Rtl8192CERadioB_1TArray[Rtl8192CERadioB_1TArrayLength] = { -0x0, }; - -u4Byte Rtl8192CERadioB_GM_Array[Rtl8192CERadioB_GM_ArrayLength] = { -0x0, }; - -u4Byte Rtl8192CEMACPHY_Array_PG[Rtl8192CEMACPHY_Array_PGLength] = { -0x0, }; - -u4Byte Rtl8192CEAGCTAB_2TArray[Rtl8192CEAGCTAB_2TArrayLength] = { -0xc78,0x7b000001, -0xc78,0x7b010001, -0xc78,0x7b020001, -0xc78,0x7b030001, -0xc78,0x7b040001, -0xc78,0x7b050001, -0xc78,0x7a060001, -0xc78,0x79070001, -0xc78,0x78080001, -0xc78,0x77090001, -0xc78,0x760a0001, -0xc78,0x750b0001, -0xc78,0x740c0001, -0xc78,0x730d0001, -0xc78,0x720e0001, -0xc78,0x710f0001, -0xc78,0x70100001, -0xc78,0x6f110001, -0xc78,0x6e120001, -0xc78,0x6d130001, -0xc78,0x6c140001, -0xc78,0x6b150001, -0xc78,0x6a160001, -0xc78,0x69170001, -0xc78,0x68180001, -0xc78,0x67190001, -0xc78,0x661a0001, -0xc78,0x651b0001, -0xc78,0x641c0001, -0xc78,0x631d0001, -0xc78,0x621e0001, -0xc78,0x611f0001, -0xc78,0x60200001, -0xc78,0x49210001, -0xc78,0x48220001, -0xc78,0x47230001, -0xc78,0x46240001, -0xc78,0x45250001, -0xc78,0x44260001, -0xc78,0x43270001, -0xc78,0x42280001, -0xc78,0x41290001, -0xc78,0x402a0001, -0xc78,0x262b0001, -0xc78,0x252c0001, -0xc78,0x242d0001, -0xc78,0x232e0001, -0xc78,0x222f0001, -0xc78,0x21300001, -0xc78,0x20310001, -0xc78,0x06320001, -0xc78,0x05330001, -0xc78,0x04340001, -0xc78,0x03350001, -0xc78,0x02360001, -0xc78,0x01370001, -0xc78,0x00380001, -0xc78,0x00390001, -0xc78,0x003a0001, -0xc78,0x003b0001, -0xc78,0x003c0001, -0xc78,0x003d0001, -0xc78,0x003e0001, -0xc78,0x003f0001, -0xc78,0x7b400001, -0xc78,0x7b410001, -0xc78,0x7b420001, -0xc78,0x7b430001, -0xc78,0x7b440001, -0xc78,0x7b450001, -0xc78,0x7a460001, -0xc78,0x79470001, -0xc78,0x78480001, -0xc78,0x77490001, -0xc78,0x764a0001, -0xc78,0x754b0001, -0xc78,0x744c0001, -0xc78,0x734d0001, -0xc78,0x724e0001, -0xc78,0x714f0001, -0xc78,0x70500001, -0xc78,0x6f510001, -0xc78,0x6e520001, -0xc78,0x6d530001, -0xc78,0x6c540001, -0xc78,0x6b550001, -0xc78,0x6a560001, -0xc78,0x69570001, -0xc78,0x68580001, -0xc78,0x67590001, -0xc78,0x665a0001, -0xc78,0x655b0001, -0xc78,0x645c0001, -0xc78,0x635d0001, -0xc78,0x625e0001, -0xc78,0x615f0001, -0xc78,0x60600001, -0xc78,0x49610001, -0xc78,0x48620001, -0xc78,0x47630001, -0xc78,0x46640001, -0xc78,0x45650001, -0xc78,0x44660001, -0xc78,0x43670001, -0xc78,0x42680001, -0xc78,0x41690001, -0xc78,0x406a0001, -0xc78,0x266b0001, -0xc78,0x256c0001, -0xc78,0x246d0001, -0xc78,0x236e0001, -0xc78,0x226f0001, -0xc78,0x21700001, -0xc78,0x20710001, -0xc78,0x06720001, -0xc78,0x05730001, -0xc78,0x04740001, -0xc78,0x03750001, -0xc78,0x02760001, -0xc78,0x01770001, -0xc78,0x00780001, -0xc78,0x00790001, -0xc78,0x007a0001, -0xc78,0x007b0001, -0xc78,0x007c0001, -0xc78,0x007d0001, -0xc78,0x007e0001, -0xc78,0x007f0001, -0xc78,0x3800001e, -0xc78,0x3801001e, -0xc78,0x3802001e, -0xc78,0x3803001e, -0xc78,0x3804001e, -0xc78,0x3805001e, -0xc78,0x3806001e, -0xc78,0x3807001e, -0xc78,0x3808001e, -0xc78,0x3c09001e, -0xc78,0x3e0a001e, -0xc78,0x400b001e, -0xc78,0x440c001e, -0xc78,0x480d001e, -0xc78,0x4c0e001e, -0xc78,0x500f001e, -0xc78,0x5210001e, -0xc78,0x5611001e, -0xc78,0x5a12001e, -0xc78,0x5e13001e, -0xc78,0x6014001e, -0xc78,0x6015001e, -0xc78,0x6016001e, -0xc78,0x6217001e, -0xc78,0x6218001e, -0xc78,0x6219001e, -0xc78,0x621a001e, -0xc78,0x621b001e, -0xc78,0x621c001e, -0xc78,0x621d001e, -0xc78,0x621e001e, -0xc78,0x621f001e, -}; - -u4Byte Rtl8192CEAGCTAB_1TArray[Rtl8192CEAGCTAB_1TArrayLength] = { -0xc78,0x7b000001, -0xc78,0x7b010001, -0xc78,0x7b020001, -0xc78,0x7b030001, -0xc78,0x7b040001, -0xc78,0x7b050001, -0xc78,0x7a060001, -0xc78,0x79070001, -0xc78,0x78080001, -0xc78,0x77090001, -0xc78,0x760a0001, -0xc78,0x750b0001, -0xc78,0x740c0001, -0xc78,0x730d0001, -0xc78,0x720e0001, -0xc78,0x710f0001, -0xc78,0x70100001, -0xc78,0x6f110001, -0xc78,0x6e120001, -0xc78,0x6d130001, -0xc78,0x6c140001, -0xc78,0x6b150001, -0xc78,0x6a160001, -0xc78,0x69170001, -0xc78,0x68180001, -0xc78,0x67190001, -0xc78,0x661a0001, -0xc78,0x651b0001, -0xc78,0x641c0001, -0xc78,0x631d0001, -0xc78,0x621e0001, -0xc78,0x611f0001, -0xc78,0x60200001, -0xc78,0x49210001, -0xc78,0x48220001, -0xc78,0x47230001, -0xc78,0x46240001, -0xc78,0x45250001, -0xc78,0x44260001, -0xc78,0x43270001, -0xc78,0x42280001, -0xc78,0x41290001, -0xc78,0x402a0001, -0xc78,0x262b0001, -0xc78,0x252c0001, -0xc78,0x242d0001, -0xc78,0x232e0001, -0xc78,0x222f0001, -0xc78,0x21300001, -0xc78,0x20310001, -0xc78,0x06320001, -0xc78,0x05330001, -0xc78,0x04340001, -0xc78,0x03350001, -0xc78,0x02360001, -0xc78,0x01370001, -0xc78,0x00380001, -0xc78,0x00390001, -0xc78,0x003a0001, -0xc78,0x003b0001, -0xc78,0x003c0001, -0xc78,0x003d0001, -0xc78,0x003e0001, -0xc78,0x003f0001, -0xc78,0x7b400001, -0xc78,0x7b410001, -0xc78,0x7b420001, -0xc78,0x7b430001, -0xc78,0x7b440001, -0xc78,0x7b450001, -0xc78,0x7a460001, -0xc78,0x79470001, -0xc78,0x78480001, -0xc78,0x77490001, -0xc78,0x764a0001, -0xc78,0x754b0001, -0xc78,0x744c0001, -0xc78,0x734d0001, -0xc78,0x724e0001, -0xc78,0x714f0001, -0xc78,0x70500001, -0xc78,0x6f510001, -0xc78,0x6e520001, -0xc78,0x6d530001, -0xc78,0x6c540001, -0xc78,0x6b550001, -0xc78,0x6a560001, -0xc78,0x69570001, -0xc78,0x68580001, -0xc78,0x67590001, -0xc78,0x665a0001, -0xc78,0x655b0001, -0xc78,0x645c0001, -0xc78,0x635d0001, -0xc78,0x625e0001, -0xc78,0x615f0001, -0xc78,0x60600001, -0xc78,0x49610001, -0xc78,0x48620001, -0xc78,0x47630001, -0xc78,0x46640001, -0xc78,0x45650001, -0xc78,0x44660001, -0xc78,0x43670001, -0xc78,0x42680001, -0xc78,0x41690001, -0xc78,0x406a0001, -0xc78,0x266b0001, -0xc78,0x256c0001, -0xc78,0x246d0001, -0xc78,0x236e0001, -0xc78,0x226f0001, -0xc78,0x21700001, -0xc78,0x20710001, -0xc78,0x06720001, -0xc78,0x05730001, -0xc78,0x04740001, -0xc78,0x03750001, -0xc78,0x02760001, -0xc78,0x01770001, -0xc78,0x00780001, -0xc78,0x00790001, -0xc78,0x007a0001, -0xc78,0x007b0001, -0xc78,0x007c0001, -0xc78,0x007d0001, -0xc78,0x007e0001, -0xc78,0x007f0001, -0xc78,0x3800001e, -0xc78,0x3801001e, -0xc78,0x3802001e, -0xc78,0x3803001e, -0xc78,0x3804001e, -0xc78,0x3805001e, -0xc78,0x3806001e, -0xc78,0x3807001e, -0xc78,0x3808001e, -0xc78,0x3c09001e, -0xc78,0x3e0a001e, -0xc78,0x400b001e, -0xc78,0x440c001e, -0xc78,0x480d001e, -0xc78,0x4c0e001e, -0xc78,0x500f001e, -0xc78,0x5210001e, -0xc78,0x5611001e, -0xc78,0x5a12001e, -0xc78,0x5e13001e, -0xc78,0x6014001e, -0xc78,0x6015001e, -0xc78,0x6016001e, -0xc78,0x6217001e, -0xc78,0x6218001e, -0xc78,0x6219001e, -0xc78,0x621a001e, -0xc78,0x621b001e, -0xc78,0x621c001e, -0xc78,0x621d001e, -0xc78,0x621e001e, -0xc78,0x621f001e, -}; - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#include "../odm_precomp.h" + + +u4Byte Rtl8192CEPHY_REG_2TArray[Rtl8192CEPHY_REG_2TArrayLength] = { +0x024,0x0011800f, +0x028,0x00ffdb83, +0x800,0x80040002, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10000330, //for Broadcom AP IOT +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x01000100, +0x82c,0x00390004, +0x830,0x27272727, +0x834,0x27272727, +0x838,0x27272727, +0x83c,0x27272727, +0x840,0x00010000, +0x844,0x00010000, +0x848,0x27272727, +0x84c,0x27272727, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x0c1b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x27272727, +0x86c,0x2b2b2b27, +0x870,0x07000700, +0x874,0x22184000, +0x878,0x08080808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xcc0000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121313, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05633, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x69543420, +0xc54,0x43bc0094, +0xc58,0x69543420, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x218610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0xa0e40000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020403, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000010, +0xe68,0x001b25a4, +0xe6c,0x63db25a4, +0xe70,0x63db25a4, +0xe74,0x0c1b25a4, +0xe78,0x0c1b25a4, +0xe7c,0x0c1b25a4, +0xe80,0x0c1b25a4, +0xe84,0x63db25a4, +0xe88,0x0c1b25a4, +0xe8c,0x63db25a4, +0xed0,0x63db25a4, +0xed4,0x63db25a4, +0xed8,0x63db25a4, +0xedc,0x001b25a4, +0xee0,0x001b25a4, +0xeec,0x6fdb25a4, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u4Byte Rtl8192CEPHY_REG_1TArray[Rtl8192CEPHY_REG_1TArrayLength] = { +0x024,0x0011800f, +0x028,0x00ffdb83, +0x800,0x80040000, +0x804,0x00000001, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10000330, //for Broadcom AP IOT +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000700, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x69543420, +0xc54,0x43bc0094, +0xc58,0x69543420, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00000740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u4Byte Rtl8192CEPHY_ChangeTo_1T1RArray[Rtl8192CEPHY_ChangeTo_1T1RArrayLength] = { +0x0, }; + +u4Byte Rtl8192CEPHY_ChangeTo_1T2RArray[Rtl8192CEPHY_ChangeTo_1T2RArrayLength] = { +0x0, }; + +u4Byte Rtl8192CEPHY_ChangeTo_2T2RArray[Rtl8192CEPHY_ChangeTo_2T2RArrayLength] = { +0x0, }; + +u4Byte Rtl8192CEPHY_REG_Array_PG[Rtl8192CEPHY_REG_Array_PGLength] = { +0xe00,0xffffffff,0x07090c0c, +0xe04,0xffffffff,0x01020405, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x0b0c0c0e, +0xe14,0xffffffff,0x01030506, +0xe18,0xffffffff,0x0b0c0d0e, +0xe1c,0xffffffff,0x01030509, +0x830,0xffffffff,0x07090c0c, +0x834,0xffffffff,0x01020405, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x0b0c0d0e, +0x848,0xffffffff,0x01030509, +0x84c,0xffffffff,0x0b0c0d0e, +0x868,0xffffffff,0x01030509, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x06060606, +0xe14,0xffffffff,0x00020406, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x06060606, +0x848,0xffffffff,0x00020406, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u4Byte Rtl8192CEPHY_REG_Array_MP[Rtl8192CEPHY_REG_Array_MPLength] = { +0xc30,0x69e9ac4a, +0xc3c,0x0a979718, +}; + +u4Byte Rtl8192CERadioA_2TArray[Rtl8192CERadioA_2TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u4Byte Rtl8192CERadioB_2TArray[Rtl8192CERadioB_2TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +}; + +u4Byte Rtl8192CERadioA_1TArray[Rtl8192CERadioA_1TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001af31, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u4Byte Rtl8192CERadioB_1TArray[Rtl8192CERadioB_1TArrayLength] = { +0x0, }; + +u4Byte Rtl8192CERadioB_GM_Array[Rtl8192CERadioB_GM_ArrayLength] = { +0x0, }; + +u4Byte Rtl8192CEMACPHY_Array_PG[Rtl8192CEMACPHY_Array_PGLength] = { +0x0, }; + +u4Byte Rtl8192CEAGCTAB_2TArray[Rtl8192CEAGCTAB_2TArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7a060001, +0xc78,0x79070001, +0xc78,0x78080001, +0xc78,0x77090001, +0xc78,0x760a0001, +0xc78,0x750b0001, +0xc78,0x740c0001, +0xc78,0x730d0001, +0xc78,0x720e0001, +0xc78,0x710f0001, +0xc78,0x70100001, +0xc78,0x6f110001, +0xc78,0x6e120001, +0xc78,0x6d130001, +0xc78,0x6c140001, +0xc78,0x6b150001, +0xc78,0x6a160001, +0xc78,0x69170001, +0xc78,0x68180001, +0xc78,0x67190001, +0xc78,0x661a0001, +0xc78,0x651b0001, +0xc78,0x641c0001, +0xc78,0x631d0001, +0xc78,0x621e0001, +0xc78,0x611f0001, +0xc78,0x60200001, +0xc78,0x49210001, +0xc78,0x48220001, +0xc78,0x47230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7a460001, +0xc78,0x79470001, +0xc78,0x78480001, +0xc78,0x77490001, +0xc78,0x764a0001, +0xc78,0x754b0001, +0xc78,0x744c0001, +0xc78,0x734d0001, +0xc78,0x724e0001, +0xc78,0x714f0001, +0xc78,0x70500001, +0xc78,0x6f510001, +0xc78,0x6e520001, +0xc78,0x6d530001, +0xc78,0x6c540001, +0xc78,0x6b550001, +0xc78,0x6a560001, +0xc78,0x69570001, +0xc78,0x68580001, +0xc78,0x67590001, +0xc78,0x665a0001, +0xc78,0x655b0001, +0xc78,0x645c0001, +0xc78,0x635d0001, +0xc78,0x625e0001, +0xc78,0x615f0001, +0xc78,0x60600001, +0xc78,0x49610001, +0xc78,0x48620001, +0xc78,0x47630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + +u4Byte Rtl8192CEAGCTAB_1TArray[Rtl8192CEAGCTAB_1TArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7a060001, +0xc78,0x79070001, +0xc78,0x78080001, +0xc78,0x77090001, +0xc78,0x760a0001, +0xc78,0x750b0001, +0xc78,0x740c0001, +0xc78,0x730d0001, +0xc78,0x720e0001, +0xc78,0x710f0001, +0xc78,0x70100001, +0xc78,0x6f110001, +0xc78,0x6e120001, +0xc78,0x6d130001, +0xc78,0x6c140001, +0xc78,0x6b150001, +0xc78,0x6a160001, +0xc78,0x69170001, +0xc78,0x68180001, +0xc78,0x67190001, +0xc78,0x661a0001, +0xc78,0x651b0001, +0xc78,0x641c0001, +0xc78,0x631d0001, +0xc78,0x621e0001, +0xc78,0x611f0001, +0xc78,0x60200001, +0xc78,0x49210001, +0xc78,0x48220001, +0xc78,0x47230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7a460001, +0xc78,0x79470001, +0xc78,0x78480001, +0xc78,0x77490001, +0xc78,0x764a0001, +0xc78,0x754b0001, +0xc78,0x744c0001, +0xc78,0x734d0001, +0xc78,0x724e0001, +0xc78,0x714f0001, +0xc78,0x70500001, +0xc78,0x6f510001, +0xc78,0x6e520001, +0xc78,0x6d530001, +0xc78,0x6c540001, +0xc78,0x6b550001, +0xc78,0x6a560001, +0xc78,0x69570001, +0xc78,0x68580001, +0xc78,0x67590001, +0xc78,0x665a0001, +0xc78,0x655b0001, +0xc78,0x645c0001, +0xc78,0x635d0001, +0xc78,0x625e0001, +0xc78,0x615f0001, +0xc78,0x60600001, +0xc78,0x49610001, +0xc78,0x48620001, +0xc78,0x47630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEPHYImg_CE.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEPHYImg_CE.h index 04e62d28742b..7c1f882cd5b0 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEPHYImg_CE.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CEPHYImg_CE.h @@ -1,60 +1,60 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __INC_HAL8192CE_PHY_IMG_H -#define __INC_HAL8192CE_PHY_IMG_H - - -/*Created on 2011/ 6/16, 6: 8*/ - -#define Rtl8192CEPHY_REG_2TArrayLength 374 -extern u4Byte Rtl8192CEPHY_REG_2TArray[Rtl8192CEPHY_REG_2TArrayLength]; -#define Rtl8192CEPHY_REG_1TArrayLength 374 -extern u4Byte Rtl8192CEPHY_REG_1TArray[Rtl8192CEPHY_REG_1TArrayLength]; -#define Rtl8192CEPHY_ChangeTo_1T1RArrayLength 1 -extern u4Byte Rtl8192CEPHY_ChangeTo_1T1RArray[Rtl8192CEPHY_ChangeTo_1T1RArrayLength]; -#define Rtl8192CEPHY_ChangeTo_1T2RArrayLength 1 -extern u4Byte Rtl8192CEPHY_ChangeTo_1T2RArray[Rtl8192CEPHY_ChangeTo_1T2RArrayLength]; -#define Rtl8192CEPHY_ChangeTo_2T2RArrayLength 1 -extern u4Byte Rtl8192CEPHY_ChangeTo_2T2RArray[Rtl8192CEPHY_ChangeTo_2T2RArrayLength]; -#define Rtl8192CEPHY_REG_Array_PGLength 336 -extern u4Byte Rtl8192CEPHY_REG_Array_PG[Rtl8192CEPHY_REG_Array_PGLength]; -#define Rtl8192CEPHY_REG_Array_MPLength 4 -extern u4Byte Rtl8192CEPHY_REG_Array_MP[Rtl8192CEPHY_REG_Array_MPLength]; -#define Rtl8192CERadioA_2TArrayLength 282 -extern u4Byte Rtl8192CERadioA_2TArray[Rtl8192CERadioA_2TArrayLength]; -#define Rtl8192CERadioB_2TArrayLength 78 -extern u4Byte Rtl8192CERadioB_2TArray[Rtl8192CERadioB_2TArrayLength]; -#define Rtl8192CERadioA_1TArrayLength 282 -extern u4Byte Rtl8192CERadioA_1TArray[Rtl8192CERadioA_1TArrayLength]; -#define Rtl8192CERadioB_1TArrayLength 1 -extern u4Byte Rtl8192CERadioB_1TArray[Rtl8192CERadioB_1TArrayLength]; -#define Rtl8192CERadioB_GM_ArrayLength 1 -extern u4Byte Rtl8192CERadioB_GM_Array[Rtl8192CERadioB_GM_ArrayLength]; -#define Rtl8192CEMACPHY_Array_PGLength 1 -extern u4Byte Rtl8192CEMACPHY_Array_PG[Rtl8192CEMACPHY_Array_PGLength]; -#define Rtl8192CEAGCTAB_2TArrayLength 320 -extern u4Byte Rtl8192CEAGCTAB_2TArray[Rtl8192CEAGCTAB_2TArrayLength]; -#define Rtl8192CEAGCTAB_1TArrayLength 320 -extern u4Byte Rtl8192CEAGCTAB_1TArray[Rtl8192CEAGCTAB_1TArrayLength]; - - -#endif //__INC_HAL8192CE_FW_IMG_H - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __INC_HAL8192CE_PHY_IMG_H +#define __INC_HAL8192CE_PHY_IMG_H + + +/*Created on 2011/ 6/16, 6: 8*/ + +#define Rtl8192CEPHY_REG_2TArrayLength 374 +extern u4Byte Rtl8192CEPHY_REG_2TArray[Rtl8192CEPHY_REG_2TArrayLength]; +#define Rtl8192CEPHY_REG_1TArrayLength 374 +extern u4Byte Rtl8192CEPHY_REG_1TArray[Rtl8192CEPHY_REG_1TArrayLength]; +#define Rtl8192CEPHY_ChangeTo_1T1RArrayLength 1 +extern u4Byte Rtl8192CEPHY_ChangeTo_1T1RArray[Rtl8192CEPHY_ChangeTo_1T1RArrayLength]; +#define Rtl8192CEPHY_ChangeTo_1T2RArrayLength 1 +extern u4Byte Rtl8192CEPHY_ChangeTo_1T2RArray[Rtl8192CEPHY_ChangeTo_1T2RArrayLength]; +#define Rtl8192CEPHY_ChangeTo_2T2RArrayLength 1 +extern u4Byte Rtl8192CEPHY_ChangeTo_2T2RArray[Rtl8192CEPHY_ChangeTo_2T2RArrayLength]; +#define Rtl8192CEPHY_REG_Array_PGLength 336 +extern u4Byte Rtl8192CEPHY_REG_Array_PG[Rtl8192CEPHY_REG_Array_PGLength]; +#define Rtl8192CEPHY_REG_Array_MPLength 4 +extern u4Byte Rtl8192CEPHY_REG_Array_MP[Rtl8192CEPHY_REG_Array_MPLength]; +#define Rtl8192CERadioA_2TArrayLength 282 +extern u4Byte Rtl8192CERadioA_2TArray[Rtl8192CERadioA_2TArrayLength]; +#define Rtl8192CERadioB_2TArrayLength 78 +extern u4Byte Rtl8192CERadioB_2TArray[Rtl8192CERadioB_2TArrayLength]; +#define Rtl8192CERadioA_1TArrayLength 282 +extern u4Byte Rtl8192CERadioA_1TArray[Rtl8192CERadioA_1TArrayLength]; +#define Rtl8192CERadioB_1TArrayLength 1 +extern u4Byte Rtl8192CERadioB_1TArray[Rtl8192CERadioB_1TArrayLength]; +#define Rtl8192CERadioB_GM_ArrayLength 1 +extern u4Byte Rtl8192CERadioB_GM_Array[Rtl8192CERadioB_GM_ArrayLength]; +#define Rtl8192CEMACPHY_Array_PGLength 1 +extern u4Byte Rtl8192CEMACPHY_Array_PG[Rtl8192CEMACPHY_Array_PGLength]; +#define Rtl8192CEAGCTAB_2TArrayLength 320 +extern u4Byte Rtl8192CEAGCTAB_2TArray[Rtl8192CEAGCTAB_2TArrayLength]; +#define Rtl8192CEAGCTAB_1TArrayLength 320 +extern u4Byte Rtl8192CEAGCTAB_1TArray[Rtl8192CEAGCTAB_1TArrayLength]; + + +#endif //__INC_HAL8192CE_FW_IMG_H + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CReg.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CReg.h index fed4689b248b..111a350f8ab0 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CReg.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CReg.h @@ -1,45 +1,45 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -//============================================================ -// File Name: Hal8192CReg.h -// -// Description: -// -// This file is for 92CE/92CU register definition. -// -// -//============================================================ -#ifndef __HAL_8192C_REG_H__ -#define __HAL_8192C_REG_H__ - -// -// Register Definition -// -#define ODM_R_A_AGC_CORE1_8192C 0xc50 - - -// -// Bitmap Definition -// -#define BIT_FA_RESET_8192C BIT0 - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +//============================================================ +// File Name: Hal8192CReg.h +// +// Description: +// +// This file is for 92CE/92CU register definition. +// +// +//============================================================ +#ifndef __HAL_8192C_REG_H__ +#define __HAL_8192C_REG_H__ + +// +// Register Definition +// +#define ODM_R_A_AGC_CORE1_8192C 0xc50 + + +// +// Bitmap Definition +// +#define BIT_FA_RESET_8192C BIT0 + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUMACImg_CE.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUMACImg_CE.c index 5a641b868db7..ff4856de3856 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUMACImg_CE.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUMACImg_CE.c @@ -1,97 +1,97 @@ -/*Created on 2011/ 6/16, 6: 8*/ - -#include "../odm_precomp.h" - - -// MAC reg V14 - 2011-11-23 -u4Byte Rtl8192CUMAC_2T_Array[Rtl8192CUMAC_2T_ArrayLength] = { -0x420,0x00000080, -0x423,0x00000000, -0x430,0x00000000, -0x431,0x00000000, -0x432,0x00000000, -0x433,0x00000001, -0x434,0x00000004, -0x435,0x00000005, -0x436,0x00000006, -0x437,0x00000007, -0x438,0x00000000, -0x439,0x00000000, -0x43a,0x00000000, -0x43b,0x00000001, -0x43c,0x00000004, -0x43d,0x00000005, -0x43e,0x00000006, -0x43f,0x00000007, -0x440,0x0000005d, -0x441,0x00000001, -0x442,0x00000000, -0x444,0x00000015, -0x445,0x000000f0, -0x446,0x0000000f, -0x447,0x00000000, -0x458,0x00000041, -0x459,0x000000a8, -0x45a,0x00000072, -0x45b,0x000000b9, -0x460,0x00000066, -0x461,0x00000066, -0x462,0x00000008, -0x463,0x00000003, -0x4c8,0x000000ff, -0x4c9,0x00000008, -0x4cc,0x000000ff, -0x4cd,0x000000ff, -0x4ce,0x00000001, -0x500,0x00000026, -0x501,0x000000a2, -0x502,0x0000002f, -0x503,0x00000000, -0x504,0x00000028, -0x505,0x000000a3, -0x506,0x0000005e, -0x507,0x00000000, -0x508,0x0000002b, -0x509,0x000000a4, -0x50a,0x0000005e, -0x50b,0x00000000, -0x50c,0x0000004f, -0x50d,0x000000a4, -0x50e,0x00000000, -0x50f,0x00000000, -0x512,0x0000001c, -0x514,0x0000000a, -0x515,0x00000010, -0x516,0x0000000a, -0x517,0x00000010, -0x51a,0x00000016, -0x524,0x0000000f, -0x525,0x0000004f, -0x546,0x00000040, -0x547,0x00000000, -0x550,0x00000010, -0x551,0x00000010, -0x559,0x00000002, -0x55a,0x00000002, -0x55d,0x000000ff, -0x605,0x00000030, -0x608,0x0000000e, -0x609,0x0000002a, -0x652,0x00000020, -0x652,0x00000020, -0x63c,0x00000008, -0x63d,0x00000008, -0x63e,0x0000000c, -0x63f,0x0000000c, -0x66e,0x00000005, -0x700,0x00000021, -0x701,0x00000043, -0x702,0x00000065, -0x703,0x00000087, -0x708,0x00000021, -0x709,0x00000043, -0x70a,0x00000065, -0x70b,0x00000087, -}; - - +/*Created on 2011/ 6/16, 6: 8*/ + +#include "../odm_precomp.h" + + +// MAC reg V14 - 2011-11-23 +u4Byte Rtl8192CUMAC_2T_Array[Rtl8192CUMAC_2T_ArrayLength] = { +0x420,0x00000080, +0x423,0x00000000, +0x430,0x00000000, +0x431,0x00000000, +0x432,0x00000000, +0x433,0x00000001, +0x434,0x00000004, +0x435,0x00000005, +0x436,0x00000006, +0x437,0x00000007, +0x438,0x00000000, +0x439,0x00000000, +0x43a,0x00000000, +0x43b,0x00000001, +0x43c,0x00000004, +0x43d,0x00000005, +0x43e,0x00000006, +0x43f,0x00000007, +0x440,0x0000005d, +0x441,0x00000001, +0x442,0x00000000, +0x444,0x00000015, +0x445,0x000000f0, +0x446,0x0000000f, +0x447,0x00000000, +0x458,0x00000041, +0x459,0x000000a8, +0x45a,0x00000072, +0x45b,0x000000b9, +0x460,0x00000066, +0x461,0x00000066, +0x462,0x00000008, +0x463,0x00000003, +0x4c8,0x000000ff, +0x4c9,0x00000008, +0x4cc,0x000000ff, +0x4cd,0x000000ff, +0x4ce,0x00000001, +0x500,0x00000026, +0x501,0x000000a2, +0x502,0x0000002f, +0x503,0x00000000, +0x504,0x00000028, +0x505,0x000000a3, +0x506,0x0000005e, +0x507,0x00000000, +0x508,0x0000002b, +0x509,0x000000a4, +0x50a,0x0000005e, +0x50b,0x00000000, +0x50c,0x0000004f, +0x50d,0x000000a4, +0x50e,0x00000000, +0x50f,0x00000000, +0x512,0x0000001c, +0x514,0x0000000a, +0x515,0x00000010, +0x516,0x0000000a, +0x517,0x00000010, +0x51a,0x00000016, +0x524,0x0000000f, +0x525,0x0000004f, +0x546,0x00000040, +0x547,0x00000000, +0x550,0x00000010, +0x551,0x00000010, +0x559,0x00000002, +0x55a,0x00000002, +0x55d,0x000000ff, +0x605,0x00000030, +0x608,0x0000000e, +0x609,0x0000002a, +0x652,0x00000020, +0x652,0x00000020, +0x63c,0x00000008, +0x63d,0x00000008, +0x63e,0x0000000c, +0x63f,0x0000000c, +0x66e,0x00000005, +0x700,0x00000021, +0x701,0x00000043, +0x702,0x00000065, +0x703,0x00000087, +0x708,0x00000021, +0x709,0x00000043, +0x70a,0x00000065, +0x70b,0x00000087, +}; + + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUMACImg_CE.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUMACImg_CE.h index fdb76cf5363e..869025a98f1a 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUMACImg_CE.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUMACImg_CE.h @@ -1,12 +1,12 @@ -#ifndef __INC_HAL8192CU_MAC_IMG_H -#define __INC_HAL8192CU_MAC_IMG_H - -/*Created on 2011/ 6/16, 6: 8*/ - - -// MAC reg V14 - 2011-11-23 -#define Rtl8192CUMAC_2T_ArrayLength 174 -extern u4Byte Rtl8192CUMAC_2T_Array[Rtl8192CUMAC_2T_ArrayLength]; - -#endif //__INC_HAL8192CE_FW_IMG_H - +#ifndef __INC_HAL8192CU_MAC_IMG_H +#define __INC_HAL8192CU_MAC_IMG_H + +/*Created on 2011/ 6/16, 6: 8*/ + + +// MAC reg V14 - 2011-11-23 +#define Rtl8192CUMAC_2T_ArrayLength 174 +extern u4Byte Rtl8192CUMAC_2T_Array[Rtl8192CUMAC_2T_ArrayLength]; + +#endif //__INC_HAL8192CE_FW_IMG_H + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUPHYImg_CE.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUPHYImg_CE.c index 5580c8c74c9d..7a961b6fe1d8 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUPHYImg_CE.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUPHYImg_CE.c @@ -1,2642 +1,2642 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -/*Created on 2011/ 6/29, 10:30*/ - -#include "../odm_precomp.h" - - -u4Byte Rtl8192CUPHY_REG_2TArray[Rtl8192CUPHY_REG_2TArrayLength] = { -0x024,0x0011800f, -0x028,0x00ffdb83, -0x800,0x80040002, -0x804,0x00000003, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10000330, //for Broadcom AP IOT -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x01000100, -0x82c,0x00390004, -0x830,0x27272727, -0x834,0x27272727, -0x838,0x27272727, -0x83c,0x27272727, -0x840,0x00010000, -0x844,0x00010000, -0x848,0x27272727, -0x84c,0x27272727, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x0c1b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x27272727, -0x86c,0x2b2b2b27, -0x870,0x07000700, -0x874,0x22184000, -0x878,0x08080808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xcc0000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121313, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05633, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x69543420, -0xc54,0x43bc0094, -0xc58,0x69543420, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x2186115b, -0xc78,0x0000001f, -0xc7c,0x00b99612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0xa0e40000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020403, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000010, -0xe68,0x001b25a4, -0xe6c,0x63db25a4, -0xe70,0x63db25a4, -0xe74,0x0c1b25a4, -0xe78,0x0c1b25a4, -0xe7c,0x0c1b25a4, -0xe80,0x0c1b25a4, -0xe84,0x63db25a4, -0xe88,0x0c1b25a4, -0xe8c,0x63db25a4, -0xed0,0x63db25a4, -0xed4,0x63db25a4, -0xed8,0x63db25a4, -0xedc,0x001b25a4, -0xee0,0x001b25a4, -0xeec,0x6fdb25a4, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u4Byte Rtl8192CUPHY_REG_1TArray[Rtl8192CUPHY_REG_1TArrayLength] = { -0x024,0x0011800f, -0x028,0x00ffdb83, -0x800,0x80040000, -0x804,0x00000001, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10000330, //for Broadcom AP IOT -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x32323200, -0x870,0x07000700, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x69543420, -0xc54,0x43bc0094, -0xc58,0x69543420, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00000740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u4Byte Rtl8192CUPHY_ChangeTo_1T1RArray[Rtl8192CUPHY_ChangeTo_1T1RArrayLength] = { -0x0, }; - -u4Byte Rtl8192CUPHY_ChangeTo_1T2RArray[Rtl8192CUPHY_ChangeTo_1T2RArrayLength] = { -0x0, }; - -u4Byte Rtl8192CUPHY_ChangeTo_2T2RArray[Rtl8192CUPHY_ChangeTo_2T2RArrayLength] = { -0x0, }; - -u4Byte Rtl8192CUPHY_REG_Array_PG[Rtl8192CUPHY_REG_Array_PGLength] = { -0xe00,0xffffffff,0x07090c0c, -0xe04,0xffffffff,0x01020405, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x0b0c0c0e, -0xe14,0xffffffff,0x01030506, -0xe18,0xffffffff,0x0b0c0d0e, -0xe1c,0xffffffff,0x01030509, -0x830,0xffffffff,0x07090c0c, -0x834,0xffffffff,0x01020405, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x0b0c0d0e, -0x848,0xffffffff,0x01030509, -0x84c,0xffffffff,0x0b0c0d0e, -0x868,0xffffffff,0x01030509, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x06060606, -0xe14,0xffffffff,0x00020406, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x06060606, -0x848,0xffffffff,0x00020406, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -}; - -u4Byte Rtl8192CUPHY_REG_Array_PG_mCard[Rtl8192CUPHY_REG_Array_PG_mCardLength] = { -0xe00,0xffffffff,0x0a0c0c0c, -0xe04,0xffffffff,0x02040608, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x0a0c0d0e, -0xe14,0xffffffff,0x02040608, -0xe18,0xffffffff,0x0a0c0d0e, -0xe1c,0xffffffff,0x02040608, -0x830,0xffffffff,0x0a0c0c0c, -0x834,0xffffffff,0x02040608, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x0a0c0d0e, -0x848,0xffffffff,0x02040608, -0x84c,0xffffffff,0x0a0c0d0e, -0x868,0xffffffff,0x02040608, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x06060606, -0xe14,0xffffffff,0x00020406, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x06060606, -0x848,0xffffffff,0x00020406, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -}; - -u4Byte Rtl8192CUPHY_REG_Array_MP[Rtl8192CUPHY_REG_Array_MPLength] = { -0xc30,0x69e9ac4a, -0xc3c,0x0a979718, -}; - -u4Byte Rtl8192CUPHY_REG_1T_HPArray[Rtl8192CUPHY_REG_1T_HPArrayLength] = { -0x024,0x0011800f, -0x028,0x00ffdb83, -0x040,0x000c0004, -0x800,0x80040000, -0x804,0x00000001, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10000330, //for Broadcom AP IOT -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390204, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x20202000, -0x870,0x03000300, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00ffc3f1, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x15160000, -0xa24,0x070b0f12, -0xa28,0x00000104, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x6954342e, -0xc54,0x43bc0094, -0xc58,0x6954342f, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c46000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x24000090, -0xc84,0x20f60000, -0xc88,0x24000090, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00000740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x24242424, -0xe04,0x24242424, -0xe08,0x03902024, -0xe10,0x24242424, -0xe14,0x24242424, -0xe18,0x24242424, -0xe1c,0x24242424, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xee8,0x31555448, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u4Byte Rtl8192CUPHY_REG_1T_mCardArray[Rtl8192CUPHY_REG_1T_mCardArrayLength] = { -0x024,0x0011800d, -0x028,0x00ffdb83, -0x800,0x80040000, -0x804,0x00000001, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10000330, //for Broadcom AP IOT -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x32323200, -0x870,0x07000700, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x69543420, -0xc54,0x43bc0094, -0xc58,0x69543420, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00000740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u4Byte Rtl8192CUPHY_REG_2T_mCardArray[Rtl8192CUPHY_REG_2T_mCardArrayLength] = { -0x024,0x0011800d, -0x028,0x00ffdb83, -0x800,0x80040002, -0x804,0x00000003, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10000330, //for Broadcom AP IOT -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x01000100, -0x82c,0x00390004, -0x830,0x27272727, -0x834,0x27272727, -0x838,0x27272727, -0x83c,0x27272727, -0x840,0x00010000, -0x844,0x00010000, -0x848,0x27272727, -0x84c,0x27272727, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x0c1b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x27272727, -0x86c,0x2b2b2b27, -0x870,0x07000700, -0x874,0x22184000, -0x878,0x08080808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xcc0000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121313, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05633, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x69543420, -0xc54,0x43bc0094, -0xc58,0x69543420, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x218610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0xa0e40000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020403, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000010, -0xe68,0x001b25a4, -0xe6c,0x63db25a4, -0xe70,0x63db25a4, -0xe74,0x0c1b25a4, -0xe78,0x0c1b25a4, -0xe7c,0x0c1b25a4, -0xe80,0x0c1b25a4, -0xe84,0x63db25a4, -0xe88,0x0c1b25a4, -0xe8c,0x63db25a4, -0xed0,0x63db25a4, -0xed4,0x63db25a4, -0xed8,0x63db25a4, -0xedc,0x001b25a4, -0xee0,0x001b25a4, -0xeec,0x6fdb25a4, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u4Byte Rtl8192CUPHY_REG_Array_PG_HP[Rtl8192CUPHY_REG_Array_PG_HPLength] = { -0xe00,0xffffffff,0x06080808, -0xe04,0xffffffff,0x00040406, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x04060608, -0xe14,0xffffffff,0x00020204, -0xe18,0xffffffff,0x04060608, -0xe1c,0xffffffff,0x00020204, -0x830,0xffffffff,0x06080808, -0x834,0xffffffff,0x00040406, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x04060608, -0x848,0xffffffff,0x00020204, -0x84c,0xffffffff,0x04060608, -0x868,0xffffffff,0x00020204, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -}; - -u4Byte Rtl8192CURadioA_2TArray[Rtl8192CURadioA_2TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00010255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x000577c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u4Byte Rtl8192CURadioB_2TArray[Rtl8192CURadioB_2TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287af, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x00014297, -0x013,0x00010295, -0x013,0x0000c298, -0x013,0x0000819c, -0x013,0x000040a8, -0x013,0x0000001c, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -}; - -u4Byte Rtl8192CURadioA_1TArray[Rtl8192CURadioA_1TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00010255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x000577c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f405, -0x015,0x0004f405, -0x015,0x0008f405, -0x015,0x000cf405, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u4Byte Rtl8192CURadioB_1TArray[Rtl8192CURadioB_1TArrayLength] = { -0x0, }; - -u4Byte Rtl8192CURadioA_2T_mCardArray[Rtl8192CURadioA_2T_mCardArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00010255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x000577c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u32 Rtl8192CURadioB_2T_mCardArray[Rtl8192CURadioB_2T_mCardArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287af, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x00014297, -0x013,0x00010295, -0x013,0x0000c298, -0x013,0x0000819c, -0x013,0x000040a8, -0x013,0x0000001c, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -}; - -u4Byte Rtl8192CURadioA_1T_mCardArray[Rtl8192CURadioA_1T_mCardArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00010255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f200, -0x027,0x000ec7d9, -0x028,0x000577c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u4Byte Rtl8192CURadioB_1T_mCardArray[Rtl8192CURadioB_1T_mCardArrayLength] = { -0x0, }; - -u4Byte Rtl8192CURadioA_1T_HPArray[Rtl8192CURadioA_1T_HPArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb0, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e529, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00000255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x0000083c, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x000977c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x000d8000, -0x012,0x00090000, -0x012,0x00051000, -0x012,0x00012000, -0x013,0x00028fb4, -0x013,0x00024fa8, -0x013,0x000207a4, -0x013,0x0001c3b0, -0x013,0x000183a4, -0x013,0x00014398, -0x013,0x000101a4, -0x013,0x0000c198, -0x013,0x000080a4, -0x013,0x00004098, -0x013,0x00000000, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f405, -0x015,0x0004f405, -0x015,0x0008f405, -0x015,0x000cf405, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u4Byte Rtl8192CURadioB_GM_Array[Rtl8192CURadioB_GM_ArrayLength] = { -0x0, }; - - -u4Byte Rtl8192CUMACPHY_Array_PG[Rtl8192CUMACPHY_Array_PGLength] = { -0x0, }; - -u4Byte Rtl8192CUAGCTAB_2TArray[Rtl8192CUAGCTAB_2TArrayLength] = { -0xc78,0x7b000001, -0xc78,0x7b010001, -0xc78,0x7b020001, -0xc78,0x7b030001, -0xc78,0x7b040001, -0xc78,0x7b050001, -0xc78,0x7a060001, -0xc78,0x79070001, -0xc78,0x78080001, -0xc78,0x77090001, -0xc78,0x760a0001, -0xc78,0x750b0001, -0xc78,0x740c0001, -0xc78,0x730d0001, -0xc78,0x720e0001, -0xc78,0x710f0001, -0xc78,0x70100001, -0xc78,0x6f110001, -0xc78,0x6e120001, -0xc78,0x6d130001, -0xc78,0x6c140001, -0xc78,0x6b150001, -0xc78,0x6a160001, -0xc78,0x69170001, -0xc78,0x68180001, -0xc78,0x67190001, -0xc78,0x661a0001, -0xc78,0x651b0001, -0xc78,0x641c0001, -0xc78,0x631d0001, -0xc78,0x621e0001, -0xc78,0x611f0001, -0xc78,0x60200001, -0xc78,0x49210001, -0xc78,0x48220001, -0xc78,0x47230001, -0xc78,0x46240001, -0xc78,0x45250001, -0xc78,0x44260001, -0xc78,0x43270001, -0xc78,0x42280001, -0xc78,0x41290001, -0xc78,0x402a0001, -0xc78,0x262b0001, -0xc78,0x252c0001, -0xc78,0x242d0001, -0xc78,0x232e0001, -0xc78,0x222f0001, -0xc78,0x21300001, -0xc78,0x20310001, -0xc78,0x06320001, -0xc78,0x05330001, -0xc78,0x04340001, -0xc78,0x03350001, -0xc78,0x02360001, -0xc78,0x01370001, -0xc78,0x00380001, -0xc78,0x00390001, -0xc78,0x003a0001, -0xc78,0x003b0001, -0xc78,0x003c0001, -0xc78,0x003d0001, -0xc78,0x003e0001, -0xc78,0x003f0001, -0xc78,0x7b400001, -0xc78,0x7b410001, -0xc78,0x7b420001, -0xc78,0x7b430001, -0xc78,0x7b440001, -0xc78,0x7b450001, -0xc78,0x7a460001, -0xc78,0x79470001, -0xc78,0x78480001, -0xc78,0x77490001, -0xc78,0x764a0001, -0xc78,0x754b0001, -0xc78,0x744c0001, -0xc78,0x734d0001, -0xc78,0x724e0001, -0xc78,0x714f0001, -0xc78,0x70500001, -0xc78,0x6f510001, -0xc78,0x6e520001, -0xc78,0x6d530001, -0xc78,0x6c540001, -0xc78,0x6b550001, -0xc78,0x6a560001, -0xc78,0x69570001, -0xc78,0x68580001, -0xc78,0x67590001, -0xc78,0x665a0001, -0xc78,0x655b0001, -0xc78,0x645c0001, -0xc78,0x635d0001, -0xc78,0x625e0001, -0xc78,0x615f0001, -0xc78,0x60600001, -0xc78,0x49610001, -0xc78,0x48620001, -0xc78,0x47630001, -0xc78,0x46640001, -0xc78,0x45650001, -0xc78,0x44660001, -0xc78,0x43670001, -0xc78,0x42680001, -0xc78,0x41690001, -0xc78,0x406a0001, -0xc78,0x266b0001, -0xc78,0x256c0001, -0xc78,0x246d0001, -0xc78,0x236e0001, -0xc78,0x226f0001, -0xc78,0x21700001, -0xc78,0x20710001, -0xc78,0x06720001, -0xc78,0x05730001, -0xc78,0x04740001, -0xc78,0x03750001, -0xc78,0x02760001, -0xc78,0x01770001, -0xc78,0x00780001, -0xc78,0x00790001, -0xc78,0x007a0001, -0xc78,0x007b0001, -0xc78,0x007c0001, -0xc78,0x007d0001, -0xc78,0x007e0001, -0xc78,0x007f0001, -0xc78,0x3800001e, -0xc78,0x3801001e, -0xc78,0x3802001e, -0xc78,0x3803001e, -0xc78,0x3804001e, -0xc78,0x3805001e, -0xc78,0x3806001e, -0xc78,0x3807001e, -0xc78,0x3808001e, -0xc78,0x3c09001e, -0xc78,0x3e0a001e, -0xc78,0x400b001e, -0xc78,0x440c001e, -0xc78,0x480d001e, -0xc78,0x4c0e001e, -0xc78,0x500f001e, -0xc78,0x5210001e, -0xc78,0x5611001e, -0xc78,0x5a12001e, -0xc78,0x5e13001e, -0xc78,0x6014001e, -0xc78,0x6015001e, -0xc78,0x6016001e, -0xc78,0x6217001e, -0xc78,0x6218001e, -0xc78,0x6219001e, -0xc78,0x621a001e, -0xc78,0x621b001e, -0xc78,0x621c001e, -0xc78,0x621d001e, -0xc78,0x621e001e, -0xc78,0x621f001e, -}; - -u4Byte Rtl8192CUAGCTAB_1TArray[Rtl8192CUAGCTAB_1TArrayLength] = { -0xc78,0x7b000001, -0xc78,0x7b010001, -0xc78,0x7b020001, -0xc78,0x7b030001, -0xc78,0x7b040001, -0xc78,0x7b050001, -0xc78,0x7a060001, -0xc78,0x79070001, -0xc78,0x78080001, -0xc78,0x77090001, -0xc78,0x760a0001, -0xc78,0x750b0001, -0xc78,0x740c0001, -0xc78,0x730d0001, -0xc78,0x720e0001, -0xc78,0x710f0001, -0xc78,0x70100001, -0xc78,0x6f110001, -0xc78,0x6e120001, -0xc78,0x6d130001, -0xc78,0x6c140001, -0xc78,0x6b150001, -0xc78,0x6a160001, -0xc78,0x69170001, -0xc78,0x68180001, -0xc78,0x67190001, -0xc78,0x661a0001, -0xc78,0x651b0001, -0xc78,0x641c0001, -0xc78,0x631d0001, -0xc78,0x621e0001, -0xc78,0x611f0001, -0xc78,0x60200001, -0xc78,0x49210001, -0xc78,0x48220001, -0xc78,0x47230001, -0xc78,0x46240001, -0xc78,0x45250001, -0xc78,0x44260001, -0xc78,0x43270001, -0xc78,0x42280001, -0xc78,0x41290001, -0xc78,0x402a0001, -0xc78,0x262b0001, -0xc78,0x252c0001, -0xc78,0x242d0001, -0xc78,0x232e0001, -0xc78,0x222f0001, -0xc78,0x21300001, -0xc78,0x20310001, -0xc78,0x06320001, -0xc78,0x05330001, -0xc78,0x04340001, -0xc78,0x03350001, -0xc78,0x02360001, -0xc78,0x01370001, -0xc78,0x00380001, -0xc78,0x00390001, -0xc78,0x003a0001, -0xc78,0x003b0001, -0xc78,0x003c0001, -0xc78,0x003d0001, -0xc78,0x003e0001, -0xc78,0x003f0001, -0xc78,0x7b400001, -0xc78,0x7b410001, -0xc78,0x7b420001, -0xc78,0x7b430001, -0xc78,0x7b440001, -0xc78,0x7b450001, -0xc78,0x7a460001, -0xc78,0x79470001, -0xc78,0x78480001, -0xc78,0x77490001, -0xc78,0x764a0001, -0xc78,0x754b0001, -0xc78,0x744c0001, -0xc78,0x734d0001, -0xc78,0x724e0001, -0xc78,0x714f0001, -0xc78,0x70500001, -0xc78,0x6f510001, -0xc78,0x6e520001, -0xc78,0x6d530001, -0xc78,0x6c540001, -0xc78,0x6b550001, -0xc78,0x6a560001, -0xc78,0x69570001, -0xc78,0x68580001, -0xc78,0x67590001, -0xc78,0x665a0001, -0xc78,0x655b0001, -0xc78,0x645c0001, -0xc78,0x635d0001, -0xc78,0x625e0001, -0xc78,0x615f0001, -0xc78,0x60600001, -0xc78,0x49610001, -0xc78,0x48620001, -0xc78,0x47630001, -0xc78,0x46640001, -0xc78,0x45650001, -0xc78,0x44660001, -0xc78,0x43670001, -0xc78,0x42680001, -0xc78,0x41690001, -0xc78,0x406a0001, -0xc78,0x266b0001, -0xc78,0x256c0001, -0xc78,0x246d0001, -0xc78,0x236e0001, -0xc78,0x226f0001, -0xc78,0x21700001, -0xc78,0x20710001, -0xc78,0x06720001, -0xc78,0x05730001, -0xc78,0x04740001, -0xc78,0x03750001, -0xc78,0x02760001, -0xc78,0x01770001, -0xc78,0x00780001, -0xc78,0x00790001, -0xc78,0x007a0001, -0xc78,0x007b0001, -0xc78,0x007c0001, -0xc78,0x007d0001, -0xc78,0x007e0001, -0xc78,0x007f0001, -0xc78,0x3800001e, -0xc78,0x3801001e, -0xc78,0x3802001e, -0xc78,0x3803001e, -0xc78,0x3804001e, -0xc78,0x3805001e, -0xc78,0x3806001e, -0xc78,0x3807001e, -0xc78,0x3808001e, -0xc78,0x3c09001e, -0xc78,0x3e0a001e, -0xc78,0x400b001e, -0xc78,0x440c001e, -0xc78,0x480d001e, -0xc78,0x4c0e001e, -0xc78,0x500f001e, -0xc78,0x5210001e, -0xc78,0x5611001e, -0xc78,0x5a12001e, -0xc78,0x5e13001e, -0xc78,0x6014001e, -0xc78,0x6015001e, -0xc78,0x6016001e, -0xc78,0x6217001e, -0xc78,0x6218001e, -0xc78,0x6219001e, -0xc78,0x621a001e, -0xc78,0x621b001e, -0xc78,0x621c001e, -0xc78,0x621d001e, -0xc78,0x621e001e, -0xc78,0x621f001e, -}; - -u4Byte Rtl8192CUAGCTAB_1T_HPArray[Rtl8192CUAGCTAB_1T_HPArrayLength] = { -0xc78,0x7b000001, -0xc78,0x7b010001, -0xc78,0x7b020001, -0xc78,0x7b030001, -0xc78,0x7b040001, -0xc78,0x7b050001, -0xc78,0x7b060001, -0xc78,0x7b070001, -0xc78,0x7b080001, -0xc78,0x7a090001, -0xc78,0x790a0001, -0xc78,0x780b0001, -0xc78,0x770c0001, -0xc78,0x760d0001, -0xc78,0x750e0001, -0xc78,0x740f0001, -0xc78,0x73100001, -0xc78,0x72110001, -0xc78,0x71120001, -0xc78,0x70130001, -0xc78,0x6f140001, -0xc78,0x6e150001, -0xc78,0x6d160001, -0xc78,0x6c170001, -0xc78,0x6b180001, -0xc78,0x6a190001, -0xc78,0x691a0001, -0xc78,0x681b0001, -0xc78,0x671c0001, -0xc78,0x661d0001, -0xc78,0x651e0001, -0xc78,0x641f0001, -0xc78,0x63200001, -0xc78,0x62210001, -0xc78,0x61220001, -0xc78,0x60230001, -0xc78,0x46240001, -0xc78,0x45250001, -0xc78,0x44260001, -0xc78,0x43270001, -0xc78,0x42280001, -0xc78,0x41290001, -0xc78,0x402a0001, -0xc78,0x262b0001, -0xc78,0x252c0001, -0xc78,0x242d0001, -0xc78,0x232e0001, -0xc78,0x222f0001, -0xc78,0x21300001, -0xc78,0x20310001, -0xc78,0x06320001, -0xc78,0x05330001, -0xc78,0x04340001, -0xc78,0x03350001, -0xc78,0x02360001, -0xc78,0x01370001, -0xc78,0x00380001, -0xc78,0x00390001, -0xc78,0x003a0001, -0xc78,0x003b0001, -0xc78,0x003c0001, -0xc78,0x003d0001, -0xc78,0x003e0001, -0xc78,0x003f0001, -0xc78,0x7b400001, -0xc78,0x7b410001, -0xc78,0x7b420001, -0xc78,0x7b430001, -0xc78,0x7b440001, -0xc78,0x7b450001, -0xc78,0x7b460001, -0xc78,0x7b470001, -0xc78,0x7b480001, -0xc78,0x7a490001, -0xc78,0x794a0001, -0xc78,0x784b0001, -0xc78,0x774c0001, -0xc78,0x764d0001, -0xc78,0x754e0001, -0xc78,0x744f0001, -0xc78,0x73500001, -0xc78,0x72510001, -0xc78,0x71520001, -0xc78,0x70530001, -0xc78,0x6f540001, -0xc78,0x6e550001, -0xc78,0x6d560001, -0xc78,0x6c570001, -0xc78,0x6b580001, -0xc78,0x6a590001, -0xc78,0x695a0001, -0xc78,0x685b0001, -0xc78,0x675c0001, -0xc78,0x665d0001, -0xc78,0x655e0001, -0xc78,0x645f0001, -0xc78,0x63600001, -0xc78,0x62610001, -0xc78,0x61620001, -0xc78,0x60630001, -0xc78,0x46640001, -0xc78,0x45650001, -0xc78,0x44660001, -0xc78,0x43670001, -0xc78,0x42680001, -0xc78,0x41690001, -0xc78,0x406a0001, -0xc78,0x266b0001, -0xc78,0x256c0001, -0xc78,0x246d0001, -0xc78,0x236e0001, -0xc78,0x226f0001, -0xc78,0x21700001, -0xc78,0x20710001, -0xc78,0x06720001, -0xc78,0x05730001, -0xc78,0x04740001, -0xc78,0x03750001, -0xc78,0x02760001, -0xc78,0x01770001, -0xc78,0x00780001, -0xc78,0x00790001, -0xc78,0x007a0001, -0xc78,0x007b0001, -0xc78,0x007c0001, -0xc78,0x007d0001, -0xc78,0x007e0001, -0xc78,0x007f0001, -0xc78,0x3800001e, -0xc78,0x3801001e, -0xc78,0x3802001e, -0xc78,0x3803001e, -0xc78,0x3804001e, -0xc78,0x3805001e, -0xc78,0x3806001e, -0xc78,0x3807001e, -0xc78,0x3808001e, -0xc78,0x3c09001e, -0xc78,0x3e0a001e, -0xc78,0x400b001e, -0xc78,0x440c001e, -0xc78,0x480d001e, -0xc78,0x4c0e001e, -0xc78,0x500f001e, -0xc78,0x5210001e, -0xc78,0x5611001e, -0xc78,0x5a12001e, -0xc78,0x5e13001e, -0xc78,0x6014001e, -0xc78,0x6015001e, -0xc78,0x6016001e, -0xc78,0x6217001e, -0xc78,0x6218001e, -0xc78,0x6219001e, -0xc78,0x621a001e, -0xc78,0x621b001e, -0xc78,0x621c001e, -0xc78,0x621d001e, -0xc78,0x621e001e, -0xc78,0x621f001e, -}; - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +/*Created on 2011/ 6/29, 10:30*/ + +#include "../odm_precomp.h" + + +u4Byte Rtl8192CUPHY_REG_2TArray[Rtl8192CUPHY_REG_2TArrayLength] = { +0x024,0x0011800f, +0x028,0x00ffdb83, +0x800,0x80040002, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10000330, //for Broadcom AP IOT +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x01000100, +0x82c,0x00390004, +0x830,0x27272727, +0x834,0x27272727, +0x838,0x27272727, +0x83c,0x27272727, +0x840,0x00010000, +0x844,0x00010000, +0x848,0x27272727, +0x84c,0x27272727, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x0c1b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x27272727, +0x86c,0x2b2b2b27, +0x870,0x07000700, +0x874,0x22184000, +0x878,0x08080808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xcc0000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121313, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05633, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x69543420, +0xc54,0x43bc0094, +0xc58,0x69543420, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x2186115b, +0xc78,0x0000001f, +0xc7c,0x00b99612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0xa0e40000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020403, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000010, +0xe68,0x001b25a4, +0xe6c,0x63db25a4, +0xe70,0x63db25a4, +0xe74,0x0c1b25a4, +0xe78,0x0c1b25a4, +0xe7c,0x0c1b25a4, +0xe80,0x0c1b25a4, +0xe84,0x63db25a4, +0xe88,0x0c1b25a4, +0xe8c,0x63db25a4, +0xed0,0x63db25a4, +0xed4,0x63db25a4, +0xed8,0x63db25a4, +0xedc,0x001b25a4, +0xee0,0x001b25a4, +0xeec,0x6fdb25a4, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u4Byte Rtl8192CUPHY_REG_1TArray[Rtl8192CUPHY_REG_1TArrayLength] = { +0x024,0x0011800f, +0x028,0x00ffdb83, +0x800,0x80040000, +0x804,0x00000001, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10000330, //for Broadcom AP IOT +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000700, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x69543420, +0xc54,0x43bc0094, +0xc58,0x69543420, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00000740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u4Byte Rtl8192CUPHY_ChangeTo_1T1RArray[Rtl8192CUPHY_ChangeTo_1T1RArrayLength] = { +0x0, }; + +u4Byte Rtl8192CUPHY_ChangeTo_1T2RArray[Rtl8192CUPHY_ChangeTo_1T2RArrayLength] = { +0x0, }; + +u4Byte Rtl8192CUPHY_ChangeTo_2T2RArray[Rtl8192CUPHY_ChangeTo_2T2RArrayLength] = { +0x0, }; + +u4Byte Rtl8192CUPHY_REG_Array_PG[Rtl8192CUPHY_REG_Array_PGLength] = { +0xe00,0xffffffff,0x07090c0c, +0xe04,0xffffffff,0x01020405, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x0b0c0c0e, +0xe14,0xffffffff,0x01030506, +0xe18,0xffffffff,0x0b0c0d0e, +0xe1c,0xffffffff,0x01030509, +0x830,0xffffffff,0x07090c0c, +0x834,0xffffffff,0x01020405, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x0b0c0d0e, +0x848,0xffffffff,0x01030509, +0x84c,0xffffffff,0x0b0c0d0e, +0x868,0xffffffff,0x01030509, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x06060606, +0xe14,0xffffffff,0x00020406, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x06060606, +0x848,0xffffffff,0x00020406, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u4Byte Rtl8192CUPHY_REG_Array_PG_mCard[Rtl8192CUPHY_REG_Array_PG_mCardLength] = { +0xe00,0xffffffff,0x0a0c0c0c, +0xe04,0xffffffff,0x02040608, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x0a0c0d0e, +0xe14,0xffffffff,0x02040608, +0xe18,0xffffffff,0x0a0c0d0e, +0xe1c,0xffffffff,0x02040608, +0x830,0xffffffff,0x0a0c0c0c, +0x834,0xffffffff,0x02040608, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x0a0c0d0e, +0x848,0xffffffff,0x02040608, +0x84c,0xffffffff,0x0a0c0d0e, +0x868,0xffffffff,0x02040608, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x06060606, +0xe14,0xffffffff,0x00020406, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x06060606, +0x848,0xffffffff,0x00020406, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u4Byte Rtl8192CUPHY_REG_Array_MP[Rtl8192CUPHY_REG_Array_MPLength] = { +0xc30,0x69e9ac4a, +0xc3c,0x0a979718, +}; + +u4Byte Rtl8192CUPHY_REG_1T_HPArray[Rtl8192CUPHY_REG_1T_HPArrayLength] = { +0x024,0x0011800f, +0x028,0x00ffdb83, +0x040,0x000c0004, +0x800,0x80040000, +0x804,0x00000001, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10000330, //for Broadcom AP IOT +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390204, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x20202000, +0x870,0x03000300, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00ffc3f1, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x15160000, +0xa24,0x070b0f12, +0xa28,0x00000104, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954342e, +0xc54,0x43bc0094, +0xc58,0x6954342f, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c46000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x24000090, +0xc84,0x20f60000, +0xc88,0x24000090, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00000740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x24242424, +0xe04,0x24242424, +0xe08,0x03902024, +0xe10,0x24242424, +0xe14,0x24242424, +0xe18,0x24242424, +0xe1c,0x24242424, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xee8,0x31555448, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u4Byte Rtl8192CUPHY_REG_1T_mCardArray[Rtl8192CUPHY_REG_1T_mCardArrayLength] = { +0x024,0x0011800d, +0x028,0x00ffdb83, +0x800,0x80040000, +0x804,0x00000001, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10000330, //for Broadcom AP IOT +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000700, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x69543420, +0xc54,0x43bc0094, +0xc58,0x69543420, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00000740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u4Byte Rtl8192CUPHY_REG_2T_mCardArray[Rtl8192CUPHY_REG_2T_mCardArrayLength] = { +0x024,0x0011800d, +0x028,0x00ffdb83, +0x800,0x80040002, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10000330, //for Broadcom AP IOT +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x01000100, +0x82c,0x00390004, +0x830,0x27272727, +0x834,0x27272727, +0x838,0x27272727, +0x83c,0x27272727, +0x840,0x00010000, +0x844,0x00010000, +0x848,0x27272727, +0x84c,0x27272727, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x0c1b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x27272727, +0x86c,0x2b2b2b27, +0x870,0x07000700, +0x874,0x22184000, +0x878,0x08080808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xcc0000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121313, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05633, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x69543420, +0xc54,0x43bc0094, +0xc58,0x69543420, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x218610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0xa0e40000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020403, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000010, +0xe68,0x001b25a4, +0xe6c,0x63db25a4, +0xe70,0x63db25a4, +0xe74,0x0c1b25a4, +0xe78,0x0c1b25a4, +0xe7c,0x0c1b25a4, +0xe80,0x0c1b25a4, +0xe84,0x63db25a4, +0xe88,0x0c1b25a4, +0xe8c,0x63db25a4, +0xed0,0x63db25a4, +0xed4,0x63db25a4, +0xed8,0x63db25a4, +0xedc,0x001b25a4, +0xee0,0x001b25a4, +0xeec,0x6fdb25a4, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u4Byte Rtl8192CUPHY_REG_Array_PG_HP[Rtl8192CUPHY_REG_Array_PG_HPLength] = { +0xe00,0xffffffff,0x06080808, +0xe04,0xffffffff,0x00040406, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x04060608, +0xe14,0xffffffff,0x00020204, +0xe18,0xffffffff,0x04060608, +0xe1c,0xffffffff,0x00020204, +0x830,0xffffffff,0x06080808, +0x834,0xffffffff,0x00040406, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x04060608, +0x848,0xffffffff,0x00020204, +0x84c,0xffffffff,0x04060608, +0x868,0xffffffff,0x00020204, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u4Byte Rtl8192CURadioA_2TArray[Rtl8192CURadioA_2TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u4Byte Rtl8192CURadioB_2TArray[Rtl8192CURadioB_2TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287af, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x00014297, +0x013,0x00010295, +0x013,0x0000c298, +0x013,0x0000819c, +0x013,0x000040a8, +0x013,0x0000001c, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +}; + +u4Byte Rtl8192CURadioA_1TArray[Rtl8192CURadioA_1TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f405, +0x015,0x0004f405, +0x015,0x0008f405, +0x015,0x000cf405, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u4Byte Rtl8192CURadioB_1TArray[Rtl8192CURadioB_1TArrayLength] = { +0x0, }; + +u4Byte Rtl8192CURadioA_2T_mCardArray[Rtl8192CURadioA_2T_mCardArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u32 Rtl8192CURadioB_2T_mCardArray[Rtl8192CURadioB_2T_mCardArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287af, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x00014297, +0x013,0x00010295, +0x013,0x0000c298, +0x013,0x0000819c, +0x013,0x000040a8, +0x013,0x0000001c, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +}; + +u4Byte Rtl8192CURadioA_1T_mCardArray[Rtl8192CURadioA_1T_mCardArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f200, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u4Byte Rtl8192CURadioB_1T_mCardArray[Rtl8192CURadioB_1T_mCardArrayLength] = { +0x0, }; + +u4Byte Rtl8192CURadioA_1T_HPArray[Rtl8192CURadioA_1T_HPArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb0, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e529, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00000255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x0000083c, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000977c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x000d8000, +0x012,0x00090000, +0x012,0x00051000, +0x012,0x00012000, +0x013,0x00028fb4, +0x013,0x00024fa8, +0x013,0x000207a4, +0x013,0x0001c3b0, +0x013,0x000183a4, +0x013,0x00014398, +0x013,0x000101a4, +0x013,0x0000c198, +0x013,0x000080a4, +0x013,0x00004098, +0x013,0x00000000, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f405, +0x015,0x0004f405, +0x015,0x0008f405, +0x015,0x000cf405, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u4Byte Rtl8192CURadioB_GM_Array[Rtl8192CURadioB_GM_ArrayLength] = { +0x0, }; + + +u4Byte Rtl8192CUMACPHY_Array_PG[Rtl8192CUMACPHY_Array_PGLength] = { +0x0, }; + +u4Byte Rtl8192CUAGCTAB_2TArray[Rtl8192CUAGCTAB_2TArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7a060001, +0xc78,0x79070001, +0xc78,0x78080001, +0xc78,0x77090001, +0xc78,0x760a0001, +0xc78,0x750b0001, +0xc78,0x740c0001, +0xc78,0x730d0001, +0xc78,0x720e0001, +0xc78,0x710f0001, +0xc78,0x70100001, +0xc78,0x6f110001, +0xc78,0x6e120001, +0xc78,0x6d130001, +0xc78,0x6c140001, +0xc78,0x6b150001, +0xc78,0x6a160001, +0xc78,0x69170001, +0xc78,0x68180001, +0xc78,0x67190001, +0xc78,0x661a0001, +0xc78,0x651b0001, +0xc78,0x641c0001, +0xc78,0x631d0001, +0xc78,0x621e0001, +0xc78,0x611f0001, +0xc78,0x60200001, +0xc78,0x49210001, +0xc78,0x48220001, +0xc78,0x47230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7a460001, +0xc78,0x79470001, +0xc78,0x78480001, +0xc78,0x77490001, +0xc78,0x764a0001, +0xc78,0x754b0001, +0xc78,0x744c0001, +0xc78,0x734d0001, +0xc78,0x724e0001, +0xc78,0x714f0001, +0xc78,0x70500001, +0xc78,0x6f510001, +0xc78,0x6e520001, +0xc78,0x6d530001, +0xc78,0x6c540001, +0xc78,0x6b550001, +0xc78,0x6a560001, +0xc78,0x69570001, +0xc78,0x68580001, +0xc78,0x67590001, +0xc78,0x665a0001, +0xc78,0x655b0001, +0xc78,0x645c0001, +0xc78,0x635d0001, +0xc78,0x625e0001, +0xc78,0x615f0001, +0xc78,0x60600001, +0xc78,0x49610001, +0xc78,0x48620001, +0xc78,0x47630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + +u4Byte Rtl8192CUAGCTAB_1TArray[Rtl8192CUAGCTAB_1TArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7a060001, +0xc78,0x79070001, +0xc78,0x78080001, +0xc78,0x77090001, +0xc78,0x760a0001, +0xc78,0x750b0001, +0xc78,0x740c0001, +0xc78,0x730d0001, +0xc78,0x720e0001, +0xc78,0x710f0001, +0xc78,0x70100001, +0xc78,0x6f110001, +0xc78,0x6e120001, +0xc78,0x6d130001, +0xc78,0x6c140001, +0xc78,0x6b150001, +0xc78,0x6a160001, +0xc78,0x69170001, +0xc78,0x68180001, +0xc78,0x67190001, +0xc78,0x661a0001, +0xc78,0x651b0001, +0xc78,0x641c0001, +0xc78,0x631d0001, +0xc78,0x621e0001, +0xc78,0x611f0001, +0xc78,0x60200001, +0xc78,0x49210001, +0xc78,0x48220001, +0xc78,0x47230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7a460001, +0xc78,0x79470001, +0xc78,0x78480001, +0xc78,0x77490001, +0xc78,0x764a0001, +0xc78,0x754b0001, +0xc78,0x744c0001, +0xc78,0x734d0001, +0xc78,0x724e0001, +0xc78,0x714f0001, +0xc78,0x70500001, +0xc78,0x6f510001, +0xc78,0x6e520001, +0xc78,0x6d530001, +0xc78,0x6c540001, +0xc78,0x6b550001, +0xc78,0x6a560001, +0xc78,0x69570001, +0xc78,0x68580001, +0xc78,0x67590001, +0xc78,0x665a0001, +0xc78,0x655b0001, +0xc78,0x645c0001, +0xc78,0x635d0001, +0xc78,0x625e0001, +0xc78,0x615f0001, +0xc78,0x60600001, +0xc78,0x49610001, +0xc78,0x48620001, +0xc78,0x47630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + +u4Byte Rtl8192CUAGCTAB_1T_HPArray[Rtl8192CUAGCTAB_1T_HPArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7b060001, +0xc78,0x7b070001, +0xc78,0x7b080001, +0xc78,0x7a090001, +0xc78,0x790a0001, +0xc78,0x780b0001, +0xc78,0x770c0001, +0xc78,0x760d0001, +0xc78,0x750e0001, +0xc78,0x740f0001, +0xc78,0x73100001, +0xc78,0x72110001, +0xc78,0x71120001, +0xc78,0x70130001, +0xc78,0x6f140001, +0xc78,0x6e150001, +0xc78,0x6d160001, +0xc78,0x6c170001, +0xc78,0x6b180001, +0xc78,0x6a190001, +0xc78,0x691a0001, +0xc78,0x681b0001, +0xc78,0x671c0001, +0xc78,0x661d0001, +0xc78,0x651e0001, +0xc78,0x641f0001, +0xc78,0x63200001, +0xc78,0x62210001, +0xc78,0x61220001, +0xc78,0x60230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7b460001, +0xc78,0x7b470001, +0xc78,0x7b480001, +0xc78,0x7a490001, +0xc78,0x794a0001, +0xc78,0x784b0001, +0xc78,0x774c0001, +0xc78,0x764d0001, +0xc78,0x754e0001, +0xc78,0x744f0001, +0xc78,0x73500001, +0xc78,0x72510001, +0xc78,0x71520001, +0xc78,0x70530001, +0xc78,0x6f540001, +0xc78,0x6e550001, +0xc78,0x6d560001, +0xc78,0x6c570001, +0xc78,0x6b580001, +0xc78,0x6a590001, +0xc78,0x695a0001, +0xc78,0x685b0001, +0xc78,0x675c0001, +0xc78,0x665d0001, +0xc78,0x655e0001, +0xc78,0x645f0001, +0xc78,0x63600001, +0xc78,0x62610001, +0xc78,0x61620001, +0xc78,0x60630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUPHYImg_CE.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUPHYImg_CE.h index 7ac79f9c6a92..6fdc75c4082e 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUPHYImg_CE.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/Hal8192CUPHYImg_CE.h @@ -1,81 +1,81 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __INC_HAL8192CU_PHY_IMG_H -#define __INC_HAL8192CU_PHY_IMG_H - -/*Created on 2011/ 6/29, 10:30*/ - -#define Rtl8192CUPHY_REG_2TArrayLength 374 -extern u4Byte Rtl8192CUPHY_REG_2TArray[Rtl8192CUPHY_REG_2TArrayLength]; -#define Rtl8192CUPHY_REG_1TArrayLength 374 -extern u4Byte Rtl8192CUPHY_REG_1TArray[Rtl8192CUPHY_REG_1TArrayLength]; -#define Rtl8192CUPHY_ChangeTo_1T1RArrayLength 1 -extern u4Byte Rtl8192CUPHY_ChangeTo_1T1RArray[Rtl8192CUPHY_ChangeTo_1T1RArrayLength]; -#define Rtl8192CUPHY_ChangeTo_1T2RArrayLength 1 -extern u4Byte Rtl8192CUPHY_ChangeTo_1T2RArray[Rtl8192CUPHY_ChangeTo_1T2RArrayLength]; -#define Rtl8192CUPHY_ChangeTo_2T2RArrayLength 1 -extern u4Byte Rtl8192CUPHY_ChangeTo_2T2RArray[Rtl8192CUPHY_ChangeTo_2T2RArrayLength]; -#define Rtl8192CUPHY_REG_Array_PGLength 336 -extern u4Byte Rtl8192CUPHY_REG_Array_PG[Rtl8192CUPHY_REG_Array_PGLength]; -#define Rtl8192CUPHY_REG_Array_PG_mCardLength 336 -extern u4Byte Rtl8192CUPHY_REG_Array_PG_mCard[Rtl8192CUPHY_REG_Array_PG_mCardLength]; -#define Rtl8192CUPHY_REG_Array_MPLength 4 -extern u4Byte Rtl8192CUPHY_REG_Array_MP[Rtl8192CUPHY_REG_Array_MPLength]; -#define Rtl8192CUPHY_REG_1T_HPArrayLength 378 -extern u4Byte Rtl8192CUPHY_REG_1T_HPArray[Rtl8192CUPHY_REG_1T_HPArrayLength]; -#define Rtl8192CUPHY_REG_1T_mCardArrayLength 374 -extern u4Byte Rtl8192CUPHY_REG_1T_mCardArray[Rtl8192CUPHY_REG_1T_mCardArrayLength]; -#define Rtl8192CUPHY_REG_2T_mCardArrayLength 374 -extern u4Byte Rtl8192CUPHY_REG_2T_mCardArray[Rtl8192CUPHY_REG_2T_mCardArrayLength]; -#define Rtl8192CUPHY_REG_Array_PG_HPLength 336 -extern u4Byte Rtl8192CUPHY_REG_Array_PG_HP[Rtl8192CUPHY_REG_Array_PG_HPLength]; -#define Rtl8192CURadioA_2TArrayLength 282 -extern u4Byte Rtl8192CURadioA_2TArray[Rtl8192CURadioA_2TArrayLength]; -#define Rtl8192CURadioB_2TArrayLength 78 -extern u4Byte Rtl8192CURadioB_2TArray[Rtl8192CURadioB_2TArrayLength]; -#define Rtl8192CURadioA_1TArrayLength 282 -extern u4Byte Rtl8192CURadioA_1TArray[Rtl8192CURadioA_1TArrayLength]; -#define Rtl8192CURadioB_1TArrayLength 1 -extern u4Byte Rtl8192CURadioB_1TArray[Rtl8192CURadioB_1TArrayLength]; -#define Rtl8192CURadioA_2T_mCardArrayLength 282 -extern u4Byte Rtl8192CURadioA_2T_mCardArray[Rtl8192CURadioA_2T_mCardArrayLength]; -#define Rtl8192CURadioB_2T_mCardArrayLength 78 -extern u4Byte Rtl8192CURadioB_2T_mCardArray[Rtl8192CURadioB_2T_mCardArrayLength]; -#define Rtl8192CURadioA_1T_mCardArrayLength 282 -extern u32 Rtl8192CURadioA_1T_mCardArray[Rtl8192CURadioA_1T_mCardArrayLength]; -#define Rtl8192CURadioB_1T_mCardArrayLength 1 -extern u32 Rtl8192CURadioB_1T_mCardArray[Rtl8192CURadioB_1T_mCardArrayLength]; -#define Rtl8192CURadioA_1T_HPArrayLength 282 -extern u4Byte Rtl8192CURadioA_1T_HPArray[Rtl8192CURadioA_1T_HPArrayLength]; -#define Rtl8192CURadioB_GM_ArrayLength 1 -extern u4Byte Rtl8192CURadioB_GM_Array[Rtl8192CURadioB_GM_ArrayLength]; -#define Rtl8192CUMACPHY_Array_PGLength 1 -extern u4Byte Rtl8192CUMACPHY_Array_PG[Rtl8192CUMACPHY_Array_PGLength]; -#define Rtl8192CUAGCTAB_2TArrayLength 320 -extern u4Byte Rtl8192CUAGCTAB_2TArray[Rtl8192CUAGCTAB_2TArrayLength]; -#define Rtl8192CUAGCTAB_1TArrayLength 320 -extern u4Byte Rtl8192CUAGCTAB_1TArray[Rtl8192CUAGCTAB_1TArrayLength]; -#define Rtl8192CUAGCTAB_1T_HPArrayLength 320 -extern u4Byte Rtl8192CUAGCTAB_1T_HPArray[Rtl8192CUAGCTAB_1T_HPArrayLength]; - - -#endif //__INC_HAL8192CU_FW_IMG_H - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __INC_HAL8192CU_PHY_IMG_H +#define __INC_HAL8192CU_PHY_IMG_H + +/*Created on 2011/ 6/29, 10:30*/ + +#define Rtl8192CUPHY_REG_2TArrayLength 374 +extern u4Byte Rtl8192CUPHY_REG_2TArray[Rtl8192CUPHY_REG_2TArrayLength]; +#define Rtl8192CUPHY_REG_1TArrayLength 374 +extern u4Byte Rtl8192CUPHY_REG_1TArray[Rtl8192CUPHY_REG_1TArrayLength]; +#define Rtl8192CUPHY_ChangeTo_1T1RArrayLength 1 +extern u4Byte Rtl8192CUPHY_ChangeTo_1T1RArray[Rtl8192CUPHY_ChangeTo_1T1RArrayLength]; +#define Rtl8192CUPHY_ChangeTo_1T2RArrayLength 1 +extern u4Byte Rtl8192CUPHY_ChangeTo_1T2RArray[Rtl8192CUPHY_ChangeTo_1T2RArrayLength]; +#define Rtl8192CUPHY_ChangeTo_2T2RArrayLength 1 +extern u4Byte Rtl8192CUPHY_ChangeTo_2T2RArray[Rtl8192CUPHY_ChangeTo_2T2RArrayLength]; +#define Rtl8192CUPHY_REG_Array_PGLength 336 +extern u4Byte Rtl8192CUPHY_REG_Array_PG[Rtl8192CUPHY_REG_Array_PGLength]; +#define Rtl8192CUPHY_REG_Array_PG_mCardLength 336 +extern u4Byte Rtl8192CUPHY_REG_Array_PG_mCard[Rtl8192CUPHY_REG_Array_PG_mCardLength]; +#define Rtl8192CUPHY_REG_Array_MPLength 4 +extern u4Byte Rtl8192CUPHY_REG_Array_MP[Rtl8192CUPHY_REG_Array_MPLength]; +#define Rtl8192CUPHY_REG_1T_HPArrayLength 378 +extern u4Byte Rtl8192CUPHY_REG_1T_HPArray[Rtl8192CUPHY_REG_1T_HPArrayLength]; +#define Rtl8192CUPHY_REG_1T_mCardArrayLength 374 +extern u4Byte Rtl8192CUPHY_REG_1T_mCardArray[Rtl8192CUPHY_REG_1T_mCardArrayLength]; +#define Rtl8192CUPHY_REG_2T_mCardArrayLength 374 +extern u4Byte Rtl8192CUPHY_REG_2T_mCardArray[Rtl8192CUPHY_REG_2T_mCardArrayLength]; +#define Rtl8192CUPHY_REG_Array_PG_HPLength 336 +extern u4Byte Rtl8192CUPHY_REG_Array_PG_HP[Rtl8192CUPHY_REG_Array_PG_HPLength]; +#define Rtl8192CURadioA_2TArrayLength 282 +extern u4Byte Rtl8192CURadioA_2TArray[Rtl8192CURadioA_2TArrayLength]; +#define Rtl8192CURadioB_2TArrayLength 78 +extern u4Byte Rtl8192CURadioB_2TArray[Rtl8192CURadioB_2TArrayLength]; +#define Rtl8192CURadioA_1TArrayLength 282 +extern u4Byte Rtl8192CURadioA_1TArray[Rtl8192CURadioA_1TArrayLength]; +#define Rtl8192CURadioB_1TArrayLength 1 +extern u4Byte Rtl8192CURadioB_1TArray[Rtl8192CURadioB_1TArrayLength]; +#define Rtl8192CURadioA_2T_mCardArrayLength 282 +extern u4Byte Rtl8192CURadioA_2T_mCardArray[Rtl8192CURadioA_2T_mCardArrayLength]; +#define Rtl8192CURadioB_2T_mCardArrayLength 78 +extern u4Byte Rtl8192CURadioB_2T_mCardArray[Rtl8192CURadioB_2T_mCardArrayLength]; +#define Rtl8192CURadioA_1T_mCardArrayLength 282 +extern u32 Rtl8192CURadioA_1T_mCardArray[Rtl8192CURadioA_1T_mCardArrayLength]; +#define Rtl8192CURadioB_1T_mCardArrayLength 1 +extern u32 Rtl8192CURadioB_1T_mCardArray[Rtl8192CURadioB_1T_mCardArrayLength]; +#define Rtl8192CURadioA_1T_HPArrayLength 282 +extern u4Byte Rtl8192CURadioA_1T_HPArray[Rtl8192CURadioA_1T_HPArrayLength]; +#define Rtl8192CURadioB_GM_ArrayLength 1 +extern u4Byte Rtl8192CURadioB_GM_Array[Rtl8192CURadioB_GM_ArrayLength]; +#define Rtl8192CUMACPHY_Array_PGLength 1 +extern u4Byte Rtl8192CUMACPHY_Array_PG[Rtl8192CUMACPHY_Array_PGLength]; +#define Rtl8192CUAGCTAB_2TArrayLength 320 +extern u4Byte Rtl8192CUAGCTAB_2TArray[Rtl8192CUAGCTAB_2TArrayLength]; +#define Rtl8192CUAGCTAB_1TArrayLength 320 +extern u4Byte Rtl8192CUAGCTAB_1TArray[Rtl8192CUAGCTAB_1TArrayLength]; +#define Rtl8192CUAGCTAB_1T_HPArrayLength 320 +extern u4Byte Rtl8192CUAGCTAB_1T_HPArray[Rtl8192CUAGCTAB_1T_HPArrayLength]; + + +#endif //__INC_HAL8192CU_FW_IMG_H + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/HalDMOutSrc8192C_CE.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/HalDMOutSrc8192C_CE.c index d1ae1bbfb988..d0ece9f63e0a 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/HalDMOutSrc8192C_CE.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/HalDMOutSrc8192C_CE.c @@ -496,6 +496,16 @@ odm_TXPowerTrackingCallback_ThermalMeter_92C( pdmpriv->ThermalValue_IQK = ThermalValue; rtl8192c_PHY_IQCalibrate(Adapter,_FALSE); } + +#if 1 + if(delta > 0 && IS_HARDWARE_TYPE_8723A(Adapter)) + { + if(ThermalValue >= 15) + PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, bMaskDWord, 0x038180fd ); + else + PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, bMaskDWord, 0x0381808d ); + } +#endif //update thermal meter value if(pdmpriv->TxPowerTrackControl) @@ -563,7 +573,6 @@ odm_CheckTXPowerTracking_ThermalMeter( struct dm_priv *pdmpriv = &pHalData->dmpriv; DM_ODM_T *podmpriv = &pHalData->odmpriv; //u1Byte TxPowerCheckCnt = 5; //10 sec - //if(!pMgntInfo->bTXPowerTracking /*|| (!pdmpriv->TxPowerTrackControl && pdmpriv->bAPKdone)*/) if(!(podmpriv->SupportAbility & ODM_RF_TX_PWR_TRACK)) { diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/odm_RTL8192C.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/odm_RTL8192C.c index 6c25887e44fd..0a10a5b255c6 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/odm_RTL8192C.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/odm_RTL8192C.c @@ -1,2233 +1,2233 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -//============================================================ -// include files -//============================================================ - -#include "../odm_precomp.h" - -#if (RTL8192C_SUPPORT == 1) - -//#if (DM_ODM_SUPPORT_TYPE == ODM_MP) -VOID -odm_ResetFACounter_92C( - IN PDM_ODM_T pDM_Odm - ) -{ -// PADAPTER pAdapter = pDM_Odm->Adapter; - u1Byte BBReset; - - //reset false alarm counter registers - ODM_SetBBReg(pDM_Odm, 0xd00, BIT27, 1); - ODM_SetBBReg(pDM_Odm, 0xd00, BIT27, 0); - //update ofdm counter - ODM_SetBBReg(pDM_Odm, 0xc00, BIT31, 0); //update page C counter - ODM_SetBBReg(pDM_Odm, 0xd00, BIT31, 0); //update page D counter - - //reset CCK CCA counter - ODM_SetBBReg(pDM_Odm, 0xa2c, BIT13|BIT12, 0); - ODM_SetBBReg(pDM_Odm, 0xa2c, BIT13|BIT12, 2); - //reset CCK FA counter - ODM_SetBBReg(pDM_Odm, 0xa2c, BIT15|BIT14, 0); - ODM_SetBBReg(pDM_Odm, 0xa2c, BIT15|BIT14, 2); - - - //BB Reset - if(!pDM_Odm->bLinked) - { - BBReset = ODM_Read1Byte(pDM_Odm, 0x02); - ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0)); - ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0); - } - -} -//#endif - -#if (DM_ODM_SUPPORT_TYPE == ODM_MP) - - - -// -// ================================================== -// Tx power tracking relative code. -// ================================================== -// - - -//091212 chiyokolin -VOID -odm_TXPowerTrackingCallbackThermalMeter92C( - IN PADAPTER Adapter - ) -{ - -#if ((RT_PLATFORM == PLATFORM_WINDOWS) || (RT_PLATFORM == PLATFORM_LINUX)) && (HAL_CODE_BASE==RTL8192_C) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; - u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100; - s4Byte ele_A=0, ele_D, TempCCk, X, value32; - s4Byte Y, ele_C=0; - s1Byte OFDM_index[2], CCK_index=0, OFDM_index_old[2], CCK_index_old=0; - int i = 0; - BOOLEAN is2T = IS_92C_SERIAL(pHalData->VersionID); - -#if MP_DRIVER == 1 - PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); - pu1Byte TxPwrLevel = pMptCtx->TxPwrLevel; -#endif - u1Byte OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur - - u4Byte DPK_delta_mapping[2][DPK_DELTA_MAPPING_NUM] = { - {0x1c, 0x1c, 0x1d, 0x1d, 0x1e, - 0x1f, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x03}, - {0x1c, 0x1d, 0x1e, 0x1e, 0x1e, - 0x1f, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x03, 0x03}}; - -#if DEV_BUS_TYPE==RT_USB_INTERFACE - u1Byte ThermalValue_HP_count = 0; - u4Byte ThermalValue_HP = 0; - s1Byte index_mapping_HP[index_mapping_HP_NUM] = { - 0, 1, 3, 4, 6, - 7, 9, 10, 12, 13, - 15, 16, 18, 19, 21 - }; - - s1Byte index_HP; -#endif - - if (ODM_CheckPowerStatus(Adapter) == FALSE) - return; - - pHalData->TXPowerTrackingCallbackCnt++; //cosa add for debug - pHalData->bTXPowerTrackingInit = TRUE; - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("===>odm_TXPowerTrackingCallbackThermalMeter92C\n")); - - ThermalValue = (u1Byte)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0] - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter)); - - //if (IS_HARDWARE_TYPE_8188E(Adapter)/* || - // is_ha*/) - //{ - // PHY_APCalibrate_8188E(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); - //} - //else if (IS_HARDWARE_TYPE_8192C(Adapter) || - // IS_HARDWARE_TYPE_8192D(Adapter) || - // IS_HARDWARE_TYPE_8723A(Adapter)) - { - PHY_APCalibrate_8192C(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); - } - - if(is2T) - rf = 2; - else - rf = 1; - - while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) - { - PlatformSleepUs(100); - TimeOut--; - if(TimeOut <= 0) - { - RTPRINT(FINIT, INIT_TxPower, - ("!!!odm_TXPowerTrackingCallbackThermalMeter92C Wait for check CCK gain index too long!!!\n" )); - break; - } - } - - if(ThermalValue) - { -// if(!pHalData->ThermalValue) - { - //Query OFDM path A default setting - ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; - for(i=0; ibCCKinCH14) - { - if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==0) - { - CCK_index_old =(u1Byte) i; - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", - rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - else - { - if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==0) - { - CCK_index_old =(u1Byte) i; - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", - rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - } - - if(!pHalData->ThermalValue) - { - pHalData->ThermalValue = pHalData->EEPROMThermalMeter; - pHalData->ThermalValue_LCK = ThermalValue; - pHalData->ThermalValue_IQK = ThermalValue; - pHalData->ThermalValue_DPK = pHalData->EEPROMThermalMeter; - -#if DEV_BUS_TYPE==RT_USB_INTERFACE - for(i = 0; i < rf; i++) - pHalData->OFDM_index_HP[i] = pHalData->OFDM_index[i] = OFDM_index_old[i]; - pHalData->CCK_index_HP = pHalData->CCK_index = CCK_index_old; -#else - for(i = 0; i < rf; i++) - pHalData->OFDM_index[i] = OFDM_index_old[i]; - pHalData->CCK_index = CCK_index_old; -#endif - } - -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) - { - pHalData->ThermalValue_HP[pHalData->ThermalValue_HP_index] = ThermalValue; - pHalData->ThermalValue_HP_index++; - if(pHalData->ThermalValue_HP_index == HP_THERMAL_NUM) - pHalData->ThermalValue_HP_index = 0; - - for(i = 0; i < HP_THERMAL_NUM; i++) - { - if(pHalData->ThermalValue_HP[i]) - { - ThermalValue_HP += pHalData->ThermalValue_HP[i]; - ThermalValue_HP_count++; - } - } - - if(ThermalValue_HP_count) - ThermalValue = (u1Byte)(ThermalValue_HP / ThermalValue_HP_count); - } -#endif - } - - delta = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) - { - if(pHalData->bDoneTxpower) - delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); - else - delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - } - else -#endif - { - delta_HP = 0; - } - delta_LCK = (ThermalValue > pHalData->ThermalValue_LCK)?(ThermalValue - pHalData->ThermalValue_LCK):(pHalData->ThermalValue_LCK - ThermalValue); - delta_IQK = (ThermalValue > pHalData->ThermalValue_IQK)?(ThermalValue - pHalData->ThermalValue_IQK):(pHalData->ThermalValue_IQK - ThermalValue); - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x delta 0x%x delta_LCK 0x%x delta_IQK 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK)); - - if(delta_LCK > 1) - { - pHalData->ThermalValue_LCK = ThermalValue; - PHY_LCCalibrate(Adapter); - } - - if((delta > 0 || delta_HP > 0)&& pHalData->TxPowerTrackControl) - { -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) - { - pHalData->bDoneTxpower = TRUE; - delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - - if(delta_HP > index_mapping_HP_NUM-1) - index_HP = index_mapping_HP[index_mapping_HP_NUM-1]; - else - index_HP = index_mapping_HP[delta_HP]; - - if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index_HP[i] - index_HP; - CCK_index = pHalData->CCK_index_HP -index_HP; - } - else - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index_HP[i] + index_HP; - CCK_index = pHalData->CCK_index_HP + index_HP; - } - - delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); - - } - else -#endif - { - if(ThermalValue > pHalData->ThermalValue) - { - for(i = 0; i < rf; i++) - pHalData->OFDM_index[i] -= delta; - pHalData->CCK_index -= delta; - } - else - { - for(i = 0; i < rf; i++) - pHalData->OFDM_index[i] += delta; - pHalData->CCK_index += delta; - } - } - - if(is2T) - { - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", - pHalData->OFDM_index[0], pHalData->OFDM_index[1], pHalData->CCK_index)); - } - else - { - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, CCK_index=0x%x\n", - pHalData->OFDM_index[0], pHalData->CCK_index)); - } - - //no adjust -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) != INTF_SEL1_USB_High_Power) -#endif - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index[i]+1; - CCK_index = pHalData->CCK_index+1; - } - else - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index[i]; - CCK_index = pHalData->CCK_index; - } - -#if MP_DRIVER == 1 - for(i = 0; i < rf; i++) - { - if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - OFDM_index[i] -= 1; - else - OFDM_index[i] -= 2; - } - else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) - { - OFDM_index[i] += 1; - } - } - else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - OFDM_index[i] -= 1; - else - OFDM_index[i] -= 2; - } - else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) - { - OFDM_index[i] -= 1; - } - } - - { - if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - CCK_index -= 1; - else - CCK_index -= 2; - } - else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) - { - CCK_index += 1; - } - } - else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - CCK_index -= 1; - else - CCK_index -= 2; - } - else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) - { - CCK_index -= 1; - } - } -#endif - } - - for(i = 0; i < rf; i++) - { - if(OFDM_index[i] > (OFDM_TABLE_SIZE_92C-1)) - OFDM_index[i] = (OFDM_TABLE_SIZE_92C-1); - else if (OFDM_index[i] < OFDM_min_index) - OFDM_index[i] = OFDM_min_index; - } - - if(CCK_index > (CCK_TABLE_SIZE-1)) - CCK_index = (CCK_TABLE_SIZE-1); - else if (CCK_index < 0) - CCK_index = 0; - - if(is2T) - { - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", - OFDM_index[0], OFDM_index[1], CCK_index)); - } - else - { - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, CCK_index=0x%x\n", - OFDM_index[0], CCK_index)); - } - } - - if(pHalData->TxPowerTrackControl && (delta != 0 || delta_HP != 0)) - { - //Adujst OFDM Ant_A according to IQK result - ele_D = (OFDMSwingTable[OFDM_index[0]] & 0xFFC00000)>>22; - X = pHalData->RegE94; - Y = pHalData->RegE9C; - - if(X != 0) - { - if ((X & 0x00000200) != 0) - X = X | 0xFFFFFC00; - ele_A = ((X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - ele_C = ((Y * ele_D)>>8)&0x000003FF; - - //wirte new elements A, C, D to regC80 and regC94, element B is always 0 - value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; - PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); - - value32 = ((X * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32); - - value32 = ((Y * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32); - - } - else - { - PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[0]]); - PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00); - } - - RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); - - //Adjust CCK according to IQK result - if(!pHalData->bCCKinCH14){ - PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); - PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); - PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); - PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); - PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); - PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); - PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); - PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); - } - else{ - PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); - PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); - PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); - PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); - PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); - PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); - PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); - PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); - } - - if(is2T) - { - ele_D = (OFDMSwingTable[OFDM_index[1]] & 0xFFC00000)>>22; - - //new element A = element D x X - X = pHalData->RegEB4; - Y = pHalData->RegEBC; - - if(X != 0){ - if ((X & 0x00000200) != 0) //consider minus - X = X | 0xFFFFFC00; - ele_A = ((X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - ele_C = ((Y * ele_D)>>8)&0x00003FF; - - //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 - value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; - PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); - - value32 = ((X * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32); - - value32 = ((Y * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32); - - } - else{ - PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[1]]); - PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00); - } - - RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); - } - - RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord), PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bRFRegOffsetMask))); - } - -#if MP_DRIVER == 1 - if(delta_IQK > 1) -#else - if(delta_IQK > 3) -#endif - { - pHalData->ThermalValue_IQK = ThermalValue; - PHY_IQCalibrate(Adapter, FALSE); - } - - //update thermal meter value - if(pHalData->TxPowerTrackControl) - Adapter->HalFunc.SetHalDefVarHandler(Adapter, HAL_DEF_THERMAL_VALUE, &ThermalValue); - - } - - PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); - pHalData->TXPowercount = 0; - - // 2011/08/23 MH Add for power tracking after S3/S4 turn off RF. In this case, we need to execute IQK again. Otherwise - // The IQK scheme will use old value to save and cause incorrect BB value. - { - RT_RF_POWER_STATE rtState; - - Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState)); - - if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) - { - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Incorrect pwrtrack point, re-iqk next time\n")); - pHalData->bIQKInitialized = FALSE; - } - } - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("<===odm_TXPowerTrackingCallbackThermalMeter92C\n")); -#endif - -} - -//#if (RT_PLATFORM == PLATFORM_WINDOWS) && (HAL_CODE_BASE==RTL8192_C) -VOID -odm_TXPowerTrackingCallbackRXGainThermalMeter92D( - IN PADAPTER Adapter - ) -{ - u1Byte index_mapping[Rx_index_mapping_NUM] = { - 0x0f, 0x0f, 0x0f, 0x0f, 0x0b, - 0x0a, 0x09, 0x08, 0x07, 0x06, - 0x05, 0x04, 0x04, 0x03, 0x02 - }; - -#ifndef AP_BUILD_WORKAROUND - u1Byte eRFPath; - u4Byte u4tmp; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; - - u4tmp = (index_mapping[(pHalData->EEPROMThermalMeter - pHalData->ThermalValue_RxGain)]) << 12; - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("===>odm_TXPowerTrackingCallbackRXGainThermalMeter92D interface %u Rx Gain %x\n", Adapter->interfaceIndex, u4tmp)); - - for(eRFPath = RF_PATH_A; eRFPath NumTotalRFPath; eRFPath++) - PHY_SetRFReg(Adapter, (ODM_RF_RADIO_PATH_E)eRFPath, RF_RXRF_A3, bRFRegOffsetMask, (pHalData->RegRF3C[eRFPath]&(~(0xF000)))|u4tmp); -#endif - -}; - - -//091212 chiyokolin -VOID -odm_TXPowerTrackingCallbackThermalMeter92D( - IN PADAPTER Adapter - ) -{ - -#ifndef AP_BUILD_WORKAROUND - -//#if (RT_PLATFORM == PLATFORM_WINDOWS) && (HAL_CODE_BASE==RTL8192_C) -#if (HAL_CODE_BASE==RTL8192_C) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; - u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_RxGain, index, offset; - u1Byte ThermalValue_AVG_count = 0; - u4Byte ThermalValue_AVG = 0; - s4Byte ele_A=0, ele_D, TempCCk, X, value32; - s4Byte Y, ele_C=0; - s1Byte OFDM_index[2], CCK_index=0, OFDM_index_old[2], CCK_index_old=0; - u4Byte i = 0; - BOOLEAN is2T = (IS_92C_SERIAL(pHalData->VersionID) || IS_92D_SINGLEPHY(pHalData->VersionID)) ; - BOOLEAN bInteralPA = FALSE; - - u1Byte OFDM_min_index = 6, OFDM_min_index_internalPA = 3, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur - u1Byte Indexforchannel = GetRightChnlPlaceforIQK(pHalData->CurrentChannel); - u1Byte index_mapping[5][index_mapping_NUM] = { - {0, 1, 3, 6, 8, 9, //5G, path A/MAC 0, decrease power - 11, 13, 14, 16, 17, 18, 18}, - {0, 2, 4, 5, 7, 10, //5G, path A/MAC 0, increase power - 12, 14, 16, 18, 18, 18, 18}, - {0, 2, 3, 6, 8, 9, //5G, path B/MAC 1, decrease power - 11, 13, 14, 16, 17, 18, 18}, - {0, 2, 4, 5, 7, 10, //5G, path B/MAC 1, increase power - 13, 16, 16, 18, 18, 18, 18}, - {0, 1, 2, 3, 4, 5, //2.4G, for decreas power - 6, 7, 7, 8, 9, 10, 10}, - }; - -u1Byte index_mapping_internalPA[8][index_mapping_NUM] = { - {0, 1, 2, 4, 6, 7, //5G, path A/MAC 0, ch36-64, decrease power - 9, 11, 12, 14, 15, 16, 16}, - {0, 2, 4, 5, 7, 10, //5G, path A/MAC 0, ch36-64, increase power - 12, 14, 16, 18, 18, 18, 18}, - {0, 1, 2, 3, 5, 6, //5G, path A/MAC 0, ch100-165, decrease power - 8, 10, 11, 13, 14, 15, 15}, - {0, 2, 4, 5, 7, 10, //5G, path A/MAC 0, ch100-165, increase power - 12, 14, 16, 18, 18, 18, 18}, - {0, 1, 2, 4, 6, 7, //5G, path B/MAC 1, ch36-64, decrease power - 9, 11, 12, 14, 15, 16, 16}, - {0, 2, 4, 5, 7, 10, //5G, path B/MAC 1, ch36-64, increase power - 13, 16, 16, 18, 18, 18, 18}, - {0, 1, 2, 3, 5, 6, //5G, path B/MAC 1, ch100-165, decrease power - 8, 9, 10, 12, 13, 14, 14}, - {0, 2, 4, 5, 7, 10, //5G, path B/MAC 1, ch100-165, increase power - 13, 16, 16, 18, 18, 18, 18}, - }; - -//#if MP_DRIVER != 1 -// return; -//#endif - - - pHalData->TXPowerTrackingCallbackCnt++; //cosa add for debug - pHalData->bTXPowerTrackingInit = TRUE; - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("===>dm_TXPowerTrackingCallback_ThermalMeter_92D interface %u txpowercontrol %d\n", Adapter->interfaceIndex, pHalData->TxPowerTrackControl)); - - ThermalValue = (u1Byte)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER_92D, 0xf800); //0x42: RF Reg[15:11] 92D - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter)); - - //PHY_APCalibrate(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); - //if (IS_HARDWARE_TYPE_8188E(Adapter)/* || - // is_ha*/) - //{ - // PHY_APCalibrate_8188E(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); - //} - //else if (IS_HARDWARE_TYPE_8192C(Adapter) || - // IS_HARDWARE_TYPE_8192D(Adapter) || - // IS_HARDWARE_TYPE_8723A(Adapter)) - { - PHY_APCalibrate_8192C(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); - } - -// if(!pHalData->TxPowerTrackControl) -// return; - - if(is2T) - rf = 2; - else - rf = 1; - - if(ThermalValue) - { -// if(!pHalData->ThermalValue) - { - //Query OFDM path A default setting - ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; - for(i=0; iCurrentBandType92D == BAND_ON_2_4G) - { - //Query CCK default setting From 0xa24 - TempCCk = pHalData->RegA24; - - for(i=0 ; ibCCKinCH14) - { - if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==0) - { - CCK_index_old =(u1Byte) i; - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", - rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - else - { - if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==0) - { - CCK_index_old =(u1Byte) i; - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", - rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - } - } - else - { - TempCCk = 0x090e1317; - CCK_index_old = 12; - } - - if(!pHalData->ThermalValue) - { - pHalData->ThermalValue = pHalData->EEPROMThermalMeter; - pHalData->ThermalValue_LCK = ThermalValue; - pHalData->ThermalValue_IQK = ThermalValue; - pHalData->ThermalValue_RxGain = pHalData->EEPROMThermalMeter; - - for(i = 0; i < rf; i++) - pHalData->OFDM_index[i] = OFDM_index_old[i]; - pHalData->CCK_index = CCK_index_old; - } - - if(pHalData->bReloadtxpowerindex) - { - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("reload ofdm index for band switch\n")); - } - - //calculate average thermal meter - { - pHalData->ThermalValue_AVG[pHalData->ThermalValue_AVG_index] = ThermalValue; - pHalData->ThermalValue_AVG_index++; - if(pHalData->ThermalValue_AVG_index == AVG_THERMAL_NUM) - pHalData->ThermalValue_AVG_index = 0; - - for(i = 0; i < AVG_THERMAL_NUM; i++) - { - if(pHalData->ThermalValue_AVG[i]) - { - ThermalValue_AVG += pHalData->ThermalValue_AVG[i]; - ThermalValue_AVG_count++; - } - } - - if(ThermalValue_AVG_count) - ThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count); - } - } - - if(pHalData->bReloadtxpowerindex) - { - delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - pHalData->bReloadtxpowerindex = FALSE; - pHalData->bDoneTxpower = FALSE; - } - else if(pHalData->bDoneTxpower) - { - delta = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); - } - else - { - delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - } - delta_LCK = (ThermalValue > pHalData->ThermalValue_LCK)?(ThermalValue - pHalData->ThermalValue_LCK):(pHalData->ThermalValue_LCK - ThermalValue); - delta_IQK = (ThermalValue > pHalData->ThermalValue_IQK)?(ThermalValue - pHalData->ThermalValue_IQK):(pHalData->ThermalValue_IQK - ThermalValue); - delta_RxGain = (ThermalValue > pHalData->ThermalValue_RxGain)?(ThermalValue - pHalData->ThermalValue_RxGain):(pHalData->ThermalValue_RxGain - ThermalValue); - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("interface %u Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x delta 0x%x delta_LCK 0x%x delta_IQK 0x%x delta_RxGain 0x%x\n", Adapter->interfaceIndex, ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK, delta_RxGain)); - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("interface %u pre thermal meter LCK 0x%x pre thermal meter IQK 0x%x delta_LCK_bound 0x%x delta_IQK_bound 0x%x\n", Adapter->interfaceIndex, pHalData->ThermalValue_LCK, pHalData->ThermalValue_IQK, pHalData->Delta_LCK, pHalData->Delta_IQK)); - - if((delta_LCK > pHalData->Delta_LCK) && (pHalData->Delta_LCK != 0)) - { - pHalData->ThermalValue_LCK = ThermalValue; - PHY_LCCalibrate(Adapter); - } - - if(delta > 0 && pHalData->TxPowerTrackControl) - { - delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - - //calculate new OFDM / CCK offset - { - if(pHalData->CurrentBandType92D == BAND_ON_2_4G) - { - offset = 4; - - if(delta > index_mapping_NUM-1) - index = index_mapping[offset][index_mapping_NUM-1]; - else - index = index_mapping[offset][delta]; - - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index[i] -delta; - CCK_index = pHalData->CCK_index -delta; - } - else - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index[i] + index; - CCK_index = pHalData->CCK_index + index; - } - } - else if(pHalData->CurrentBandType92D == BAND_ON_5G) - { - for(i = 0; i < rf; i++) - { - if(pHalData->MacPhyMode92D == DUALMAC_DUALPHY && - Adapter->interfaceIndex == 1) //MAC 1 5G - bInteralPA = pHalData->InternalPA5G[1]; - else - bInteralPA = pHalData->InternalPA5G[i]; - - if(bInteralPA) - { - if(Adapter->interfaceIndex == 1 || i == rf) - offset = 4; - else - offset = 0; - - if(pHalData->CurrentChannel >= 100 && pHalData->CurrentChannel <= 165) - offset += 2; - } - else - { - if(Adapter->interfaceIndex == 1 || i == rf) - offset = 2; - else - offset = 0; - } - - if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power - offset++; - - if(bInteralPA) - { - if(delta > index_mapping_NUM-1) - index = index_mapping_internalPA[offset][index_mapping_NUM-1]; - else - index = index_mapping_internalPA[offset][delta]; - } - else - { - if(delta > index_mapping_NUM-1) - index = index_mapping[offset][index_mapping_NUM-1]; - else - index = index_mapping[offset][delta]; - } - - if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power - { - if(bInteralPA && ThermalValue > 0x12) - { - OFDM_index[i] = pHalData->OFDM_index[i] -((delta/2)*3+(delta%2)); - } - else - { - OFDM_index[i] = pHalData->OFDM_index[i] -index; - } - } - else - { - OFDM_index[i] = pHalData->OFDM_index[i] + index; - } - } - } - - if(is2T) - { - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", - pHalData->OFDM_index[0], pHalData->OFDM_index[1], pHalData->CCK_index)); - } - else - { - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, CCK_index=0x%x\n", - pHalData->OFDM_index[0], pHalData->CCK_index)); - } - - for(i = 0; i < rf; i++) - { - if(OFDM_index[i] > OFDM_TABLE_SIZE_92D-1) - { - OFDM_index[i] = OFDM_TABLE_SIZE_92D-1; - } - else if(bInteralPA || pHalData->CurrentBandType92D == BAND_ON_2_4G) - { - if (OFDM_index[i] < OFDM_min_index_internalPA) - OFDM_index[i] = OFDM_min_index_internalPA; - } - else if (OFDM_index[i] < OFDM_min_index) - { - OFDM_index[i] = OFDM_min_index; - } - } - - if(pHalData->CurrentBandType92D == BAND_ON_2_4G) - { - if(CCK_index > CCK_TABLE_SIZE-1) - CCK_index = CCK_TABLE_SIZE-1; - else if (CCK_index < 0) - CCK_index = 0; - } - - if(is2T) - { - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", - OFDM_index[0], OFDM_index[1], CCK_index)); - } - else - { - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, CCK_index=0x%x\n", - OFDM_index[0], CCK_index)); - } - } - - //Config by SwingTable - if(pHalData->TxPowerTrackControl && !pHalData->bNOPG) - { - pHalData->bDoneTxpower = TRUE; - - //Adujst OFDM Ant_A according to IQK result - ele_D = (OFDMSwingTable[(u1Byte)OFDM_index[0]] & 0xFFC00000)>>22; -// X = pHalData->RegE94; -// Y = pHalData->RegE9C; - X = pHalData->IQKMatrixRegSetting[Indexforchannel].Value[0][0]; - Y = pHalData->IQKMatrixRegSetting[Indexforchannel].Value[0][1]; - - if(X != 0 && pHalData->CurrentBandType92D == BAND_ON_2_4G) - { - if ((X & 0x00000200) != 0) - X = X | 0xFFFFFC00; - ele_A = ((X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - ele_C = ((Y * ele_D)>>8)&0x000003FF; - - //wirte new elements A, C, D to regC80 and regC94, element B is always 0 - value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; - PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); - - value32 = ((X * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT24, value32); - - } - else - { - PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[(u1Byte)OFDM_index[0]]); - PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT24, 0x00); - } - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD, ("TxPwrTracking for interface %u path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x 0xe94 = 0x%x 0xe9c = 0x%x\n", - (u1Byte)Adapter->interfaceIndex, (u4Byte)X, (u4Byte)Y, (u4Byte)ele_A, (u4Byte)ele_C, (u4Byte)ele_D, (u4Byte)X, (u4Byte)Y)); - - - if(pHalData->CurrentBandType92D == BAND_ON_2_4G) - { - //Adjust CCK according to IQK result - if(!pHalData->bCCKinCH14){ - PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][0]); - PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][1]); - PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][2]); - PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][3]); - PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][4]); - PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][5]); - PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][6]); - PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][7]); - } - else{ - PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch14[(u1Byte)CCK_index][0]); - PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch14[(u1Byte)CCK_index][1]); - PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch14[(u1Byte)CCK_index][2]); - PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch14[(u1Byte)CCK_index][3]); - PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch14[(u1Byte)CCK_index][4]); - PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch14[(u1Byte)CCK_index][5]); - PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch14[(u1Byte)CCK_index][6]); - PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch14[(u1Byte)CCK_index][7]); - } - } - - if(is2T) - { - ele_D = (OFDMSwingTable[(u1Byte)OFDM_index[1]] & 0xFFC00000)>>22; - - //new element A = element D x X -// X = pHalData->RegEB4; -// Y = pHalData->RegEBC; - X = pHalData->IQKMatrixRegSetting[Indexforchannel].Value[0][4]; - Y = pHalData->IQKMatrixRegSetting[Indexforchannel].Value[0][5]; - - if(X != 0 && pHalData->CurrentBandType92D == BAND_ON_2_4G) - { - if ((X & 0x00000200) != 0) //consider minus - X = X | 0xFFFFFC00; - ele_A = ((X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - ele_C = ((Y * ele_D)>>8)&0x00003FF; - - //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 - value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; - PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); - - value32 = ((X * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT28, value32); - - } - else - { - PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[(u1Byte)OFDM_index[1]]); - PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT28, 0x00); - } - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x 0xeb4 = 0x%x 0xebc = 0x%x\n", - (u4Byte)X, (u4Byte)Y, (u4Byte)ele_A, (u4Byte)ele_C, (u4Byte)ele_D, (u4Byte)X, (u4Byte)Y)); - } - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD, ("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord), PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bRFRegOffsetMask))); - } - } - - if((delta_IQK > pHalData->Delta_IQK) && (pHalData->Delta_IQK != 0)) - { - PHY_ResetIQKResult(Adapter); - pHalData->ThermalValue_IQK = ThermalValue; -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) -#if USE_WORKITEM - PlatformAcquireMutex(&pHalData->mxChnlBwControl); -#else - PlatformAcquireSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); -#endif -#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) - PlatformAcquireMutex(&pHalData->mxChnlBwControl); -#endif - - PHY_IQCalibrate(Adapter, FALSE); - -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) -#if USE_WORKITEM - PlatformReleaseMutex(&pHalData->mxChnlBwControl); -#else - PlatformReleaseSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); -#endif -#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) - PlatformReleaseMutex(&pHalData->mxChnlBwControl); -#endif - - } - - if(delta_RxGain > 0 && pHalData->CurrentBandType92D == BAND_ON_5G - && ThermalValue <= pHalData->EEPROMThermalMeter) - { - pHalData->ThermalValue_RxGain = ThermalValue; - odm_TXPowerTrackingCallbackRXGainThermalMeter92D(Adapter); - } - - //update thermal meter value - if(pHalData->TxPowerTrackControl) - { - Adapter->HalFunc.SetHalDefVarHandler(Adapter, HAL_DEF_THERMAL_VALUE, &ThermalValue); - } - - } - - ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("<===dm_TXPowerTrackingCallback_ThermalMeter_92D\n")); - - pHalData->TXPowercount = 0; -#endif -#endif -} - - -// -// Description: -// - Dispatch TxPower Tracking direct call ONLY for 92s. -// - We shall NOT schedule Workitem within PASSIVE LEVEL, which will cause system resource -// leakage under some platform. -// -// Assumption: -// PASSIVE_LEVEL when this routine is called. -// -// Added by Roger, 2009.06.18. -// -VOID -odm_TXPowerTrackingDirectCall92C( - IN PADAPTER Adapter - ) -{ -#ifndef AP_BUILD_WORKAROUND - if(IS_HARDWARE_TYPE_8192D(Adapter)) - odm_TXPowerTrackingCallbackThermalMeter92D(Adapter); - else - odm_TXPowerTrackingCallbackThermalMeter92C(Adapter); -#endif -} - - -VOID -odm_TXPowerTrackingCallback_ThermalMeter_92C( - IN PADAPTER Adapter - ) -{ -#if ((RT_PLATFORM == PLATFORM_WINDOWS) || (RT_PLATFORM == PLATFORM_LINUX)) && (HAL_CODE_BASE==RTL8192_C) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100; - s4Byte ele_A=0, ele_D, TempCCk, X, value32; - s4Byte Y, ele_C=0; - s1Byte OFDM_index[2], CCK_index=0, OFDM_index_old[2], CCK_index_old=0; - int i = 0; - BOOLEAN is2T = IS_92C_SERIAL(pHalData->VersionID); - -#if MP_DRIVER == 1 - PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); - pu1Byte TxPwrLevel = pMptCtx->TxPwrLevel; -#endif - u1Byte OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur -#if 0 - u4Byte DPK_delta_mapping[2][DPK_DELTA_MAPPING_NUM] = { - {0x1c, 0x1c, 0x1d, 0x1d, 0x1e, - 0x1f, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x03}, - {0x1c, 0x1d, 0x1e, 0x1e, 0x1e, - 0x1f, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x03, 0x03}}; -#endif -#if DEV_BUS_TYPE==RT_USB_INTERFACE - u1Byte ThermalValue_HP_count = 0; - u4Byte ThermalValue_HP = 0; - s1Byte index_mapping_HP[index_mapping_HP_NUM] = { - 0, 1, 3, 4, 6, - 7, 9, 10, 12, 13, - 15, 16, 18, 19, 21 - }; - - s1Byte index_HP; -#endif - - if (ODM_CheckPowerStatus(Adapter) == FALSE) - return; - - pHalData->TXPowerTrackingCallbackCnt++; //cosa add for debug - pHalData->bTXPowerTrackingInit = TRUE; - - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("===>odm_TXPowerTrackingCallback_ThermalMeter_92C\n")); - - ThermalValue = (u1Byte)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0] - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter)); - - PHY_APCalibrate_8192C(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); - - if(is2T) - rf = 2; - else - rf = 1; - - while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) - { - PlatformSleepUs(100); - TimeOut--; - if(TimeOut <= 0) - { - RTPRINT(FINIT, INIT_TxPower, - ("!!!odm_TXPowerTrackingCallback_ThermalMeter_92C Wait for check CCK gain index too long!!!\n" )); - break; - } - } - - if(ThermalValue) - { -// if(!pHalData->ThermalValue) - { - //Query OFDM path A default setting - ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; - for(i=0; ibCCKinCH14) - { - if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==0) - { - CCK_index_old =(u1Byte) i; - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", - rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - else - { - if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==0) - { - CCK_index_old =(u1Byte) i; - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", - rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - } - - if(!pHalData->ThermalValue) - { - pHalData->ThermalValue = pHalData->EEPROMThermalMeter; - pHalData->ThermalValue_LCK = ThermalValue; - pHalData->ThermalValue_IQK = ThermalValue; - pHalData->ThermalValue_DPK = pHalData->EEPROMThermalMeter; - -#if DEV_BUS_TYPE==RT_USB_INTERFACE - for(i = 0; i < rf; i++) - pHalData->OFDM_index_HP[i] = pHalData->OFDM_index[i] = OFDM_index_old[i]; - pHalData->CCK_index_HP = pHalData->CCK_index = CCK_index_old; -#else - for(i = 0; i < rf; i++) - pHalData->OFDM_index[i] = OFDM_index_old[i]; - pHalData->CCK_index = CCK_index_old; -#endif - } - -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) - { - pHalData->ThermalValue_HP[pHalData->ThermalValue_HP_index] = ThermalValue; - pHalData->ThermalValue_HP_index++; - if(pHalData->ThermalValue_HP_index == HP_THERMAL_NUM) - pHalData->ThermalValue_HP_index = 0; - - for(i = 0; i < HP_THERMAL_NUM; i++) - { - if(pHalData->ThermalValue_HP[i]) - { - ThermalValue_HP += pHalData->ThermalValue_HP[i]; - ThermalValue_HP_count++; - } - } - - if(ThermalValue_HP_count) - ThermalValue = (u1Byte)(ThermalValue_HP / ThermalValue_HP_count); - } -#endif - } - - delta = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) - { - if(pHalData->bDoneTxpower) - delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); - else - delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - } - else -#endif - { - delta_HP = 0; - } - delta_LCK = (ThermalValue > pHalData->ThermalValue_LCK)?(ThermalValue - pHalData->ThermalValue_LCK):(pHalData->ThermalValue_LCK - ThermalValue); - delta_IQK = (ThermalValue > pHalData->ThermalValue_IQK)?(ThermalValue - pHalData->ThermalValue_IQK):(pHalData->ThermalValue_IQK - ThermalValue); - - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x delta 0x%x delta_LCK 0x%x delta_IQK 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK)); - - if(delta_LCK > 1) - { - pHalData->ThermalValue_LCK = ThermalValue; - PHY_LCCalibrate_8192C(Adapter); - } - - if((delta > 0 || delta_HP > 0)&& pHalData->TxPowerTrackControl) - { -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) - { - pHalData->bDoneTxpower = TRUE; - delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - - if(delta_HP > index_mapping_HP_NUM-1) - index_HP = index_mapping_HP[index_mapping_HP_NUM-1]; - else - index_HP = index_mapping_HP[delta_HP]; - - if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index_HP[i] - index_HP; - CCK_index = pHalData->CCK_index_HP -index_HP; - } - else - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index_HP[i] + index_HP; - CCK_index = pHalData->CCK_index_HP + index_HP; - } - - delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); - - } - else -#endif - { - if(ThermalValue > pHalData->ThermalValue) - { - for(i = 0; i < rf; i++) - pHalData->OFDM_index[i] -= delta; - pHalData->CCK_index -= delta; - } - else - { - for(i = 0; i < rf; i++) - pHalData->OFDM_index[i] += delta; - pHalData->CCK_index += delta; - } - } - - if(is2T) - { - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", - pHalData->OFDM_index[0], pHalData->OFDM_index[1], pHalData->CCK_index)); - } - else - { - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, CCK_index=0x%x\n", - pHalData->OFDM_index[0], pHalData->CCK_index)); - } - - //no adjust -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) != INTF_SEL1_USB_High_Power) -#endif - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index[i]+1; - CCK_index = pHalData->CCK_index+1; - } - else - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index[i]; - CCK_index = pHalData->CCK_index; - } - -#if MP_DRIVER == 1 - for(i = 0; i < rf; i++) - { - if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - OFDM_index[i] -= 1; - else - OFDM_index[i] -= 2; - } - else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) - { - OFDM_index[i] += 1; - } - } - else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - OFDM_index[i] -= 1; - else - OFDM_index[i] -= 2; - } - else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) - { - OFDM_index[i] -= 1; - } - } - - { - if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - CCK_index -= 1; - else - CCK_index -= 2; - } - else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) - { - CCK_index += 1; - } - } - else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - CCK_index -= 1; - else - CCK_index -= 2; - } - else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) - { - CCK_index -= 1; - } - } -#endif - } - - for(i = 0; i < rf; i++) - { - if(OFDM_index[i] > (OFDM_TABLE_SIZE_92C-1)) - OFDM_index[i] = (OFDM_TABLE_SIZE_92C-1); - else if (OFDM_index[i] < OFDM_min_index) - OFDM_index[i] = OFDM_min_index; - } - - if(CCK_index > (CCK_TABLE_SIZE-1)) - CCK_index = (CCK_TABLE_SIZE-1); - else if (CCK_index < 0) - CCK_index = 0; - - if(is2T) - { - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", - OFDM_index[0], OFDM_index[1], CCK_index)); - } - else - { - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, CCK_index=0x%x\n", - OFDM_index[0], CCK_index)); - } - } - - if(pHalData->TxPowerTrackControl && (delta != 0 || delta_HP != 0)) - { - //Adujst OFDM Ant_A according to IQK result - ele_D = (OFDMSwingTable[OFDM_index[0]] & 0xFFC00000)>>22; - X = pHalData->RegE94; - Y = pHalData->RegE9C; - - if(X != 0) - { - if ((X & 0x00000200) != 0) - X = X | 0xFFFFFC00; - ele_A = ((X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - ele_C = ((Y * ele_D)>>8)&0x000003FF; - - //wirte new elements A, C, D to regC80 and regC94, element B is always 0 - value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; - PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); - - value32 = ((X * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32); - - value32 = ((Y * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32); - - } - else - { - PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[0]]); - PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00); - } - - RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); - - //Adjust CCK according to IQK result - if(!pHalData->bCCKinCH14){ - PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); - PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); - PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); - PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); - PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); - PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); - PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); - PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); - } - else{ - PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); - PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); - PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); - PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); - PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); - PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); - PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); - PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); - } - - if(is2T) - { - ele_D = (OFDMSwingTable[OFDM_index[1]] & 0xFFC00000)>>22; - - //new element A = element D x X - X = pHalData->RegEB4; - Y = pHalData->RegEBC; - - if(X != 0){ - if ((X & 0x00000200) != 0) //consider minus - X = X | 0xFFFFFC00; - ele_A = ((X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - ele_C = ((Y * ele_D)>>8)&0x00003FF; - - //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 - value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; - PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); - - value32 = ((X * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32); - - value32 = ((Y * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32); - - } - else{ - PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[1]]); - PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00); - } - - RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); - } - - RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord), PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bRFRegOffsetMask))); - } - -#if MP_DRIVER == 1 - if(delta_IQK > 1) -#else - if(delta_IQK > 3) -#endif - { - pHalData->ThermalValue_IQK = ThermalValue; - PHY_IQCalibrate_8192C(Adapter, FALSE); - } - -#if 1 - if(delta > 0 && IS_HARDWARE_TYPE_8723A(Adapter)) - { - if(ThermalValue >= 15) - PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, bMaskDWord, 0x038180fd ); - else - PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, bMaskDWord, 0x0381808d ); - } -#endif - - //update thermal meter value - if(pHalData->TxPowerTrackControl) - Adapter->HalFunc.SetHalDefVarHandler(Adapter, HAL_DEF_THERMAL_VALUE, &ThermalValue); - - } - - PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); - pHalData->TXPowercount = 0; - - // 2011/08/23 MH Add for power tracking after S3/S4 turn off RF. In this case, we need to execute IQK again. Otherwise - // The IQK scheme will use old value to save and cause incorrect BB value. - { - RT_RF_POWER_STATE rtState; - - Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState)); - - if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) - { - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Incorrect pwrtrack point, re-iqk next time\n")); - pHalData->bIQKInitialized = FALSE; - } - } - - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("<===odm_TXPowerTrackingCallback_ThermalMeter_92C\n")); -#endif -} - -VOID -odm_TXPowerTrackingCallback_ThermalMeter_8723A( - IN PADAPTER Adapter) -{ -#if ((RT_PLATFORM == PLATFORM_WINDOWS) || (RT_PLATFORM == PLATFORM_LINUX)) && (HAL_CODE_BASE==RTL8192_C) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100; - s4Byte ele_A=0, ele_D, TempCCk, X, value32; - s4Byte Y, ele_C=0; - s1Byte OFDM_index[2], CCK_index=0, OFDM_index_old[2], CCK_index_old=0; - int i = 0; - BOOLEAN is2T = IS_92C_SERIAL(pHalData->VersionID); - -#if MP_DRIVER == 1 - PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); - pu1Byte TxPwrLevel = pMptCtx->TxPwrLevel; -#endif - u1Byte OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur -#if 0 - u4Byte DPK_delta_mapping[2][DPK_DELTA_MAPPING_NUM] = { - {0x1c, 0x1c, 0x1d, 0x1d, 0x1e, - 0x1f, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x03}, - {0x1c, 0x1d, 0x1e, 0x1e, 0x1e, - 0x1f, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x03, 0x03}}; -#endif -#if DEV_BUS_TYPE==RT_USB_INTERFACE - u1Byte ThermalValue_HP_count = 0; - u4Byte ThermalValue_HP = 0; - s1Byte index_mapping_HP[index_mapping_HP_NUM] = { - 0, 1, 3, 4, 6, - 7, 9, 10, 12, 13, - 15, 16, 18, 19, 21 - }; - - s1Byte index_HP; -#endif - - if (ODM_CheckPowerStatus(Adapter) == FALSE) - return; - - pHalData->TXPowerTrackingCallbackCnt++; //cosa add for debug - pHalData->bTXPowerTrackingInit = TRUE; - - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("===>odm_TXPowerTrackingCallback_ThermalMeter_92C\n")); - - ThermalValue = (u1Byte)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0] - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter)); - - -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if (ThermalValue <= 0x16) - { // <20120307, Kordan> Asked by Alex. - PlatformEFIOWrite2Byte(Adapter, REG_AFE_XTAL_CTRL, - ((PlatformEFIORead2Byte(Adapter, REG_AFE_XTAL_CTRL))&~(BIT4|BIT5|BIT6|BIT7)) | (BIT7)); - } - else - { - PlatformEFIOWrite2Byte(Adapter, REG_AFE_XTAL_CTRL, - ((PlatformEFIORead2Byte(Adapter, REG_AFE_XTAL_CTRL))&~(BIT4|BIT5|BIT6|BIT7)) | (BIT4|BIT5|BIT6|BIT7)); - } -#endif - - PHY_APCalibrate_8192C(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); - - if(is2T) - rf = 2; - else - rf = 1; - - while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) - { - PlatformSleepUs(100); - TimeOut--; - if(TimeOut <= 0) - { - RTPRINT(FINIT, INIT_TxPower, - ("!!!odm_TXPowerTrackingCallback_ThermalMeter_92C Wait for check CCK gain index too long!!!\n" )); - break; - } - } - - if(ThermalValue) - { -// if(!pHalData->ThermalValue) - { - //Query OFDM path A default setting - ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; - for(i=0; ibCCKinCH14) - { - if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==0) - { - CCK_index_old =(u1Byte) i; - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", - rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - else - { - if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==0) - { - CCK_index_old =(u1Byte) i; - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", - rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - } - - if(!pHalData->ThermalValue) - { - pHalData->ThermalValue = pHalData->EEPROMThermalMeter; - pHalData->ThermalValue_LCK = ThermalValue; - pHalData->ThermalValue_IQK = ThermalValue; - pHalData->ThermalValue_DPK = pHalData->EEPROMThermalMeter; - -#if DEV_BUS_TYPE==RT_USB_INTERFACE - for(i = 0; i < rf; i++) - pHalData->OFDM_index_HP[i] = pHalData->OFDM_index[i] = OFDM_index_old[i]; - pHalData->CCK_index_HP = pHalData->CCK_index = CCK_index_old; -#else - for(i = 0; i < rf; i++) - pHalData->OFDM_index[i] = OFDM_index_old[i]; - pHalData->CCK_index = CCK_index_old; -#endif - } - -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) - { - pHalData->ThermalValue_HP[pHalData->ThermalValue_HP_index] = ThermalValue; - pHalData->ThermalValue_HP_index++; - if(pHalData->ThermalValue_HP_index == HP_THERMAL_NUM) - pHalData->ThermalValue_HP_index = 0; - - for(i = 0; i < HP_THERMAL_NUM; i++) - { - if(pHalData->ThermalValue_HP[i]) - { - ThermalValue_HP += pHalData->ThermalValue_HP[i]; - ThermalValue_HP_count++; - } - } - - if(ThermalValue_HP_count) - ThermalValue = (u1Byte)(ThermalValue_HP / ThermalValue_HP_count); - } -#endif - } - - delta = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) - { - if(pHalData->bDoneTxpower) - delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); - else - delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - } - else -#endif - { - delta_HP = 0; - } - delta_LCK = (ThermalValue > pHalData->ThermalValue_LCK)?(ThermalValue - pHalData->ThermalValue_LCK):(pHalData->ThermalValue_LCK - ThermalValue); - delta_IQK = (ThermalValue > pHalData->ThermalValue_IQK)?(ThermalValue - pHalData->ThermalValue_IQK):(pHalData->ThermalValue_IQK - ThermalValue); - - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x delta 0x%x delta_LCK 0x%x delta_IQK 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK)); - - if(delta_LCK > 1) - { - pHalData->ThermalValue_LCK = ThermalValue; - PHY_LCCalibrate(Adapter); - } - - if((delta > 0 || delta_HP > 0)&& pHalData->TxPowerTrackControl) - { -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) - { - pHalData->bDoneTxpower = TRUE; - delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - - if(delta_HP > index_mapping_HP_NUM-1) - index_HP = index_mapping_HP[index_mapping_HP_NUM-1]; - else - index_HP = index_mapping_HP[delta_HP]; - - if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index_HP[i] - index_HP; - CCK_index = pHalData->CCK_index_HP -index_HP; - } - else - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index_HP[i] + index_HP; - CCK_index = pHalData->CCK_index_HP + index_HP; - } - - delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); - - } - else -#endif - { - if(ThermalValue > pHalData->ThermalValue) - { - for(i = 0; i < rf; i++) - pHalData->OFDM_index[i] -= delta; - pHalData->CCK_index -= delta; - } - else - { - for(i = 0; i < rf; i++) - pHalData->OFDM_index[i] += delta; - pHalData->CCK_index += delta; - } - } - - if(is2T) - { - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", - pHalData->OFDM_index[0], pHalData->OFDM_index[1], pHalData->CCK_index)); - } - else - { - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, CCK_index=0x%x\n", - pHalData->OFDM_index[0], pHalData->CCK_index)); - } - - //no adjust -#if DEV_BUS_TYPE==RT_USB_INTERFACE - if(RT_GetInterfaceSelection(Adapter) != INTF_SEL1_USB_High_Power) -#endif - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index[i]+1; - CCK_index = pHalData->CCK_index+1; - } - else - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pHalData->OFDM_index[i]; - CCK_index = pHalData->CCK_index; - } - -#if MP_DRIVER == 1 - for(i = 0; i < rf; i++) - { - if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - OFDM_index[i] -= 1; - else - OFDM_index[i] -= 2; - } - else if(delta >= 5 && ThermalValue < pHalData->EEPROMThermalMeter) - { - OFDM_index[i] += 2; - } - else if(delta < 5 && ThermalValue < pHalData->EEPROMThermalMeter) - { - OFDM_index[i] += 1; - } - } - else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - OFDM_index[i] -= 1; - else - OFDM_index[i] -= 2; - } - else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) - { - OFDM_index[i] -= 1; - } - } - - { - if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - CCK_index -= 1; - else - CCK_index -= 2; - } - else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) - { - CCK_index += 1; - } - } - else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - CCK_index -= 1; - else - CCK_index -= 2; - } - else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) - { - CCK_index -= 1; - } - } -#endif - } - - for(i = 0; i < rf; i++) - { - if(OFDM_index[i] > (OFDM_TABLE_SIZE_92C-1)) - OFDM_index[i] = (OFDM_TABLE_SIZE_92C-1); - else if (OFDM_index[i] < OFDM_min_index) - OFDM_index[i] = OFDM_min_index; - } - - if(CCK_index > (CCK_TABLE_SIZE-1)) - CCK_index = (CCK_TABLE_SIZE-1); - else if (CCK_index < 0) - CCK_index = 0; - - if(is2T) - { - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", - OFDM_index[0], OFDM_index[1], CCK_index)); - } - else - { - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, CCK_index=0x%x\n", - OFDM_index[0], CCK_index)); - } - } - - if(pHalData->TxPowerTrackControl && (delta != 0 || delta_HP != 0)) - { - //Adujst OFDM Ant_A according to IQK result - ele_D = (OFDMSwingTable[OFDM_index[0]] & 0xFFC00000)>>22; - X = pHalData->RegE94; - Y = pHalData->RegE9C; - - if(X != 0) - { - if ((X & 0x00000200) != 0) - X = X | 0xFFFFFC00; - ele_A = ((X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - ele_C = ((Y * ele_D)>>8)&0x000003FF; - - //wirte new elements A, C, D to regC80 and regC94, element B is always 0 - value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; - PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); - - value32 = ((X * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32); - - value32 = ((Y * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32); - - } - else - { - PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[0]]); - PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00); - } - - RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); - - //Adjust CCK according to IQK result - if(!pHalData->bCCKinCH14){ - PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); - PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); - PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); - PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); - PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); - PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); - PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); - PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); - } - else{ - PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); - PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); - PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); - PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); - PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); - PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); - PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); - PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); - } - - if(is2T) - { - ele_D = (OFDMSwingTable[OFDM_index[1]] & 0xFFC00000)>>22; - - //new element A = element D x X - X = pHalData->RegEB4; - Y = pHalData->RegEBC; - - if(X != 0){ - if ((X & 0x00000200) != 0) //consider minus - X = X | 0xFFFFFC00; - ele_A = ((X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - ele_C = ((Y * ele_D)>>8)&0x00003FF; - - //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 - value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; - PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); - - value32 = ((X * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32); - - value32 = ((Y * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32); - - } - else{ - PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[1]]); - PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00); - } - - RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); - } - - RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord), PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bRFRegOffsetMask))); - } - -#if MP_DRIVER == 1 - if(delta_IQK > 1) -#else - if(delta_IQK > 3) -#endif - { - pHalData->ThermalValue_IQK = ThermalValue; - PHY_IQCalibrate(Adapter, FALSE); - } - -#if 1 - if(delta > 0) - { - if(ThermalValue >= 15) - PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, bMaskDWord, 0x038180fd ); - else - PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, bMaskDWord, 0x0381808d ); - } -#endif - //update thermal meter value - if(pHalData->TxPowerTrackControl) - Adapter->HalFunc.SetHalDefVarHandler(Adapter, HAL_DEF_THERMAL_VALUE, &ThermalValue); - - } - - PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); - pHalData->TXPowercount = 0; - - // 2011/08/23 MH Add for power tracking after S3/S4 turn off RF. In this case, we need to execute IQK again. Otherwise - // The IQK scheme will use old value to save and cause incorrect BB value. - { - RT_RF_POWER_STATE rtState; - - Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState)); - - if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) - { - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Incorrect pwrtrack point, re-iqk next time\n")); - pHalData->bIQKInitialized = FALSE; - } - } - - RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("<===odm_TXPowerTrackingCallback_ThermalMeter_92C\n")); -#endif -} - -// -// ================================================== -// Tx power tracking relative code. -// ================================================== -// - - -#endif - -#else //#if (RTL8192C_SUPPORT == 1) -VOID -odm_TXPowerTrackingCallback_ThermalMeter_92C( - IN PADAPTER Adapter - ) -{ -} -VOID -odm_TXPowerTrackingCallback_ThermalMeter_8723A( - IN PADAPTER Adapter) -{ -} - -#endif //#if (RTL8192C_SUPPORT == 1) - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +//============================================================ +// include files +//============================================================ + +#include "../odm_precomp.h" + +#if (RTL8192C_SUPPORT == 1) + +//#if (DM_ODM_SUPPORT_TYPE == ODM_MP) +VOID +odm_ResetFACounter_92C( + IN PDM_ODM_T pDM_Odm + ) +{ +// PADAPTER pAdapter = pDM_Odm->Adapter; + u1Byte BBReset; + + //reset false alarm counter registers + ODM_SetBBReg(pDM_Odm, 0xd00, BIT27, 1); + ODM_SetBBReg(pDM_Odm, 0xd00, BIT27, 0); + //update ofdm counter + ODM_SetBBReg(pDM_Odm, 0xc00, BIT31, 0); //update page C counter + ODM_SetBBReg(pDM_Odm, 0xd00, BIT31, 0); //update page D counter + + //reset CCK CCA counter + ODM_SetBBReg(pDM_Odm, 0xa2c, BIT13|BIT12, 0); + ODM_SetBBReg(pDM_Odm, 0xa2c, BIT13|BIT12, 2); + //reset CCK FA counter + ODM_SetBBReg(pDM_Odm, 0xa2c, BIT15|BIT14, 0); + ODM_SetBBReg(pDM_Odm, 0xa2c, BIT15|BIT14, 2); + + + //BB Reset + if(!pDM_Odm->bLinked) + { + BBReset = ODM_Read1Byte(pDM_Odm, 0x02); + ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0)); + ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0); + } + +} +//#endif + +#if (DM_ODM_SUPPORT_TYPE == ODM_MP) + + + +// +// ================================================== +// Tx power tracking relative code. +// ================================================== +// + + +//091212 chiyokolin +VOID +odm_TXPowerTrackingCallbackThermalMeter92C( + IN PADAPTER Adapter + ) +{ + +#if ((RT_PLATFORM == PLATFORM_WINDOWS) || (RT_PLATFORM == PLATFORM_LINUX)) && (HAL_CODE_BASE==RTL8192_C) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100; + s4Byte ele_A=0, ele_D, TempCCk, X, value32; + s4Byte Y, ele_C=0; + s1Byte OFDM_index[2], CCK_index=0, OFDM_index_old[2], CCK_index_old=0; + int i = 0; + BOOLEAN is2T = IS_92C_SERIAL(pHalData->VersionID); + +#if MP_DRIVER == 1 + PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + pu1Byte TxPwrLevel = pMptCtx->TxPwrLevel; +#endif + u1Byte OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur + + u4Byte DPK_delta_mapping[2][DPK_DELTA_MAPPING_NUM] = { + {0x1c, 0x1c, 0x1d, 0x1d, 0x1e, + 0x1f, 0x00, 0x00, 0x01, 0x01, + 0x02, 0x02, 0x03}, + {0x1c, 0x1d, 0x1e, 0x1e, 0x1e, + 0x1f, 0x00, 0x00, 0x01, 0x02, + 0x02, 0x03, 0x03}}; + +#if DEV_BUS_TYPE==RT_USB_INTERFACE + u1Byte ThermalValue_HP_count = 0; + u4Byte ThermalValue_HP = 0; + s1Byte index_mapping_HP[index_mapping_HP_NUM] = { + 0, 1, 3, 4, 6, + 7, 9, 10, 12, 13, + 15, 16, 18, 19, 21 + }; + + s1Byte index_HP; +#endif + + if (ODM_CheckPowerStatus(Adapter) == FALSE) + return; + + pHalData->TXPowerTrackingCallbackCnt++; //cosa add for debug + pHalData->bTXPowerTrackingInit = TRUE; + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("===>odm_TXPowerTrackingCallbackThermalMeter92C\n")); + + ThermalValue = (u1Byte)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0] + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter)); + + //if (IS_HARDWARE_TYPE_8188E(Adapter)/* || + // is_ha*/) + //{ + // PHY_APCalibrate_8188E(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); + //} + //else if (IS_HARDWARE_TYPE_8192C(Adapter) || + // IS_HARDWARE_TYPE_8192D(Adapter) || + // IS_HARDWARE_TYPE_8723A(Adapter)) + { + PHY_APCalibrate_8192C(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); + } + + if(is2T) + rf = 2; + else + rf = 1; + + while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) + { + PlatformSleepUs(100); + TimeOut--; + if(TimeOut <= 0) + { + RTPRINT(FINIT, INIT_TxPower, + ("!!!odm_TXPowerTrackingCallbackThermalMeter92C Wait for check CCK gain index too long!!!\n" )); + break; + } + } + + if(ThermalValue) + { +// if(!pHalData->ThermalValue) + { + //Query OFDM path A default setting + ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; + for(i=0; ibCCKinCH14) + { + if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==0) + { + CCK_index_old =(u1Byte) i; + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", + rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + else + { + if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==0) + { + CCK_index_old =(u1Byte) i; + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", + rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + } + + if(!pHalData->ThermalValue) + { + pHalData->ThermalValue = pHalData->EEPROMThermalMeter; + pHalData->ThermalValue_LCK = ThermalValue; + pHalData->ThermalValue_IQK = ThermalValue; + pHalData->ThermalValue_DPK = pHalData->EEPROMThermalMeter; + +#if DEV_BUS_TYPE==RT_USB_INTERFACE + for(i = 0; i < rf; i++) + pHalData->OFDM_index_HP[i] = pHalData->OFDM_index[i] = OFDM_index_old[i]; + pHalData->CCK_index_HP = pHalData->CCK_index = CCK_index_old; +#else + for(i = 0; i < rf; i++) + pHalData->OFDM_index[i] = OFDM_index_old[i]; + pHalData->CCK_index = CCK_index_old; +#endif + } + +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) + { + pHalData->ThermalValue_HP[pHalData->ThermalValue_HP_index] = ThermalValue; + pHalData->ThermalValue_HP_index++; + if(pHalData->ThermalValue_HP_index == HP_THERMAL_NUM) + pHalData->ThermalValue_HP_index = 0; + + for(i = 0; i < HP_THERMAL_NUM; i++) + { + if(pHalData->ThermalValue_HP[i]) + { + ThermalValue_HP += pHalData->ThermalValue_HP[i]; + ThermalValue_HP_count++; + } + } + + if(ThermalValue_HP_count) + ThermalValue = (u1Byte)(ThermalValue_HP / ThermalValue_HP_count); + } +#endif + } + + delta = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) + { + if(pHalData->bDoneTxpower) + delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); + else + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + } + else +#endif + { + delta_HP = 0; + } + delta_LCK = (ThermalValue > pHalData->ThermalValue_LCK)?(ThermalValue - pHalData->ThermalValue_LCK):(pHalData->ThermalValue_LCK - ThermalValue); + delta_IQK = (ThermalValue > pHalData->ThermalValue_IQK)?(ThermalValue - pHalData->ThermalValue_IQK):(pHalData->ThermalValue_IQK - ThermalValue); + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x delta 0x%x delta_LCK 0x%x delta_IQK 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK)); + + if(delta_LCK > 1) + { + pHalData->ThermalValue_LCK = ThermalValue; + PHY_LCCalibrate(Adapter); + } + + if((delta > 0 || delta_HP > 0)&& pHalData->TxPowerTrackControl) + { +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) + { + pHalData->bDoneTxpower = TRUE; + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + + if(delta_HP > index_mapping_HP_NUM-1) + index_HP = index_mapping_HP[index_mapping_HP_NUM-1]; + else + index_HP = index_mapping_HP[delta_HP]; + + if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index_HP[i] - index_HP; + CCK_index = pHalData->CCK_index_HP -index_HP; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index_HP[i] + index_HP; + CCK_index = pHalData->CCK_index_HP + index_HP; + } + + delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); + + } + else +#endif + { + if(ThermalValue > pHalData->ThermalValue) + { + for(i = 0; i < rf; i++) + pHalData->OFDM_index[i] -= delta; + pHalData->CCK_index -= delta; + } + else + { + for(i = 0; i < rf; i++) + pHalData->OFDM_index[i] += delta; + pHalData->CCK_index += delta; + } + } + + if(is2T) + { + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", + pHalData->OFDM_index[0], pHalData->OFDM_index[1], pHalData->CCK_index)); + } + else + { + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, CCK_index=0x%x\n", + pHalData->OFDM_index[0], pHalData->CCK_index)); + } + + //no adjust +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) != INTF_SEL1_USB_High_Power) +#endif + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index[i]+1; + CCK_index = pHalData->CCK_index+1; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index[i]; + CCK_index = pHalData->CCK_index; + } + +#if MP_DRIVER == 1 + for(i = 0; i < rf; i++) + { + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + OFDM_index[i] -= 1; + else + OFDM_index[i] -= 2; + } + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + OFDM_index[i] += 1; + } + } + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + OFDM_index[i] -= 1; + else + OFDM_index[i] -= 2; + } + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) + { + OFDM_index[i] -= 1; + } + } + + { + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + CCK_index -= 1; + else + CCK_index -= 2; + } + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + CCK_index += 1; + } + } + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + CCK_index -= 1; + else + CCK_index -= 2; + } + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) + { + CCK_index -= 1; + } + } +#endif + } + + for(i = 0; i < rf; i++) + { + if(OFDM_index[i] > (OFDM_TABLE_SIZE_92C-1)) + OFDM_index[i] = (OFDM_TABLE_SIZE_92C-1); + else if (OFDM_index[i] < OFDM_min_index) + OFDM_index[i] = OFDM_min_index; + } + + if(CCK_index > (CCK_TABLE_SIZE-1)) + CCK_index = (CCK_TABLE_SIZE-1); + else if (CCK_index < 0) + CCK_index = 0; + + if(is2T) + { + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", + OFDM_index[0], OFDM_index[1], CCK_index)); + } + else + { + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, CCK_index=0x%x\n", + OFDM_index[0], CCK_index)); + } + } + + if(pHalData->TxPowerTrackControl && (delta != 0 || delta_HP != 0)) + { + //Adujst OFDM Ant_A according to IQK result + ele_D = (OFDMSwingTable[OFDM_index[0]] & 0xFFC00000)>>22; + X = pHalData->RegE94; + Y = pHalData->RegE9C; + + if(X != 0) + { + if ((X & 0x00000200) != 0) + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x000003FF; + + //wirte new elements A, C, D to regC80 and regC94, element B is always 0 + value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32); + + value32 = ((Y * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32); + + } + else + { + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[0]]); + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00); + } + + RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); + + //Adjust CCK according to IQK result + if(!pHalData->bCCKinCH14){ + PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); + PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); + PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); + PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); + PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); + PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); + PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); + PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); + } + else{ + PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); + PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); + PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); + PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); + PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); + PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); + PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); + PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); + } + + if(is2T) + { + ele_D = (OFDMSwingTable[OFDM_index[1]] & 0xFFC00000)>>22; + + //new element A = element D x X + X = pHalData->RegEB4; + Y = pHalData->RegEBC; + + if(X != 0){ + if ((X & 0x00000200) != 0) //consider minus + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x00003FF; + + //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 + value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32); + + value32 = ((Y * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32); + + } + else{ + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[1]]); + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00); + } + + RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); + } + + RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord), PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bRFRegOffsetMask))); + } + +#if MP_DRIVER == 1 + if(delta_IQK > 1) +#else + if(delta_IQK > 3) +#endif + { + pHalData->ThermalValue_IQK = ThermalValue; + PHY_IQCalibrate(Adapter, FALSE); + } + + //update thermal meter value + if(pHalData->TxPowerTrackControl) + Adapter->HalFunc.SetHalDefVarHandler(Adapter, HAL_DEF_THERMAL_VALUE, &ThermalValue); + + } + + PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); + pHalData->TXPowercount = 0; + + // 2011/08/23 MH Add for power tracking after S3/S4 turn off RF. In this case, we need to execute IQK again. Otherwise + // The IQK scheme will use old value to save and cause incorrect BB value. + { + RT_RF_POWER_STATE rtState; + + Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState)); + + if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) + { + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Incorrect pwrtrack point, re-iqk next time\n")); + pHalData->bIQKInitialized = FALSE; + } + } + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("<===odm_TXPowerTrackingCallbackThermalMeter92C\n")); +#endif + +} + +//#if (RT_PLATFORM == PLATFORM_WINDOWS) && (HAL_CODE_BASE==RTL8192_C) +VOID +odm_TXPowerTrackingCallbackRXGainThermalMeter92D( + IN PADAPTER Adapter + ) +{ + u1Byte index_mapping[Rx_index_mapping_NUM] = { + 0x0f, 0x0f, 0x0f, 0x0f, 0x0b, + 0x0a, 0x09, 0x08, 0x07, 0x06, + 0x05, 0x04, 0x04, 0x03, 0x02 + }; + +#ifndef AP_BUILD_WORKAROUND + u1Byte eRFPath; + u4Byte u4tmp; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + + u4tmp = (index_mapping[(pHalData->EEPROMThermalMeter - pHalData->ThermalValue_RxGain)]) << 12; + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("===>odm_TXPowerTrackingCallbackRXGainThermalMeter92D interface %u Rx Gain %x\n", Adapter->interfaceIndex, u4tmp)); + + for(eRFPath = RF_PATH_A; eRFPath NumTotalRFPath; eRFPath++) + PHY_SetRFReg(Adapter, (ODM_RF_RADIO_PATH_E)eRFPath, RF_RXRF_A3, bRFRegOffsetMask, (pHalData->RegRF3C[eRFPath]&(~(0xF000)))|u4tmp); +#endif + +}; + + +//091212 chiyokolin +VOID +odm_TXPowerTrackingCallbackThermalMeter92D( + IN PADAPTER Adapter + ) +{ + +#ifndef AP_BUILD_WORKAROUND + +//#if (RT_PLATFORM == PLATFORM_WINDOWS) && (HAL_CODE_BASE==RTL8192_C) +#if (HAL_CODE_BASE==RTL8192_C) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; + u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_RxGain, index, offset; + u1Byte ThermalValue_AVG_count = 0; + u4Byte ThermalValue_AVG = 0; + s4Byte ele_A=0, ele_D, TempCCk, X, value32; + s4Byte Y, ele_C=0; + s1Byte OFDM_index[2], CCK_index=0, OFDM_index_old[2], CCK_index_old=0; + u4Byte i = 0; + BOOLEAN is2T = (IS_92C_SERIAL(pHalData->VersionID) || IS_92D_SINGLEPHY(pHalData->VersionID)) ; + BOOLEAN bInteralPA = FALSE; + + u1Byte OFDM_min_index = 6, OFDM_min_index_internalPA = 3, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur + u1Byte Indexforchannel = GetRightChnlPlaceforIQK(pHalData->CurrentChannel); + u1Byte index_mapping[5][index_mapping_NUM] = { + {0, 1, 3, 6, 8, 9, //5G, path A/MAC 0, decrease power + 11, 13, 14, 16, 17, 18, 18}, + {0, 2, 4, 5, 7, 10, //5G, path A/MAC 0, increase power + 12, 14, 16, 18, 18, 18, 18}, + {0, 2, 3, 6, 8, 9, //5G, path B/MAC 1, decrease power + 11, 13, 14, 16, 17, 18, 18}, + {0, 2, 4, 5, 7, 10, //5G, path B/MAC 1, increase power + 13, 16, 16, 18, 18, 18, 18}, + {0, 1, 2, 3, 4, 5, //2.4G, for decreas power + 6, 7, 7, 8, 9, 10, 10}, + }; + +u1Byte index_mapping_internalPA[8][index_mapping_NUM] = { + {0, 1, 2, 4, 6, 7, //5G, path A/MAC 0, ch36-64, decrease power + 9, 11, 12, 14, 15, 16, 16}, + {0, 2, 4, 5, 7, 10, //5G, path A/MAC 0, ch36-64, increase power + 12, 14, 16, 18, 18, 18, 18}, + {0, 1, 2, 3, 5, 6, //5G, path A/MAC 0, ch100-165, decrease power + 8, 10, 11, 13, 14, 15, 15}, + {0, 2, 4, 5, 7, 10, //5G, path A/MAC 0, ch100-165, increase power + 12, 14, 16, 18, 18, 18, 18}, + {0, 1, 2, 4, 6, 7, //5G, path B/MAC 1, ch36-64, decrease power + 9, 11, 12, 14, 15, 16, 16}, + {0, 2, 4, 5, 7, 10, //5G, path B/MAC 1, ch36-64, increase power + 13, 16, 16, 18, 18, 18, 18}, + {0, 1, 2, 3, 5, 6, //5G, path B/MAC 1, ch100-165, decrease power + 8, 9, 10, 12, 13, 14, 14}, + {0, 2, 4, 5, 7, 10, //5G, path B/MAC 1, ch100-165, increase power + 13, 16, 16, 18, 18, 18, 18}, + }; + +//#if MP_DRIVER != 1 +// return; +//#endif + + + pHalData->TXPowerTrackingCallbackCnt++; //cosa add for debug + pHalData->bTXPowerTrackingInit = TRUE; + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("===>dm_TXPowerTrackingCallback_ThermalMeter_92D interface %u txpowercontrol %d\n", Adapter->interfaceIndex, pHalData->TxPowerTrackControl)); + + ThermalValue = (u1Byte)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER_92D, 0xf800); //0x42: RF Reg[15:11] 92D + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter)); + + //PHY_APCalibrate(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); + //if (IS_HARDWARE_TYPE_8188E(Adapter)/* || + // is_ha*/) + //{ + // PHY_APCalibrate_8188E(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); + //} + //else if (IS_HARDWARE_TYPE_8192C(Adapter) || + // IS_HARDWARE_TYPE_8192D(Adapter) || + // IS_HARDWARE_TYPE_8723A(Adapter)) + { + PHY_APCalibrate_8192C(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); + } + +// if(!pHalData->TxPowerTrackControl) +// return; + + if(is2T) + rf = 2; + else + rf = 1; + + if(ThermalValue) + { +// if(!pHalData->ThermalValue) + { + //Query OFDM path A default setting + ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; + for(i=0; iCurrentBandType92D == BAND_ON_2_4G) + { + //Query CCK default setting From 0xa24 + TempCCk = pHalData->RegA24; + + for(i=0 ; ibCCKinCH14) + { + if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==0) + { + CCK_index_old =(u1Byte) i; + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", + rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + else + { + if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==0) + { + CCK_index_old =(u1Byte) i; + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", + rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + } + } + else + { + TempCCk = 0x090e1317; + CCK_index_old = 12; + } + + if(!pHalData->ThermalValue) + { + pHalData->ThermalValue = pHalData->EEPROMThermalMeter; + pHalData->ThermalValue_LCK = ThermalValue; + pHalData->ThermalValue_IQK = ThermalValue; + pHalData->ThermalValue_RxGain = pHalData->EEPROMThermalMeter; + + for(i = 0; i < rf; i++) + pHalData->OFDM_index[i] = OFDM_index_old[i]; + pHalData->CCK_index = CCK_index_old; + } + + if(pHalData->bReloadtxpowerindex) + { + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("reload ofdm index for band switch\n")); + } + + //calculate average thermal meter + { + pHalData->ThermalValue_AVG[pHalData->ThermalValue_AVG_index] = ThermalValue; + pHalData->ThermalValue_AVG_index++; + if(pHalData->ThermalValue_AVG_index == AVG_THERMAL_NUM) + pHalData->ThermalValue_AVG_index = 0; + + for(i = 0; i < AVG_THERMAL_NUM; i++) + { + if(pHalData->ThermalValue_AVG[i]) + { + ThermalValue_AVG += pHalData->ThermalValue_AVG[i]; + ThermalValue_AVG_count++; + } + } + + if(ThermalValue_AVG_count) + ThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count); + } + } + + if(pHalData->bReloadtxpowerindex) + { + delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + pHalData->bReloadtxpowerindex = FALSE; + pHalData->bDoneTxpower = FALSE; + } + else if(pHalData->bDoneTxpower) + { + delta = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); + } + else + { + delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + } + delta_LCK = (ThermalValue > pHalData->ThermalValue_LCK)?(ThermalValue - pHalData->ThermalValue_LCK):(pHalData->ThermalValue_LCK - ThermalValue); + delta_IQK = (ThermalValue > pHalData->ThermalValue_IQK)?(ThermalValue - pHalData->ThermalValue_IQK):(pHalData->ThermalValue_IQK - ThermalValue); + delta_RxGain = (ThermalValue > pHalData->ThermalValue_RxGain)?(ThermalValue - pHalData->ThermalValue_RxGain):(pHalData->ThermalValue_RxGain - ThermalValue); + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("interface %u Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x delta 0x%x delta_LCK 0x%x delta_IQK 0x%x delta_RxGain 0x%x\n", Adapter->interfaceIndex, ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK, delta_RxGain)); + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("interface %u pre thermal meter LCK 0x%x pre thermal meter IQK 0x%x delta_LCK_bound 0x%x delta_IQK_bound 0x%x\n", Adapter->interfaceIndex, pHalData->ThermalValue_LCK, pHalData->ThermalValue_IQK, pHalData->Delta_LCK, pHalData->Delta_IQK)); + + if((delta_LCK > pHalData->Delta_LCK) && (pHalData->Delta_LCK != 0)) + { + pHalData->ThermalValue_LCK = ThermalValue; + PHY_LCCalibrate(Adapter); + } + + if(delta > 0 && pHalData->TxPowerTrackControl) + { + delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + + //calculate new OFDM / CCK offset + { + if(pHalData->CurrentBandType92D == BAND_ON_2_4G) + { + offset = 4; + + if(delta > index_mapping_NUM-1) + index = index_mapping[offset][index_mapping_NUM-1]; + else + index = index_mapping[offset][delta]; + + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index[i] -delta; + CCK_index = pHalData->CCK_index -delta; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index[i] + index; + CCK_index = pHalData->CCK_index + index; + } + } + else if(pHalData->CurrentBandType92D == BAND_ON_5G) + { + for(i = 0; i < rf; i++) + { + if(pHalData->MacPhyMode92D == DUALMAC_DUALPHY && + Adapter->interfaceIndex == 1) //MAC 1 5G + bInteralPA = pHalData->InternalPA5G[1]; + else + bInteralPA = pHalData->InternalPA5G[i]; + + if(bInteralPA) + { + if(Adapter->interfaceIndex == 1 || i == rf) + offset = 4; + else + offset = 0; + + if(pHalData->CurrentChannel >= 100 && pHalData->CurrentChannel <= 165) + offset += 2; + } + else + { + if(Adapter->interfaceIndex == 1 || i == rf) + offset = 2; + else + offset = 0; + } + + if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power + offset++; + + if(bInteralPA) + { + if(delta > index_mapping_NUM-1) + index = index_mapping_internalPA[offset][index_mapping_NUM-1]; + else + index = index_mapping_internalPA[offset][delta]; + } + else + { + if(delta > index_mapping_NUM-1) + index = index_mapping[offset][index_mapping_NUM-1]; + else + index = index_mapping[offset][delta]; + } + + if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power + { + if(bInteralPA && ThermalValue > 0x12) + { + OFDM_index[i] = pHalData->OFDM_index[i] -((delta/2)*3+(delta%2)); + } + else + { + OFDM_index[i] = pHalData->OFDM_index[i] -index; + } + } + else + { + OFDM_index[i] = pHalData->OFDM_index[i] + index; + } + } + } + + if(is2T) + { + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", + pHalData->OFDM_index[0], pHalData->OFDM_index[1], pHalData->CCK_index)); + } + else + { + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, CCK_index=0x%x\n", + pHalData->OFDM_index[0], pHalData->CCK_index)); + } + + for(i = 0; i < rf; i++) + { + if(OFDM_index[i] > OFDM_TABLE_SIZE_92D-1) + { + OFDM_index[i] = OFDM_TABLE_SIZE_92D-1; + } + else if(bInteralPA || pHalData->CurrentBandType92D == BAND_ON_2_4G) + { + if (OFDM_index[i] < OFDM_min_index_internalPA) + OFDM_index[i] = OFDM_min_index_internalPA; + } + else if (OFDM_index[i] < OFDM_min_index) + { + OFDM_index[i] = OFDM_min_index; + } + } + + if(pHalData->CurrentBandType92D == BAND_ON_2_4G) + { + if(CCK_index > CCK_TABLE_SIZE-1) + CCK_index = CCK_TABLE_SIZE-1; + else if (CCK_index < 0) + CCK_index = 0; + } + + if(is2T) + { + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", + OFDM_index[0], OFDM_index[1], CCK_index)); + } + else + { + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, CCK_index=0x%x\n", + OFDM_index[0], CCK_index)); + } + } + + //Config by SwingTable + if(pHalData->TxPowerTrackControl && !pHalData->bNOPG) + { + pHalData->bDoneTxpower = TRUE; + + //Adujst OFDM Ant_A according to IQK result + ele_D = (OFDMSwingTable[(u1Byte)OFDM_index[0]] & 0xFFC00000)>>22; +// X = pHalData->RegE94; +// Y = pHalData->RegE9C; + X = pHalData->IQKMatrixRegSetting[Indexforchannel].Value[0][0]; + Y = pHalData->IQKMatrixRegSetting[Indexforchannel].Value[0][1]; + + if(X != 0 && pHalData->CurrentBandType92D == BAND_ON_2_4G) + { + if ((X & 0x00000200) != 0) + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x000003FF; + + //wirte new elements A, C, D to regC80 and regC94, element B is always 0 + value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT24, value32); + + } + else + { + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[(u1Byte)OFDM_index[0]]); + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT24, 0x00); + } + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD, ("TxPwrTracking for interface %u path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x 0xe94 = 0x%x 0xe9c = 0x%x\n", + (u1Byte)Adapter->interfaceIndex, (u4Byte)X, (u4Byte)Y, (u4Byte)ele_A, (u4Byte)ele_C, (u4Byte)ele_D, (u4Byte)X, (u4Byte)Y)); + + + if(pHalData->CurrentBandType92D == BAND_ON_2_4G) + { + //Adjust CCK according to IQK result + if(!pHalData->bCCKinCH14){ + PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][0]); + PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][1]); + PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][2]); + PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][3]); + PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][4]); + PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][5]); + PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][6]); + PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[(u1Byte)CCK_index][7]); + } + else{ + PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch14[(u1Byte)CCK_index][0]); + PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch14[(u1Byte)CCK_index][1]); + PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch14[(u1Byte)CCK_index][2]); + PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch14[(u1Byte)CCK_index][3]); + PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch14[(u1Byte)CCK_index][4]); + PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch14[(u1Byte)CCK_index][5]); + PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch14[(u1Byte)CCK_index][6]); + PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch14[(u1Byte)CCK_index][7]); + } + } + + if(is2T) + { + ele_D = (OFDMSwingTable[(u1Byte)OFDM_index[1]] & 0xFFC00000)>>22; + + //new element A = element D x X +// X = pHalData->RegEB4; +// Y = pHalData->RegEBC; + X = pHalData->IQKMatrixRegSetting[Indexforchannel].Value[0][4]; + Y = pHalData->IQKMatrixRegSetting[Indexforchannel].Value[0][5]; + + if(X != 0 && pHalData->CurrentBandType92D == BAND_ON_2_4G) + { + if ((X & 0x00000200) != 0) //consider minus + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x00003FF; + + //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 + value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT28, value32); + + } + else + { + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[(u1Byte)OFDM_index[1]]); + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT28, 0x00); + } + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x 0xeb4 = 0x%x 0xebc = 0x%x\n", + (u4Byte)X, (u4Byte)Y, (u4Byte)ele_A, (u4Byte)ele_C, (u4Byte)ele_D, (u4Byte)X, (u4Byte)Y)); + } + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD, ("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord), PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bRFRegOffsetMask))); + } + } + + if((delta_IQK > pHalData->Delta_IQK) && (pHalData->Delta_IQK != 0)) + { + PHY_ResetIQKResult(Adapter); + pHalData->ThermalValue_IQK = ThermalValue; +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) +#if USE_WORKITEM + PlatformAcquireMutex(&pHalData->mxChnlBwControl); +#else + PlatformAcquireSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); +#endif +#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) + PlatformAcquireMutex(&pHalData->mxChnlBwControl); +#endif + + PHY_IQCalibrate(Adapter, FALSE); + +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) +#if USE_WORKITEM + PlatformReleaseMutex(&pHalData->mxChnlBwControl); +#else + PlatformReleaseSpinLock(Adapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); +#endif +#elif((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) + PlatformReleaseMutex(&pHalData->mxChnlBwControl); +#endif + + } + + if(delta_RxGain > 0 && pHalData->CurrentBandType92D == BAND_ON_5G + && ThermalValue <= pHalData->EEPROMThermalMeter) + { + pHalData->ThermalValue_RxGain = ThermalValue; + odm_TXPowerTrackingCallbackRXGainThermalMeter92D(Adapter); + } + + //update thermal meter value + if(pHalData->TxPowerTrackControl) + { + Adapter->HalFunc.SetHalDefVarHandler(Adapter, HAL_DEF_THERMAL_VALUE, &ThermalValue); + } + + } + + ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD,("<===dm_TXPowerTrackingCallback_ThermalMeter_92D\n")); + + pHalData->TXPowercount = 0; +#endif +#endif +} + + +// +// Description: +// - Dispatch TxPower Tracking direct call ONLY for 92s. +// - We shall NOT schedule Workitem within PASSIVE LEVEL, which will cause system resource +// leakage under some platform. +// +// Assumption: +// PASSIVE_LEVEL when this routine is called. +// +// Added by Roger, 2009.06.18. +// +VOID +odm_TXPowerTrackingDirectCall92C( + IN PADAPTER Adapter + ) +{ +#ifndef AP_BUILD_WORKAROUND + if(IS_HARDWARE_TYPE_8192D(Adapter)) + odm_TXPowerTrackingCallbackThermalMeter92D(Adapter); + else + odm_TXPowerTrackingCallbackThermalMeter92C(Adapter); +#endif +} + + +VOID +odm_TXPowerTrackingCallback_ThermalMeter_92C( + IN PADAPTER Adapter + ) +{ +#if ((RT_PLATFORM == PLATFORM_WINDOWS) || (RT_PLATFORM == PLATFORM_LINUX)) && (HAL_CODE_BASE==RTL8192_C) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100; + s4Byte ele_A=0, ele_D, TempCCk, X, value32; + s4Byte Y, ele_C=0; + s1Byte OFDM_index[2], CCK_index=0, OFDM_index_old[2], CCK_index_old=0; + int i = 0; + BOOLEAN is2T = IS_92C_SERIAL(pHalData->VersionID); + +#if MP_DRIVER == 1 + PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + pu1Byte TxPwrLevel = pMptCtx->TxPwrLevel; +#endif + u1Byte OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur +#if 0 + u4Byte DPK_delta_mapping[2][DPK_DELTA_MAPPING_NUM] = { + {0x1c, 0x1c, 0x1d, 0x1d, 0x1e, + 0x1f, 0x00, 0x00, 0x01, 0x01, + 0x02, 0x02, 0x03}, + {0x1c, 0x1d, 0x1e, 0x1e, 0x1e, + 0x1f, 0x00, 0x00, 0x01, 0x02, + 0x02, 0x03, 0x03}}; +#endif +#if DEV_BUS_TYPE==RT_USB_INTERFACE + u1Byte ThermalValue_HP_count = 0; + u4Byte ThermalValue_HP = 0; + s1Byte index_mapping_HP[index_mapping_HP_NUM] = { + 0, 1, 3, 4, 6, + 7, 9, 10, 12, 13, + 15, 16, 18, 19, 21 + }; + + s1Byte index_HP; +#endif + + if (ODM_CheckPowerStatus(Adapter) == FALSE) + return; + + pHalData->TXPowerTrackingCallbackCnt++; //cosa add for debug + pHalData->bTXPowerTrackingInit = TRUE; + + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("===>odm_TXPowerTrackingCallback_ThermalMeter_92C\n")); + + ThermalValue = (u1Byte)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0] + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter)); + + PHY_APCalibrate_8192C(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); + + if(is2T) + rf = 2; + else + rf = 1; + + while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) + { + PlatformSleepUs(100); + TimeOut--; + if(TimeOut <= 0) + { + RTPRINT(FINIT, INIT_TxPower, + ("!!!odm_TXPowerTrackingCallback_ThermalMeter_92C Wait for check CCK gain index too long!!!\n" )); + break; + } + } + + if(ThermalValue) + { +// if(!pHalData->ThermalValue) + { + //Query OFDM path A default setting + ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; + for(i=0; ibCCKinCH14) + { + if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==0) + { + CCK_index_old =(u1Byte) i; + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", + rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + else + { + if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==0) + { + CCK_index_old =(u1Byte) i; + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", + rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + } + + if(!pHalData->ThermalValue) + { + pHalData->ThermalValue = pHalData->EEPROMThermalMeter; + pHalData->ThermalValue_LCK = ThermalValue; + pHalData->ThermalValue_IQK = ThermalValue; + pHalData->ThermalValue_DPK = pHalData->EEPROMThermalMeter; + +#if DEV_BUS_TYPE==RT_USB_INTERFACE + for(i = 0; i < rf; i++) + pHalData->OFDM_index_HP[i] = pHalData->OFDM_index[i] = OFDM_index_old[i]; + pHalData->CCK_index_HP = pHalData->CCK_index = CCK_index_old; +#else + for(i = 0; i < rf; i++) + pHalData->OFDM_index[i] = OFDM_index_old[i]; + pHalData->CCK_index = CCK_index_old; +#endif + } + +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) + { + pHalData->ThermalValue_HP[pHalData->ThermalValue_HP_index] = ThermalValue; + pHalData->ThermalValue_HP_index++; + if(pHalData->ThermalValue_HP_index == HP_THERMAL_NUM) + pHalData->ThermalValue_HP_index = 0; + + for(i = 0; i < HP_THERMAL_NUM; i++) + { + if(pHalData->ThermalValue_HP[i]) + { + ThermalValue_HP += pHalData->ThermalValue_HP[i]; + ThermalValue_HP_count++; + } + } + + if(ThermalValue_HP_count) + ThermalValue = (u1Byte)(ThermalValue_HP / ThermalValue_HP_count); + } +#endif + } + + delta = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) + { + if(pHalData->bDoneTxpower) + delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); + else + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + } + else +#endif + { + delta_HP = 0; + } + delta_LCK = (ThermalValue > pHalData->ThermalValue_LCK)?(ThermalValue - pHalData->ThermalValue_LCK):(pHalData->ThermalValue_LCK - ThermalValue); + delta_IQK = (ThermalValue > pHalData->ThermalValue_IQK)?(ThermalValue - pHalData->ThermalValue_IQK):(pHalData->ThermalValue_IQK - ThermalValue); + + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x delta 0x%x delta_LCK 0x%x delta_IQK 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK)); + + if(delta_LCK > 1) + { + pHalData->ThermalValue_LCK = ThermalValue; + PHY_LCCalibrate_8192C(Adapter); + } + + if((delta > 0 || delta_HP > 0)&& pHalData->TxPowerTrackControl) + { +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) + { + pHalData->bDoneTxpower = TRUE; + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + + if(delta_HP > index_mapping_HP_NUM-1) + index_HP = index_mapping_HP[index_mapping_HP_NUM-1]; + else + index_HP = index_mapping_HP[delta_HP]; + + if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index_HP[i] - index_HP; + CCK_index = pHalData->CCK_index_HP -index_HP; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index_HP[i] + index_HP; + CCK_index = pHalData->CCK_index_HP + index_HP; + } + + delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); + + } + else +#endif + { + if(ThermalValue > pHalData->ThermalValue) + { + for(i = 0; i < rf; i++) + pHalData->OFDM_index[i] -= delta; + pHalData->CCK_index -= delta; + } + else + { + for(i = 0; i < rf; i++) + pHalData->OFDM_index[i] += delta; + pHalData->CCK_index += delta; + } + } + + if(is2T) + { + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", + pHalData->OFDM_index[0], pHalData->OFDM_index[1], pHalData->CCK_index)); + } + else + { + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, CCK_index=0x%x\n", + pHalData->OFDM_index[0], pHalData->CCK_index)); + } + + //no adjust +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) != INTF_SEL1_USB_High_Power) +#endif + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index[i]+1; + CCK_index = pHalData->CCK_index+1; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index[i]; + CCK_index = pHalData->CCK_index; + } + +#if MP_DRIVER == 1 + for(i = 0; i < rf; i++) + { + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + OFDM_index[i] -= 1; + else + OFDM_index[i] -= 2; + } + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + OFDM_index[i] += 1; + } + } + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + OFDM_index[i] -= 1; + else + OFDM_index[i] -= 2; + } + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) + { + OFDM_index[i] -= 1; + } + } + + { + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + CCK_index -= 1; + else + CCK_index -= 2; + } + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + CCK_index += 1; + } + } + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + CCK_index -= 1; + else + CCK_index -= 2; + } + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) + { + CCK_index -= 1; + } + } +#endif + } + + for(i = 0; i < rf; i++) + { + if(OFDM_index[i] > (OFDM_TABLE_SIZE_92C-1)) + OFDM_index[i] = (OFDM_TABLE_SIZE_92C-1); + else if (OFDM_index[i] < OFDM_min_index) + OFDM_index[i] = OFDM_min_index; + } + + if(CCK_index > (CCK_TABLE_SIZE-1)) + CCK_index = (CCK_TABLE_SIZE-1); + else if (CCK_index < 0) + CCK_index = 0; + + if(is2T) + { + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", + OFDM_index[0], OFDM_index[1], CCK_index)); + } + else + { + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, CCK_index=0x%x\n", + OFDM_index[0], CCK_index)); + } + } + + if(pHalData->TxPowerTrackControl && (delta != 0 || delta_HP != 0)) + { + //Adujst OFDM Ant_A according to IQK result + ele_D = (OFDMSwingTable[OFDM_index[0]] & 0xFFC00000)>>22; + X = pHalData->RegE94; + Y = pHalData->RegE9C; + + if(X != 0) + { + if ((X & 0x00000200) != 0) + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x000003FF; + + //wirte new elements A, C, D to regC80 and regC94, element B is always 0 + value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32); + + value32 = ((Y * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32); + + } + else + { + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[0]]); + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00); + } + + RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); + + //Adjust CCK according to IQK result + if(!pHalData->bCCKinCH14){ + PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); + PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); + PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); + PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); + PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); + PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); + PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); + PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); + } + else{ + PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); + PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); + PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); + PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); + PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); + PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); + PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); + PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); + } + + if(is2T) + { + ele_D = (OFDMSwingTable[OFDM_index[1]] & 0xFFC00000)>>22; + + //new element A = element D x X + X = pHalData->RegEB4; + Y = pHalData->RegEBC; + + if(X != 0){ + if ((X & 0x00000200) != 0) //consider minus + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x00003FF; + + //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 + value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32); + + value32 = ((Y * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32); + + } + else{ + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[1]]); + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00); + } + + RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); + } + + RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord), PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bRFRegOffsetMask))); + } + +#if MP_DRIVER == 1 + if(delta_IQK > 1) +#else + if(delta_IQK > 3) +#endif + { + pHalData->ThermalValue_IQK = ThermalValue; + PHY_IQCalibrate_8192C(Adapter, FALSE); + } + +#if 1 + if(delta > 0 && IS_HARDWARE_TYPE_8723A(Adapter)) + { + if(ThermalValue >= 15) + PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, bMaskDWord, 0x038180fd ); + else + PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, bMaskDWord, 0x0381808d ); + } +#endif + + //update thermal meter value + if(pHalData->TxPowerTrackControl) + Adapter->HalFunc.SetHalDefVarHandler(Adapter, HAL_DEF_THERMAL_VALUE, &ThermalValue); + + } + + PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); + pHalData->TXPowercount = 0; + + // 2011/08/23 MH Add for power tracking after S3/S4 turn off RF. In this case, we need to execute IQK again. Otherwise + // The IQK scheme will use old value to save and cause incorrect BB value. + { + RT_RF_POWER_STATE rtState; + + Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState)); + + if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) + { + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Incorrect pwrtrack point, re-iqk next time\n")); + pHalData->bIQKInitialized = FALSE; + } + } + + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("<===odm_TXPowerTrackingCallback_ThermalMeter_92C\n")); +#endif +} + +VOID +odm_TXPowerTrackingCallback_ThermalMeter_8723A( + IN PADAPTER Adapter) +{ +#if ((RT_PLATFORM == PLATFORM_WINDOWS) || (RT_PLATFORM == PLATFORM_LINUX)) && (HAL_CODE_BASE==RTL8192_C) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100; + s4Byte ele_A=0, ele_D, TempCCk, X, value32; + s4Byte Y, ele_C=0; + s1Byte OFDM_index[2], CCK_index=0, OFDM_index_old[2], CCK_index_old=0; + int i = 0; + BOOLEAN is2T = IS_92C_SERIAL(pHalData->VersionID); + +#if MP_DRIVER == 1 + PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + pu1Byte TxPwrLevel = pMptCtx->TxPwrLevel; +#endif + u1Byte OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur +#if 0 + u4Byte DPK_delta_mapping[2][DPK_DELTA_MAPPING_NUM] = { + {0x1c, 0x1c, 0x1d, 0x1d, 0x1e, + 0x1f, 0x00, 0x00, 0x01, 0x01, + 0x02, 0x02, 0x03}, + {0x1c, 0x1d, 0x1e, 0x1e, 0x1e, + 0x1f, 0x00, 0x00, 0x01, 0x02, + 0x02, 0x03, 0x03}}; +#endif +#if DEV_BUS_TYPE==RT_USB_INTERFACE + u1Byte ThermalValue_HP_count = 0; + u4Byte ThermalValue_HP = 0; + s1Byte index_mapping_HP[index_mapping_HP_NUM] = { + 0, 1, 3, 4, 6, + 7, 9, 10, 12, 13, + 15, 16, 18, 19, 21 + }; + + s1Byte index_HP; +#endif + + if (ODM_CheckPowerStatus(Adapter) == FALSE) + return; + + pHalData->TXPowerTrackingCallbackCnt++; //cosa add for debug + pHalData->bTXPowerTrackingInit = TRUE; + + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("===>odm_TXPowerTrackingCallback_ThermalMeter_92C\n")); + + ThermalValue = (u1Byte)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0] + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter)); + + +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if (ThermalValue <= 0x16) + { // <20120307, Kordan> Asked by Alex. + PlatformEFIOWrite2Byte(Adapter, REG_AFE_XTAL_CTRL, + ((PlatformEFIORead2Byte(Adapter, REG_AFE_XTAL_CTRL))&~(BIT4|BIT5|BIT6|BIT7)) | (BIT7)); + } + else + { + PlatformEFIOWrite2Byte(Adapter, REG_AFE_XTAL_CTRL, + ((PlatformEFIORead2Byte(Adapter, REG_AFE_XTAL_CTRL))&~(BIT4|BIT5|BIT6|BIT7)) | (BIT4|BIT5|BIT6|BIT7)); + } +#endif + + PHY_APCalibrate_8192C(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); + + if(is2T) + rf = 2; + else + rf = 1; + + while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) + { + PlatformSleepUs(100); + TimeOut--; + if(TimeOut <= 0) + { + RTPRINT(FINIT, INIT_TxPower, + ("!!!odm_TXPowerTrackingCallback_ThermalMeter_92C Wait for check CCK gain index too long!!!\n" )); + break; + } + } + + if(ThermalValue) + { +// if(!pHalData->ThermalValue) + { + //Query OFDM path A default setting + ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; + for(i=0; ibCCKinCH14) + { + if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==0) + { + CCK_index_old =(u1Byte) i; + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", + rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + else + { + if(PlatformCompareMemory((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==0) + { + CCK_index_old =(u1Byte) i; + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", + rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + } + + if(!pHalData->ThermalValue) + { + pHalData->ThermalValue = pHalData->EEPROMThermalMeter; + pHalData->ThermalValue_LCK = ThermalValue; + pHalData->ThermalValue_IQK = ThermalValue; + pHalData->ThermalValue_DPK = pHalData->EEPROMThermalMeter; + +#if DEV_BUS_TYPE==RT_USB_INTERFACE + for(i = 0; i < rf; i++) + pHalData->OFDM_index_HP[i] = pHalData->OFDM_index[i] = OFDM_index_old[i]; + pHalData->CCK_index_HP = pHalData->CCK_index = CCK_index_old; +#else + for(i = 0; i < rf; i++) + pHalData->OFDM_index[i] = OFDM_index_old[i]; + pHalData->CCK_index = CCK_index_old; +#endif + } + +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) + { + pHalData->ThermalValue_HP[pHalData->ThermalValue_HP_index] = ThermalValue; + pHalData->ThermalValue_HP_index++; + if(pHalData->ThermalValue_HP_index == HP_THERMAL_NUM) + pHalData->ThermalValue_HP_index = 0; + + for(i = 0; i < HP_THERMAL_NUM; i++) + { + if(pHalData->ThermalValue_HP[i]) + { + ThermalValue_HP += pHalData->ThermalValue_HP[i]; + ThermalValue_HP_count++; + } + } + + if(ThermalValue_HP_count) + ThermalValue = (u1Byte)(ThermalValue_HP / ThermalValue_HP_count); + } +#endif + } + + delta = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) + { + if(pHalData->bDoneTxpower) + delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); + else + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + } + else +#endif + { + delta_HP = 0; + } + delta_LCK = (ThermalValue > pHalData->ThermalValue_LCK)?(ThermalValue - pHalData->ThermalValue_LCK):(pHalData->ThermalValue_LCK - ThermalValue); + delta_IQK = (ThermalValue > pHalData->ThermalValue_IQK)?(ThermalValue - pHalData->ThermalValue_IQK):(pHalData->ThermalValue_IQK - ThermalValue); + + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x delta 0x%x delta_LCK 0x%x delta_IQK 0x%x\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK)); + + if(delta_LCK > 1) + { + pHalData->ThermalValue_LCK = ThermalValue; + PHY_LCCalibrate(Adapter); + } + + if((delta > 0 || delta_HP > 0)&& pHalData->TxPowerTrackControl) + { +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power) + { + pHalData->bDoneTxpower = TRUE; + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + + if(delta_HP > index_mapping_HP_NUM-1) + index_HP = index_mapping_HP[index_mapping_HP_NUM-1]; + else + index_HP = index_mapping_HP[delta_HP]; + + if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index_HP[i] - index_HP; + CCK_index = pHalData->CCK_index_HP -index_HP; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index_HP[i] + index_HP; + CCK_index = pHalData->CCK_index_HP + index_HP; + } + + delta_HP = (ThermalValue > pHalData->ThermalValue)?(ThermalValue - pHalData->ThermalValue):(pHalData->ThermalValue - ThermalValue); + + } + else +#endif + { + if(ThermalValue > pHalData->ThermalValue) + { + for(i = 0; i < rf; i++) + pHalData->OFDM_index[i] -= delta; + pHalData->CCK_index -= delta; + } + else + { + for(i = 0; i < rf; i++) + pHalData->OFDM_index[i] += delta; + pHalData->CCK_index += delta; + } + } + + if(is2T) + { + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", + pHalData->OFDM_index[0], pHalData->OFDM_index[1], pHalData->CCK_index)); + } + else + { + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("temp OFDM_A_index=0x%x, CCK_index=0x%x\n", + pHalData->OFDM_index[0], pHalData->CCK_index)); + } + + //no adjust +#if DEV_BUS_TYPE==RT_USB_INTERFACE + if(RT_GetInterfaceSelection(Adapter) != INTF_SEL1_USB_High_Power) +#endif + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index[i]+1; + CCK_index = pHalData->CCK_index+1; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pHalData->OFDM_index[i]; + CCK_index = pHalData->CCK_index; + } + +#if MP_DRIVER == 1 + for(i = 0; i < rf; i++) + { + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + OFDM_index[i] -= 1; + else + OFDM_index[i] -= 2; + } + else if(delta >= 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + OFDM_index[i] += 2; + } + else if(delta < 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + OFDM_index[i] += 1; + } + } + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + OFDM_index[i] -= 1; + else + OFDM_index[i] -= 2; + } + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) + { + OFDM_index[i] -= 1; + } + } + + { + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + CCK_index -= 1; + else + CCK_index -= 2; + } + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + CCK_index += 1; + } + } + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + CCK_index -= 1; + else + CCK_index -= 2; + } + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) + { + CCK_index -= 1; + } + } +#endif + } + + for(i = 0; i < rf; i++) + { + if(OFDM_index[i] > (OFDM_TABLE_SIZE_92C-1)) + OFDM_index[i] = (OFDM_TABLE_SIZE_92C-1); + else if (OFDM_index[i] < OFDM_min_index) + OFDM_index[i] = OFDM_min_index; + } + + if(CCK_index > (CCK_TABLE_SIZE-1)) + CCK_index = (CCK_TABLE_SIZE-1); + else if (CCK_index < 0) + CCK_index = 0; + + if(is2T) + { + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", + OFDM_index[0], OFDM_index[1], CCK_index)); + } + else + { + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("new OFDM_A_index=0x%x, CCK_index=0x%x\n", + OFDM_index[0], CCK_index)); + } + } + + if(pHalData->TxPowerTrackControl && (delta != 0 || delta_HP != 0)) + { + //Adujst OFDM Ant_A according to IQK result + ele_D = (OFDMSwingTable[OFDM_index[0]] & 0xFFC00000)>>22; + X = pHalData->RegE94; + Y = pHalData->RegE9C; + + if(X != 0) + { + if ((X & 0x00000200) != 0) + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x000003FF; + + //wirte new elements A, C, D to regC80 and regC94, element B is always 0 + value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32); + + value32 = ((Y * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32); + + } + else + { + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[0]]); + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00); + } + + RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); + + //Adjust CCK according to IQK result + if(!pHalData->bCCKinCH14){ + PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); + PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); + PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); + PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); + PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); + PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); + PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); + PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); + } + else{ + PlatformEFIOWrite1Byte(Adapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); + PlatformEFIOWrite1Byte(Adapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); + PlatformEFIOWrite1Byte(Adapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); + PlatformEFIOWrite1Byte(Adapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); + PlatformEFIOWrite1Byte(Adapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); + PlatformEFIOWrite1Byte(Adapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); + PlatformEFIOWrite1Byte(Adapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); + PlatformEFIOWrite1Byte(Adapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); + } + + if(is2T) + { + ele_D = (OFDMSwingTable[OFDM_index[1]] & 0xFFC00000)>>22; + + //new element A = element D x X + X = pHalData->RegEB4; + Y = pHalData->RegEBC; + + if(X != 0){ + if ((X & 0x00000200) != 0) //consider minus + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x00003FF; + + //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 + value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32); + + value32 = ((Y * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32); + + } + else{ + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[1]]); + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00); + } + + RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); + } + + RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord), PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bRFRegOffsetMask))); + } + +#if MP_DRIVER == 1 + if(delta_IQK > 1) +#else + if(delta_IQK > 3) +#endif + { + pHalData->ThermalValue_IQK = ThermalValue; + PHY_IQCalibrate(Adapter, FALSE); + } + +#if 1 + if(delta > 0) + { + if(ThermalValue >= 15) + PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, bMaskDWord, 0x038180fd ); + else + PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, bMaskDWord, 0x0381808d ); + } +#endif + //update thermal meter value + if(pHalData->TxPowerTrackControl) + Adapter->HalFunc.SetHalDefVarHandler(Adapter, HAL_DEF_THERMAL_VALUE, &ThermalValue); + + } + + PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); + pHalData->TXPowercount = 0; + + // 2011/08/23 MH Add for power tracking after S3/S4 turn off RF. In this case, we need to execute IQK again. Otherwise + // The IQK scheme will use old value to save and cause incorrect BB value. + { + RT_RF_POWER_STATE rtState; + + Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState)); + + if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) + { + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Incorrect pwrtrack point, re-iqk next time\n")); + pHalData->bIQKInitialized = FALSE; + } + } + + RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("<===odm_TXPowerTrackingCallback_ThermalMeter_92C\n")); +#endif +} + +// +// ================================================== +// Tx power tracking relative code. +// ================================================== +// + + +#endif + +#else //#if (RTL8192C_SUPPORT == 1) +VOID +odm_TXPowerTrackingCallback_ThermalMeter_92C( + IN PADAPTER Adapter + ) +{ +} +VOID +odm_TXPowerTrackingCallback_ThermalMeter_8723A( + IN PADAPTER Adapter) +{ +} + +#endif //#if (RTL8192C_SUPPORT == 1) + + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/odm_RTL8192C.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/odm_RTL8192C.h index cc9c57f9b242..684db25a5035 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/odm_RTL8192C.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8192c/odm_RTL8192C.h @@ -1,86 +1,86 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __ODM_RTL8192C_H__ -#define __ODM_RTL8192C_H__ - - -VOID -odm_ResetFACounter_92C( - IN PDM_ODM_T pDM_Odm - ); - -#if (DM_ODM_SUPPORT_TYPE & ODM_MP) - - -// -// ================================================== -// Tx power tracking relative code. -// ================================================== -// - -VOID -odm_TXPowerTrackingCallbackThermalMeter92C( - IN PADAPTER Adapter - ); - - -VOID -odm_TXPowerTrackingCallbackRXGainThermalMeter92D( - IN PADAPTER Adapter - ); - -VOID -odm_TXPowerTrackingDirectCall92C( - IN PADAPTER Adapter - ); - -VOID -odm_TXPowerTrackingDirectCall92C( - IN PADAPTER Adapter - ); - -VOID -odm_TXPowerTrackingCallback_ThermalMeter_92C( - IN PADAPTER Adapter - ); - -VOID -odm_TXPowerTrackingCallback_ThermalMeter_8723A( - IN PADAPTER Adapter - ); - -// -// ================================================== -// Tx power tracking relative code. -// ================================================== -// - -void -ODM_RF_Saving_8188E( - IN PDM_ODM_T pDM_Odm, - IN u1Byte bForceInNormal - ); - - -#endif - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __ODM_RTL8192C_H__ +#define __ODM_RTL8192C_H__ + + +VOID +odm_ResetFACounter_92C( + IN PDM_ODM_T pDM_Odm + ); + +#if (DM_ODM_SUPPORT_TYPE & ODM_MP) + + +// +// ================================================== +// Tx power tracking relative code. +// ================================================== +// + +VOID +odm_TXPowerTrackingCallbackThermalMeter92C( + IN PADAPTER Adapter + ); + + +VOID +odm_TXPowerTrackingCallbackRXGainThermalMeter92D( + IN PADAPTER Adapter + ); + +VOID +odm_TXPowerTrackingDirectCall92C( + IN PADAPTER Adapter + ); + +VOID +odm_TXPowerTrackingDirectCall92C( + IN PADAPTER Adapter + ); + +VOID +odm_TXPowerTrackingCallback_ThermalMeter_92C( + IN PADAPTER Adapter + ); + +VOID +odm_TXPowerTrackingCallback_ThermalMeter_8723A( + IN PADAPTER Adapter + ); + +// +// ================================================== +// Tx power tracking relative code. +// ================================================== +// + +void +ODM_RF_Saving_8188E( + IN PDM_ODM_T pDM_Odm, + IN u1Byte bForceInNormal + ); + + +#endif + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723Reg.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723Reg.h index 16329cd46a55..2e04792e7fe8 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723Reg.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723Reg.h @@ -1,45 +1,45 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -//============================================================ -// File Name: Hal8723Reg.h -// -// Description: -// -// This file is for RTL8723 register definition. -// -// -//============================================================ -#ifndef __HAL_8723_REG_H__ -#define __HAL_8723_REG_H__ - -// -// Register Definition -// -#define ODM_R_A_AGC_CORE1_8723A 0xc50 - - -// -// Bitmap Definition -// -#define BIT_FA_RESET_8723A BIT0 - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +//============================================================ +// File Name: Hal8723Reg.h +// +// Description: +// +// This file is for RTL8723 register definition. +// +// +//============================================================ +#ifndef __HAL_8723_REG_H__ +#define __HAL_8723_REG_H__ + +// +// Register Definition +// +#define ODM_R_A_AGC_CORE1_8723A 0xc50 + + +// +// Bitmap Definition +// +#define BIT_FA_RESET_8723A BIT0 + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.c index d495f7e33a04..db70fd79a870 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.c @@ -1,7245 +1,5972 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -/*Created on 2013/02/26, 18:59*/ -#include "../odm_precomp.h" - -const u8 Rtl8723SFwImgArray[Rtl8723SImgArrayLength] = { -0x01,0x23,0x02,0x00,0x0e,0x00,0x00,0x00,0x11,0x16,0x12,0x05,0x5e,0x50,0x01,0x00, -0x31,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x58,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x60,0xbf,0x00,0x00,0x00,0x00,0x00,0x02,0x53,0x36,0x00,0x00, -0x00,0x00,0x00,0x02,0x51,0x6b,0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03, -0x00,0x04,0x06,0x05,0x04,0x02,0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09, -0x08,0x06,0x00,0x08,0x0a,0x09,0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08, -0x0a,0x09,0x08,0x00,0x00,0x08,0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10, -0x00,0x18,0x22,0x21,0x20,0x18,0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21, -0x20,0x08,0x00,0x20,0x22,0x21,0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20, -0x22,0x20,0x18,0x08,0x00,0x20,0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00, -0x00,0x30,0x31,0x2f,0x10,0x10,0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28, -0x10,0x00,0x00,0x30,0x31,0x20,0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30, -0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05, -0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05, -0x05,0x05,0x06,0x07,0x0a,0x0b,0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11, -0x08,0x08,0x09,0x09,0x0a,0x0c,0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07, -0x07,0x07,0x08,0x0a,0x04,0x04,0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07, -0x08,0x0b,0x0d,0x0f,0x04,0x04,0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12, -0x04,0x04,0x05,0x05,0x06,0x0a,0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f, -0x21,0x27,0x29,0x2a,0x00,0x00,0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04, -0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90, -0x00,0xc0,0x00,0xd8,0x00,0x50,0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90, -0x01,0xe0,0x02,0x30,0x01,0x2c,0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0, -0x06,0x40,0x07,0xd0,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12, -0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c, -0x00,0x50,0x00,0x64,0x00,0xa0,0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0, -0x00,0xf0,0x01,0x68,0x01,0xf4,0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02, -0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12, -0x05,0x07,0x07,0x08,0x0b,0x12,0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04, -0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08, -0x09,0x0a,0x0b,0x0c,0x20,0x1e,0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00, -0xbb,0x01,0x06,0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01, -0xf3,0x22,0xf8,0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83, -0xe8,0xf0,0x22,0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25, -0x82,0xc8,0xf2,0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82, -0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, -0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb, -0xfe,0x07,0xe3,0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5, -0xf0,0x74,0x01,0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, -0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0, -0x08,0xe6,0x22,0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22, -0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a, -0x89,0x82,0x8a,0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0, -0x19,0x22,0xbb,0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11, -0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0, -0x22,0x50,0x09,0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9, -0x25,0x82,0xc8,0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed, -0x49,0xfd,0xec,0x48,0xfc,0x22,0xbb,0x01,0x07,0x89,0x82,0x8a,0x83,0x02,0x43,0x46, -0x50,0x05,0xe9,0xf8,0x02,0x43,0xda,0xbb,0xfe,0x05,0xe9,0xf8,0x02,0x43,0xe6,0x89, -0x82,0x8a,0x83,0x02,0x43,0xf2,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, -0xff,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb, -0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0, -0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0, -0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12, -0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83, -0xe4,0x73,0x74,0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0xd0,0x83,0xd0, -0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74, -0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0xb5,0xf0,0x06,0x74,0x03, -0x93,0x68,0x60,0xe9,0xa3,0xa3,0xa3,0xa3,0x80,0xd8,0xe6,0xfc,0x08,0xe6,0xfd,0x08, -0xe6,0xfe,0x08,0xe6,0xff,0x22,0xe2,0xfc,0x08,0xe2,0xfd,0x08,0xe2,0xfe,0x08,0xe2, -0xff,0x22,0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0x74,0x02,0x93,0xfe,0x74,0x03,0x93, -0xff,0x22,0x02,0x44,0x40,0x02,0x4b,0x85,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40, -0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07, -0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56, -0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, -0x90,0x44,0x85,0xe4,0x7e,0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09, -0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8, -0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82, -0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf, -0xe9,0xde,0xe7,0x80,0xbe,0x48,0x9e,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x48,0x9e,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x9e,0x8c,0x00,0x41, -0x9f,0x14,0x00,0x41,0x9e,0x9e,0x80,0x41,0x9e,0x9f,0x80,0x41,0x9d,0xa8,0x00,0x41, -0x9d,0xa9,0x00,0x41,0x9d,0xa7,0x00,0x41,0x9e,0xb3,0x00,0x00,0x90,0x9e,0x69,0xe0, -0xfe,0xa3,0xe0,0xff,0x90,0x02,0x84,0xef,0xf0,0xa3,0xee,0xf0,0xa3,0x74,0x05,0xf0, -0x22,0xe5,0x68,0x30,0xe3,0x04,0xe4,0xff,0x80,0x02,0x7f,0x01,0xe1,0xd6,0x8f,0x82, -0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x05,0xaf, -0x69,0x02,0x56,0x5f,0x02,0x4c,0x80,0x22,0x7f,0x00,0x22,0x90,0x01,0x64,0x74,0x20, -0xf0,0x22,0x22,0x02,0x61,0x15,0x02,0x61,0x1c,0xef,0x8e,0xf0,0x71,0xad,0x45,0x26, -0x00,0x40,0x45,0x4e,0x00,0x80,0x45,0x79,0x01,0x00,0x45,0x8d,0x02,0x00,0x45,0xa5, -0x04,0x00,0x00,0x00,0x45,0xc2,0xed,0x54,0x3f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e, -0x00,0x7f,0x40,0xef,0x2d,0xff,0xee,0x3c,0xfe,0xef,0x78,0x06,0xce,0xc3,0x13,0xce, -0x13,0xd8,0xf9,0x78,0x06,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x80,0x26,0xed,0x54, -0x7f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x00,0x7f,0x80,0xef,0x2d,0xff,0xee,0x3c, -0xfe,0xef,0x78,0x07,0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x78,0x07,0xc3,0x33,0xce, -0x33,0xce,0xd8,0xf9,0xfd,0xac,0x06,0x80,0x49,0xed,0x70,0x04,0xfe,0xff,0x80,0x04, -0x7e,0x01,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x7d,0x00,0xfc,0x80,0x35,0xec,0x54,0x01, -0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x02,0x7f,0x00,0xef,0x2d,0xee,0x3c,0xc3, -0x13,0x7d,0x00,0x80,0x1a,0xec,0x54,0x03,0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e, -0x04,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x13,0x13,0x54,0x3f,0x7d,0x00,0x25,0xe0,0x25, -0xe0,0xfc,0xae,0x04,0xaf,0x05,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0x90, -0x9e,0x6f,0xf0,0xa3,0x74,0x08,0xf0,0xa3,0xf0,0x90,0x01,0x1f,0xe0,0xfe,0x90,0x01, -0x1e,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x9e,0x69,0xf0,0xa3,0xef,0xf0, -0x90,0x02,0x87,0xe0,0x90,0x9e,0x6e,0xf0,0x90,0x9e,0xbc,0xe0,0x20,0xe0,0x02,0xe1, -0x49,0xe4,0x90,0x9e,0x6d,0xf0,0x90,0x9e,0x6e,0xe0,0xff,0x90,0x9e,0x6d,0xe0,0xc3, -0x9f,0x40,0x02,0xe1,0x49,0x90,0x9e,0x69,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0x90,0xfd, -0x11,0xf0,0x74,0x02,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0x0f,0xfc, -0x33,0x33,0x33,0x54,0xf8,0xff,0xed,0x24,0x18,0x2f,0x90,0x9e,0x6b,0xf0,0xe0,0x24, -0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0xfc,0x90,0x9e,0x6c,0xf0,0x74, -0x01,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0xfe,0x74,0x00,0x2d,0xf5,0x82, -0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x7a,0x00,0x24,0x00,0xff,0xea,0x3e,0x54,0x3f,0xab, -0x07,0xfa,0xaf,0x04,0xef,0x75,0xf0,0x08,0xa4,0x24,0x18,0xff,0xe4,0x35,0xf0,0xfe, -0xef,0x2b,0xfb,0xee,0x3a,0xfa,0x90,0x9e,0xc2,0xe0,0xfe,0xa3,0xe0,0xff,0xad,0x03, -0xac,0x02,0xb1,0x09,0xaa,0x06,0xab,0x07,0x90,0x9e,0x69,0xee,0x8f,0xf0,0x51,0x54, -0x90,0x9e,0xc0,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x9e,0x69,0xe0,0xfc,0xa3,0xe0,0xfd, -0xd3,0x9f,0xec,0x9e,0x40,0x1b,0x90,0x9e,0xc1,0xe0,0x24,0x01,0xff,0x90,0x9e,0xc0, -0xe0,0x34,0x00,0xfe,0xc3,0xed,0x9f,0xff,0xec,0x9e,0x90,0x9e,0x69,0xf0,0xa3,0xef, -0xf0,0x90,0x9e,0x6c,0xe0,0xff,0x24,0x40,0x60,0x04,0x24,0x20,0x70,0x24,0x90,0x9e, -0xbc,0xe0,0xfe,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x29,0xef,0x90,0x00,0x81, -0xb4,0xa0,0x06,0xe0,0x44,0x04,0xf0,0x80,0x04,0xe0,0x44,0x08,0xf0,0x90,0x9e,0xbf, -0x80,0x0f,0x90,0x9e,0xbc,0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x06,0x80, -0x04,0xe0,0x44,0x01,0xf0,0x90,0x9e,0xbf,0xe0,0x20,0xe0,0x07,0x90,0x01,0x3f,0xe0, -0x30,0xe2,0x10,0xf1,0x4e,0x90,0x9e,0xbc,0xe0,0xc4,0x54,0x0f,0x30,0xe0,0x12,0x91, -0xbc,0x80,0x0e,0x91,0xbc,0x90,0x01,0xbf,0xe0,0x04,0xf0,0x90,0x00,0xe2,0xe0,0x04, -0xf0,0x90,0x9e,0x6d,0xe0,0x04,0xf0,0xc1,0x06,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e, -0x9b,0xe0,0x64,0x02,0x70,0x33,0x90,0x9e,0xbd,0xe0,0xff,0x90,0x9e,0xbc,0xe0,0xfe, -0xc4,0x13,0x54,0x01,0xfd,0x12,0x4e,0xa4,0x90,0x9e,0xbe,0xe0,0x75,0xf0,0x20,0xa4, -0xff,0xae,0xf0,0x12,0x3b,0x3b,0x90,0x9e,0xbd,0xe0,0xff,0x90,0x9e,0xbc,0xe0,0xfe, -0xc4,0x13,0x54,0x01,0xf4,0xfd,0x02,0x4e,0xa4,0x90,0x06,0x90,0xe0,0x44,0x01,0xf0, -0x22,0x90,0x9e,0xb4,0xe0,0x30,0xe0,0x3d,0xe5,0x67,0x64,0x01,0x70,0x37,0x90,0x9e, -0xb8,0xe0,0x60,0x31,0x90,0x9e,0x8e,0xe0,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x02, -0x80,0x15,0x90,0x9e,0xb8,0xe0,0xff,0x90,0x9e,0xb6,0xe0,0xb5,0x07,0x0f,0xf1,0x4e, -0x90,0x00,0x81,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x9e,0xb8,0xf0,0x22,0x91,0xd1,0x90, -0x9e,0xb8,0xe0,0x04,0xf0,0x22,0x8f,0x27,0x12,0x4f,0xf8,0xef,0x64,0x01,0x70,0x2e, -0x90,0x9e,0x97,0x12,0x50,0x26,0xe5,0x27,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4, -0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4, -0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xd3, -0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x9e,0xe6,0x12, -0x43,0x7e,0xab,0x63,0xaa,0x64,0xa9,0x65,0x90,0x9e,0xe9,0x12,0x43,0x7e,0xaf,0x66, -0x15,0x66,0xef,0x60,0x1e,0x90,0x9e,0xe9,0xe4,0x75,0xf0,0x01,0x12,0x43,0x67,0x12, -0x1f,0x04,0xff,0x90,0x9e,0xe6,0xe4,0x75,0xf0,0x01,0x12,0x43,0x67,0xef,0x12,0x42, -0x20,0x80,0xdb,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10, -0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xec,0x12,0x43,0x7e,0x90,0x9e,0x9b,0xe0,0x64, -0x01,0x60,0x66,0x90,0x9e,0x9b,0xe0,0x70,0x60,0x90,0x9d,0xa7,0xe0,0xff,0x04,0xf0, -0x90,0x9e,0xec,0x12,0x43,0x5e,0x90,0x00,0x01,0xef,0x12,0x42,0x32,0x31,0x8f,0xef, -0x60,0x47,0x90,0x9e,0xec,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66, -0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0x11,0x0f,0x90,0x9e,0xef,0x12,0x43,0x5e,0x8b, -0x63,0x8a,0x64,0x89,0x65,0x90,0x9e,0xec,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0xc4, -0x54,0x0f,0xf5,0x66,0x7b,0x01,0x7a,0x01,0x79,0xa2,0x11,0x0f,0x90,0x01,0xaf,0x74, -0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10, -0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xf2,0x12,0x43,0x7e,0x90,0x9d,0xa9,0xe0,0xff, -0x90,0x9d,0xa8,0xe0,0xb5,0x07,0x07,0x7d,0x02,0x7f,0x03,0x12,0x3a,0xdf,0x90,0x9d, -0xa8,0xe0,0x70,0x06,0xa3,0xe0,0x64,0x09,0x60,0x0b,0x90,0x9d,0xa8,0xe0,0x14,0xff, -0xa3,0xe0,0xb5,0x07,0x0d,0x31,0x8f,0xef,0x60,0x70,0x31,0xe9,0x90,0x01,0x3f,0x74, -0x02,0xf0,0x90,0x9d,0xa9,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xad,0xf9,0x74,0x9d,0x35, -0xf0,0xa8,0x01,0xfc,0x7d,0x01,0x90,0x9e,0xf2,0x12,0x43,0x5e,0x7e,0x00,0x7f,0x02, -0x12,0x1e,0xde,0x90,0x9d,0xa9,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xaf,0xf9,0x74,0x9d, -0x35,0xf0,0xfa,0x7b,0x01,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x90,0x9e,0xf5,0x12,0x43, -0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x90,0x9e,0xf2,0x12,0x43,0x5e,0x12,0x1f,0x04, -0xff,0xc4,0x54,0x0f,0xf5,0x66,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x11,0x0f,0x90,0x9d, -0xa9,0xe0,0x04,0xf0,0xe0,0xb4,0x0a,0x02,0xe4,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0x7f, -0xaf,0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xfd,0xee,0xf0,0xa3, -0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90,0x9e,0xfd,0xe0,0xfe,0xa3,0xe0,0xf5,0x82, -0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x9f,0x00,0xe0,0x94,0xe8,0x90,0x9e,0xff,0xe0, -0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0,0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90, -0x9e,0xff,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x0a,0x7e,0x00,0x12,0x3b,0x3b, -0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x90,0x9d,0xa8,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xad,0xf9,0x74,0x9d,0x35,0xf0,0xfa, -0x7b,0x01,0xc0,0x02,0xc0,0x01,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xaf,0xf9,0x74,0x9d, -0x35,0xf0,0xfa,0x90,0x9e,0xef,0x12,0x43,0x7e,0xd0,0x01,0xd0,0x02,0x11,0x5e,0x90, -0x9d,0xa8,0xe0,0x04,0xf0,0xe0,0xb4,0x0a,0x02,0xe4,0xf0,0x90,0x9d,0xa9,0xe0,0xff, -0x90,0x9d,0xa8,0xe0,0xb5,0x07,0x07,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x71,0xd0,0xd0, -0x92,0xaf,0x22,0x90,0x01,0xcc,0xe0,0x54,0x0f,0x90,0x9e,0x69,0xf0,0x90,0x9e,0x69, -0xe0,0xfd,0x70,0x02,0x61,0x84,0x90,0x9f,0x14,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8, -0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02, -0x61,0x7d,0x90,0x9f,0x14,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x52,0xe0, -0x90,0x9e,0x6a,0xf0,0x75,0x63,0x01,0x75,0x64,0x9e,0x75,0x65,0x6a,0x75,0x66,0x01, -0x7b,0x01,0x7a,0x9e,0x79,0x6b,0x11,0x0f,0x90,0x9e,0x6b,0xe0,0xff,0xc4,0x13,0x13, -0x13,0x54,0x01,0x90,0x9f,0x14,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88, -0x12,0x43,0x52,0xe0,0x90,0x9e,0x6c,0xf0,0x90,0x9f,0x14,0xe0,0x75,0xf0,0x02,0x90, -0x00,0x89,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6d,0xf0,0x90,0x9f,0x14,0xe0,0x75,0xf0, -0x04,0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6e,0xf0,0x90,0x9f,0x14,0xe0, -0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6f,0xf0,0x90,0x9f, -0x14,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52,0xe0,0x90,0x9e,0x70,0xf0, -0x80,0x33,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6c, -0xf0,0x90,0x9f,0x14,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90, -0x9e,0x6d,0xf0,0x90,0x9f,0x14,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52, -0xe0,0x90,0x9e,0x6e,0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x9e,0x79,0x6c,0x12, -0x80,0x07,0x90,0x9e,0x69,0xe0,0xff,0x90,0x9f,0x14,0xe0,0xfe,0x74,0x01,0xa8,0x06, -0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x90,0x9e,0x69,0xf0,0x90,0x9f,0x14, -0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc, -0xf0,0x90,0x9f,0x14,0xe0,0x04,0xf0,0xe0,0x54,0x03,0xf0,0x41,0x4d,0x90,0x01,0xc6, -0xe0,0x44,0x02,0xf0,0x22,0xe4,0x90,0x9e,0x66,0xf0,0xa3,0xf0,0x12,0x60,0x87,0x75, -0x8e,0x02,0xf1,0xe8,0x12,0x44,0xf8,0x90,0x9e,0x9b,0xef,0xf0,0x12,0x60,0x24,0x90, -0x9e,0x9d,0xef,0xf0,0xe4,0xf5,0x57,0x12,0x78,0x90,0x12,0x61,0x60,0x12,0x37,0x4e, -0x12,0x67,0x5a,0x12,0x57,0xfe,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41, -0x74,0x10,0xf0,0x90,0x05,0x5a,0xf0,0xa3,0xe4,0xf0,0x12,0x44,0xfb,0x12,0x58,0x1c, -0x12,0x44,0xf7,0x12,0x60,0x8f,0x12,0x8d,0xfb,0x12,0x8d,0xf2,0x12,0x8d,0xca,0x90, -0x9e,0x68,0xe5,0xd9,0xf0,0x12,0x5f,0xf5,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,0x40, -0xf0,0xd1,0x94,0x75,0xe8,0x03,0x43,0xa8,0x85,0x12,0x8e,0x69,0xd2,0xaf,0x12,0x87, -0xdd,0x12,0x60,0x31,0x90,0x9e,0x66,0xe0,0x64,0x01,0xf0,0x24,0x85,0x90,0x01,0xc4, -0xf0,0x74,0x4b,0xa3,0xf0,0xe5,0x57,0x30,0xe0,0x0a,0xc2,0xaf,0x53,0x57,0xfe,0x12, -0x8e,0xca,0xd2,0xaf,0xe5,0x57,0x30,0xe2,0x10,0x12,0x61,0x23,0xbf,0x01,0x0a,0xc2, -0xaf,0x53,0x57,0xfb,0xd2,0xaf,0x12,0x45,0xc7,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf, -0x53,0x57,0xef,0xd2,0xaf,0x51,0x43,0xe5,0x57,0x30,0xe6,0x0a,0xc2,0xaf,0x53,0x57, -0xbf,0xd2,0xaf,0x12,0x72,0x3b,0xe5,0x57,0x30,0xe7,0x09,0xc2,0xaf,0x53,0x57,0x7f, -0xd2,0xaf,0x31,0xe9,0xc2,0xaf,0xe5,0x69,0x54,0x0f,0xff,0xbf,0x01,0x0e,0x90,0x9e, -0xa5,0x74,0x01,0xf0,0x12,0x44,0xe8,0xe4,0x90,0x9e,0xa5,0xf0,0xd2,0xaf,0x80,0x84, -0x7d,0x01,0xaf,0x69,0x90,0x9f,0x09,0xed,0xf0,0x90,0x9f,0x08,0xef,0xf0,0x54,0x0f, -0xff,0xe5,0x68,0x54,0x0f,0x6f,0x60,0x73,0x90,0x9f,0x08,0xe0,0x30,0xe2,0x2b,0xe5, -0x68,0x20,0xe2,0x05,0x7f,0x01,0x12,0x67,0x85,0xe5,0x68,0x30,0xe3,0x0a,0x90,0x9f, -0x08,0xe0,0x20,0xe3,0x03,0x02,0x68,0x03,0xe5,0x68,0x20,0xe3,0x4e,0x90,0x9f,0x08, -0xe0,0x30,0xe3,0x47,0xa3,0xe0,0xff,0x02,0x62,0x72,0xe5,0x68,0x54,0x0f,0xff,0xbf, -0x0c,0x10,0x90,0x9f,0x08,0xe0,0x20,0xe3,0x09,0x12,0x5e,0xac,0xef,0x60,0x2c,0x12, -0x68,0x03,0xe5,0x68,0x54,0x0f,0xff,0xbf,0x04,0x10,0x90,0x9f,0x08,0xe0,0x20,0xe2, -0x09,0x12,0x5f,0x93,0xef,0x60,0x14,0x12,0x68,0x29,0xe5,0x68,0x54,0x0f,0xff,0xbf, -0x02,0x09,0x12,0x61,0xfc,0xef,0x60,0x03,0x12,0x6b,0x0b,0x22,0xef,0x64,0x01,0x70, -0x38,0x7d,0x7c,0x7f,0x02,0x12,0x3a,0x54,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x54,0x90, -0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x7d,0x01,0x7f,0x0c,0x91,0x84, -0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x03,0x12,0x56,0x83,0x90,0x06,0x04,0xe0,0x54,0x7f, -0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0,0xa3, -0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x3a,0xc5,0x7d,0x02,0x7f,0x03,0x12,0x3a,0xc5, -0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90,0x9e, -0xa9,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x67,0x30,0xe0,0x22,0x90,0x9e,0xa3, -0xe0,0x70,0x21,0xe0,0x04,0xf0,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d, -0x01,0x7f,0x04,0x91,0x84,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x08,0x02,0x56,0x83,0xe4, -0x90,0x9e,0xa3,0xf0,0x22,0x8b,0x13,0x8a,0x14,0x89,0x15,0x12,0x61,0xc6,0xab,0x13, -0xaa,0x14,0xa9,0x15,0x12,0x1f,0x04,0xf5,0x6a,0x12,0x43,0x87,0x4d,0xd5,0x00,0x4d, -0xdd,0x01,0x4d,0xf0,0x02,0x4e,0x04,0x03,0x4e,0x0a,0x04,0x4e,0x21,0x05,0x4e,0x39, -0x06,0x00,0x00,0x4e,0x44,0x7f,0x01,0xb1,0x0c,0x7f,0x01,0x80,0x64,0xab,0x13,0xaa, -0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0xe4,0xff,0xd1,0x54,0x80,0x18, -0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0x7f,0x01,0xd1, -0x54,0x1f,0x80,0x04,0xd1,0x45,0xe4,0xff,0xa1,0x0c,0xab,0x13,0xaa,0x14,0xa9,0x15, -0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0xe4,0xff,0xd1,0x54,0xb1,0x0c,0xe4,0xff,0x80, -0x20,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0x7f,0x01, -0xd1,0x54,0x1f,0xb1,0x0c,0xe4,0xff,0x80,0x08,0xd1,0x45,0xe4,0xff,0xb1,0x0c,0xe4, -0xff,0x12,0x61,0xd2,0x22,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f, -0x1d,0xfd,0x7f,0x02,0xef,0x24,0xfe,0x60,0x12,0x04,0x70,0x2f,0x90,0x9e,0xaf,0x74, -0x01,0xf0,0x90,0x9e,0xa1,0xf0,0x90,0x9e,0xb2,0xf0,0x22,0xed,0x70,0x0a,0x90,0x9e, -0xac,0xe0,0x90,0x9e,0xaf,0xf0,0x80,0x05,0x90,0x9e,0xaf,0xed,0xf0,0x90,0x9e,0xaf, -0xe0,0x90,0x9e,0xa1,0xf0,0x90,0x9e,0xb2,0x74,0x01,0xf0,0x22,0xf4,0xff,0x90,0x00, -0x63,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe,0xd0, -0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9f,0x13,0xed,0xf0, -0x90,0x9f,0x12,0xef,0xf0,0xd3,0x94,0x07,0x50,0x63,0xe0,0xff,0x74,0x01,0xa8,0x07, -0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0xd1, -0x94,0x90,0x9f,0x12,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, -0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0xd1,0x94,0x90,0x9f,0x13,0xe0,0x60,0x16, -0x90,0x9f,0x12,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, -0xff,0x90,0x00,0x45,0x80,0x60,0x90,0x9f,0x12,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, -0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x62,0x90,0x9f,0x12, -0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, -0xfc,0xd1,0x8c,0x90,0x9f,0x12,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, -0x33,0xd8,0xfc,0xff,0x90,0x00,0x62,0xe0,0x4f,0xf0,0xd1,0x94,0x90,0x9f,0x13,0xe0, -0x60,0x18,0x90,0x9f,0x12,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xff,0x90,0x00,0x61,0xe0,0x4f,0x80,0x17,0x90,0x9f,0x12,0xe0,0xff,0x74, -0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x61,0xe0, -0x5f,0xf0,0xd1,0x94,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x8f,0x82,0x75,0x83,0x00,0xed,0xf0,0xd1,0x94,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00, -0x20,0xe0,0x44,0x01,0xfd,0x7f,0x20,0xf1,0x89,0x7f,0xf4,0x7e,0x01,0x12,0x3b,0x3b, -0x90,0x00,0x00,0xe0,0x54,0xdf,0xfd,0xe4,0xff,0xf1,0x89,0x90,0x00,0x28,0xe0,0x44, -0x03,0xfd,0x7f,0x28,0xf1,0x89,0x90,0x00,0x08,0xe0,0x54,0xef,0xfd,0x7f,0x08,0xf1, -0x89,0xe4,0xff,0x12,0x6a,0x44,0x7f,0x64,0x7e,0x00,0x12,0x3b,0x3b,0x90,0x00,0x29, -0xe0,0x44,0xc0,0xfd,0x7f,0x29,0x80,0xa1,0xe4,0x90,0x9e,0x9a,0xf0,0x90,0x00,0x80, -0xe0,0x44,0x80,0xfd,0x7f,0x80,0x80,0x91,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90, -0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6, -0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f, -0x01,0xd0,0xd0,0x92,0xaf,0x22,0xe0,0xff,0x7d,0x01,0xe4,0xfb,0xfa,0xef,0x30,0xe0, -0x02,0x7b,0x80,0xef,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0xed, -0x60,0x0e,0x74,0x0f,0x2b,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0, -0xaf,0x03,0x74,0x08,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09, -0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2b,0xf5, -0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf7,0xf0,0xae,0x02,0xaf,0x03,0x22,0xe0, -0x54,0xef,0xf0,0x90,0xfd,0x63,0xe0,0x54,0x3f,0x25,0xe0,0x25,0xe0,0xff,0x90,0xfd, -0x62,0xe0,0x54,0x03,0x4f,0x90,0x9e,0x5d,0xf0,0x90,0xfd,0x64,0xe0,0x54,0x3f,0x25, -0xe0,0x25,0xe0,0xff,0x90,0xfd,0x63,0xe0,0x54,0x03,0x4f,0x90,0x9e,0x5e,0xf0,0x90, -0x9e,0x5d,0xe0,0xfd,0xa3,0xe0,0xfb,0xe4,0xff,0x90,0x9e,0x62,0xef,0xf0,0xa3,0xed, -0xf0,0xa3,0xeb,0xf0,0x12,0x4f,0xf8,0xef,0x64,0x01,0x60,0x02,0x21,0x6a,0x90,0x9e, -0x99,0x11,0x26,0x90,0x9e,0x62,0xe0,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0xad,0x07,0x74,0x06,0x2d,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x74,0x11,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5, -0x83,0xe0,0x54,0xef,0xf0,0xad,0x07,0x74,0x16,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5, -0x83,0xe0,0x44,0x02,0xf0,0x74,0x16,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0, -0x54,0x03,0xf0,0x90,0x9e,0x63,0xe0,0xfd,0xac,0x07,0x74,0x22,0x2c,0xf5,0x82,0xe4, -0x34,0xfc,0xf5,0x83,0xed,0xf0,0x90,0x9e,0x64,0xe0,0xfd,0x74,0x23,0x2c,0xf5,0x82, -0xe4,0x34,0xfc,0xf5,0x83,0xed,0xf0,0x74,0x24,0x2c,0xf5,0x82,0xe4,0x34,0xfc,0xf5, -0x83,0xe0,0x04,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xc0,0xe0,0xc0,0xf0,0xc0, -0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03, -0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x53,0x91,0xbf,0x90,0xfd,0x68,0xe0,0x20, -0xe0,0x02,0x41,0xfb,0x90,0xfd,0x60,0xe0,0x64,0x0e,0x60,0x02,0x41,0x3f,0x90,0x9e, -0x43,0xe0,0xff,0x13,0x13,0x13,0x54,0x1f,0x20,0xe0,0x02,0x41,0x3f,0x90,0xfd,0x62, -0xe0,0x54,0xc0,0xfe,0x90,0x07,0x90,0xe0,0x54,0x3f,0x4e,0xf0,0x90,0xfd,0x63,0xe0, -0x90,0x07,0x91,0xf0,0x90,0xfd,0x64,0xe0,0x90,0x07,0x92,0xf0,0x90,0xfd,0x65,0xe0, -0x90,0x07,0x93,0xf0,0x90,0x07,0x95,0x74,0x01,0xf0,0xef,0x20,0xe0,0x42,0x90,0x9e, -0x43,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x18,0x90,0x07,0x78,0x11,0x7f,0x90,0x9e, -0x43,0xe0,0xff,0xc3,0x13,0x30,0xe0,0x47,0x90,0x07,0x83,0xe0,0x44,0x40,0xf0,0x80, -0x3e,0x90,0x9e,0x43,0xe0,0xff,0xc3,0x13,0x30,0xe0,0x10,0xe4,0xff,0x71,0x16,0x90, -0x07,0x95,0xe0,0x44,0x01,0xf0,0xa3,0xe0,0x44,0x01,0xf0,0x90,0x07,0x78,0x80,0x13, -0x90,0x9e,0x43,0xe0,0xff,0x13,0x13,0x54,0x3f,0x90,0x07,0x78,0x30,0xe0,0x04,0x11, -0x7f,0x80,0x0c,0xe0,0x44,0x10,0xf0,0xe0,0x44,0x20,0xf0,0xe0,0x54,0xdf,0xf0,0x90, -0xfd,0x60,0xe0,0xb4,0x0f,0x0b,0x90,0xfd,0x62,0xe0,0xff,0xa3,0xe0,0xfd,0x12,0x8f, -0x02,0x90,0xfd,0x60,0xe0,0x64,0x15,0x70,0x64,0x90,0xfd,0x62,0xe0,0x90,0x9e,0x60, -0xf0,0x90,0xfd,0x62,0xe0,0x30,0xe0,0x15,0x90,0x9e,0x60,0xe0,0xf4,0x54,0x3f,0x04, -0xff,0x90,0x9e,0x4e,0xe0,0x13,0x13,0x54,0x3f,0xc3,0x9f,0x80,0x10,0x90,0x9e,0x4e, -0xe0,0x13,0x13,0x54,0x3f,0xff,0x90,0x9e,0x60,0xe0,0x54,0x3f,0x2f,0x90,0x9e,0x5f, -0xf0,0x90,0x9e,0x5f,0xe0,0xff,0x54,0x30,0xc4,0x54,0x0f,0xfe,0xef,0x25,0xe0,0x25, -0xe0,0x4e,0x90,0x9e,0x61,0xf0,0x90,0x00,0x2e,0xf0,0x90,0x9e,0x5f,0xe0,0xc4,0x54, -0xf0,0xff,0x90,0x9e,0x4f,0xe0,0x54,0x0f,0x4f,0x90,0x00,0x2d,0xf0,0x90,0xfd,0x60, -0xe0,0xb4,0x16,0x08,0x90,0xfd,0x62,0xe0,0xff,0x12,0x8f,0x55,0x90,0xfd,0x60,0xe0, -0xb4,0x21,0x08,0x90,0xfd,0x62,0xe0,0xff,0x12,0x8f,0x7d,0x90,0xfd,0x60,0xe0,0xb4, -0x22,0x03,0x12,0x90,0x34,0x90,0xfd,0x60,0xe0,0xb4,0x23,0x08,0x90,0xfd,0x62,0xe0, -0xff,0x12,0x90,0x11,0x90,0xfd,0x68,0xe0,0x44,0x01,0xf0,0xd0,0x07,0xd0,0x06,0xd0, -0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, -0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0x9e,0x43,0xe0,0xc3,0x13,0x30,0xe0,0x16,0xef, -0x7b,0x01,0xb4,0x01,0x06,0x7a,0x9e,0x79,0x4a,0x80,0x04,0x7a,0x9e,0x79,0x46,0x7f, -0x80,0x7e,0x08,0xf1,0x70,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0, -0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0, -0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0x36,0xf0,0x74,0x53,0xa3,0xf0,0x53,0x91,0xdf, -0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0, -0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90, -0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34,0x30,0xe1,0x0b,0x90,0x01,0x3c,0x74,0x02,0xf0, -0x12,0x6c,0xb1,0xf1,0xb7,0xe5,0x34,0x30,0xe2,0x36,0x90,0x01,0x3c,0x74,0x04,0xf0, -0x90,0x06,0x92,0xe0,0x30,0xe0,0x21,0x75,0x48,0x00,0x90,0x9e,0xa6,0xe0,0xf5,0x49, -0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x5b,0x74,0x05,0xf0, -0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x08,0x90,0x9e,0xae,0xe4,0xf0,0x12,0x44,0xe8, -0xe5,0x34,0x30,0xe3,0x36,0x90,0x01,0x3c,0x74,0x08,0xf0,0x90,0x06,0x92,0xe0,0x30, -0xe1,0x21,0x75,0x48,0x00,0x90,0x9e,0xa6,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x5c, -0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02, -0xf0,0x80,0x08,0x90,0x9e,0xad,0xe4,0xf0,0x12,0x44,0xe8,0xe5,0x34,0x30,0xe4,0x06, -0x90,0x01,0x3c,0x74,0x10,0xf0,0xe5,0x34,0x30,0xe5,0x06,0x90,0x01,0x3c,0x74,0x20, -0xf0,0xe5,0x35,0x30,0xe0,0x19,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x01,0x2f,0xe0, -0x44,0x7f,0xf0,0x90,0x00,0x83,0xe0,0xf5,0x69,0x12,0x6b,0x1d,0x12,0x44,0xe8,0xe5, -0x35,0x30,0xe2,0x0c,0x90,0x01,0x3d,0x74,0x04,0xf0,0x53,0x6b,0xfb,0x12,0x44,0xe8, -0xe5,0x36,0x30,0xe0,0x69,0x90,0x01,0x3e,0x74,0x01,0xf0,0x90,0x9e,0xd7,0xe0,0x30, -0xe0,0x12,0xa3,0xe0,0x64,0x03,0x60,0x0c,0x7f,0x01,0xd1,0x0b,0xef,0x60,0x05,0x7f, -0x01,0x12,0x68,0x90,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x43,0xe4,0xff,0xd1,0x0b,0xef, -0x60,0x3c,0xd1,0x2f,0x90,0x9e,0xd2,0xe0,0xff,0x64,0x06,0x60,0x31,0xef,0xb4,0x04, -0x02,0x80,0x07,0x90,0x9e,0xd2,0xe0,0xb4,0x05,0x04,0xe4,0xff,0x80,0x14,0x90,0x9e, -0xd2,0xe0,0xb4,0x03,0x04,0x7f,0x01,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x02,0x05, -0x7f,0x01,0x12,0x62,0xa5,0x7d,0x01,0xaf,0x69,0x12,0x4c,0x84,0xd1,0x83,0xe5,0x36, -0x30,0xe1,0x3b,0x90,0x01,0x3e,0x74,0x02,0xf0,0x90,0x9e,0xd7,0xe0,0x30,0xe0,0x12, -0xa3,0xe0,0x64,0x03,0x60,0x0c,0x7f,0x01,0xd1,0x0b,0xef,0x70,0x05,0x7f,0x02,0x12, -0x68,0x90,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x15,0x12,0x8b,0xdb,0x90,0x9e,0xd2,0xe0, -0x64,0x06,0x60,0x0a,0xe4,0xff,0xd1,0x0b,0xef,0x70,0x03,0x12,0x67,0xbb,0xe5,0x36, -0x30,0xe3,0x09,0x90,0x01,0x3e,0x74,0x08,0xf0,0x43,0x6b,0x04,0xe5,0x36,0x30,0xe4, -0x06,0x90,0x01,0x3e,0x74,0x10,0xf0,0xe5,0x36,0x30,0xe2,0x72,0x90,0x01,0x3e,0x74, -0x04,0xf0,0x90,0x07,0x8f,0xe0,0x30,0xe7,0x12,0x74,0x80,0xf0,0x90,0x07,0x95,0x74, -0x04,0xf0,0xa3,0xe0,0x44,0x04,0xf0,0xe4,0xff,0x71,0x16,0x90,0x07,0x8f,0xe0,0x30, -0xe6,0x12,0x74,0x40,0xf0,0x90,0x07,0x7c,0xe0,0xb4,0x06,0x08,0x90,0x07,0x80,0xe0, -0xff,0x12,0x8f,0x2d,0x90,0x07,0x8f,0xe0,0x30,0xe5,0x13,0x74,0x20,0xf0,0xe4,0xff, -0x71,0x16,0x90,0x07,0x95,0xe0,0x44,0x01,0xf0,0xa3,0xe0,0x44,0x01,0xf0,0x90,0x07, -0x95,0xe0,0x30,0xe2,0x0c,0x74,0x04,0xf0,0xa3,0xe0,0x54,0xfb,0xf0,0x7f,0x01,0x71, -0x16,0x90,0x07,0x95,0xe0,0x30,0xe0,0x06,0x74,0x01,0xf0,0xff,0x71,0x16,0xe5,0x36, -0x30,0xe5,0x06,0x90,0x01,0x3e,0x74,0x20,0xf0,0xe5,0x36,0x30,0xe6,0x08,0x90,0x01, -0x3e,0x74,0x40,0xf0,0xd1,0x19,0xe5,0x36,0x30,0xe7,0x0c,0x90,0x01,0x3e,0x74,0x80, -0xf0,0x53,0x6b,0xfe,0x12,0x44,0xe8,0xe5,0x37,0x30,0xe1,0x09,0x90,0x01,0x3f,0x74, -0x02,0xf0,0x43,0x57,0x80,0xe5,0x37,0x30,0xe4,0x1b,0x90,0x01,0x3f,0x74,0x10,0xf0, -0xd1,0xc8,0x90,0x9e,0xaf,0xe0,0x90,0x05,0x73,0xf0,0x90,0x01,0x36,0x74,0x02,0xf0, -0xfd,0xff,0x12,0x3a,0xc5,0x74,0x36,0x04,0x90,0x01,0xc4,0xf0,0x74,0x53,0xa3,0xf0, -0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00, -0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x6c,0x90,0x05,0x43, -0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0x22,0x12,0x4f,0xf8,0xbf,0x01,0x0f,0x90, -0x9e,0x96,0xe0,0xff,0xe4,0xfd,0x11,0x2a,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90, -0x9e,0xd1,0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x0b,0xa3,0xe0,0x64,0x06, -0x60,0x05,0x7f,0x06,0x12,0x62,0xa5,0x90,0x9e,0xd2,0xe0,0x64,0x06,0x60,0x02,0xd1, -0x52,0x22,0x90,0x9e,0xd6,0xe0,0xb4,0x01,0x05,0xe4,0xf0,0x12,0x5d,0x03,0x22,0xae, -0x07,0xe4,0xff,0xd1,0x0b,0xef,0x60,0x18,0x90,0x9e,0xd1,0xe0,0xc4,0x13,0x13,0x54, -0x03,0x20,0xe0,0x0c,0xaf,0x06,0x7d,0x01,0x12,0x4c,0x84,0xd1,0x83,0x7f,0x01,0x22, -0x7f,0x00,0x22,0x90,0x9e,0xd2,0xe0,0x64,0x06,0x60,0x3c,0xe5,0x68,0x54,0x0f,0x14, -0x60,0x2e,0x14,0x60,0x1e,0x24,0xfe,0x60,0x0e,0x24,0xf8,0x70,0x2a,0xe4,0x90,0x9e, -0xd2,0xf0,0x90,0x05,0x22,0xf0,0x22,0x90,0x9e,0xd2,0x74,0x01,0xf0,0x90,0x05,0x22, -0xe4,0xf0,0x22,0x90,0x9e,0xd2,0x74,0x03,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x22, -0x90,0x01,0xc6,0xe0,0x44,0x08,0xf0,0x22,0xe4,0x90,0x9f,0x16,0xf0,0xe5,0x6a,0x70, -0x02,0xe1,0x6b,0xe5,0x67,0x64,0x01,0x60,0x02,0xe1,0x6b,0xe5,0x6a,0x14,0x60,0x28, -0x24,0xfd,0x60,0x24,0x24,0x02,0x24,0xfb,0x50,0x02,0x80,0x22,0xe4,0x90,0x9e,0xa1, -0xf0,0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x9e,0xa1,0xe0,0x70,0x0a,0x90,0x9e, -0xaf,0xe0,0x90,0x9e,0xa1,0xf0,0x80,0x00,0x90,0x9f,0x16,0x74,0x01,0xf0,0x90,0x9e, -0xd1,0xe0,0x30,0xe0,0x15,0xa3,0xe0,0xb4,0x06,0x05,0xe4,0x90,0x9f,0x16,0xf0,0xe4, -0xff,0xd1,0x0b,0xef,0x70,0x04,0x90,0x9f,0x16,0xf0,0x90,0x9f,0x16,0xe0,0x60,0x3b, -0x43,0x6b,0x10,0xe4,0xf5,0x48,0x90,0x9e,0xab,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f, -0x54,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x68,0x54,0x0f, -0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x4c,0x84,0x90,0x9e,0xd1,0xe0, -0x30,0xe0,0x08,0xd1,0x83,0x90,0x05,0x22,0x74,0xff,0xf0,0x22,0x7f,0x70,0x7e,0x08, -0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xef,0x54,0xfc,0xff,0x90,0x01,0xe8,0xf0,0xee, -0x44,0xf0,0xa3,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0x01,0xec,0xf0,0x90,0x00, -0x02,0x12,0x1f,0x1d,0x90,0x01,0xed,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x01, -0xee,0xf0,0x12,0x1f,0x04,0x90,0x01,0xef,0xf0,0x90,0x01,0xeb,0x74,0x40,0xf0,0x12, -0x5f,0x3e,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e,0x51,0xe0,0xff,0x90,0x9e,0x50,0xe0, -0x5f,0x60,0x24,0x12,0x5d,0x8a,0xef,0x54,0x9f,0xff,0xec,0x90,0x9f,0x01,0x12,0x1f, -0xd7,0x7b,0x01,0x7a,0x9f,0x79,0x01,0xf1,0x6c,0x90,0x00,0x40,0x74,0x24,0xf0,0xe5, -0x6a,0x70,0x04,0x90,0x01,0x57,0xf0,0x22,0x12,0x4f,0xf8,0xbf,0x01,0x0f,0x90,0x02, -0x09,0xe0,0xff,0x7d,0x01,0x11,0x2a,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x75,0x28, -0x33,0xe4,0xf5,0x29,0x75,0x2a,0x07,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3, -0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0x75,0x30,0x1f,0x75, -0x31,0x01,0xe4,0xf5,0x32,0x43,0x32,0x20,0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5, -0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0x90,0x01,0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0x12, -0x4f,0x89,0xe4,0xfd,0x7f,0x51,0x12,0x4f,0x89,0xe4,0xfd,0x7f,0x52,0x12,0x4f,0x89, -0xe4,0xfd,0x7f,0x53,0x02,0x4f,0x89,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0, -0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05, -0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0x67,0xf0,0x74,0x58,0xa3,0xf0,0x90,0x01, -0x34,0xe0,0x55,0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0, -0x55,0x2b,0xf5,0x2f,0xe5,0x2c,0x20,0xe0,0x02,0x41,0x20,0x90,0x01,0x34,0x74,0x01, -0xf0,0x85,0xd1,0x4d,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, -0x85,0xd7,0x53,0x85,0xd9,0x54,0x85,0xd2,0x4e,0x78,0x8d,0x7c,0x9e,0xfd,0x7b,0x00, -0x7a,0x00,0x79,0x4d,0x7e,0x00,0x7f,0x08,0x12,0x1e,0xde,0x90,0x9e,0x8e,0xe0,0xff, -0xc4,0x13,0x54,0x01,0xfe,0xef,0xc4,0x13,0x13,0x54,0x01,0x6e,0x70,0x02,0x21,0xcf, -0x90,0x9e,0x8e,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x02,0x21,0xcf, -0xef,0x54,0x1f,0xf5,0x08,0x90,0x9e,0x8f,0xe0,0x54,0x3f,0xf5,0x09,0x90,0x9e,0x91, -0xe0,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5, -0x83,0xe4,0x8f,0xf0,0x12,0x42,0x54,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03,0x75,0x09, -0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75,0xf0,0x02,0xe5, -0x09,0x12,0x43,0x52,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x9e,0x91,0xe0,0x54,0x1f,0x2f, -0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75, -0xf0,0x02,0xe5,0x09,0x12,0x43,0x52,0xee,0xf0,0xa3,0xef,0xf0,0x90,0x9e,0x8e,0xe0, -0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x28,0x90,0x9e,0x91,0xe0,0x54,0x1f,0xff,0xe5, -0x08,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0x8f,0xf0,0x12, -0x42,0x54,0x90,0x9e,0x90,0xe0,0x30,0xe7,0x36,0xaf,0x08,0x12,0x6d,0xe9,0x80,0x2f, -0x90,0x9e,0x91,0xe0,0x54,0x1f,0xff,0xfd,0xe5,0x08,0x25,0xe0,0x24,0x44,0xf5,0x82, -0xe4,0x34,0x99,0xf5,0x83,0xe4,0x8d,0xf0,0x12,0x42,0x54,0x90,0x9e,0x90,0xe0,0xfe, -0x30,0xe7,0x0c,0x54,0x7f,0xfd,0x8f,0x0d,0xab,0x09,0xaf,0x08,0x12,0x6d,0x86,0xe5, -0x6a,0x14,0x24,0xfd,0x50,0x02,0x80,0x45,0x90,0x9e,0xb0,0xe0,0x60,0x37,0x90,0x01, -0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x91,0xea,0xef,0x64,0x01,0x70,0x2d, -0x90,0x9e,0xa6,0xe0,0xf5,0x48,0x75,0x49,0x00,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01, -0x12,0x39,0xa9,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, -0x9e,0xae,0xf0,0x80,0x08,0x91,0xea,0xbf,0x01,0x03,0x12,0x44,0xe8,0x12,0x47,0x91, -0xe5,0x2c,0x30,0xe1,0x7b,0x90,0x01,0x34,0x74,0x02,0xf0,0x90,0xfd,0x10,0x74,0x7f, -0xf0,0x90,0x04,0x7f,0xe0,0x54,0x07,0xf5,0x55,0x90,0x04,0x7e,0xe0,0x54,0x07,0xf5, -0x56,0x65,0x55,0x60,0x5b,0xe4,0xff,0x75,0xf0,0x08,0xe5,0x55,0xa4,0x2f,0xf5,0x82, -0xe4,0x35,0xf0,0xf5,0x83,0xe5,0x82,0x24,0xc0,0xf5,0x82,0xe5,0x83,0x34,0xfc,0xf5, -0x83,0xe0,0xfe,0x74,0x58,0x2f,0xf8,0xa6,0x06,0x0f,0xbf,0x08,0xda,0x78,0x84,0x7c, -0x9e,0x7d,0x01,0x7b,0x00,0x7a,0x00,0x79,0x58,0x7e,0x00,0x7f,0x08,0x12,0x1e,0xde, -0x90,0x9e,0x84,0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x02,0xb1,0xe3,0xe5, -0x55,0x24,0x01,0xff,0xef,0x54,0x07,0xf5,0x55,0x90,0x04,0x7f,0xf0,0xb5,0x56,0xa5, -0xe5,0x2c,0x30,0xe3,0x10,0x90,0x01,0x34,0x74,0x08,0xf0,0x90,0x9e,0xbc,0xe0,0x30, -0xe0,0x03,0x43,0x57,0x04,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0, -0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5,0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0, -0x54,0xdf,0xf0,0x90,0x01,0x34,0x74,0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x11, -0x37,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0,0x12,0x4e,0x94,0x80,0xfe,0xe5,0x2c,0x30, -0xe6,0x06,0x90,0x01,0x34,0x74,0x40,0xf0,0xe5,0x2e,0x30,0xe0,0x41,0x90,0x9e,0x9c, -0x74,0x01,0xf0,0x90,0x01,0x36,0xf0,0xb1,0x43,0xd1,0x05,0x90,0x9e,0xd7,0xe0,0x30, -0xe0,0x0d,0x13,0x13,0x54,0x3f,0x30,0xe0,0x06,0x90,0x9e,0xd9,0x74,0x01,0xf0,0x90, -0x9e,0xd1,0xe0,0xff,0x30,0xe0,0x0d,0x13,0x13,0x54,0x3f,0x30,0xe0,0x06,0x90,0x9e, -0xd3,0x74,0x01,0xf0,0x12,0x56,0xc8,0xd1,0x36,0x90,0x9e,0x9c,0xe4,0xf0,0xe5,0x2e, -0x30,0xe1,0x5f,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90,0x01,0x02,0xe0, -0x54,0x03,0x64,0x01,0x70,0x29,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a,0x74,0x01,0xf0, -0x90,0x9e,0x8c,0xe4,0xf0,0x80,0x18,0x90,0x9e,0x8c,0xe0,0x04,0xf0,0xe0,0xc3,0x94, -0x0a,0x40,0x0c,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x57,0xe8,0x90, -0x9e,0xd1,0xe0,0x30,0xe0,0x0d,0xe4,0xff,0x12,0x56,0x0b,0xef,0x60,0x05,0x90,0x05, -0x22,0xe4,0xf0,0xd1,0x6c,0x90,0x9e,0xb2,0xe0,0x60,0x07,0x7d,0x02,0x7f,0x02,0x12, -0x3a,0x54,0xe5,0x2e,0x30,0xe2,0x46,0x90,0x01,0x36,0x74,0x04,0xf0,0x90,0x9e,0xd1, -0xe0,0x30,0xe0,0x06,0xa3,0xe0,0x64,0x06,0x60,0x30,0x12,0x6b,0xe1,0x90,0x9e,0xb2, -0xe0,0x60,0x27,0x90,0x9e,0xaf,0xe0,0xff,0x90,0x9e,0xa1,0xe0,0xb5,0x07,0x1b,0x90, -0x9e,0xaf,0xe0,0x90,0x05,0x73,0xf0,0x90,0x01,0x3f,0x74,0x10,0xf0,0xfd,0x7f,0x03, -0x12,0x3a,0xdf,0x7d,0x01,0x7f,0x02,0x12,0x3a,0x54,0x12,0x57,0xb7,0xe5,0x2e,0x30, -0xe3,0x34,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x67,0x64,0x01,0x70,0x28,0xe5,0x6a, -0x60,0x24,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x75,0x48,0x00, -0x90,0x9e,0xa8,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9, -0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4,0x2b,0x90,0x01,0x36,0x74,0x10, -0xf0,0xe5,0x67,0xb4,0x01,0x20,0xe5,0x6a,0x60,0x1c,0x90,0x01,0x57,0xe4,0xf0,0x90, -0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0xb1,0xe4,0xf0,0x53,0x6b,0xfd,0xe5,0x6b,0x54, -0x07,0x70,0x03,0x12,0x44,0xe8,0xe5,0x2e,0x30,0xe5,0x1e,0x90,0x01,0x36,0x74,0x20, -0xf0,0xe5,0x67,0xb4,0x01,0x13,0xe5,0x6a,0x60,0x0f,0x90,0x9e,0xb0,0xe0,0x64,0x02, -0x60,0x05,0x12,0x56,0x19,0x80,0x02,0xd1,0xf4,0xe5,0x2e,0x30,0xe6,0x1b,0x90,0x01, -0x36,0x74,0x40,0xf0,0xe5,0x67,0xb4,0x01,0x10,0xe5,0x6a,0x60,0x0c,0x53,0x6b,0xfe, -0xe5,0x6b,0x54,0x07,0x70,0x03,0x12,0x44,0xe8,0xe5,0x2f,0x30,0xe1,0x26,0x90,0x01, -0x37,0x74,0x02,0xf0,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x17,0xe4,0xff,0x12,0x56,0x0b, -0xef,0x60,0x07,0xb1,0x03,0x12,0x56,0x83,0x80,0x0a,0x90,0x9e,0xd6,0x74,0x01,0xf0, -0x80,0x02,0xb1,0x03,0x74,0x67,0x04,0x90,0x01,0xc4,0xf0,0x74,0x58,0xa3,0xf0,0xd0, -0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, -0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0x04,0x1a,0xe0,0xf4,0x60, -0x03,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x07,0x64,0x07,0x7f,0x01,0x60,0x02, -0x7f,0x00,0x22,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x54,0xe5,0x6a,0x14,0x24,0xfd,0x50, -0x06,0x24,0xfd,0x50,0x1d,0x80,0x2b,0x90,0x9e,0xb0,0xe0,0x60,0x06,0x7d,0x01,0x7f, -0x0c,0x80,0x1c,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50,0x16,0x7d,0x01,0x7f,0x04, -0x80,0x0d,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12, -0x4c,0x84,0x22,0x90,0x9e,0x51,0xe0,0xff,0x90,0x9e,0x50,0xe0,0x5f,0x60,0x3a,0x90, -0x00,0x40,0x74,0x04,0xf0,0xb1,0x8a,0xef,0x44,0x60,0xff,0xec,0x90,0x9e,0x52,0x12, -0x1f,0xd7,0x7f,0x60,0x7e,0x08,0xb1,0x8e,0xef,0x44,0x20,0xff,0xec,0x90,0x9e,0x56, -0x12,0x1f,0xd7,0x7b,0x01,0x7a,0x9e,0x79,0x52,0x12,0x57,0x6c,0x7b,0x01,0x7a,0x9e, -0x79,0x56,0x7f,0x60,0x7e,0x08,0x12,0x57,0x70,0x22,0x7f,0x70,0x7e,0x08,0xd3,0x10, -0xaf,0x01,0xc3,0xc0,0xd0,0xef,0x54,0xfc,0xff,0x90,0x01,0xe8,0xf0,0xee,0xa3,0xf0, -0x90,0x01,0xeb,0x74,0x80,0xf0,0xf1,0x3e,0x90,0x01,0xec,0xe0,0xff,0x90,0x9f,0x05, -0x12,0x43,0x5e,0x90,0x00,0x03,0xef,0x12,0x42,0x32,0x90,0x01,0xed,0xe0,0x90,0x00, -0x02,0x12,0x42,0x32,0x90,0x01,0xee,0xe0,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x01, -0xef,0xe0,0x12,0x42,0x20,0x90,0x9f,0x05,0x12,0x43,0x5e,0x12,0x43,0x26,0xd0,0xd0, -0x92,0xaf,0x22,0x90,0x9e,0x52,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44,0x80, -0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x0b,0x7a,0x9e, -0x79,0x52,0x02,0x48,0xde,0x90,0x9e,0x51,0xe0,0xff,0x90,0x9e,0x50,0xe0,0x5f,0xff, -0xe5,0x6a,0x7e,0x00,0x70,0x02,0x7e,0x01,0xee,0x5f,0x60,0x19,0xe4,0xf5,0x48,0x90, -0x9e,0xab,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9,0x90, -0x01,0x57,0x74,0x05,0xf0,0x22,0x90,0x9e,0xb9,0xe0,0x30,0xe0,0x2e,0xe5,0x67,0xb4, -0x01,0x29,0x90,0x9e,0xb3,0xe0,0x04,0xf0,0xe0,0xb4,0x0a,0x0b,0x90,0x9e,0xbb,0xe0, -0x04,0xf0,0xe4,0x90,0x9e,0xb3,0xf0,0x90,0x9e,0xbb,0xe0,0xff,0x90,0x9e,0xba,0xe0, -0xb5,0x07,0x08,0x12,0x44,0xd1,0xe4,0x90,0x9e,0xbb,0xf0,0x22,0x90,0x9e,0xb4,0xe0, -0x30,0xe0,0x38,0xe5,0x67,0x64,0x01,0x70,0x32,0x90,0x9e,0xb7,0xe0,0x04,0xf0,0xe0, -0xff,0x90,0x9e,0xb5,0xe0,0xb5,0x07,0x23,0x90,0x06,0x92,0xe0,0x54,0x1c,0x70,0x0b, -0x12,0x44,0xd1,0x90,0x9e,0xb8,0xe0,0x04,0xf0,0x80,0x0b,0x90,0x06,0x92,0x74,0x1c, -0xf0,0xe4,0x90,0x9e,0xb8,0xf0,0xe4,0x90,0x9e,0xb7,0xf0,0x22,0x91,0xea,0xef,0x64, -0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x30,0x90,0x9e,0xae,0xe0,0x60, -0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x22,0x90,0x9e,0xad,0xe0,0x60,0x08,0x90, -0x01,0xb9,0x74,0x04,0xf0,0x80,0x14,0xe5,0x69,0x54,0x0f,0xd3,0x94,0x04,0x40,0x08, -0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x08, -0xf0,0x7f,0x00,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4, -0xf5,0x48,0x90,0x9e,0xa6,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x12, -0x39,0xa9,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x9e, -0xad,0x14,0xf0,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x0c,0x50,0x11,0x7d,0x01,0x7f,0x0c, -0x12,0x4c,0x84,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x03,0x12,0x56,0x83,0x22,0xe4,0x90, -0x9f,0x0c,0xf0,0xa3,0xf0,0x90,0x01,0xeb,0xe0,0x54,0xc0,0x60,0x43,0xc3,0x90,0x9f, -0x0d,0xe0,0x94,0x88,0x90,0x9f,0x0c,0xe0,0x94,0x13,0x40,0x0a,0x90,0x01,0xc6,0xe0, -0x44,0x04,0xf0,0x7f,0x00,0x22,0x90,0x9f,0x0c,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54, -0x7f,0x14,0x7e,0x00,0x12,0x3b,0x3b,0xd3,0x90,0x9f,0x0d,0xe0,0x94,0x64,0x90,0x9f, -0x0c,0xe0,0x94,0x00,0x40,0xbf,0x90,0x01,0xc7,0xe0,0x30,0xe2,0xb8,0x7f,0x00,0x22, -0x7f,0x01,0x22,0x91,0xea,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0, -0x80,0x4a,0xe5,0x6b,0x54,0x03,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x3c, -0xe5,0x69,0x54,0x0f,0xd3,0x94,0x02,0x40,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80, -0x2b,0xe5,0x6b,0x30,0xe2,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x1e,0xe5,0x6b, -0x30,0xe4,0x08,0x90,0x01,0xb9,0x74,0x10,0xf0,0x80,0x11,0x90,0x9e,0xa3,0xe0,0x60, -0x08,0x90,0x01,0xb9,0x74,0x20,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74, -0x04,0xf0,0x7f,0x00,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90, -0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0x12,0x4f,0x89,0x7d, -0xff,0x7f,0x55,0x12,0x4f,0x89,0x7d,0xff,0x7f,0x56,0x12,0x4f,0x89,0x7d,0xff,0x7f, -0x57,0x02,0x4f,0x89,0x90,0x00,0xf3,0xe0,0x7f,0x00,0x30,0xe3,0x03,0x7f,0x01,0x22, -0x22,0xe4,0x90,0x9e,0x69,0xf0,0xa3,0xf0,0x90,0x01,0x98,0xe0,0x7f,0x00,0x30,0xe4, -0x02,0x7f,0x01,0xef,0x64,0x01,0x60,0x3e,0xc3,0x90,0x9e,0x6a,0xe0,0x94,0x88,0x90, -0x9e,0x69,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44,0x80,0xf0,0x22,0x90, -0x9e,0x69,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x14,0x7e,0x00,0x12,0x3b,0x3b, -0xd3,0x90,0x9e,0x6a,0xe0,0x94,0x32,0x90,0x9e,0x69,0xe0,0x94,0x00,0x40,0xb9,0x90, -0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x90,0x01,0x94,0xe0,0x44,0x01,0xf0,0x22,0x90, -0x01,0x01,0xe0,0x44,0x04,0xf0,0x90,0x01,0x9c,0x74,0x7e,0xf0,0xa3,0x74,0x92,0xf0, -0xa3,0x74,0xa0,0xf0,0xa3,0x74,0x24,0xf0,0x90,0x01,0x9b,0x74,0x49,0xf0,0x90,0x01, -0x9a,0x74,0xe0,0xf0,0x90,0x01,0x99,0xe4,0xf0,0x90,0x01,0x98,0x04,0xf0,0x22,0xc0, -0xe0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x05,0xc0,0x06,0xc0,0x07, -0x7d,0xbf,0x90,0x01,0xc4,0xed,0xf0,0x74,0x60,0xff,0xa3,0xf0,0x53,0x91,0xef,0x90, -0x00,0x51,0xe0,0xfe,0x90,0x00,0x55,0xe0,0x5e,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x03, -0x74,0x40,0xf0,0xe5,0x3d,0x30,0xe7,0x06,0x90,0x00,0x55,0x74,0x80,0xf0,0x90,0x01, -0xc4,0xed,0xf0,0xa3,0xef,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0xd0,0xd0,0x82, -0xd0,0x83,0xd0,0xe0,0x32,0x8f,0x1f,0x8c,0x20,0x8d,0x21,0x22,0x8f,0x22,0x8c,0x23, -0x8d,0x24,0x22,0xe4,0x90,0x9e,0x69,0xf0,0xa3,0xf0,0x90,0x02,0x86,0xe0,0x20,0xe1, -0x2c,0xc3,0x90,0x9e,0x6a,0xe0,0x94,0xd0,0x90,0x9e,0x69,0xe0,0x94,0x07,0x40,0x0a, -0x90,0x01,0xc6,0xe0,0x44,0x20,0xf0,0x7f,0x00,0x22,0x90,0x9e,0x69,0xe4,0x75,0xf0, -0x01,0x12,0x42,0x54,0x7f,0x0a,0x7e,0x00,0x12,0x3b,0x3b,0x80,0xcd,0x7f,0x01,0x22, -0xe4,0xf5,0x67,0xf5,0x6b,0xf5,0x6a,0x75,0x69,0x0c,0x75,0x68,0x0c,0x90,0x9e,0xb0, -0xf0,0x90,0x9e,0xae,0xf0,0x90,0x9e,0xad,0xf0,0x90,0x9e,0xaf,0x04,0xf0,0x90,0x9e, -0xa1,0xf0,0xe4,0x90,0x9e,0xb1,0xf0,0x90,0x9e,0xa3,0xf0,0x90,0x9e,0xab,0x74,0x07, -0xf0,0xe4,0x90,0x9e,0xa2,0xf0,0x90,0x9e,0xa9,0xf0,0xa3,0x74,0x0b,0xf0,0x90,0x9e, -0xa7,0x74,0x01,0xf0,0xa3,0x74,0x03,0xf0,0x90,0x9e,0xa6,0x74,0x14,0xf0,0x90,0x9e, -0xac,0x74,0x05,0xf0,0xe4,0x90,0x9e,0xa5,0xf0,0x90,0x9e,0xa0,0xf0,0x90,0x9e,0x9c, -0xf0,0x90,0x9e,0xb2,0xf0,0x22,0xe4,0x90,0x9e,0xb1,0xf0,0x90,0x9e,0xa2,0xf0,0xf5, -0x6b,0x22,0xef,0xb4,0x01,0x07,0x7d,0xc8,0x7f,0x02,0x02,0x3a,0x71,0x7d,0x60,0x7f, -0x02,0x12,0x3a,0x54,0x90,0x01,0x3d,0x74,0x04,0xf0,0xa3,0x74,0xc8,0xf0,0x7d,0x04, -0x7f,0x01,0x12,0x3a,0xdf,0x7d,0xc8,0x7f,0x02,0x02,0x3a,0xdf,0xe5,0x57,0x60,0x08, -0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x61,0xe5,0x69,0x54,0x0f,0xd3,0x94,0x01,0x40, -0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x50,0x90,0x02,0x87,0xe0,0x60,0x08,0x90, -0x01,0xb9,0x74,0x04,0xf0,0x80,0x42,0x90,0x9e,0x9b,0xe0,0xb4,0x01,0x10,0x90,0x9e, -0x82,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x1c,0x80,0x2b,0x90,0x9e, -0x9b,0xe0,0x70,0x14,0x90,0x9d,0xa9,0xe0,0xff,0x90,0x9d,0xa8,0xe0,0x6f,0x60,0x08, -0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x11,0x90,0x9e,0xa5,0xe0,0x70,0x08,0x90,0x01, -0xb9,0x74,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x02,0xf0,0x7f, -0x00,0x22,0x90,0x06,0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x0a,0xe5,0x67,0xb4,0x01, -0x05,0xe4,0xff,0x12,0x47,0xd6,0x53,0x68,0xf0,0x43,0x68,0x0c,0x90,0x9e,0xd1,0xe0, -0x30,0xe0,0x07,0x90,0x05,0x27,0xe0,0x54,0x7f,0xf0,0x22,0x7f,0x01,0x51,0x72,0xe4, -0x90,0x9e,0xd2,0xf0,0x22,0x90,0x9e,0xd2,0xe0,0xfe,0x6f,0x70,0x02,0x81,0x59,0xef, -0x12,0x43,0x87,0x62,0xcc,0x00,0x63,0x00,0x01,0x63,0x3e,0x02,0x63,0x77,0x03,0x63, -0xae,0x04,0x63,0xe6,0x05,0x64,0x20,0x06,0x00,0x00,0x64,0x59,0xee,0xb4,0x04,0x04, -0x7f,0x01,0x81,0x8e,0x90,0x9e,0xd2,0xe0,0xff,0xb4,0x05,0x02,0x81,0x63,0xef,0xb4, -0x06,0x06,0x7f,0x01,0x91,0x78,0x80,0x16,0x90,0x9e,0xd2,0xe0,0xb4,0x03,0x06,0x7f, -0x01,0x91,0x5a,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x02,0x02,0x91,0x6d,0x80,0x9b, -0x90,0x9e,0xd2,0xe0,0xb4,0x04,0x06,0x7f,0x01,0x91,0x8e,0x80,0x09,0x90,0x9e,0xd2, -0xe0,0xb4,0x05,0x02,0x91,0x63,0x90,0x9e,0xd2,0xe0,0x70,0x02,0x81,0xa6,0x90,0x9e, -0xd2,0xe0,0xfe,0xb4,0x06,0x04,0x7f,0x01,0x81,0x78,0xee,0xb4,0x03,0x04,0x7f,0x01, -0x81,0x5a,0x90,0x9e,0xd2,0xe0,0x64,0x02,0x60,0x02,0x81,0x59,0x81,0x6d,0x90,0x9e, -0xd2,0xe0,0xb4,0x04,0x06,0x7f,0x01,0x91,0x8e,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4, -0x05,0x02,0x91,0x63,0x90,0x9e,0xd2,0xe0,0x70,0x04,0x91,0xa6,0x80,0x16,0x90,0x9e, -0xd2,0xe0,0xfe,0xb4,0x06,0x06,0x7f,0x01,0x91,0x78,0x80,0x08,0xee,0xb4,0x03,0x04, -0x7f,0x01,0x91,0x5a,0x02,0x8b,0xba,0x90,0x9e,0xd2,0xe0,0xb4,0x04,0x06,0x7f,0x01, -0x91,0x8e,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x05,0x02,0x91,0x63,0x90,0x9e,0xd2, -0xe0,0x70,0x04,0x91,0xa6,0x80,0x14,0x90,0x9e,0xd2,0xe0,0xfe,0xb4,0x06,0x06,0xe4, -0xff,0x91,0x78,0x80,0x06,0xee,0xb4,0x02,0x02,0x91,0x6d,0x02,0x68,0x4a,0x90,0x9e, -0xd2,0xe0,0xfe,0xb4,0x06,0x06,0xe4,0xff,0x91,0x78,0x80,0x13,0xee,0xb4,0x03,0x06, -0x7f,0x01,0x91,0x5a,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x02,0x02,0x91,0x6d,0x90, -0x9e,0xd2,0xe0,0xb4,0x01,0x04,0x51,0x9b,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x05, -0x02,0x91,0x63,0x02,0x6a,0x3b,0x90,0x9e,0xd2,0xe0,0xfe,0xb4,0x06,0x06,0xe4,0xff, -0x91,0x78,0x80,0x13,0xee,0xb4,0x03,0x06,0x7f,0x01,0x91,0x5a,0x80,0x09,0x90,0x9e, -0xd2,0xe0,0xb4,0x02,0x02,0x91,0x6d,0x90,0x9e,0xd2,0xe0,0xb4,0x01,0x04,0x51,0x9b, -0x80,0x0b,0x90,0x9e,0xd2,0xe0,0xb4,0x04,0x04,0x7f,0x01,0x91,0x8e,0x02,0x8b,0xad, -0x90,0x9e,0xd2,0xe0,0xb4,0x04,0x06,0x7f,0x01,0x91,0x8e,0x80,0x09,0x90,0x9e,0xd2, -0xe0,0xb4,0x05,0x02,0x91,0x63,0x90,0x9e,0xd2,0xe0,0x70,0x04,0x91,0xa6,0x80,0x16, -0x90,0x9e,0xd2,0xe0,0xb4,0x03,0x06,0xe4,0xff,0x91,0x5a,0x80,0x09,0x90,0x9e,0xd2, -0xe0,0xb4,0x02,0x02,0x91,0x6d,0x12,0x8b,0xc7,0x22,0xf1,0x85,0x90,0x9e,0xd2,0x74, -0x01,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xd2,0xf0,0x22,0x90,0x05,0x22, -0xe4,0xf0,0x90,0x9e,0xd2,0x04,0xf0,0x22,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0xef, -0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xd2,0x74,0x01,0xf0,0x22,0x90,0x9f, -0x18,0xef,0xf0,0xf1,0x9e,0x90,0x9f,0x18,0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0, -0xe4,0x90,0x9e,0xd2,0xf0,0x22,0x12,0x68,0x03,0x90,0x9e,0xd2,0x74,0x01,0xf0,0x22, -0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x74,0x12,0x43,0x7e,0xe4,0x90,0x9e, -0x77,0xf0,0x12,0x1f,0x04,0xc3,0x13,0x20,0xe0,0x02,0xc1,0x06,0x90,0x9e,0x74,0x12, -0x43,0x5e,0x12,0x1f,0x04,0xff,0x54,0x02,0xfe,0x90,0x9e,0xd7,0xe0,0x54,0xfd,0x4e, -0xfe,0xf0,0xef,0x54,0x01,0xff,0xee,0x54,0xfe,0x4f,0xff,0xf0,0x12,0x1f,0x04,0xfe, -0x54,0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff,0x90,0x9e,0xd7,0xf0,0xee,0x54,0x10,0xfe, -0xef,0x54,0xef,0x4e,0xff,0xf0,0x12,0x1f,0x04,0xfe,0x54,0x20,0xfd,0xef,0x54,0xdf, -0x4d,0xff,0x90,0x9e,0xd7,0xf0,0xee,0x54,0x40,0xfe,0xef,0x54,0xbf,0x4e,0xf0,0x20, -0xe0,0x02,0xa1,0xf5,0xf1,0x5a,0x90,0x9e,0x77,0x74,0x21,0xf0,0x90,0x9e,0x74,0x12, -0x43,0x5e,0x12,0x1f,0x04,0xff,0x13,0x13,0x54,0x01,0xfe,0x90,0x9e,0xd7,0xe0,0xfd, -0x13,0x13,0x54,0x01,0x6e,0x60,0x31,0xef,0x54,0x04,0xff,0xed,0x54,0xfb,0x4f,0xf0, -0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x15,0x90,0x01,0x34,0x74,0x40,0xf0,0xfd,0xe4, -0xff,0x12,0x3a,0xc5,0x90,0x9e,0x77,0xe0,0x44,0x08,0xf0,0x80,0x0b,0xe4,0x90,0x9e, -0xd9,0xf0,0x7d,0x40,0xff,0x12,0x3a,0x54,0x90,0x9e,0xd7,0xe0,0xfd,0x13,0x13,0x13, -0x54,0x1f,0x30,0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x12,0xf0,0xed,0xc4,0x54,0x0f, -0x30,0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x14,0xf0,0x90,0x9e,0xd7,0xe0,0xc4,0x13, -0x54,0x07,0x30,0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x80,0xf0,0x90,0x9e,0xd7,0xe0, -0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x40,0xf0,0x90, -0x9e,0x77,0xe0,0x90,0x05,0x27,0xf0,0x90,0x9e,0xd8,0xe0,0x70,0x05,0x7f,0x01,0x12, -0x68,0x90,0x90,0x9e,0xd7,0xe0,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x04,0x7f,0x03, -0x80,0x0e,0x7f,0x01,0x12,0x56,0x0b,0xef,0x60,0x04,0x7f,0x01,0x80,0x02,0x7f,0x02, -0x12,0x68,0x90,0xe1,0x55,0x90,0x9e,0x77,0x74,0x01,0xf0,0x90,0x05,0x27,0xf0,0xe4, -0xff,0x12,0x68,0x90,0xe1,0x53,0x90,0x9e,0x74,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff, -0x54,0x02,0xfe,0x90,0x9e,0xd1,0xe0,0x54,0xfd,0x4e,0xfe,0xf0,0xef,0x54,0x01,0xff, -0xee,0x54,0xfe,0x4f,0xff,0xf0,0x12,0x1f,0x04,0xfe,0x54,0x08,0xfd,0xef,0x54,0xf7, -0x4d,0xff,0x90,0x9e,0xd1,0xf0,0xee,0x54,0x10,0xfe,0xef,0x54,0xef,0x4e,0xff,0xf0, -0x12,0x1f,0x04,0x54,0x40,0xfe,0xef,0x54,0xbf,0x4e,0x90,0x9e,0xd1,0xf0,0x20,0xe0, -0x02,0xe1,0x26,0xf1,0x5a,0x90,0x9e,0x77,0x74,0x31,0xf0,0x90,0x9e,0x74,0x12,0x43, -0x5e,0x12,0x1f,0x04,0xff,0x13,0x13,0x54,0x01,0xfe,0x90,0x9e,0xd1,0xe0,0xfd,0x13, -0x13,0x54,0x01,0x6e,0x60,0x31,0xef,0x54,0x04,0xff,0xed,0x54,0xfb,0x4f,0xf0,0xe0, -0x13,0x13,0x54,0x3f,0x30,0xe0,0x15,0x90,0x01,0x34,0x74,0x40,0xf0,0xfd,0xe4,0xff, -0x12,0x3a,0xc5,0x90,0x9e,0x77,0xe0,0x44,0x08,0xf0,0x80,0x0b,0xe4,0x90,0x9e,0xd3, -0xf0,0x7d,0x40,0xff,0x12,0x3a,0x54,0x90,0x9e,0xd1,0xe0,0xfd,0x13,0x13,0x13,0x54, -0x1f,0x30,0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x02,0xf0,0xed,0xc4,0x54,0x0f,0x30, -0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x04,0xf0,0x90,0x9e,0x77,0xe0,0x54,0x0e,0x60, -0x0c,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x3a,0xdf,0x90,0x9e,0x77, -0xe0,0x90,0x05,0x27,0xf0,0x90,0x9e,0xd1,0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30, -0xe0,0x0c,0xa3,0xe0,0x64,0x06,0x60,0x5d,0x7f,0x06,0x51,0xa5,0x80,0x57,0x90,0x05, -0x27,0xe0,0x44,0x40,0xf0,0x90,0x9e,0xd2,0xe0,0xb4,0x06,0x15,0x7f,0x01,0x51,0xa5, -0xe4,0xff,0x12,0x56,0x0b,0xef,0x60,0x05,0x12,0x4c,0x80,0x80,0x04,0xf1,0xbb,0x80, -0x34,0x12,0x56,0x83,0x80,0x2f,0x90,0x9e,0x77,0x74,0x01,0xf0,0x90,0x05,0x27,0xf0, -0x7d,0x03,0x7f,0x02,0x12,0x3a,0x71,0x90,0x9e,0xd2,0xe0,0xb4,0x06,0x04,0x7f,0x01, -0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x04,0x04,0xe4,0xff,0x51,0xa5,0x12,0x56,0x52, -0x12,0x44,0xe8,0xf1,0x5a,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e,0xd7,0xe0,0x54,0xfe, -0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90, -0x9e,0xd1,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0xa3,0xf0,0x22,0x90,0x9f,0x15,0xef,0xf0,0xf1,0x9e,0x90,0x9f,0x15,0xe0, -0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x53,0x68,0xf0,0x43,0x68,0x04,0x22,0x90,0x01, -0x01,0xe0,0x44,0x02,0xf0,0x90,0x01,0x00,0x74,0xff,0xf0,0x90,0x00,0x02,0xe0,0x44, -0x01,0xf0,0x12,0x4e,0x94,0x90,0x01,0xba,0xe4,0xf0,0x22,0x90,0x9e,0xa3,0xe0,0x60, -0x16,0x90,0x9e,0xd2,0xe0,0x70,0x04,0x7f,0x05,0x80,0x1f,0x90,0x9e,0xd2,0xe0,0x64, -0x01,0x70,0x19,0x7f,0x02,0x80,0x13,0x90,0x9e,0xd2,0xe0,0xb4,0x01,0x04,0x7f,0x03, -0x80,0x08,0x90,0x9e,0xd2,0xe0,0x70,0x04,0x7f,0x04,0x51,0xa5,0x22,0xf1,0x9e,0x90, -0x05,0x22,0x74,0x6f,0xf0,0x90,0x05,0x27,0xe0,0x54,0xbf,0xf0,0x90,0x9e,0xd8,0x74, -0x03,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x67,0xb4,0x01,0x05,0x7f, -0x01,0x12,0x47,0xd6,0x53,0x68,0xf0,0x43,0x68,0x04,0x90,0x9e,0xd1,0xe0,0x30,0xe0, -0x07,0x90,0x05,0x27,0xe0,0x44,0x80,0xf0,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x31, -0xe2,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x3a, -0xc5,0x11,0x59,0x53,0x68,0xf0,0x43,0x68,0x02,0x22,0x11,0x29,0x90,0x9e,0xd2,0x74, -0x03,0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0x90,0x00,0x02,0xe0,0x54,0xfe,0xf0, -0x12,0x4e,0x94,0x90,0x01,0x00,0x74,0x3f,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0x90,0x05, -0x53,0xe0,0x44,0x20,0xf0,0x90,0x01,0xba,0x74,0xcc,0xf0,0x22,0x31,0xe2,0xef,0x70, -0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x11,0x59,0x90,0x9e,0xd8,0x74,0x02,0xf0,0x22, -0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xd8,0xe0,0x90,0x9f,0x17,0xf0,0x6f, -0x70,0x02,0x21,0x5c,0xef,0x14,0x60,0x3b,0x14,0x60,0x5f,0x14,0x70,0x02,0x21,0x35, -0x24,0x03,0x60,0x02,0x21,0x5c,0x90,0x9f,0x17,0xe0,0xb4,0x03,0x04,0x31,0x7d,0x21, -0x5c,0x90,0x9f,0x17,0xe0,0xb4,0x02,0x04,0x31,0x95,0x21,0x5c,0x90,0x9f,0x17,0xe0, -0xb4,0x04,0x04,0x31,0x99,0x21,0x5c,0x90,0x9f,0x17,0xe0,0x64,0x01,0x70,0x7d,0x31, -0x7f,0x80,0x79,0x90,0x9f,0x17,0xe0,0xff,0xb4,0x03,0x04,0x31,0xcf,0x80,0x6d,0xef, -0xb4,0x02,0x04,0x31,0xb1,0x80,0x65,0x90,0x9f,0x17,0xe0,0xff,0xb4,0x04,0x04,0x31, -0xa6,0x80,0x59,0xef,0x70,0x56,0x31,0x6a,0x80,0x52,0x90,0x9f,0x17,0xe0,0xb4,0x03, -0x04,0x31,0xbf,0x80,0x47,0x90,0x9f,0x17,0xe0,0xb4,0x01,0x04,0x11,0x7c,0x80,0x3c, -0x90,0x9f,0x17,0xe0,0xb4,0x04,0x04,0x31,0x9d,0x80,0x31,0x90,0x9f,0x17,0xe0,0x70, -0x2b,0x31,0x61,0x80,0x27,0x90,0x9f,0x17,0xe0,0xff,0xb4,0x01,0x05,0x12,0x67,0xef, -0x80,0x1a,0xef,0xb4,0x02,0x05,0x12,0x67,0xed,0x80,0x11,0x90,0x9f,0x17,0xe0,0xff, -0xb4,0x04,0x04,0x51,0x29,0x80,0x05,0xef,0x70,0x02,0x31,0x65,0xd0,0xd0,0x92,0xaf, -0x22,0x31,0x6a,0x01,0x7c,0x31,0x6a,0x02,0x67,0xef,0x90,0x01,0x3e,0x74,0x03,0xf0, -0xfd,0x7f,0x02,0x12,0x3a,0xdf,0x90,0x9e,0xd8,0x74,0x01,0xf0,0x22,0x31,0xcf,0x7d, -0x03,0x7f,0x02,0x12,0x3a,0x71,0x90,0x05,0x27,0xe4,0xf0,0xe0,0x54,0xbf,0xf0,0xe4, -0x90,0x9e,0xd8,0xf0,0x22,0x31,0xb1,0x80,0xe6,0x31,0xa6,0x80,0xe2,0x11,0x59,0x90, -0x9e,0xd8,0x74,0x02,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xd8,0x04,0xf0, -0x22,0x12,0x67,0x9e,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xd8,0x04,0xf0,0x22,0x90, -0x05,0x27,0xe0,0x44,0x40,0xf0,0x11,0x53,0x90,0x9e,0xd8,0x74,0x02,0xf0,0x22,0x90, -0x05,0x22,0xe4,0xf0,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0x90,0x9e,0xd8,0x74,0x01, -0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0xe4,0x90,0x9f,0x0e,0xf0,0xa3,0xf0,0x90, -0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70, -0x03,0x7f,0x01,0x22,0xd3,0x90,0x9f,0x0f,0xe0,0x94,0xe8,0x90,0x9f,0x0e,0xe0,0x94, -0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x3b,0x3b,0x90,0x9f,0x0e, -0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x80,0xc6,0x02,0x67,0xef,0x31,0x6a,0x90,0x05, -0x22,0x74,0xff,0xf0,0x90,0x9e,0xd8,0x74,0x04,0xf0,0x22,0x11,0x53,0x90,0x9e,0xd2, -0x74,0x04,0xf0,0x22,0x8f,0x25,0xe4,0x90,0x9f,0x0a,0xf0,0xa3,0xf0,0x90,0x01,0x09, -0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x25,0x60,0x3e,0xc3,0x90,0x9f, -0x0b,0xe0,0x94,0x88,0x90,0x9f,0x0a,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0, -0x44,0x80,0xf0,0x22,0x90,0x9f,0x0a,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x14, -0x7e,0x00,0x12,0x3b,0x3b,0xd3,0x90,0x9f,0x0b,0xe0,0x94,0x32,0x90,0x9f,0x0a,0xe0, -0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x90,0x9e,0x9b,0xe0, -0xb4,0x01,0x04,0x7d,0x91,0x80,0x0c,0x90,0x9e,0x9b,0xe0,0x70,0x04,0x7d,0x90,0x80, -0x02,0xe4,0xfd,0x7f,0x93,0x12,0x4f,0x89,0x90,0x00,0x29,0xe0,0x54,0x3f,0xfd,0x7f, -0x29,0x12,0x4f,0x89,0x90,0x00,0x28,0xe0,0x54,0xfc,0xfd,0x7f,0x28,0x12,0x4f,0x89, -0x90,0x00,0x08,0xe0,0x44,0x10,0xfd,0x7f,0x08,0x12,0x4f,0x89,0x7f,0x01,0x51,0x44, -0x90,0x00,0x00,0xe0,0x44,0x20,0xfd,0xe4,0xff,0x12,0x4f,0x89,0x90,0x00,0x20,0xe0, -0x54,0xfe,0xfd,0x7f,0x20,0x12,0x4f,0x89,0x90,0x00,0x90,0xe0,0x44,0x01,0xfd,0x7f, -0x90,0x12,0x4f,0x89,0x7f,0x14,0x7e,0x00,0x02,0x3b,0x3b,0x53,0x68,0xf0,0x43,0x68, -0x01,0x51,0x9c,0x12,0x4f,0x9e,0x53,0x68,0xf0,0x43,0x68,0x02,0x22,0xe5,0x69,0x30, -0xe6,0x19,0xe5,0x69,0x54,0x0f,0xff,0x90,0x9e,0x9f,0xe0,0xfe,0x4f,0x90,0x01,0x2f, -0xf0,0xee,0x64,0x80,0x90,0x9e,0x9f,0xf0,0x53,0x69,0xbf,0x22,0x8f,0x26,0x12,0x4f, -0xf8,0xef,0x64,0x01,0x70,0x2e,0x90,0x9e,0x98,0x12,0x50,0x26,0xe5,0x26,0x60,0x10, -0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e, -0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04, -0x1f,0x74,0x20,0xf0,0x22,0x90,0x06,0xa9,0xe0,0x90,0x9e,0x52,0xf0,0xe0,0x54,0xc0, -0x70,0x09,0x53,0x6b,0xfe,0x53,0x6b,0xfd,0x02,0x44,0xe8,0x90,0x9e,0x52,0xe0,0x30, -0xe6,0x1e,0x90,0x9e,0xa0,0xe0,0x70,0x08,0x43,0x6b,0x01,0x12,0x56,0x19,0x80,0x13, -0x90,0x9e,0xb0,0xe0,0xb4,0x01,0x0c,0x43,0x6b,0x04,0x7f,0x01,0x71,0x3c,0x80,0x03, -0x53,0x6b,0xfe,0x90,0x9e,0x52,0xe0,0x30,0xe7,0x23,0x43,0x6b,0x02,0xe4,0xf5,0x48, -0x90,0x9e,0xa8,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9, -0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0xb1,0x74,0x01,0xf0,0x22,0x53,0x6b,0xfd, -0x22,0xe5,0x67,0x64,0x01,0x70,0x66,0xe5,0x6a,0x60,0x62,0xe5,0x6a,0x64,0x02,0x60, -0x06,0xe5,0x6a,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x9e,0xa1,0xf0,0x90, -0x06,0xaa,0xe0,0x90,0x9e,0xaf,0xf0,0x90,0x9e,0xa1,0xe0,0x70,0x07,0x90,0x9e,0xaf, -0xe0,0xff,0x80,0x05,0x90,0x9e,0xa1,0xe0,0xff,0x90,0x9e,0xa1,0xef,0xf0,0x90,0x9e, -0xa3,0xe0,0x60,0x03,0xe0,0x14,0xf0,0xe4,0x90,0x9e,0xa2,0xf0,0x90,0x01,0x57,0xf0, -0x90,0x01,0x3c,0x74,0x02,0xf0,0x53,0x6b,0xfd,0x53,0x6b,0xef,0xe5,0x6a,0x14,0x24, -0xfd,0x50,0x06,0x24,0xfd,0x50,0x04,0x80,0x04,0x80,0x03,0x71,0x75,0x22,0x90,0x06, -0xa9,0xe0,0x90,0x9e,0x52,0xf0,0xe0,0x54,0xc0,0x70,0x09,0x53,0x6b,0xfe,0x53,0x6b, -0xfd,0x12,0x44,0xe8,0x90,0x9e,0x52,0xe0,0x30,0xe6,0x15,0x43,0x6b,0x01,0x90,0x9e, -0xb0,0xe0,0x64,0x02,0x60,0x05,0x12,0x56,0x19,0x80,0x08,0x12,0x5e,0xf4,0x80,0x03, -0x53,0x6b,0xfe,0x90,0x9e,0x52,0xe0,0x30,0xe7,0x23,0x43,0x6b,0x02,0xe4,0xf5,0x48, -0x90,0x9e,0xa8,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9, -0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0xb1,0x74,0x01,0xf0,0x22,0x53,0x6b,0xfd, -0x22,0xe5,0x6a,0x60,0x39,0x90,0x9e,0xb1,0xe0,0x60,0x0d,0xe4,0xf0,0x53,0x6b,0xfd, -0xe5,0x6b,0x54,0x07,0x70,0x28,0x80,0x23,0x90,0x9e,0xa2,0xe0,0x04,0xf0,0x53,0x6b, -0xef,0x90,0x9e,0xa7,0xe0,0xff,0x90,0x9e,0xa2,0xe0,0xd3,0x9f,0x40,0x0d,0xe5,0x67, -0xb4,0x01,0x0b,0xa3,0xe0,0x70,0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xe8,0x22,0xd3, -0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xf8,0x12,0x43,0x7e,0x90,0x9e,0xfb,0xe0, -0x54,0xf0,0x44,0x06,0xff,0xf0,0xed,0x54,0x0f,0xc4,0x54,0xf0,0xfe,0xef,0x54,0x0f, -0x4e,0xf0,0x90,0x9e,0xf8,0x12,0x43,0x5e,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7b,0x01, -0x7a,0x9e,0x79,0xfb,0x12,0x48,0xde,0xd0,0xd0,0x92,0xaf,0x22,0xe0,0xfd,0x74,0x26, -0x25,0x13,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xed,0xf0,0xaf,0x13,0xd3,0x10,0xaf, -0x01,0xc3,0xc0,0xd0,0xef,0xc3,0x94,0x20,0x50,0x0e,0x74,0x84,0x2f,0xf5,0x82,0xe4, -0x34,0x04,0xf5,0x83,0xed,0xf0,0x80,0x29,0x74,0xa6,0x2f,0xf5,0x82,0xe4,0x34,0x9c, -0xf5,0x83,0xed,0xf0,0x90,0x9e,0xc4,0xef,0xf0,0x24,0xa6,0xf5,0x82,0xe4,0x34,0x9c, -0xf5,0x83,0xe0,0x90,0x9e,0xc5,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0xc4,0x7d,0x02,0x91, -0xef,0xd0,0xd0,0x92,0xaf,0x22,0x8f,0x0a,0x8d,0x0b,0xe5,0x0b,0x54,0x1f,0xf5,0x10, -0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x0e,0x90,0x04,0xfd, -0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, -0x40,0x04,0xaf,0x0a,0x80,0x33,0xe5,0x0e,0x25,0x0d,0xf5,0x0f,0xe5,0x10,0x90,0x41, -0xdc,0x93,0xff,0xe5,0x0f,0xd3,0x9f,0x74,0x01,0x40,0x11,0x25,0x0a,0xf5,0x82,0xe4, -0x34,0x94,0xf5,0x83,0xe4,0xf0,0xad,0x0b,0xaf,0x0a,0xa1,0x3d,0x25,0x0a,0xf5,0x82, -0xe4,0x34,0x94,0xf5,0x83,0xe5,0x0f,0xf0,0x22,0xad,0x07,0x75,0xf0,0x09,0xed,0x90, -0x96,0x48,0x12,0x43,0x52,0xe0,0xff,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5, -0x83,0xe0,0x54,0x1f,0xf5,0x12,0xd3,0x9f,0x40,0x02,0x8f,0x12,0xe5,0x12,0x25,0xe0, -0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff, -0xe5,0x12,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, -0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2, -0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x05,0xad,0x12, -0xb1,0x3d,0xaf,0x12,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef,0x30,0xe0,0x17,0xed, -0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5, -0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34, -0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82,0xe4,0x34,0x04,0xf5, -0x83,0xe0,0x4d,0xf0,0x22,0xad,0x07,0xed,0xc3,0x94,0x20,0x50,0x0d,0x74,0x84,0x2d, -0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x80,0x0b,0x74,0xa6,0x2d,0xf5,0x82,0xe4, -0x34,0x9c,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1e,0xe5,0x1e,0x54,0x1f,0xfc,0x75,0xf0, -0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x52,0xe0,0xff,0x90,0x9e,0x73,0xf0,0xed,0x25, -0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e, -0x74,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b, -0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x76,0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25, -0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01,0x93, -0xfb,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xea,0xf0,0xa3, -0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xe1,0xb3,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34, -0x9d,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x9e,0x73,0xe0,0xff,0xeb,0xd3,0x9f,0x40, -0x02,0xe1,0xe4,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01,0x7e, -0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e, -0x74,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50,0x40, -0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, -0xff,0x90,0x9e,0x76,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x23,0xbb,0x11,0x09, -0x90,0x9e,0x75,0xe0,0x30,0xe7,0x02,0x7b,0x17,0xeb,0x64,0x13,0x60,0x03,0xbb,0x12, -0x09,0x90,0x9e,0x74,0xe0,0x30,0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1e,0x80,0x34, -0x0b,0x80,0x84,0x90,0x9e,0x73,0xe0,0xfb,0x6c,0x70,0x69,0x74,0x67,0x2d,0xf5,0x82, -0xe4,0x34,0x9d,0xf5,0x83,0xec,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4a,0x12,0x43, -0x52,0xe0,0xb4,0x01,0x0c,0xe5,0x1e,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1e,0x80, -0x03,0xaf,0x1e,0x22,0xec,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, -0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34, -0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, -0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3, -0xef,0xf0,0x80,0x5b,0xec,0xd3,0x9b,0x40,0x56,0x90,0x9e,0x73,0xe0,0xff,0x74,0x67, -0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1e,0xec,0x25, -0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, -0xff,0xec,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, -0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2, -0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1e,0x22,0x74, -0x01,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1e,0x44, -0x80,0xfd,0x12,0x6d,0x3d,0xe5,0x1e,0x44,0x80,0xff,0x22,0xac,0x07,0xec,0xc3,0x94, -0x20,0x50,0x0d,0x74,0x84,0x2c,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x80,0x0b, -0x74,0xa6,0x2c,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1e,0xe5, -0x1e,0x54,0x1f,0xff,0x90,0x9e,0x75,0xf0,0x75,0xf0,0x09,0xec,0x90,0x96,0x49,0x12, -0x43,0x52,0xe0,0x90,0x9e,0x77,0xf0,0x75,0xf0,0x09,0xec,0x90,0x96,0x48,0x12,0x43, -0x52,0xe0,0xfe,0x90,0x9e,0x78,0xf0,0xec,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34, -0x9b,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x79,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, -0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, -0x9e,0x7b,0xcb,0xf0,0xa3,0xeb,0xf0,0xef,0xd3,0x9e,0x40,0x0a,0x90,0x9e,0x78,0xe0, -0x90,0x9e,0x75,0xf0,0xf5,0x1e,0xed,0x70,0x02,0x21,0xf1,0x90,0x9e,0x76,0xed,0xf0, -0xe5,0x1e,0x30,0xe6,0x0a,0x90,0x9e,0x75,0xe0,0xf5,0x1e,0xa3,0xe0,0x14,0xf0,0x90, -0x9e,0x76,0xe0,0x70,0x02,0x21,0xf1,0x90,0x9e,0x75,0xe0,0xff,0xd3,0x94,0x00,0x50, -0x02,0x21,0xf1,0xe4,0x90,0x9e,0x74,0xf0,0xef,0x14,0x90,0x9e,0x73,0xf0,0x90,0x9e, -0x77,0xe0,0xfd,0x90,0x9e,0x73,0xe0,0xff,0xd3,0x9d,0x40,0x6b,0xef,0x94,0x10,0x40, -0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33, -0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x7b,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e, -0x70,0x27,0x90,0x9e,0x73,0xe0,0xff,0xc3,0x94,0x10,0x50,0x33,0x74,0x01,0x7e,0x00, -0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x79, -0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x16,0x90,0x9e,0x73,0xe0,0xf5,0x1e,0xa3, -0xe0,0x04,0xf0,0x90,0x9e,0x76,0xe0,0xff,0x90,0x9e,0x74,0xe0,0x6f,0x60,0x08,0x90, -0x9e,0x73,0xe0,0x14,0xf0,0x80,0x87,0x90,0x9e,0x76,0xe0,0xff,0x90,0x9e,0x74,0xe0, -0xc3,0x9f,0x50,0x0d,0x90,0x9e,0x73,0xe0,0xb5,0x05,0x06,0x90,0x9e,0x77,0xe0,0xf5, -0x1e,0xe5,0x1e,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93, -0xfe,0x74,0x01,0x93,0xff,0xe5,0x1e,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41, -0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff, -0xec,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef, -0xf0,0xaf,0x04,0xad,0x1e,0x12,0x6d,0x3d,0xaf,0x1e,0x22,0xe4,0xf5,0x13,0xe5,0x13, -0xb4,0x20,0x14,0x90,0x9a,0xc5,0xe0,0x04,0xf0,0x90,0x95,0x01,0xe0,0xff,0x90,0x9a, -0xc5,0xe0,0xb5,0x07,0x02,0xe4,0xf0,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x4b,0x12, -0x43,0x52,0xe0,0x64,0x01,0x60,0x03,0x02,0x78,0x83,0xe5,0x13,0x25,0xe0,0x24,0x80, -0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3,0x94,0x00,0xee,0x94, -0x00,0x50,0x03,0x02,0x78,0x83,0xe5,0x13,0x94,0x20,0x40,0x09,0x90,0x9a,0xc5,0xe0, -0x60,0x03,0x02,0x78,0x8f,0xe5,0x13,0x75,0xf0,0x0a,0xa4,0x24,0x00,0xf9,0x74,0x90, -0x35,0xf0,0x75,0x18,0x01,0xf5,0x19,0x89,0x1a,0xe5,0x13,0x25,0xe0,0x24,0x80,0xf5, -0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x9e,0x6d,0xcf,0xf0,0xa3, -0xef,0xf0,0xe5,0x13,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0, -0xff,0xa3,0xe0,0x90,0x9e,0x6f,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x13,0xc3,0x94,0x20, -0x50,0x14,0x74,0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f, -0x90,0x9e,0x69,0xf0,0x80,0x12,0x74,0xa6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5, -0x83,0xe0,0x54,0x3f,0x90,0x9e,0x69,0xf0,0x90,0x9e,0x69,0xe0,0xfe,0x54,0x1f,0xa3, -0xf0,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x48,0x12,0x43,0x52,0xe0,0x90,0x9e,0x72, -0xf0,0x74,0xe6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xc3,0x94,0x05, -0x40,0x02,0xa1,0x5c,0x90,0x9e,0x72,0xe0,0xff,0x90,0x9e,0x6a,0xe0,0x9f,0x40,0x13, -0x90,0x9e,0x72,0xe0,0x90,0x9e,0x6a,0xf0,0xee,0x54,0x40,0xfe,0x90,0x9e,0x69,0xf0, -0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x54,0x05,0x64,0x01,0x70,0x29,0x90,0x9e,0x6a, -0xe0,0xff,0x90,0x41,0x50,0x93,0xfe,0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a, -0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xe0,0x80,0x30,0x90,0x9e,0x6a, -0xe0,0x90,0x40,0xfc,0x80,0x27,0x90,0x9e,0x6a,0xe0,0xff,0x90,0x41,0x50,0x93,0xfe, -0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06, -0xef,0x90,0x41,0x18,0x80,0x07,0x90,0x9e,0x6a,0xe0,0x90,0x41,0x34,0x93,0x90,0x9e, -0x71,0xf0,0x90,0x9e,0x71,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x56,0xf9,0x74,0x40,0x35, -0xf0,0x75,0x15,0xff,0xf5,0x16,0x89,0x17,0x90,0x9e,0x69,0xe0,0x90,0x41,0xf8,0x93, -0xff,0xd3,0x90,0x9e,0x70,0xe0,0x9f,0x90,0x9e,0x6f,0xe0,0x94,0x00,0x40,0x09,0xe4, -0xfd,0xaf,0x13,0x11,0x9b,0x02,0x78,0x1a,0xe5,0x13,0x25,0xe0,0x24,0xc2,0xf5,0x82, -0xe4,0x34,0x95,0xf5,0x83,0xe0,0xf5,0x1b,0xa3,0xe0,0xf5,0x1c,0xab,0x15,0xaa,0x16, -0xa9,0x17,0x12,0x1f,0x04,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,0x42, -0x6a,0xfd,0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5, -0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0x7e,0x00, -0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x02,0x12,0x42,0x95,0xfd,0xac,0xf0,0x12, -0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16, -0xa9,0x17,0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9, -0x1a,0x90,0x00,0x04,0x12,0x42,0x95,0xfd,0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c, -0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x03, -0x12,0x1f,0x1d,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x06,0x12, -0x42,0x95,0xfd,0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b, -0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0x7e, -0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x08,0x12,0x42,0x95,0xfd,0xac,0xf0, -0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa, -0x16,0xa9,0x17,0x90,0x00,0x05,0x12,0x1f,0x1d,0xff,0x7e,0x00,0x90,0x9e,0x6d,0xe0, -0xfc,0xa3,0xe0,0xfd,0x12,0x1f,0x4a,0xd3,0xe5,0x1c,0x9f,0xe5,0x1b,0x9e,0x40,0x0c, -0xe5,0x1c,0x9f,0xf5,0x1c,0xe5,0x1b,0x9e,0xf5,0x1b,0x80,0x05,0xe4,0xf5,0x1b,0xf5, -0x1c,0xe5,0x13,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe5,0x1b, -0xf0,0xa3,0xe5,0x1c,0xf0,0x90,0x9e,0x69,0xe0,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4, -0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,0x95,0x1b,0x50,0x07, -0xaf,0x13,0x12,0x6e,0x95,0xe1,0xee,0x90,0x9e,0x69,0xe0,0x25,0xe0,0x24,0xa4,0xf5, -0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,0x95,0x1b, -0x50,0x02,0xe1,0xee,0x7d,0x01,0xaf,0x13,0x11,0x9b,0xe1,0xee,0x74,0xe6,0x25,0x13, -0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02,0xc1,0xf7,0x90, -0x96,0x43,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x9e,0x6a,0xe0,0xc3,0x94,0x19,0x40,0x3d, -0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x9e,0x6a,0xe0,0xc3,0x94,0x11,0x40,0x2e,0x80, -0x1f,0x90,0x96,0x43,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x9e,0x6a,0xe0,0xc3,0x94,0x0a, -0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x9e,0x6a,0xe0,0xc3,0x94,0x03,0x40,0x0d, -0x90,0x9a,0x84,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x9a,0x84,0xf0,0x74,0x84,0x25, -0x13,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1d,0x74,0x44,0x25,0x13,0xf5, -0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02,0xc1,0xa4,0x90, -0x9a,0x84,0xe0,0x64,0x01,0x60,0x02,0xc1,0xa4,0x74,0x85,0x25,0x13,0xf5,0x82,0xe4, -0x34,0x9a,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff,0xe4,0x33,0xfe, -0x74,0x41,0x25,0x13,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xfd,0xd3,0x9f,0xee, -0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4,0x33,0xfe,0x74, -0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xd3,0x9f,0xee,0x64,0x80, -0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x26,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9d,0xf5, -0x83,0xe0,0xff,0x90,0x9e,0x6a,0xe0,0x6f,0x60,0x3d,0x74,0x44,0x25,0x13,0xf5,0x82, -0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75,0x1d,0x05,0x80, -0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1d,0x03,0x80,0x03,0x75,0x1d,0x01,0x74, -0x41,0x25,0x13,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xef,0xf0,0x74,0x85,0x25,0x13, -0xf5,0x82,0xe4,0x34,0x9a,0x80,0x29,0x74,0xe6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c, -0xf5,0x83,0xe4,0xf0,0x74,0x85,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0, -0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1d,0x74,0xe6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c, -0xf5,0x83,0xe4,0xf0,0x90,0x9e,0x6a,0xe0,0xff,0x74,0x26,0x25,0x13,0xf5,0x82,0xe4, -0x34,0x9d,0xf5,0x83,0xef,0xf0,0x74,0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x98,0xf5, -0x83,0xe5,0x1d,0xf0,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x4c,0x12,0x43,0x52,0xe0, -0xb4,0x01,0x10,0xe4,0xf5,0x1d,0x74,0xe6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5, -0x83,0xe4,0xf0,0xad,0x1d,0xe1,0xe9,0xec,0x64,0x06,0x60,0x02,0xe1,0xee,0xf5,0x1b, -0xf5,0x1c,0x90,0x42,0x19,0x93,0xff,0x7e,0x00,0x90,0x9e,0x6d,0xe0,0xfc,0xa3,0xe0, -0xfd,0x12,0x1f,0x4a,0x90,0x9e,0x6b,0xee,0xf0,0xa3,0xef,0xf0,0x74,0x84,0x25,0x13, -0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1d,0xe4,0xf5,0x14,0xab,0x18,0xaa, -0x19,0xa9,0x1a,0x75,0xf0,0x02,0xe5,0x14,0xa4,0xf5,0x82,0x85,0xf0,0x83,0x12,0x42, -0x95,0xfd,0xac,0xf0,0xe5,0x14,0x90,0x42,0x14,0x93,0xff,0x7e,0x00,0x12,0x1f,0x4a, -0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xc3,0x90,0x9e,0x6c,0xe0,0x95, -0x1c,0x90,0x9e,0x6b,0xe0,0x95,0x1b,0x40,0x07,0x05,0x14,0xe5,0x14,0xb4,0x05,0xbd, -0xe5,0x14,0xc3,0x13,0xf5,0x14,0xe5,0x1d,0xb4,0x01,0x06,0xe5,0x14,0x70,0x46,0x80, -0x13,0xe5,0x1d,0xb4,0x03,0x15,0xe5,0x14,0x70,0x05,0x75,0x1d,0x03,0x80,0x39,0xe5, -0x14,0xb4,0x01,0x05,0x75,0x1d,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1d,0xb4,0x05,0x28, -0xe5,0x14,0x70,0x05,0x75,0x1d,0x05,0x80,0x0d,0xe5,0x14,0xb4,0x01,0x05,0x75,0x1d, -0x03,0x80,0x03,0x75,0x1d,0x01,0xd3,0x90,0x9e,0x70,0xe0,0x94,0x03,0x90,0x9e,0x6f, -0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1d,0xd3,0x90,0x9e,0x70,0xe0,0x94,0x03,0x90, -0x9e,0x6f,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1d,0x74,0x84,0x25,0x13,0xf5,0x82, -0xe4,0x34,0x98,0xf5,0x83,0xe5,0x1d,0xf0,0xfd,0xaf,0x13,0x12,0x6e,0x55,0x74,0xe6, -0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74,0xe6,0x50, -0x0e,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x04,0xf0,0x80,0x0b,0x25, -0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0xab,0x18,0xaa,0x19,0xa9,0x1a, -0xe4,0xf5,0xf0,0x12,0x42,0xcd,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x02,0xe4, -0xf5,0xf0,0x12,0x42,0xec,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x42,0xec,0x90,0x00, -0x06,0xe4,0xf5,0xf0,0x12,0x42,0xec,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12,0x42,0xec, -0xe5,0x13,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xe5,0x13,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0, -0xa3,0xf0,0xe5,0x13,0x25,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4, -0xf0,0xa3,0xf0,0x05,0x13,0xe5,0x13,0xc3,0x94,0x40,0x50,0x03,0x02,0x72,0x3e,0x22, -0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0,0xa3,0xe4, -0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0,0x0d,0xbd, -0x10,0xf0,0xe4,0x90,0x9a,0xc5,0xf0,0x90,0x95,0x01,0x04,0xf0,0xe4,0xfd,0x75,0xf0, -0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed, -0x90,0x90,0x02,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90, -0x04,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12, -0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x52, -0xe4,0xf0,0xa3,0xf0,0x74,0x26,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0x74,0x13, -0xf0,0x74,0x85,0x2d,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,0x74,0x84,0x2d, -0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xed,0x25,0xe0,0x24,0x80,0xf5,0x82, -0xe4,0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0xc4,0xf5,0x82, -0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0xc4,0xf5,0x82, -0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0x44,0xf5,0x82, -0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82, -0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0x46,0xf5,0x82, -0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x86,0x2d,0xf5,0x82,0xe4,0x34, -0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x46,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4, -0xf0,0x74,0xe6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xca, -0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x92,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93, -0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4b,0x12, -0x43,0x52,0x74,0x01,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4a,0x12,0x43,0x52,0x74, -0x01,0xf0,0x74,0x82,0x2d,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0c,0xf0,0x75, -0xf0,0x09,0xed,0x90,0x96,0x46,0x12,0x43,0x52,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0, -0x09,0xed,0x90,0x96,0x44,0x12,0x43,0x52,0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0, -0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x52,0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90, -0x96,0x49,0x12,0x43,0x52,0xe4,0xf0,0xed,0xc3,0x94,0x20,0x50,0x0f,0x74,0x84,0x2d, -0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x80,0x0d,0x74,0xa6,0x2d,0xf5, -0x82,0xe4,0x34,0x9c,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x40,0x60,0x02,0x01, -0xbe,0x22,0x8f,0x13,0xef,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xaf,0x82, -0xf5,0x15,0x8f,0x16,0xe5,0x13,0x75,0xf0,0x02,0xa4,0x24,0x02,0xf9,0x74,0x95,0x35, -0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x46, -0x12,0x43,0x52,0xaf,0x82,0x85,0x83,0x1a,0x8f,0x1b,0xe5,0x13,0x75,0xf0,0x09,0xa4, -0x24,0x44,0xf9,0x74,0x96,0x35,0xf0,0x75,0x1c,0x01,0xf5,0x1d,0x89,0x1e,0x74,0x82, -0x25,0x13,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x12,0x43,0x87,0x7a,0xe2,0x00, -0x7a,0xf7,0x01,0x7b,0x0c,0x02,0x7b,0x21,0x03,0x7b,0x4a,0x04,0x7b,0x5f,0x05,0x7b, -0x74,0x06,0x7b,0x9a,0x0c,0x7b,0xc7,0x0d,0x7b,0xf4,0x0e,0x7c,0x21,0x0f,0x00,0x00, -0x7c,0x55,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74, -0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4, -0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x13,0x25,0xe0, -0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, -0x12,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0, -0xf0,0xa3,0xe4,0xf0,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5, -0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x81,0x55,0xe5,0x13,0x25,0xe0,0x24,0xc6, -0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27,0xe5, -0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0x0f,0xf0,0xa3, -0x74,0xf0,0x80,0x12,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5, -0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x81,0x55,0x90,0x04,0x47,0xe0,0xab,0x17, -0xaa,0x18,0xa9,0x19,0x12,0x42,0x20,0x90,0x04,0x46,0xe0,0xab,0x17,0xaa,0x18,0xa9, -0x19,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x04,0x45,0xe0,0x85,0x16,0x82,0x85,0x15, -0x83,0xf0,0x90,0x04,0x44,0x81,0x4c,0x90,0x04,0x4b,0xe0,0xab,0x17,0xaa,0x18,0xa9, -0x19,0x12,0x42,0x20,0x90,0x04,0x4a,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, -0x01,0x12,0x42,0x32,0x90,0x04,0x49,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xf0,0x90, -0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x12,0x42, -0x20,0x90,0x04,0x4e,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x01,0x12,0x42, -0x32,0x90,0x04,0x4d,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xf0,0x90,0x04,0x4c,0x80, -0x2b,0x90,0x04,0x53,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x12,0x42,0x20,0x90,0x04, -0x52,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x04, -0x51,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xf0,0x90,0x04,0x50,0xe0,0x85,0x16,0x82, -0x85,0x15,0x83,0xa3,0xf0,0xab,0x17,0xaa,0x18,0xa9,0x19,0xc0,0x03,0xc0,0x02,0xc0, -0x01,0x12,0x1f,0x04,0xff,0xab,0x1c,0xaa,0x1d,0xa9,0x1e,0x12,0x1f,0x04,0x5f,0xd0, -0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x20,0xab,0x17,0xe5,0x19,0x24,0x01,0xf9,0xe4, -0x35,0x18,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x1f,0x04,0xff,0xab,0x1c,0xaa, -0x1d,0xa9,0x1e,0x90,0x00,0x01,0x12,0x1f,0x1d,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03, -0x12,0x42,0x20,0x85,0x16,0x82,0x85,0x15,0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85, -0x1b,0x82,0x85,0x1a,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0x85,0x16, -0x82,0x85,0x15,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1b,0x82,0x85,0x1a, -0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x13,0x25,0xe0,0x24, -0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0x75, -0x14,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce, -0xd8,0xf9,0xff,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x14,0x24,0x10,0x80,0x5d,0x15, -0x14,0xe5,0x14,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x13,0x25,0xe0,0x24,0xc6, -0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3d,0x75,0x14, -0x0f,0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, -0xf9,0xff,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0, -0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x9e,0x80,0xe5,0x14,0xf0,0x80,0x10, -0x15,0x14,0xe5,0x14,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90,0x9e,0x80,0xf0, -0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfe,0xa3, -0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x14,0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05, -0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82, -0xe4,0x34,0x9b,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x9e, -0x81,0xe5,0x14,0xf0,0x80,0x5b,0x05,0x14,0xe5,0x14,0xb4,0x10,0xca,0x80,0x52,0xe5, -0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0, -0x4e,0x60,0x39,0xe4,0xf5,0x14,0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05,0xc3, -0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x14,0x24, -0x10,0x80,0x0a,0x05,0x14,0xe5,0x14,0xb4,0x0c,0xcc,0x80,0x05,0xe4,0x90,0x9e,0x81, -0xf0,0x90,0x9e,0x80,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x48,0x12,0x43, -0x52,0xef,0xf0,0x90,0x9e,0x81,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x49, -0x12,0x43,0x52,0xee,0xf0,0x74,0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, -0xe0,0xd3,0x9f,0x40,0x06,0x90,0x9e,0x80,0x12,0x6d,0x2c,0x74,0x84,0x25,0x13,0xf5, -0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x9e,0x81,0xe0,0xfe,0xef,0xc3,0x9e, -0x50,0x03,0x12,0x6d,0x2c,0x90,0x9e,0x80,0xe0,0xff,0xd3,0x94,0x13,0x40,0x07,0x90, -0x96,0x43,0x74,0x03,0xf0,0x22,0xef,0xd3,0x94,0x0b,0x40,0x07,0x90,0x96,0x43,0x74, -0x02,0xf0,0x22,0xef,0xd3,0x94,0x03,0x40,0x07,0x90,0x96,0x43,0x74,0x01,0xf0,0x22, -0xe4,0x90,0x96,0x43,0xf0,0x22,0x90,0x9e,0x74,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0x12, -0x43,0x7e,0x90,0x9e,0x76,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x1f,0x1d,0x54,0xf0, -0xc4,0x54,0x0f,0x90,0x9e,0x79,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x54,0x40,0xc4, -0x13,0x13,0x54,0x03,0x90,0x9e,0x7a,0xf0,0x90,0x9e,0x74,0xe0,0xff,0x75,0xf0,0x09, -0x90,0x96,0x46,0x12,0x43,0x52,0xad,0x82,0xac,0x83,0x90,0x9e,0x7b,0xec,0xf0,0xa3, -0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,0x35,0xf0,0xfa,0x7b, -0x01,0xa3,0x12,0x43,0x7e,0x90,0x9e,0x76,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x1f, -0x1d,0x54,0x0f,0xff,0x90,0x9e,0x7d,0x12,0x43,0x5e,0xef,0x12,0x42,0x20,0x90,0x9e, -0x76,0x12,0x43,0x5e,0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x90,0x9e,0x7d,0x12,0x43, -0x5e,0x90,0x00,0x01,0xef,0x12,0x42,0x32,0x90,0x9e,0x76,0x12,0x43,0x5e,0x90,0x00, -0x01,0x12,0x1f,0x1d,0xff,0x90,0x9e,0x7b,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5,0x82,0x8c, -0x83,0xef,0xf0,0x12,0x1f,0x04,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x9e,0x79,0xe0, -0xfe,0x90,0x9e,0x74,0xe0,0xff,0x24,0x82,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee, -0xf0,0x90,0x9e,0x75,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4a,0x12,0x43,0x52, -0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x96,0x4b,0x12,0x43,0x52,0x74,0x01,0xf0,0x90, -0x9e,0x7a,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4c,0x12,0x43,0x52,0xee,0xf0, -0x41,0x62,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0x54,0x1f,0xfe,0xef,0x54,0x20,0xc4, -0x13,0x54,0x07,0xfd,0xaf,0x06,0xc1,0xa6,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0x54, -0x3f,0xfe,0xef,0x54,0x80,0xc4,0x13,0x13,0x13,0x54,0x01,0xfd,0xaf,0x06,0xc1,0xa6, -0x12,0x1f,0x04,0xf5,0x13,0xc3,0x94,0x40,0x50,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d, -0xff,0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xef,0xf0,0x22,0xe5, -0x13,0xb4,0x40,0x0a,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x96,0x42,0xf0,0x22,0x12, -0x1f,0x04,0x90,0x95,0x01,0xf0,0x22,0x90,0x9e,0x71,0x12,0x43,0x7e,0xef,0x12,0x43, -0x87,0x80,0x93,0x01,0x80,0x9b,0x02,0x80,0xbb,0x03,0x80,0xc4,0x05,0x80,0xcd,0x06, -0x81,0xf7,0x07,0x80,0xd6,0x08,0x80,0xdf,0x10,0x80,0xe8,0x11,0x80,0xf0,0x12,0x80, -0xf8,0x13,0x81,0x00,0x14,0x81,0x09,0x15,0x81,0x12,0x16,0x81,0x1c,0x17,0x81,0x26, -0x18,0x81,0x30,0x19,0x81,0xc6,0x1a,0x81,0xce,0x1b,0x81,0xd7,0x1c,0x81,0x39,0x1d, -0x81,0x43,0x1e,0x81,0x4e,0x21,0x81,0x56,0x22,0x81,0x5e,0x23,0x81,0x66,0x24,0x81, -0x6e,0x25,0x81,0x76,0x26,0x81,0x7e,0x27,0x81,0x86,0x28,0x81,0x8e,0x29,0x80,0xa3, -0x2d,0x80,0xab,0x2e,0x81,0x96,0x2f,0x81,0xe0,0x30,0x81,0xe8,0x31,0x81,0xa6,0x32, -0x81,0x9e,0x33,0x80,0xb3,0x34,0x81,0xae,0x36,0x81,0xb6,0x37,0x81,0xbe,0x38,0x00, -0x00,0x81,0xf0,0x90,0x9e,0x71,0x12,0x43,0x5e,0xc1,0xe1,0x90,0x9e,0x71,0x12,0x43, -0x5e,0x81,0x7c,0x90,0x9e,0x71,0x12,0x43,0x5e,0xe1,0xe9,0x90,0x9e,0x71,0x12,0x43, -0x5e,0xe1,0x35,0x90,0x9e,0x71,0x12,0x43,0x5e,0x81,0xae,0x90,0x9e,0x71,0x12,0x43, -0x5e,0x02,0x88,0x31,0x90,0x9e,0x71,0x12,0x43,0x5e,0x02,0x7f,0xd0,0x90,0x9e,0x71, -0x12,0x43,0x5e,0x02,0x7f,0xa2,0x90,0x9e,0x71,0x12,0x43,0x5e,0x02,0x64,0xb0,0x90, -0x9e,0x71,0x12,0x43,0x5e,0x02,0x88,0x79,0x90,0x9e,0x71,0x12,0x43,0x5e,0xa1,0x08, -0x90,0x9e,0x71,0x12,0x43,0x5e,0x81,0xc9,0x90,0x9e,0x71,0x12,0x43,0x5e,0x81,0x94, -0x90,0x9e,0x71,0x12,0x43,0x5e,0x02,0x88,0xc0,0x90,0x9e,0x71,0x12,0x43,0x5e,0x02, -0x89,0x98,0x90,0x9e,0x71,0x12,0x43,0x5e,0x7f,0x01,0x80,0x2f,0x90,0x9e,0x71,0x12, -0x43,0x5e,0x7f,0x02,0x80,0x25,0x90,0x9e,0x71,0x12,0x43,0x5e,0x7f,0x03,0x80,0x1b, -0x90,0x9e,0x71,0x12,0x43,0x5e,0x02,0x8b,0x1d,0x90,0x9e,0x71,0x12,0x43,0x5e,0xe4, -0xff,0x80,0x08,0x90,0x9e,0x71,0x12,0x43,0x5e,0x7f,0x04,0x02,0x8a,0x3b,0x90,0x9e, -0x71,0x12,0x43,0x5e,0xa1,0x2f,0x90,0x9e,0x71,0x12,0x43,0x5e,0xa1,0x56,0x90,0x9e, -0x71,0x12,0x43,0x5e,0xa1,0x7d,0x90,0x9e,0x71,0x12,0x43,0x5e,0xa1,0xa4,0x90,0x9e, -0x71,0x12,0x43,0x5e,0xa1,0xcb,0x90,0x9e,0x71,0x12,0x43,0x5e,0xa1,0xf2,0x90,0x9e, -0x71,0x12,0x43,0x5e,0xe1,0x63,0x90,0x9e,0x71,0x12,0x43,0x5e,0xc1,0x19,0x90,0x9e, -0x71,0x12,0x43,0x5e,0xc1,0x67,0x90,0x9e,0x71,0x12,0x43,0x5e,0xe1,0x9a,0x90,0x9e, -0x71,0x12,0x43,0x5e,0xc1,0x8f,0x90,0x9e,0x71,0x12,0x43,0x5e,0xc1,0xb8,0x90,0x9e, -0x71,0x12,0x43,0x5e,0x80,0x42,0x90,0x9e,0x71,0x12,0x43,0x5e,0x81,0x82,0x90,0x9e, -0x71,0x12,0x43,0x5e,0xc1,0x40,0x90,0x9e,0x71,0x12,0x43,0x5e,0x61,0x77,0x90,0x9e, -0x71,0x12,0x43,0x5e,0x02,0x7f,0xff,0x90,0x9e,0x71,0x12,0x43,0x5e,0x02,0x7f,0xb8, -0x90,0x9e,0x71,0x12,0x43,0x5e,0x81,0xe8,0x90,0x9e,0x71,0x12,0x43,0x5e,0xe1,0x0b, -0x90,0x01,0xc6,0xe0,0x44,0x01,0xf0,0x22,0x12,0x1f,0x04,0x60,0x44,0x90,0xfd,0x58, -0xe0,0x20,0xe0,0x3d,0x90,0xfd,0x50,0x74,0x0a,0xf0,0xa3,0x74,0x06,0xf0,0x90,0x00, -0x01,0x12,0x1f,0x1d,0x90,0xfd,0x52,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0xfd, -0x53,0xf0,0xa3,0xe4,0xf0,0xa3,0x74,0xc0,0xf0,0xa3,0x74,0x10,0xf0,0xa3,0x74,0x80, -0xf0,0x90,0xfd,0x50,0x74,0x0a,0xf0,0xa3,0x74,0x06,0xf0,0x90,0xfd,0x58,0x74,0x01, -0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfe,0x90,0x00,0x01,0x12,0x1f,0x1d,0x7c,0x00, -0x24,0x00,0xff,0xec,0x3e,0xfe,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0xfc,0x74, -0x20,0x2f,0xff,0xe4,0x3e,0xfe,0x90,0x9e,0x74,0xef,0xf0,0xee,0xf9,0x90,0x02,0x09, -0xe0,0xc3,0x13,0x90,0xfd,0x10,0xf0,0xec,0xc3,0x99,0x50,0x43,0xec,0x70,0x04,0x7d, -0x04,0x80,0x02,0xe4,0xfd,0xed,0xc3,0x94,0x20,0x50,0x07,0xaf,0x05,0x51,0xcb,0x0d, -0x80,0xf3,0x0c,0x90,0xfd,0x10,0xe0,0x04,0xf0,0xec,0xb5,0x01,0xda,0xe4,0xfd,0xed, -0x75,0xf0,0x08,0xa4,0xff,0x90,0x9e,0x74,0xe0,0xfb,0xc3,0xef,0x9b,0x74,0x80,0xf8, -0x65,0xf0,0x98,0x50,0x07,0xaf,0x05,0x51,0xcb,0x0d,0x80,0xe3,0x0c,0x80,0xb8,0x90, -0x00,0x81,0xe0,0x44,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0x90,0xfd,0x58,0xe0,0x30, -0xe0,0x08,0x90,0x01,0xb8,0xe0,0x04,0xf0,0x80,0xf1,0xef,0x75,0xf0,0x08,0xa4,0x24, -0x00,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x50,0xf0,0xef,0x75,0xf0, -0x08,0xa4,0x24,0x01,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x51,0xf0, -0xef,0x75,0xf0,0x08,0xa4,0x24,0x02,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90, -0xfd,0x52,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x03,0xf5,0x82,0xe4,0x34,0xfc,0xf5, -0x83,0xe0,0x90,0xfd,0x53,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x04,0xf5,0x82,0xe4, -0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x54,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x05, -0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x55,0xf0,0xef,0x75,0xf0,0x08, -0xa4,0x24,0x06,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x56,0xf0,0xef, -0x75,0xf0,0x08,0xa4,0x24,0x07,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd, -0x57,0xf0,0xa3,0x74,0x01,0xf0,0x22,0x90,0x9e,0x74,0x12,0x43,0x7e,0x12,0x1f,0x04, -0x20,0xe0,0x1d,0x7d,0x08,0xe4,0xff,0x12,0x3a,0x54,0x90,0x06,0x90,0xe4,0xf0,0x12, -0x8d,0xfb,0x90,0x01,0x3f,0x74,0x04,0xf0,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x22, -0x90,0x9e,0x74,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x54,0x01,0xfe,0x90,0x9e,0xbc, -0xe0,0x54,0xfe,0x4e,0xf0,0xef,0x54,0x04,0xff,0xe0,0x54,0xfb,0x4f,0xf0,0x12,0x1f, -0x04,0xff,0x54,0x02,0xfe,0x90,0x9e,0xbc,0xe0,0x54,0xfd,0x4e,0xf0,0xef,0x54,0x08, -0xff,0xe0,0x54,0xf7,0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54,0x10,0xfe,0x90,0x9e,0xbc, -0xe0,0x54,0xef,0x4e,0xf0,0xef,0x54,0x20,0xff,0xe0,0x54,0xdf,0x4f,0xf0,0x12,0x1f, -0x04,0xff,0x54,0x40,0xfe,0x90,0x9e,0xbc,0xe0,0x54,0xbf,0x4e,0xf0,0xef,0x54,0x80, -0xff,0xe0,0x54,0x7f,0x4f,0xf0,0x90,0x00,0x81,0xe4,0xf0,0x90,0x9e,0xbf,0xe0,0x54, -0xfe,0xf0,0x90,0x06,0x09,0xe0,0x54,0xfe,0xf0,0x12,0x1f,0x04,0xc3,0x13,0x30,0xe0, -0x07,0x90,0x06,0x90,0xe0,0x44,0x02,0xf0,0x90,0x9e,0x74,0x12,0x43,0x5e,0x12,0x1f, -0x04,0xff,0x13,0x13,0x54,0x3f,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x04,0xf0, -0xef,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x08,0xf0, -0x90,0x9e,0x9b,0xe0,0xb4,0x02,0x14,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e,0xbd, -0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x9e,0xbe,0xf0,0x90,0x02,0x86,0xe0,0x44, -0x04,0xf0,0x43,0x57,0x04,0x7d,0x08,0xe4,0xff,0x02,0x3a,0xc5,0x12,0x1f,0x04,0xf5, -0x67,0x22,0x12,0x1f,0x04,0x90,0xfe,0x10,0x60,0x05,0xe0,0x44,0x01,0xf0,0x22,0xe0, -0x54,0xfe,0xf0,0x22,0x12,0x1f,0x04,0x30,0xe0,0x0e,0x90,0x07,0x78,0xe0,0x54,0xfd, -0xf0,0x90,0x9e,0x50,0x74,0x01,0xf0,0x22,0xe4,0x90,0x9e,0x50,0xf0,0x22,0x12,0x1f, -0x04,0x30,0xe0,0x07,0x54,0x01,0x90,0x9e,0xb2,0xf0,0x22,0x7d,0x10,0x7f,0x03,0x12, -0x3a,0x71,0x7d,0x01,0x7f,0x02,0x02,0x3a,0xc5,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x17, -0x90,0xfd,0x50,0x74,0x0d,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52, -0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x22,0x12,0x1f,0x04,0xff,0x54,0x01,0xfe,0x90, -0x9e,0xb9,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x0a,0x90,0x00,0x01, -0x12,0x1f,0x1d,0x90,0x9e,0xba,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90, -0xfd,0x50,0x74,0x0c,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0, -0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0xfd,0x58,0x04,0xf0,0x22,0x90, -0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x17,0xf0,0xa3,0x74,0x01,0xf0, -0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50, -0x74,0x18,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4, -0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58, -0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x19,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f, -0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1a, -0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3, -0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20, -0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1b,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90, -0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04, -0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1c,0xf0,0xa3, -0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3, -0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f, -0x90,0xfd,0x50,0x74,0x1e,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52, -0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22, -0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x23,0xf0,0xa3,0x74,0x01, -0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, -0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x12,0x1f,0x04,0xff,0xe4,0xfc,0xfd,0xfe,0x78, -0x18,0x12,0x1f,0xc4,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x9e,0x4a,0x12, -0x43,0x46,0xec,0x54,0x03,0xfc,0x12,0x43,0x19,0x90,0x9e,0x46,0x02,0x1f,0xd7,0x90, -0xfd,0x58,0xe0,0x20,0xe0,0x21,0x90,0xfd,0x50,0x74,0x1f,0xf0,0xa3,0x74,0x01,0xf0, -0x12,0x1f,0x04,0x54,0x01,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x21,0x90, -0xfd,0x50,0x74,0x20,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x54,0x01,0x90,0xfd, -0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0, -0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e, -0xb0,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0x9e,0xa0,0xf0,0x12,0x1f,0x04,0x65, -0x6a,0x60,0x03,0x12,0x4d,0xa5,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x1f,0x04,0xff,0x54, -0x01,0xfe,0x90,0x9e,0xb4,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x14, -0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e,0xb5,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, -0x90,0x9e,0xb6,0xf0,0x22,0x12,0x1f,0x04,0x30,0xe0,0x18,0xc3,0x13,0x54,0x7f,0x90, -0x9e,0xab,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0x90,0x9e,0xa9,0xe4,0xf0,0xa3, -0xef,0xf0,0x22,0x90,0x9e,0xab,0x74,0x07,0xf0,0x90,0x9e,0xa9,0xe4,0xf0,0xa3,0x74, -0x0b,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x2f,0x90,0xfd,0x50,0x74,0x1d,0xf0, -0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0x90,0x00,0x01,0x12,0x1f, -0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0xfd,0x54,0xf0,0xa3, -0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0, -0x3b,0x12,0x1f,0x04,0x90,0xfd,0x50,0xf0,0xa3,0x74,0x04,0xf0,0x90,0x00,0x01,0x12, -0x1f,0x1d,0x90,0xfd,0x52,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0, -0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0xfd,0x54,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d, -0x90,0xfd,0x55,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0xe4,0x90,0x9d, -0xa8,0xf0,0xa3,0xf0,0x90,0x01,0xaf,0xf0,0x22,0x90,0x00,0x02,0x12,0x1f,0x1d,0xff, -0x30,0xe0,0x25,0x12,0x1f,0x04,0x90,0x9e,0xa7,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d, -0x90,0x9e,0xa8,0xf0,0xef,0xc3,0x13,0x54,0x7f,0x90,0x9e,0xa6,0xf0,0x90,0x00,0x03, -0x12,0x1f,0x1d,0x90,0x9e,0xac,0xf0,0x22,0x90,0x9e,0xa7,0x74,0x01,0xf0,0x90,0x9e, -0xa8,0x74,0x03,0xf0,0x90,0x9e,0xa6,0x74,0x14,0xf0,0x90,0x9e,0xac,0x74,0x05,0xf0, -0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x1f,0x04,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x9e, -0x95,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0xed,0x2f,0x90,0x9e,0x96,0xf0,0x90, -0x00,0x02,0x12,0x1f,0x1d,0xff,0xed,0x2f,0x90,0x9e,0x97,0xf0,0x90,0x00,0x03,0x12, -0x1f,0x1d,0xff,0xed,0x2f,0x90,0x9e,0x98,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff, -0xae,0x05,0xed,0x2f,0x90,0x9e,0x99,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x3f, -0x90,0xfd,0x50,0x74,0x0b,0xf0,0xa3,0x74,0x05,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52, -0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f, -0x1d,0x90,0xfd,0x54,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0xfd,0x55,0xf0,0x90, -0x00,0x04,0x12,0x1f,0x1d,0x90,0xfd,0x56,0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x22, -0x90,0x07,0x78,0xe0,0x44,0x0c,0xf0,0x12,0x1f,0x04,0xff,0x30,0xe0,0x75,0x90,0xfd, -0x58,0xe0,0x20,0xe0,0x10,0x90,0xfd,0x50,0x74,0x14,0xf0,0xa3,0x74,0x01,0xf0,0xa3, -0xf0,0x90,0xfd,0x58,0xf0,0x90,0x9e,0x43,0xe0,0x44,0x08,0xf0,0xef,0x30,0xe1,0x0d, -0xe0,0x44,0x01,0xf0,0x90,0x07,0x78,0xe0,0x54,0xfd,0xf0,0x80,0x07,0x90,0x07,0x78, -0xe0,0x44,0x02,0xf0,0x12,0x1f,0x04,0xff,0x30,0xe2,0x1e,0x90,0x9e,0x43,0xe0,0x44, -0x04,0xf0,0x90,0x04,0x26,0xe0,0x44,0x40,0xf0,0x90,0x07,0x78,0xe0,0x54,0xef,0xf0, -0x90,0x07,0x83,0xe0,0x44,0x40,0xf0,0x80,0x07,0x90,0x07,0x78,0xe0,0x44,0x10,0xf0, -0xef,0x30,0xe4,0x63,0x90,0x9e,0x43,0xe0,0x44,0x02,0xf0,0x90,0x04,0x26,0xe0,0x44, -0x80,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x12,0x90,0xfd,0x50,0x74,0x14,0xf0, -0xa3,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0x90,0xfd,0x58,0x04,0xf0,0x90,0x9e,0x43,0xe0, -0x54,0xfe,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xf7,0xf0,0x90, -0x07,0x78,0xe0,0x54,0xe3,0xf0,0x90,0x07,0x83,0xe0,0x54,0x3f,0xf0,0x90,0x04,0x26, -0xe0,0x54,0x3f,0xf0,0x90,0x9e,0x4a,0x12,0x43,0x46,0x90,0x81,0x57,0x12,0x1f,0xd7, -0x7f,0x80,0x7e,0x08,0x12,0x34,0x55,0x22,0x12,0x1f,0x04,0xff,0x30,0xe0,0x4b,0x90, -0x07,0x78,0xe0,0x44,0x02,0xf0,0x90,0x07,0x83,0xe0,0x44,0x02,0xf0,0x90,0x07,0x78, -0xe0,0x44,0x80,0x54,0xbf,0xf0,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1a,0x90,0xfd,0x50, -0x74,0x1a,0xf0,0xa3,0x74,0x01,0xf0,0xa3,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0xef,0x30,0xe1,0x5f,0x90,0x9e,0x43,0xe0,0x44, -0x02,0xf0,0x90,0x07,0x95,0xe0,0x44,0x06,0xf0,0x22,0x90,0x9e,0x43,0xe0,0x54,0xfd, -0xf0,0x90,0x07,0x78,0xe0,0x54,0x3f,0xf0,0x90,0x07,0x83,0xe0,0x54,0xfd,0xf0,0x90, -0x07,0x95,0xe0,0x54,0xf9,0xf0,0x90,0x9e,0x4a,0x12,0x43,0x46,0x90,0x81,0x57,0x12, -0x1f,0xd7,0x7f,0x80,0x7e,0x08,0x12,0x34,0x55,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1a, -0x90,0xfd,0x50,0x74,0x1a,0xf0,0xa3,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3, -0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0xef,0x70,0x21,0x12,0x1f, -0x04,0x30,0xe0,0x14,0x90,0x00,0x40,0xe0,0x44,0x20,0xf0,0xe0,0x54,0x3f,0xf0,0x90, -0x07,0x78,0xe0,0x44,0x01,0xf0,0x80,0x07,0x90,0x07,0x78,0xe0,0x54,0xfe,0xf0,0xef, -0x64,0x01,0x70,0x6a,0x12,0x1f,0x04,0x90,0x00,0x01,0x30,0xe0,0x2e,0x12,0x1f,0x1d, -0x90,0x06,0xc0,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x06,0xc1,0xf0,0x90,0x00, -0x03,0x12,0x1f,0x1d,0x90,0x06,0xc2,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x90,0x06, -0xc3,0xf0,0x90,0x06,0xcc,0xe0,0x54,0xfe,0xf0,0x80,0x2c,0x12,0x1f,0x1d,0x90,0x06, -0xc4,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x06,0xc5,0xf0,0x90,0x00,0x03,0x12, -0x1f,0x1d,0x90,0x06,0xc6,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x90,0x06,0xc7,0xf0, -0x90,0x06,0xcc,0xe0,0x44,0x01,0xf0,0x90,0x06,0xcc,0xe0,0x44,0x02,0xf0,0xef,0xb4, -0x02,0x11,0x12,0x1f,0x04,0x90,0x06,0xc8,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90, -0x06,0xc9,0xf0,0xef,0xb4,0x03,0x11,0x12,0x1f,0x04,0x90,0x06,0xca,0xf0,0x90,0x00, -0x01,0x12,0x1f,0x1d,0x90,0x06,0xcb,0xf0,0xef,0x64,0x04,0x70,0x1f,0x12,0x1f,0x04, -0xff,0x90,0x07,0x83,0x30,0xe0,0x06,0xe0,0x44,0x10,0xf0,0x80,0x04,0xe0,0x54,0x6f, -0xf0,0xef,0x30,0xe1,0x07,0x90,0x07,0x83,0xe0,0x44,0x80,0xf0,0x22,0x90,0x9e,0x74, -0x12,0x43,0x7e,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x37,0x90,0xfd,0x50,0x74,0x11,0xf0, -0xa3,0x74,0x03,0xf0,0x90,0x9e,0x74,0x12,0x43,0x5e,0x12,0x1f,0x04,0x90,0xfd,0x52, -0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f, -0x1d,0x90,0xfd,0x54,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x80, -0x16,0x43,0x57,0x01,0x78,0xaa,0x7c,0x9d,0x7d,0x01,0x90,0x9e,0x74,0x12,0x43,0x5e, -0x7e,0x00,0x7f,0x03,0x12,0x1e,0xde,0x90,0x9e,0x74,0x12,0x43,0x5e,0x12,0x1f,0x04, -0x60,0x07,0x90,0x9e,0x51,0x74,0x01,0xf0,0x22,0xe4,0x90,0x9e,0x51,0xf0,0x22,0x90, -0x05,0x22,0x74,0xff,0xf0,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0x90,0x9e,0xd8,0x74, -0x04,0xf0,0x22,0x12,0x67,0x9e,0x90,0x9e,0xd8,0x74,0x04,0xf0,0x22,0x90,0x05,0x22, -0x74,0xff,0xf0,0x90,0x9e,0xd2,0x74,0x05,0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0, -0x90,0x9e,0xd2,0x74,0x02,0xf0,0x22,0x90,0x05,0x27,0xe0,0x54,0xbf,0xf0,0x90,0x05, -0x22,0x74,0x6f,0xf0,0x90,0x9e,0xd2,0x74,0x06,0xf0,0x22,0x90,0x01,0x57,0xe0,0x60, -0x3c,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0xb1,0xe0, -0x60,0x07,0xe4,0xf0,0x53,0x6b,0xfd,0x80,0x24,0x90,0x9e,0xa2,0xe0,0x04,0xf0,0x53, -0x6b,0xef,0x90,0x9e,0xa7,0xe0,0xff,0x90,0x9e,0xa2,0xe0,0xd3,0x9f,0x40,0x0e,0xe5, -0x67,0xb4,0x01,0x09,0x90,0x9e,0xa3,0xe0,0x70,0x03,0xe0,0x04,0xf0,0x90,0x01,0x5b, -0xe0,0x60,0x10,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0xe4,0x90, -0x9e,0xae,0xf0,0x90,0x01,0x5f,0xe0,0x60,0x10,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01, -0x3c,0x74,0x08,0xf0,0xe4,0x90,0x9e,0xad,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, -0xd0,0x90,0x9f,0x19,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, -0x12,0x4e,0x94,0x90,0x9f,0x19,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, -0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, -0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, -0x80,0x4c,0x90,0x9f,0x19,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, -0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x62,0xe0,0x5f,0xf0,0x12,0x4e, -0x94,0x90,0x9f,0x19,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3, -0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x60,0xe0,0xfb,0xe4,0xfe,0xef,0x5b, -0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0, -0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9f,0x11,0xed,0xf0,0x90, -0x9f,0x10,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x9f,0x10, -0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90, -0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x9f,0x10,0xe0,0xff,0x74,0x01,0xa8,0x07, -0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12,0x4e, -0x94,0x90,0x9f,0x10,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, -0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x67,0x90,0x9f,0x10,0xe0,0x24,0xf8,0xf0,0xa3, -0xe0,0x70,0x1a,0x90,0x9f,0x10,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, -0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x63,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x9f,0x10, -0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, -0x63,0xe0,0x4f,0xf0,0x12,0x4e,0x94,0x90,0x9f,0x10,0xe0,0xff,0x74,0x01,0xa8,0x07, -0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4e,0x8c,0x90,0x9f,0x10,0xe0,0xff,0x74, -0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x62,0xe0, -0x5f,0xf0,0x12,0x4e,0x94,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e,0xb4,0xe0,0x54,0xfe, -0xf0,0xe4,0x90,0x9e,0xb7,0xf0,0xa3,0xf0,0x90,0x9e,0xb5,0x74,0x03,0xf0,0xa3,0xf0, -0x22,0xe4,0x90,0x9e,0xbb,0xf0,0x90,0x9e,0xb9,0xe0,0x54,0x7f,0xf0,0xa3,0x74,0x0a, -0xf0,0x22,0x90,0x9e,0xb9,0xe0,0x54,0xfe,0xf0,0x80,0xe6,0x90,0x9e,0xbc,0xe0,0x54, -0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xf7,0xf0,0xe0,0x54, -0xef,0xf0,0xe0,0x54,0xdf,0xf0,0xe0,0x54,0xbf,0xf0,0xe0,0x54,0x7f,0xf0,0xe4,0xa3, -0xf0,0xa3,0xf0,0xa3,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x90,0x01,0x17,0xe0, -0xfe,0x90,0x01,0x16,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x9e,0xc0,0xf0, -0xa3,0xef,0xf0,0x90,0x01,0x04,0xe0,0x54,0x0f,0x90,0x9e,0x77,0xf0,0xe0,0xff,0x74, -0x40,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x90, -0x9e,0xc3,0xf0,0xee,0x90,0x9e,0xc2,0xf0,0x22,0x75,0xe8,0x07,0x90,0xfd,0x68,0x74, -0x02,0xf0,0x90,0x9e,0x43,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0x54,0xfd,0xf0,0x54, -0xf7,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0x12,0x1f,0xe3,0x00,0x00,0x00,0x00,0x7f, -0x80,0x7e,0x08,0x12,0x2c,0x87,0x90,0x9e,0x4a,0x12,0x1f,0xd7,0x90,0x00,0x2e,0xe0, -0x90,0x9e,0x4e,0xf0,0x90,0x00,0x2d,0xe0,0x90,0x9e,0x4f,0xf0,0xe4,0xa3,0xf0,0xa3, -0xf0,0x90,0x04,0x26,0xe0,0x44,0x10,0xf0,0x90,0x07,0x83,0xe4,0xf0,0x90,0x07,0x78, -0x74,0x03,0xf0,0x7d,0x04,0x7f,0x02,0x02,0x3a,0xdf,0x90,0xfd,0x58,0xe0,0x20,0xe0, -0x2d,0x90,0xfd,0x50,0x74,0x11,0xf0,0xa3,0x74,0x04,0xf0,0x90,0x9d,0xaa,0xe0,0x90, -0xfd,0x52,0xf0,0x90,0x9d,0xab,0xe0,0x90,0xfd,0x53,0xf0,0x90,0x9d,0xac,0xe0,0x90, -0xfd,0x54,0xf0,0xa3,0x74,0x28,0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x22,0x43,0x57, -0x01,0x22,0xae,0x07,0x90,0x9e,0x62,0xe0,0x54,0xf0,0x44,0x04,0xf0,0x54,0x0f,0x44, -0x20,0xf0,0x90,0x9e,0x64,0xee,0xf0,0xa3,0xed,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x64, -0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x62,0x02,0x48,0xde,0xad,0x07,0x90, -0x9e,0x5a,0xe0,0x54,0xf0,0x44,0x05,0xf0,0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e,0x5c, -0xef,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x5c,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e, -0x79,0x5a,0x02,0x48,0xde,0xad,0x07,0x90,0x9e,0x62,0xe0,0x54,0xf0,0x44,0x07,0xf0, -0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e,0x64,0xef,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x64, -0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x62,0x02,0x48,0xde,0xad,0x07,0x90, -0x9e,0x62,0xe0,0x54,0xf0,0x44,0x09,0xf0,0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e,0x64, -0xef,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x64,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e, -0x79,0x62,0x02,0x48,0xde,0x90,0x9e,0xdd,0xe0,0x54,0xf0,0x44,0x0a,0xf0,0x90,0xfd, -0x60,0xe0,0x90,0x9e,0xdf,0xf0,0x90,0xfd,0x62,0xe0,0x90,0x9e,0xe0,0xf0,0x90,0xfd, -0x63,0xe0,0x90,0x9e,0xe1,0xf0,0x90,0xfd,0x64,0xe0,0x90,0x9e,0xe2,0xf0,0x90,0xfd, -0x65,0xe0,0x90,0x9e,0xe3,0xf0,0x90,0xfd,0x60,0xe0,0x90,0x9e,0xdd,0x30,0xe6,0x08, -0xe0,0x54,0x0f,0x44,0x50,0xf0,0x80,0x16,0xe0,0x54,0x0f,0x44,0x70,0xf0,0x90,0xfd, -0x66,0xe0,0x90,0x9e,0xe4,0xf0,0x90,0xfd,0x67,0xe0,0x90,0x9e,0xe5,0xf0,0x7b,0x01, -0x7a,0x9e,0x79,0xdf,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e,0x79,0xdd,0x02,0x48, -0xde,0x90,0x9e,0x62,0xef,0xf0,0xa3,0xe0,0x54,0xf0,0x44,0x0c,0xf0,0x54,0x0f,0x44, -0x10,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x62,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e, -0x09,0x02,0x48,0xde,0x90,0x00,0x75,0xe0,0x44,0x01,0xf0,0x7f,0x01,0x7e,0x00,0x12, -0x3a,0xaa,0x90,0xfe,0x13,0x74,0x03,0xf0,0x7f,0x02,0x7e,0x00,0x12,0x3a,0xaa,0x90, -0xfe,0x13,0xe4,0xf0,0x90,0x00,0x75,0xe0,0x54,0xfe,0xf0,0x22,0x1b,0x4f,}; - - - //WiFi for BT MP New FW 0326 -const u8 Rtl8723SFwUMCBCutMPImgArray[Rtl8723SUMCBCutMPImgArrayLength] = { -0x02, 0x23, 0x02, 0x00, 0x21, 0x00, 0x00, 0x00, 0x03, 0x27, 0x23, 0x01, 0x4E, 0x5E, 0x01, 0x00, -0x73, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4A, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x61, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x67, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0x81, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x6B, 0xB7, 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, -0x00, 0x04, 0x06, 0x05, 0x04, 0x02, 0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, -0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, -0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, 0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, -0x00, 0x18, 0x22, 0x21, 0x20, 0x18, 0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, -0x20, 0x08, 0x00, 0x20, 0x22, 0x21, 0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, -0x22, 0x20, 0x18, 0x08, 0x00, 0x20, 0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, -0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, -0x10, 0x00, 0x00, 0x30, 0x31, 0x20, 0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, -0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, -0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, -0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, -0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, 0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, -0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, -0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, -0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, -0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, -0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, -0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, -0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, -0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, -0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, -0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, -0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, -0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, -0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, -0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, -0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, -0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, -0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, -0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, -0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, -0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, -0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, -0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, -0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, -0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, -0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, -0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, -0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, -0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, -0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, -0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, -0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, -0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, -0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, -0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, -0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, -0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, -0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, -0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, -0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, -0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, -0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, -0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, -0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, -0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0xFB, 0x90, 0x93, 0x63, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, -0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xF0, 0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0xF0, -0x0B, 0x90, 0x93, 0x40, 0xF0, 0x04, 0x70, 0x03, 0x02, 0x44, 0xF0, 0x43, 0x66, 0x10, 0x90, 0x93, -0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0xE0, 0x54, 0x0F, 0xFF, 0x90, -0x93, 0x58, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0xF5, 0x49, -0xE4, 0x1B, 0x80, 0x56, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, -0x58, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x04, 0x2F, 0xF5, -0x49, 0xE4, 0xFB, 0x80, 0x35, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x13, -0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, -0xFB, 0x80, 0x17, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, -0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, -0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, -0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x12, 0x9B, 0x79, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x22, 0xE4, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x41, 0xF0, 0xF5, 0x66, 0x22, 0x22, 0xE4, 0xFF, -0x02, 0x4E, 0x27, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0xFB, 0x90, 0x93, 0x5D, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x62, 0x64, 0x01, -0x60, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x65, 0x14, 0x60, 0x2B, 0x24, 0xFD, 0x60, 0x27, 0x24, 0x02, -0x24, 0xFB, 0x50, 0x02, 0x80, 0x21, 0x90, 0x93, 0x40, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, -0xE0, 0x60, 0x14, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x08, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, -0xF0, 0x7B, 0x01, 0x80, 0x02, 0x7B, 0x01, 0xEB, 0x70, 0x03, 0x02, 0x46, 0x78, 0x43, 0x66, 0x10, -0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, 0xE0, 0x54, 0x0F, -0xFF, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0x80, -0x2D, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, -0xFE, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x08, -0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3A, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0x80, -0x2D, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, -0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, -0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, -0xE5, 0x63, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x93, 0x13, 0xE0, 0xFF, 0x90, 0x93, 0x58, 0xE0, 0xD3, -0x9F, 0x40, 0x08, 0x90, 0x93, 0x14, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0x14, 0xF0, -0x90, 0x93, 0x58, 0xE0, 0x90, 0x93, 0x13, 0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x46, 0xE4, -0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, -0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, 0x4A, 0x65, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x55, 0x80, 0x09, 0x43, 0x66, 0x01, 0x12, 0x51, 0x48, 0x90, -0x93, 0x51, 0x74, 0x01, 0xF0, 0x12, 0x9B, 0x79, 0x22, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0xE5, 0x65, -0x70, 0x03, 0x02, 0x47, 0x32, 0x90, 0x93, 0x5A, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, -0xE5, 0x66, 0x54, 0x07, 0x60, 0x03, 0x02, 0x47, 0x32, 0x02, 0x47, 0x2F, 0x90, 0x93, 0x41, 0xE0, -0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x36, -0xE0, 0x54, 0x0F, 0xB5, 0x07, 0x0A, 0x90, 0x93, 0x39, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, -0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, -0x90, 0x93, 0x58, 0xE0, 0xB5, 0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, -0x03, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, -0x93, 0x63, 0x74, 0x5A, 0xF0, 0x90, 0x93, 0x63, 0xE0, 0xFF, 0x90, 0x93, 0x48, 0xE0, 0x2F, 0xFF, -0xE4, 0x33, 0xFE, 0x90, 0x93, 0x41, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, -0x40, 0x0D, 0xE5, 0x62, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, -0x52, 0x17, 0x22, 0xE4, 0xF5, 0x66, 0xF5, 0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, -0x59, 0xF0, 0x90, 0x93, 0x55, 0xF0, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x93, 0x57, 0x04, 0xF0, 0x90, -0x93, 0x40, 0xF0, 0xE4, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x93, 0x4F, 0x74, -0x05, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x4D, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, -0x93, 0x48, 0xF0, 0x90, 0x93, 0x4B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x45, 0x74, 0x14, 0xF0, 0x90, -0x93, 0x50, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x43, 0xF0, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x93, -0xB2, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x93, 0x5C, 0xF0, 0x90, 0x93, 0x58, 0xF0, 0x90, 0x93, -0x3D, 0xF0, 0x90, 0x93, 0x56, 0xF0, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x93, 0x44, 0xF0, 0x90, 0x93, -0x51, 0xF0, 0x90, 0x93, 0x4A, 0xF0, 0x90, 0x93, 0x46, 0xF0, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x93, -0x49, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, -0x36, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x93, 0x39, 0xF0, 0x22, 0xEF, 0x60, 0x5F, 0xAF, 0x05, -0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x93, -0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x30, 0xE0, 0x6B, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xE0, 0x25, 0xE0, 0x25, -0xE0, 0xFF, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, -0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xAF, 0x05, 0x74, -0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x19, -0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, -0xE0, 0x0C, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x22, 0x90, -0x93, 0x15, 0xE0, 0x30, 0xE0, 0x22, 0x90, 0x93, 0x26, 0xE0, 0x60, 0x09, 0x90, 0x01, 0xB9, 0x74, -0x40, 0xF0, 0x02, 0x49, 0x29, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x02, 0x80, 0x2F, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x67, 0x80, 0x5D, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, -0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, -0xB9, 0x74, 0x02, 0xF0, 0x80, 0x53, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, -0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x42, 0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, -0x08, 0xF0, 0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, -0x28, 0x90, 0x93, 0x42, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, -0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, -0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, -0x00, 0x22, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0xE0, -0x54, 0xC0, 0x70, 0x18, 0x90, 0x93, 0x51, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x14, 0x12, 0x52, 0x17, 0x80, 0x0F, 0x90, 0x93, 0x3D, 0xE0, -0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x5D, 0xE0, 0x30, -0xE6, 0x1B, 0x43, 0x66, 0x01, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, -0x0C, 0x60, 0x13, 0x12, 0x51, 0x48, 0x80, 0x0E, 0x12, 0x50, 0x77, 0x80, 0x09, 0x90, 0x93, 0x51, -0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x5D, 0xE0, 0x30, -0xE7, 0x2A, 0x43, 0x66, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, -0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x93, -0x5A, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, -0x8E, 0x25, 0x8F, 0x26, 0xAD, 0x26, 0xAC, 0x25, 0xAF, 0x24, 0x12, 0x47, 0xEB, 0xAF, 0x26, 0xAE, -0x25, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, -0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x8F, 0x68, 0x8D, 0x69, 0xE5, 0x68, 0x54, 0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, -0xE5, 0x68, 0x30, 0xE2, 0x30, 0xE5, 0x63, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0xA1, 0xE5, -0x63, 0x30, 0xE3, 0x10, 0xE5, 0x68, 0x20, 0xE3, 0x0B, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x53, 0x12, -0x51, 0xD4, 0x80, 0x4E, 0xE5, 0x63, 0x20, 0xE3, 0x49, 0xE5, 0x68, 0x30, 0xE3, 0x44, 0xAF, 0x69, -0x12, 0x51, 0x86, 0x80, 0x3D, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x68, 0x20, -0xE3, 0x09, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x2A, 0x12, 0x51, 0xD4, 0xE5, 0x63, 0x54, 0x0F, 0xFF, -0xBF, 0x04, 0x0E, 0xE5, 0x68, 0x20, 0xE2, 0x09, 0x12, 0x48, 0x8F, 0xEF, 0x60, 0x14, 0x12, 0x51, -0x1F, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4B, 0xF7, 0xEF, 0x60, 0x03, 0x12, -0x52, 0x04, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x02, 0x4B, 0x35, 0x02, 0x52, 0xF4, 0xE4, 0x93, 0xA3, -0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, -0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, -0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, -0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4F, 0x75, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, -0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, -0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, -0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, -0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x7D, -0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, 0x01, 0x36, -0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, -0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x4A, 0x65, 0x90, 0x06, -0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, -0x74, 0x7B, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, -0x03, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, -0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4F, 0x28, 0xE5, 0x62, 0x20, 0xE0, -0x05, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0x22, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x10, 0x12, 0x51, -0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x5C, 0xE5, 0x14, -0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x50, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, -0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x3F, 0x90, 0x02, 0x87, 0xE0, 0x60, -0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x31, 0x90, 0x01, 0xAF, 0xE0, 0x60, 0x02, 0x80, -0x07, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, -0x90, 0x93, 0x43, 0xE0, 0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, -0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, -0x7F, 0x00, 0x22, 0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, 0x64, -0x02, 0x60, 0x06, 0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, 0x40, -0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x93, 0x57, 0xF0, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x07, 0x90, -0x93, 0x57, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x93, 0x40, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xEF, 0xF0, -0x90, 0x93, 0x42, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x58, -0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, -0x02, 0xF0, 0x53, 0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, -0x03, 0x12, 0x49, 0x32, 0x22, 0x90, 0x93, 0xB1, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, -0x90, 0x93, 0xB1, 0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0x7D, 0x40, 0x7F, 0x93, 0x12, 0x54, -0x0A, 0x90, 0x00, 0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x28, -0xE0, 0x54, 0xFC, 0xFD, 0x7F, 0x28, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, -0x7F, 0x08, 0x12, 0x54, 0x0A, 0x7F, 0x01, 0x12, 0x4E, 0x81, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, -0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, -0x54, 0x0A, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x54, 0x0A, 0x7F, 0x14, -0x7E, 0x00, 0x02, 0x3B, 0x09, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x93, 0x1A, 0xE0, -0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x49, 0x12, -0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, -0x93, 0x55, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x52, -0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, 0xD3, -0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, -0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, -0x22, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xC8, 0x12, 0x44, 0xF1, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, -0x12, 0x1E, 0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, -0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, -0x1F, 0x0F, 0xFD, 0xE4, 0xFF, 0x12, 0x50, 0x39, 0x80, 0x29, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x50, 0x39, 0x1F, 0x80, 0x14, 0x90, -0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x50, -0x39, 0xE4, 0xFF, 0x12, 0x4B, 0x7A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x24, -0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, -0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x27, 0x74, 0xFF, 0xF0, 0x12, 0x5E, -0x42, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x1F, 0x12, 0x49, -0xD0, 0x90, 0x05, 0x22, 0xE5, 0x27, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, 0x01, -0x12, 0x58, 0x1F, 0x12, 0x49, 0xD0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x8F, 0x6C, 0xE4, 0x90, 0x94, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, -0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6C, 0x60, 0x3E, 0xC3, 0x90, 0x94, 0x45, 0xE0, 0x94, -0x88, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, -0x22, 0x90, 0x94, 0x44, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, -0x3B, 0x09, 0xD3, 0x90, 0x94, 0x45, 0xE0, 0x94, 0x32, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x00, 0x40, -0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, 0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, -0x7F, 0x20, 0x12, 0x54, 0x0A, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, -0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, -0x28, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x54, 0x0A, -0xE4, 0xFF, 0x12, 0x4E, 0x81, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, -0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x54, 0x0A, 0xE4, 0xFF, 0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, -0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, -0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, -0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, 0x4E, 0xE0, 0x9D, 0x90, 0x93, 0x4D, -0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xA3, 0xE0, -0x90, 0x05, 0x58, 0xF0, 0x22, 0x48, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x48, 0x93, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0x9F, 0x00, 0x41, -0x93, 0xAE, 0x00, 0x41, 0x93, 0x94, 0x00, 0x41, 0x94, 0x4C, 0x00, 0x41, 0x93, 0x13, 0x00, 0x41, -0x93, 0x14, 0x00, 0x41, 0x92, 0x69, 0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, 0x41, -0x94, 0x3D, 0x00, 0x41, 0x94, 0x4A, 0x00, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0x56, 0x74, 0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x94, 0x31, 0x12, -0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x94, 0x31, 0x12, -0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, -0x7E, 0x08, 0x12, 0x34, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, -0x02, 0x80, 0x35, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x2E, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, -0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x9B, 0x79, 0x90, 0x93, 0x59, 0xE0, -0x60, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0D, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, -0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, -0x24, 0x02, 0x70, 0x32, 0x80, 0x0A, 0x90, 0x93, 0x57, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x40, 0xF0, -0xE4, 0x90, 0x93, 0x5C, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x50, 0xE0, 0x90, 0x93, 0x57, -0xF0, 0x80, 0x05, 0x90, 0x93, 0x57, 0xED, 0xF0, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, 0xF0, -0x90, 0x93, 0x5C, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, -0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, -0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, -0xF0, 0x90, 0x93, 0x52, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x0C, 0x50, 0x03, 0x12, -0x4A, 0x65, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, -0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x3E, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, -0xFF, 0x74, 0x40, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, -0xF9, 0x90, 0x93, 0x54, 0xF0, 0xEE, 0x90, 0x93, 0x53, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x93, -0xB0, 0xE0, 0x90, 0x94, 0x35, 0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0xB0, 0xE0, 0x90, 0x94, 0x35, -0x60, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, -0x01, 0x10, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x35, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x55, 0x6B, 0x90, -0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x5E, 0x42, 0xEF, 0x70, -0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x12, 0x54, -0x62, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x90, 0x93, 0x46, 0xE0, 0x70, 0x1A, 0x90, 0x04, -0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, 0x1F, 0x8E, 0x6A, -0x8F, 0x6B, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x16, 0x90, -0x93, 0x4A, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x44, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, -0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, -0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x0C, -0x22, 0x90, 0x94, 0x4D, 0xEF, 0xF0, 0x12, 0x98, 0x8F, 0x90, 0x94, 0x4D, 0xE0, 0x60, 0x05, 0x90, -0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, -0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, -0x02, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x05, -0x7F, 0x01, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0xE5, 0x64, 0x30, 0xE6, -0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, -0x53, 0x64, 0xBF, 0x22, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0xE5, 0x12, 0x4E, 0xD9, -0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x7D, 0x01, 0xAF, 0x64, 0x02, 0x4A, 0x69, 0x90, 0x02, -0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, 0x43, -0xF7, 0x52, 0x49, 0x00, 0x40, 0x52, 0x71, 0x00, 0x80, 0x52, 0x9C, 0x01, 0x00, 0x52, 0xB0, 0x02, -0x00, 0x52, 0xC8, 0x04, 0x00, 0x00, 0x00, 0x52, 0xE5, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, 0xFF, -0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, 0xCE, -0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x80, -0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, 0x2D, -0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x07, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, 0xFE, -0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, 0x35, -0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, 0x2D, -0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, 0xFF, -0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, 0x00, -0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x21, 0xF0, -0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x75, 0xF0, 0xA3, 0xF0, 0xF1, 0x9F, 0x75, 0x8E, 0x02, -0xB1, 0x34, 0xF1, 0xBF, 0x90, 0x93, 0xB1, 0xEF, 0xF0, 0xF1, 0xA7, 0x90, 0x93, 0xB3, 0xEF, 0xF0, -0x12, 0x60, 0x3E, 0x90, 0x93, 0x95, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x14, 0xF5, 0x09, -0xF5, 0x62, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x88, 0x65, -0x12, 0x47, 0x33, 0x12, 0x37, 0x1C, 0xF1, 0xB3, 0x71, 0xE1, 0x12, 0x60, 0x02, 0xF1, 0xD2, 0xF1, -0x98, 0x12, 0x60, 0x20, 0x12, 0x44, 0xFD, 0x12, 0x60, 0xAC, 0xB1, 0x1C, 0x90, 0x93, 0x77, 0xE5, -0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x52, 0x75, 0xE8, 0x03, -0x43, 0xA8, 0x85, 0x12, 0x96, 0x00, 0xD2, 0xAF, 0x51, 0xEA, 0x12, 0x60, 0x56, 0x90, 0x93, 0x75, -0xE0, 0x64, 0x01, 0xF0, 0x24, 0xF4, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, 0xA3, 0xF0, 0xE5, 0x14, -0x30, 0xE0, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0xFE, 0xB1, 0x44, 0xD2, 0xAF, 0xE5, 0x14, 0x30, 0xE4, -0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xEF, 0xD2, 0xAF, 0x12, 0x6F, 0xBB, 0xE5, 0x14, 0x30, 0xE6, 0x0A, -0xC2, 0xAF, 0x53, 0x14, 0xBF, 0xD2, 0xAF, 0x12, 0x80, 0x62, 0xE5, 0x14, 0x30, 0xE7, 0x09, 0xC2, -0xAF, 0x53, 0x14, 0x7F, 0xD2, 0xAF, 0xB1, 0xD2, 0xC2, 0xAF, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0xBF, -0x01, 0x0D, 0x90, 0x93, 0x43, 0x74, 0x01, 0xF0, 0x51, 0x17, 0xE4, 0x90, 0x93, 0x43, 0xF0, 0xD2, -0xAF, 0x90, 0x01, 0xBD, 0xE5, 0x63, 0xF0, 0x90, 0x93, 0x59, 0xE0, 0x90, 0x01, 0xBC, 0xF0, 0x80, -0x8C, 0x90, 0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x91, 0x0A, 0x7D, 0xFF, 0x7F, 0x55, 0x91, 0x0A, -0x7D, 0xFF, 0x7F, 0x56, 0x91, 0x0A, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x91, 0x52, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x91, 0x0A, 0xE4, 0xFD, 0x7F, 0x51, 0x91, 0x0A, 0xE4, -0xFD, 0x7F, 0x52, 0x91, 0x0A, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0x90, 0x00, 0x02, 0xE0, 0x44, -0x01, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xF2, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x00, 0x00, 0x90, 0x93, 0xF6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x02, -0xE0, 0x54, 0xFE, 0xF0, 0x91, 0x52, 0x91, 0x4B, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x90, -0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, -0xF0, 0x90, 0x93, 0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x3D, -0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x56, 0xF0, 0xFF, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, -0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, 0xEC, 0x54, 0xFD, 0xFC, 0x90, 0x93, -0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, -0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x22, 0xE4, 0xFF, 0x11, -0xEB, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xF6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, -0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xF6, 0xB1, 0x67, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, -0x93, 0x51, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x94, 0x3E, 0xE0, -0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x94, 0x40, 0xF0, 0x90, 0x94, 0x3E, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, -0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, -0x7F, 0x80, 0x81, 0x0A, 0xE4, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x6B, 0x12, 0x73, 0x5E, 0xEF, 0xB4, -0x02, 0x14, 0x90, 0x94, 0x4A, 0xE0, 0x64, 0x04, 0x60, 0x07, 0x43, 0x14, 0x01, 0xE0, 0x04, 0xF0, -0x22, 0xE4, 0x90, 0x94, 0x4A, 0xF0, 0x22, 0x7F, 0x70, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, 0xEE, 0x44, 0xF0, 0xA3, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, -0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEE, 0xF0, 0x12, 0x1E, 0xF6, -0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, 0x12, 0x97, 0x34, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x90, 0x93, 0x04, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x16, 0xEF, 0x7B, 0x01, 0xB4, 0x01, -0x06, 0x7A, 0x93, 0x79, 0x0B, 0x80, 0x04, 0x7A, 0x93, 0x79, 0x07, 0x7F, 0x80, 0x7E, 0x08, 0xB1, -0x6B, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x40, 0xEF, 0x60, 0x4E, 0x90, 0x92, -0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, -0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, -0xFA, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0xD0, 0x01, 0xD0, 0x02, 0xD1, 0x31, 0x90, 0x92, 0x69, -0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, -0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x10, 0x12, 0x43, 0xC8, 0x90, 0x92, -0x68, 0xE0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0xF1, 0x40, 0xEF, 0x70, 0x02, 0xC1, 0xEC, 0x90, -0x94, 0x10, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, -0x7A, 0x01, 0x79, 0xA0, 0xD1, 0xF1, 0x90, 0x94, 0x13, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, -0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, -0x23, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0xD1, 0xF1, 0x90, 0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, -0x93, 0xB1, 0xE0, 0x64, 0x01, 0x70, 0x48, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, -0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x20, 0xD1, 0xF1, 0x90, 0x94, -0x13, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, -0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x22, 0xD1, -0xF1, 0x90, 0x93, 0x95, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, -0x92, 0x68, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x94, -0x0A, 0x12, 0x43, 0xC8, 0xAB, 0x20, 0xAA, 0x21, 0xA9, 0x22, 0x90, 0x94, 0x0D, 0x12, 0x43, 0xC8, -0xAF, 0x23, 0x15, 0x23, 0xEF, 0x60, 0x1E, 0x90, 0x94, 0x0D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, -0xB1, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x94, 0x0A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, -0x12, 0x42, 0x53, 0x80, 0xDB, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x94, 0x39, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, -0xF0, 0x90, 0x94, 0x39, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, -0x90, 0x94, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0x3B, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, -0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x3B, 0xE4, 0x75, 0xF0, 0x01, 0x12, -0x42, 0x87, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, 0x7F, 0x01, 0x22, 0x8F, 0x82, -0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0x20, 0xF0, 0x22, 0x90, -0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, -0x7F, 0x01, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0x90, -0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, 0x02, 0x22, 0x7F, -0x00, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, -0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, -0xC4, 0x74, 0xE7, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, -0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, -0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, -0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, -0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, -0x54, 0xEF, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, -0x62, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x67, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x54, 0x3F, 0x25, -0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x68, 0xF0, 0x90, -0x93, 0x67, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xE4, 0xFF, 0x90, 0x94, 0x1C, 0xEF, 0xF0, 0xA3, 0xED, -0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, -0x21, 0xF0, 0xD1, 0x3C, 0xBF, 0x01, 0x02, 0x11, 0xEC, 0x90, 0x94, 0x21, 0xE0, 0x90, 0x05, 0x22, -0xF0, 0x80, 0x02, 0x11, 0xEC, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0xAC, 0xE0, -0xFF, 0x7D, 0x01, 0x11, 0x1F, 0x90, 0x94, 0x1F, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, -0x94, 0x1C, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x94, 0x2B, 0xF0, 0xEF, 0x60, 0x10, -0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0E, -0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, -0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x11, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, 0x16, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x16, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0xAE, 0x05, 0x74, 0x22, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEB, 0xF0, 0x90, 0x94, 0x2B, 0xE0, 0xFF, 0x74, 0x23, 0x2E, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x12, 0x9B, 0xA7, 0x90, 0x93, 0x27, 0xE0, -0x64, 0x01, 0x60, 0x02, 0x41, 0xAE, 0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x18, 0xE0, 0xC3, 0x13, -0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0xA3, -0xE0, 0x90, 0x93, 0x63, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x63, 0xE0, 0x24, 0x03, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x27, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, -0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, -0x90, 0x93, 0x16, 0xE0, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xB9, -0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, -0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x06, 0xF0, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0xA1, 0xAC, 0x90, 0x93, -0x27, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x61, 0x8D, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, -0x3F, 0x30, 0xE0, 0x08, 0xD1, 0x3C, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x62, 0xE4, 0xFF, 0xD1, 0xE6, -0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x1F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, -0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x90, 0x93, 0x63, 0xF0, 0x90, -0x93, 0x1A, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x16, 0xE0, 0x24, 0x03, 0xFF, -0x90, 0x93, 0x63, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0xFF, 0x90, 0x93, 0x64, -0xE0, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x63, 0x74, 0x05, 0xF0, 0xE4, 0xFF, 0xD1, 0x83, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, -0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, -0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x20, 0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, -0x65, 0x60, 0x0D, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0xC1, 0x36, 0x90, 0x93, 0x27, -0xE0, 0x64, 0x03, 0x60, 0x02, 0x81, 0xE1, 0x7F, 0x01, 0xD1, 0xE6, 0x90, 0x93, 0x19, 0xE0, 0xFF, -0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x98, 0x8F, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0x81, 0x3D, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x90, 0x93, 0x29, -0xE0, 0xD3, 0x9F, 0x40, 0x4D, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, -0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0x17, 0xE0, 0xD3, 0x9D, -0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0x93, 0x66, 0xF0, 0x80, -0x06, 0x90, 0x93, 0x66, 0x74, 0x03, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x66, 0xE0, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, -0x80, 0x24, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x22, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, -0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x1D, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x27, 0xF0, -0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x29, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, -0x90, 0x93, 0x65, 0xE0, 0xFF, 0x90, 0x93, 0x17, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, -0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x63, -0x74, 0x05, 0xF0, 0x7F, 0x01, 0xD1, 0x83, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, -0xE0, 0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0x93, 0x1A, 0xE0, -0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x02, 0x80, 0x0F, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x08, 0xE5, 0x65, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, -0x69, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, -0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x51, 0x48, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, -0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x7F, 0x01, 0xC1, -0x38, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xA1, 0xB2, 0xF5, 0x48, 0x75, 0x49, 0x03, -0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, -0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, -0x90, 0x93, 0x17, 0xE0, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xB9, -0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, -0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x07, 0xF0, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x90, 0x05, 0x22, 0xE4, -0xF0, 0x22, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x3B, 0x90, 0x93, 0x19, 0xE0, -0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xD1, 0x3C, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x62, -0xE4, 0xFF, 0xD1, 0xE6, 0xD1, 0x83, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, -0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x20, 0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, -0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, -0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x22, 0x90, 0x05, 0x22, 0x74, -0xFF, 0xF0, 0xE4, 0x90, 0x94, 0x48, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, -0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, -0x94, 0x49, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0x48, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, -0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x94, 0x48, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, -0x87, 0x80, 0xC6, 0x90, 0x94, 0x2C, 0xEF, 0xF0, 0x12, 0x9D, 0x50, 0x90, 0x93, 0x18, 0xE0, 0xFF, -0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x08, 0x90, 0x94, 0x2C, 0xE0, 0xFF, 0x12, 0x50, 0xEB, 0x90, -0x94, 0x2D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x90, 0x94, 0x2C, 0xE0, 0xB4, 0x01, 0x10, -0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x80, 0x0A, -0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x94, 0x2D, 0x12, 0x1F, 0xD5, -0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x2D, 0x12, 0x55, 0x67, 0x90, 0x94, 0x2C, -0xE0, 0x90, 0x93, 0x26, 0xF0, 0x22, 0xEF, 0x64, 0x03, 0x60, 0x02, 0xE1, 0xB4, 0x90, 0x94, 0x02, -0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x30, 0xE0, 0x30, 0x90, 0x94, 0x06, 0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0xA3, -0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x41, 0x90, 0x94, 0x02, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, -0x74, 0x55, 0xF0, 0x80, 0x2D, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x17, 0x90, -0x94, 0x02, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, -0xF0, 0xA3, 0x74, 0x5A, 0x80, 0x05, 0x90, 0x94, 0x06, 0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x94, 0x02, 0xE0, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x94, 0x03, 0xE0, 0x90, 0x06, -0xC1, 0xF0, 0x90, 0x94, 0x04, 0xE0, 0x90, 0x06, 0xC2, 0xF0, 0x90, 0x94, 0x05, 0xE0, 0x90, 0x06, -0xC3, 0xF0, 0x90, 0x94, 0x06, 0xE0, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x94, 0x07, 0xE0, 0x90, 0x06, -0xC5, 0xF0, 0x90, 0x94, 0x08, 0xE0, 0x90, 0x06, 0xC6, 0xF0, 0x90, 0x94, 0x09, 0xE0, 0x90, 0x06, -0xC7, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, -0x17, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEF, 0x90, -0x06, 0xCC, 0xB4, 0x01, 0x03, 0xE4, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x57, 0xE7, 0xBF, -0x01, 0x0F, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x1F, 0x90, 0x04, 0x1F, 0x74, 0x20, -0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, 0xE0, 0x02, -0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90, 0x01, 0x30, -0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B, 0xF0, 0x22, -0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x43, 0x32, 0x20, 0x90, -0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, 0x22, 0x90, 0x93, -0xB3, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, -0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, -0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, -0x79, 0xE0, 0x94, 0x88, 0x90, 0x93, 0x78, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, -0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x78, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, -0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x78, 0xE0, -0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x01, 0xE0, -0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, -0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, -0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, -0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, -0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x93, 0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, -0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07, 0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3C, 0x90, 0x93, -0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D, 0xF0, 0x79, 0x40, 0x90, 0x93, 0x5D, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0x9F, -0xF0, 0x22, 0x90, 0x93, 0x9F, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0C, 0xE4, 0xF0, -0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x5F, 0xCC, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, -0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, -0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x4B, 0xF0, 0x74, 0x61, -0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28, 0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, -0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0, 0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, -0x02, 0x61, 0x45, 0x90, 0x01, 0x34, 0x74, 0x01, 0xF0, 0x85, 0xD1, 0x0A, 0x85, 0xD3, 0x0C, 0x85, -0xD4, 0x0D, 0x85, 0xD5, 0x0E, 0x85, 0xD6, 0x0F, 0x85, 0xD7, 0x10, 0x85, 0xD9, 0x11, 0x85, 0xD2, -0x0B, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x0A, 0x75, 0x23, 0x08, 0xFB, 0x7A, 0x93, -0x79, 0xA0, 0x12, 0x56, 0xF1, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, -0xC4, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x70, 0x02, 0x41, 0xF0, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x41, 0xF0, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, -0x93, 0xA2, 0xE0, 0x54, 0x3F, 0xF5, 0x4E, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, -0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, -0x87, 0xE5, 0x4E, 0xD3, 0x94, 0x04, 0x40, 0x03, 0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, -0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, -0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, -0x9C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xA1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, -0x2F, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, -0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFF, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x67, 0xAF, 0x4D, 0x12, 0x7A, 0xA1, 0x80, 0x60, -0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x53, 0x90, 0x93, 0xA4, -0xE0, 0x54, 0x1F, 0xFF, 0xFD, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, -0xF5, 0x83, 0xE4, 0x8D, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFE, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0xEE, 0x54, 0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, -0x12, 0x7A, 0x3D, 0x80, 0x1B, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, -0x04, 0x30, 0xE0, 0xB4, 0x01, 0x0A, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, -0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x46, 0x90, 0x93, 0x59, 0xE0, 0x60, 0x37, 0x90, -0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, -0x70, 0x2D, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, -0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, -0x90, 0x93, 0x55, 0xF0, 0x80, 0x09, 0x12, 0x51, 0xBB, 0xBF, 0x01, 0x03, 0x12, 0x52, 0x17, 0x90, -0x94, 0x4B, 0xE0, 0x04, 0xF0, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0xE7, 0x90, 0x01, 0x34, 0x74, -0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, 0x0B, 0x75, -0x4F, 0x88, 0x75, 0x50, 0x0F, 0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, 0x75, 0x50, 0x08, -0x75, 0x51, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x12, 0x90, 0x04, 0x7E, 0xE0, 0x55, -0x51, 0xF5, 0x13, 0x65, 0x12, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x12, 0x75, 0xF0, 0x08, 0xA4, 0x25, -0x4F, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x15, 0x2F, -0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x15, -0x75, 0x23, 0x08, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x97, 0x12, 0x56, 0xF1, 0x90, 0x93, 0x97, 0xE0, -0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0x6A, 0xE5, 0x12, 0x24, 0x01, -0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, 0x12, 0x90, -0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x13, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, -0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x14, 0x10, -0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, -0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x54, 0x1F, 0x90, -0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x54, 0x52, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x06, -0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x81, 0xF1, 0x90, 0x93, 0xB2, -0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, -0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x12, 0x45, 0x09, 0x90, -0x93, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xE6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, -0x12, 0x50, 0xEB, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0xFF, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9F, 0x40, 0x30, 0xE0, 0x54, 0xFE, -0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x90, 0x93, 0x32, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, -0xC9, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2E, 0x12, 0x43, 0x84, 0x90, 0x81, -0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x80, 0x1C, 0x90, 0x93, 0x2D, -0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0xFE, -0x25, 0xE0, 0x4F, 0xF0, 0x80, 0x03, 0x12, 0x6B, 0x40, 0x12, 0x6B, 0x09, 0x90, 0x93, 0xB2, 0xE4, -0xF0, 0xE5, 0x2E, 0x30, 0xE1, 0x45, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x43, 0x14, 0x40, 0x12, -0x9D, 0xA9, 0x11, 0xDC, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x1D, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, -0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, -0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, 0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, -0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x43, -0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x12, 0x4C, 0x73, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x34, 0x90, -0x93, 0x57, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x57, 0xE0, 0x90, -0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, -0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x40, -0xE0, 0x14, 0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x62, -0x64, 0x01, 0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, -0x74, 0x02, 0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, -0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, -0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, 0x60, 0x1C, -0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x5A, 0xE4, 0xF0, -0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2E, 0x30, 0xE5, -0x25, 0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x1A, 0xE5, 0x65, 0x60, 0x16, -0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x08, 0x12, 0x51, -0x48, 0x80, 0x03, 0x12, 0x50, 0x77, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, -0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, 0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, 0x66, 0x54, -0x07, 0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2F, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x37, 0x74, 0x02, -0xF0, 0x12, 0x4F, 0xFA, 0x74, 0x4B, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, -0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, -0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x5D, 0xE0, 0x54, 0xF0, -0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x15, 0x90, 0x94, -0x19, 0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x5D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x94, 0x16, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, -0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x92, 0x69, 0xE0, 0x70, 0x06, 0xA3, -0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, -0x12, 0x57, 0x40, 0xEF, 0x60, 0x72, 0x12, 0x55, 0xD2, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x90, -0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xA8, 0x01, -0xFC, 0x7D, 0x01, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x7E, 0x00, 0x7F, 0x02, 0x12, 0x1E, 0xD0, -0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, -0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0x19, 0x12, 0x43, 0xA8, 0x8B, 0x20, -0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, -0x0F, 0xF5, 0x23, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x56, 0xF1, 0x90, 0x92, 0x6A, 0xE0, -0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0x90, -0x93, 0x63, 0xE0, 0x54, 0xF0, 0x44, 0x05, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x65, -0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x65, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, -0x79, 0x63, 0xC1, 0x89, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x07, 0xF0, 0x54, -0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x6E, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, -0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0xC1, 0x89, 0xAD, 0x07, 0x90, 0x93, 0x6C, -0xE0, 0x54, 0xF0, 0x44, 0x09, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x6E, 0xEF, 0xF0, -0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, -0xC1, 0x89, 0x90, 0x93, 0x8F, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x92, 0xE0, 0x54, 0xF0, 0x44, 0x02, -0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, 0x93, 0x8F, 0x12, 0x43, 0xA8, 0x90, 0x94, 0x19, 0x12, -0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x92, 0xC1, 0x89, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, -0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x7D, 0xDA, 0x90, 0x01, 0xC4, -0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, -0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, -0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, -0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, -0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, -0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, -0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, -0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, -0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, -0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, -0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, 0x56, -0x00, 0x90, 0x01, 0xC4, 0x74, 0x81, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, -0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, -0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3C, -0x74, 0x01, 0xF0, 0xE5, 0x34, 0x30, 0xE1, 0x10, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, -0x15, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x46, 0x79, 0xE5, 0x34, 0x30, 0xE2, 0x36, 0x90, 0x01, 0x3C, -0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x45, -0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, -0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x55, 0xE4, 0xF0, -0x12, 0x52, 0x17, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0x90, 0x06, -0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, -0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, -0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x52, 0xE4, 0xF0, 0x12, 0x52, 0x17, 0xE5, 0x34, -0x30, 0xE4, 0x34, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x30, 0xE0, 0x24, -0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x07, 0x78, 0x74, 0x01, -0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, -0x34, 0x30, 0x80, 0x03, 0x12, 0x59, 0x97, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, 0x74, -0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x83, -0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, 0x64, 0xF0, 0x12, 0x51, 0xEC, 0x12, 0x52, 0x17, 0xE5, -0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, -0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, 0xAE, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, -0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x06, 0x90, -0x01, 0x3E, 0x74, 0x01, 0xF0, 0xE5, 0x36, 0x30, 0xE1, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, -0xE5, 0x36, 0x30, 0xE3, 0x08, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xD1, 0x50, 0xE5, 0x36, 0x30, -0xE4, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x76, 0x90, 0x01, 0x3E, -0x74, 0x04, 0xF0, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE7, 0x13, 0x74, 0x80, 0xF0, 0x90, 0x07, 0x95, -0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x8F, -0xE0, 0x30, 0xE6, 0x12, 0x74, 0x40, 0xF0, 0x90, 0x07, 0x7C, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x07, -0x80, 0xE0, 0xFF, 0x12, 0x67, 0x3D, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE5, 0x14, 0x74, 0x20, 0xF0, -0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, 0x01, -0xF0, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE2, 0x0D, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, -0x7F, 0x01, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE0, 0x07, 0x74, 0x01, 0xF0, 0xFF, -0x12, 0x55, 0xB2, 0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, -0x30, 0xE6, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, -0x3E, 0x74, 0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, -0x14, 0x80, 0xE5, 0x37, 0x30, 0xE4, 0x1C, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x44, 0x24, -0x90, 0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x71, -0x40, 0x71, 0x09, 0x74, 0x81, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, -0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, -0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x94, 0x3E, 0xE0, 0x30, 0xE0, 0x2F, -0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x94, 0x3D, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, -0x94, 0x40, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x3D, 0xF0, 0x90, 0x94, 0x40, 0xE0, 0xFF, 0x90, -0x94, 0x3F, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x44, 0xFE, 0xE4, 0x90, 0x94, 0x40, 0xF0, 0x22, -0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x6F, 0x7F, 0x01, 0x12, 0x5E, 0xE6, 0x90, 0x93, 0x19, 0xE0, -0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x98, 0x8F, 0x7F, 0x01, 0x12, 0x5E, 0x83, -0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x29, 0x90, 0x93, 0x15, 0xE0, 0xC4, -0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, 0xE0, -0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, -0x0C, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x4C, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, 0x74, 0x6F, 0xF0, -0x80, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, -0x05, 0x7F, 0x01, 0x12, 0x55, 0xB2, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, -0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, -0xC0, 0x06, 0xC0, 0x07, 0x53, 0x91, 0xBF, 0x90, 0xFD, 0x68, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x35, -0x90, 0x93, 0x94, 0xE0, 0x70, 0x16, 0x90, 0x00, 0x2E, 0xE0, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x00, -0x2D, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x94, 0x74, 0x01, 0xF0, 0x90, 0xFD, 0x60, 0xE0, -0x54, 0x3F, 0xD3, 0x94, 0x09, 0x50, 0x03, 0x12, 0x99, 0xED, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x0E, -0x60, 0x02, 0x81, 0xB8, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, -0x02, 0x81, 0xB8, 0x90, 0xFD, 0x62, 0xE0, 0x54, 0xC0, 0xFE, 0x90, 0x07, 0x90, 0xE0, 0x54, 0x3F, -0x4E, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x07, 0x91, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x07, -0x92, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x07, 0x93, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x01, 0xF0, -0xEF, 0x20, 0xE0, 0x44, 0x90, 0x93, 0x04, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x19, 0x90, -0x07, 0x78, 0x12, 0x58, 0x7F, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x49, 0x90, -0x07, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x80, 0x40, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, -0xE0, 0x11, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, -0x44, 0x01, 0xF0, 0x90, 0x07, 0x78, 0x80, 0x14, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x54, -0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x12, 0x58, 0x7F, 0x80, 0x0C, 0xE0, 0x44, 0x10, 0xF0, -0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x0F, 0x0A, 0x90, -0xFD, 0x62, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD1, 0xBF, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x15, 0x70, -0x76, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6A, 0xF0, 0xE0, 0x30, 0xE6, 0x1C, 0xF4, 0x54, 0x3F, -0x04, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9F, 0x90, 0x93, 0x69, 0xF0, -0xD3, 0x94, 0x3F, 0x40, 0x20, 0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, 0x54, -0x3F, 0xFF, 0x90, 0x93, 0x6A, 0xE0, 0x54, 0x3F, 0x2F, 0x90, 0x93, 0x69, 0xF0, 0xD3, 0x94, 0x3F, -0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0x93, 0x69, 0xE0, 0xFF, 0x90, 0x01, 0xE7, 0xF0, 0xEF, 0x54, -0x30, 0xC4, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x69, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, -0x93, 0x6B, 0xF0, 0x90, 0x00, 0x2E, 0xF0, 0xEE, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x93, 0x10, 0xE0, -0x54, 0x0F, 0x4F, 0x90, 0x00, 0x2D, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x16, 0x08, 0x90, 0xFD, -0x62, 0xE0, 0xFF, 0x12, 0x67, 0x64, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x21, 0x08, 0x90, 0xFD, 0x62, -0xE0, 0xFF, 0x12, 0x67, 0x8B, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x22, 0x02, 0xD1, 0x6E, 0x90, 0xFD, -0x60, 0xE0, 0x64, 0x23, 0x70, 0x7B, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x2C, 0x30, 0xE0, 0x05, -0x74, 0x01, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE1, 0x5B, 0x90, 0x93, -0x2D, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x60, 0x7E, 0x08, 0x12, -0x2C, 0x6E, 0x90, 0x93, 0x32, 0x12, 0x1F, 0xC9, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x7F, 0x70, 0x7E, -0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x2E, 0x12, 0x1F, 0xC9, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, -0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x01, 0xBE, 0xE0, 0x04, -0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x2D, 0x30, 0xE2, 0x08, 0xE0, 0x54, 0x1F, 0x44, 0x20, -0xF0, 0x80, 0x06, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0xFF, 0x12, 0x9A, -0x59, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x24, 0x02, 0xD1, 0x96, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x25, -0x13, 0x90, 0xFD, 0x62, 0xE0, 0x60, 0x0D, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, -0x24, 0x74, 0x04, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x26, 0x05, 0x7F, 0x01, 0x12, 0x9A, 0xF5, -0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x30, 0x07, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0xD1, 0xEA, 0x90, 0xFD, -0x68, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, -0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, -0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, 0x93, 0x1C, 0xE0, -0xC3, 0x13, 0x30, 0xE0, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x00, -0x75, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0x74, -0x03, 0xF0, 0x7F, 0x02, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0xE4, 0xF0, 0x90, 0x00, -0x75, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0D, 0xF0, 0x54, -0x0F, 0x44, 0x10, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x7B, 0x01, 0x7A, 0x93, -0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x66, 0x89, 0xAE, -0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x04, 0xF0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, -0x93, 0x6E, 0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, -0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x66, 0x89, 0xAC, 0x07, 0x90, 0x93, 0xD9, 0xE0, -0x44, 0x0F, 0xF0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x93, 0xDB, 0xEC, 0xF0, 0x60, 0x32, 0x90, -0xFD, 0x63, 0xE0, 0x90, 0x93, 0xDC, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0x93, 0xDD, 0xF0, 0x90, -0xFD, 0x64, 0xE0, 0x90, 0x93, 0xDE, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xDF, 0xF0, 0x90, -0xFD, 0x66, 0xE0, 0x90, 0x93, 0xE0, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0xE1, 0xF0, 0x80, -0x11, 0x90, 0x93, 0xDC, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xDB, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, -0x79, 0xD9, 0x02, 0x66, 0x89, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1E, 0xF6, 0x90, -0x93, 0x83, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x1F, 0x0F, 0x90, 0x93, 0x85, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x86, -0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x87, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, -0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x15, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x7F, 0x30, 0x12, -0x96, 0xD8, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0x7D, 0x01, 0xE4, 0x80, 0x07, 0x90, 0x93, 0x83, 0xE0, -0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0xEA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, -0xFD, 0x70, 0x03, 0x02, 0x71, 0x06, 0x90, 0x94, 0x4C, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, -0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x03, -0x02, 0x70, 0xFF, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x43, 0x9C, -0xE0, 0x90, 0x93, 0x79, 0xF0, 0x75, 0x20, 0x01, 0x75, 0x21, 0x93, 0x75, 0x22, 0x79, 0x75, 0x23, -0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7A, 0x12, 0x56, 0xF1, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x94, 0x4C, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, 0x02, 0x90, -0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, -0x02, 0x90, 0x00, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x4C, 0xE0, -0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0x90, 0x94, -0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7E, 0xF0, -0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x7F, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, -0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, -0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, -0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, -0x7B, 0x31, 0x0B, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x90, 0x94, 0x4C, 0xE0, 0xFE, 0x74, 0x01, 0xA8, -0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x94, -0x4C, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, -0xCC, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x02, 0x6F, 0xCC, 0x90, -0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x80, 0x12, 0x43, -0xC8, 0xEF, 0x12, 0x43, 0xD1, 0x71, 0xAF, 0x01, 0x71, 0xA6, 0x02, 0x71, 0xF7, 0x03, 0x72, 0x00, -0x05, 0x72, 0x09, 0x06, 0x73, 0x4B, 0x07, 0x72, 0x11, 0x0B, 0x72, 0x1A, 0x10, 0x72, 0x22, 0x11, -0x72, 0x2A, 0x12, 0x72, 0x32, 0x16, 0x72, 0x3C, 0x17, 0x72, 0x46, 0x18, 0x72, 0x50, 0x19, 0x73, -0x17, 0x1B, 0x73, 0x20, 0x1C, 0x72, 0x59, 0x1D, 0x72, 0x63, 0x1E, 0x72, 0x6E, 0x21, 0x72, 0x77, -0x22, 0x72, 0x80, 0x23, 0x72, 0x89, 0x24, 0x72, 0x92, 0x25, 0x72, 0x9B, 0x26, 0x72, 0xA4, 0x27, -0x72, 0xAD, 0x28, 0x72, 0xB6, 0x29, 0x71, 0xB8, 0x2D, 0x71, 0xC1, 0x2E, 0x72, 0xBF, 0x2F, 0x73, -0x29, 0x30, 0x72, 0xD0, 0x32, 0x72, 0xC7, 0x33, 0x71, 0xD3, 0x34, 0x72, 0xD9, 0x36, 0x72, 0xE2, -0x37, 0x72, 0xEB, 0x38, 0x72, 0xF3, 0x3A, 0x71, 0xCA, 0x3B, 0x72, 0xFC, 0x3E, 0x73, 0x05, 0x3F, -0x73, 0x0E, 0x41, 0x73, 0x32, 0x46, 0x71, 0xDC, 0x47, 0x71, 0xEE, 0x48, 0x71, 0xE5, 0x49, 0x73, -0x3B, 0x4B, 0x00, 0x00, 0x73, 0x44, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8B, 0x7D, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8B, 0x83, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8C, -0x64, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8C, 0xAC, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, -0x02, 0x8C, 0xE5, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0x17, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x02, 0x8D, 0x1D, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0xDD, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0xD0, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0xEE, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0x5F, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x81, -0x1C, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0xAC, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, -0x61, 0x4C, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x61, 0x52, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, -0x61, 0x58, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x01, 0x80, 0x2F, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x7F, 0x02, 0x80, 0x25, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x03, 0x80, 0x1B, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x18, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE4, -0xFF, 0x80, 0x08, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x04, 0x02, 0x8E, 0x36, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x50, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x69, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x82, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x8F, 0x9B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xB4, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x8F, 0xCD, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xE6, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x02, 0x8F, 0xFF, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x18, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0x81, 0x0D, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x40, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x59, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x90, 0x72, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x25, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x61, 0xEB, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x37, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x02, 0x96, 0x63, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0x7C, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0xB7, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0xA4, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0x8B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x99, 0xB9, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x6F, 0x55, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x97, 0x22, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x05, 0x7F, 0x0B, -0x80, 0x10, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0A, 0x7D, 0x01, 0x7F, 0x0D, 0x80, 0x04, 0x7D, 0x03, -0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x41, 0x12, 0x43, 0xC8, 0xE4, -0xFE, 0x90, 0x00, 0xA3, 0xE0, 0x54, 0xF8, 0x44, 0x05, 0xF0, 0x90, 0x00, 0xA0, 0xE0, 0x54, 0x0F, -0x64, 0x04, 0x70, 0x5A, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x49, 0x90, 0xFD, 0x50, 0xEF, 0xF0, -0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0x94, 0x41, 0x12, 0x43, 0xA8, 0x8E, 0x82, -0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, -0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0F, 0x74, 0x52, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0x90, 0xFD, 0x58, 0x74, 0x01, -0xF0, 0xFF, 0x80, 0x12, 0x90, 0x01, 0x43, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, 0x08, 0x90, 0x01, -0x42, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, -0x23, 0x71, 0x62, 0xEF, 0xB4, 0x03, 0x05, 0x7F, 0xFF, 0x12, 0x9A, 0x59, 0x22, 0x12, 0x1E, 0xF6, -0xFF, 0xE9, 0x24, 0x01, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x04, 0x61, 0x62, 0x90, 0x00, 0x04, 0x12, -0x1F, 0x0F, 0xFF, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, -0x90, 0x93, 0x83, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x85, 0x12, -0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x88, -0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, -0x89, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, -0xAD, 0x82, 0xAC, 0x83, 0x90, 0x93, 0x8A, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, -0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0xC8, 0x90, -0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x0F, 0xFF, 0x90, 0x93, -0x8C, 0x12, 0x43, 0xA8, 0xEF, 0x12, 0x42, 0x53, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x8C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0xEF, 0x12, -0x42, 0x65, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, -0x93, 0x8A, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, -0x8D, 0x82, 0x8C, 0x83, 0xA3, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFE, 0x90, 0x93, 0x83, 0xE0, 0xFF, -0x24, 0xC2, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFE, -0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, -0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, 0x75, 0xF0, -0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x8F, 0x57, 0xEF, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, 0x57, 0x75, 0xF0, -0x02, 0xA4, 0x24, 0x02, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, -0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, 0x85, 0x83, 0x5D, -0x8F, 0x5E, 0xE5, 0x57, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0x75, -0x5F, 0x01, 0xF5, 0x60, 0x89, 0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, -0x83, 0xE0, 0x12, 0x43, 0xD1, 0x75, 0xAA, 0x00, 0x75, 0xBF, 0x01, 0x75, 0xD4, 0x02, 0x75, 0xE9, -0x03, 0x76, 0x12, 0x04, 0x76, 0x27, 0x05, 0x76, 0x3C, 0x06, 0x76, 0x62, 0x0C, 0x76, 0x8F, 0x0D, -0x76, 0xBC, 0x0E, 0x76, 0xE9, 0x0F, 0x00, 0x00, 0x77, 0x1D, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, -0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, -0x74, 0x10, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, -0xE1, 0x1D, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, -0x0F, 0xF0, 0xA3, 0x74, 0xF5, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xE1, 0x1D, 0x90, 0x04, 0x47, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, -0x04, 0x46, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, -0x04, 0x45, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, 0xE1, 0x14, 0x90, -0x04, 0x4B, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4A, 0xE0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x49, 0xE0, -0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x59, 0x82, -0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, -0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, -0xF0, 0x90, 0x04, 0x50, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, -0x60, 0xA9, 0x61, 0x12, 0x1E, 0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, -0xAB, 0x5A, 0xE5, 0x5C, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, -0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, 0x82, 0x85, 0x58, -0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xE0, 0xFE, 0xEF, -0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xC0, 0x83, 0xC0, -0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, -0xD0, 0x83, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x4C, 0x90, 0x93, 0x8F, 0x74, 0x0B, 0xF0, 0x90, 0x93, 0x8F, -0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x78, 0x63, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, -0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, -0x0A, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x8F, 0xE0, 0x14, -0xF0, 0x80, 0xBA, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x47, 0x90, 0x93, 0x8F, 0x74, 0x0F, 0xF0, 0x90, 0x93, 0x8F, -0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, -0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, -0x8F, 0xE0, 0xA3, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0x8F, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, -0x93, 0x90, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, 0x8F, 0xE0, -0xFF, 0xC3, 0x94, 0x10, 0x40, 0x02, 0x21, 0x1C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, -0x93, 0x8F, 0xE0, 0x80, 0x63, 0x90, 0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x57, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, -0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, -0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, -0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, -0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0x90, 0x93, 0x90, 0xE0, -0xFF, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, 0x90, 0x93, -0x91, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xEE, 0xF0, -0xE5, 0x57, 0xC3, 0x94, 0x20, 0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, -0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, -0x34, 0x04, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x91, 0xE0, 0xA3, 0xF0, 0x80, -0x37, 0x80, 0x2D, 0x74, 0x27, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, -0x90, 0x93, 0x90, 0xE0, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x92, 0xEE, 0xF0, 0x80, -0x17, 0x90, 0x93, 0x91, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, 0x80, 0x08, -0x90, 0x93, 0x90, 0xE0, 0x90, 0x93, 0x92, 0xF0, 0x90, 0x93, 0x92, 0xE0, 0xFD, 0xAF, 0x57, 0x31, -0xF4, 0x90, 0x93, 0x92, 0xE0, 0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, -0x83, 0xEF, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x8A, 0x83, -0x74, 0x03, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x02, 0xF0, -0x22, 0xEF, 0xD3, 0x94, 0x03, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, -0x8A, 0x83, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, 0x20, 0x50, -0x0E, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, 0x29, 0x74, -0x27, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0xCC, 0xEF, 0xF0, -0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0xCD, 0xF0, 0x7B, 0x01, -0x7A, 0x93, 0x79, 0xCC, 0x7D, 0x02, 0x71, 0xB9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, -0x53, 0xE5, 0x53, 0x54, 0x1F, 0x90, 0x93, 0x5F, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x88, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x60, 0x74, 0x01, 0xF0, 0xEB, 0xC3, -0x94, 0x01, 0x40, 0x02, 0x80, 0x3B, 0x90, 0x93, 0x5D, 0xE0, 0x25, 0x55, 0xFF, 0xA3, 0xF0, 0xA3, -0xE0, 0x90, 0x41, 0xA4, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x13, 0x74, 0x01, 0x25, 0x52, 0xF5, -0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x21, 0xF4, 0x90, 0x93, -0x5E, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEF, 0xF0, -0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x62, 0xF0, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, -0x93, 0x61, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, -0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x5D, -0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, -0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFF, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, -0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x0D, -0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, 0x93, 0x62, -0xE0, 0xFF, 0x90, 0x93, 0x61, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, 0x61, 0xE0, -0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, -0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, -0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, -0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, -0x90, 0x93, 0x61, 0xE0, 0xFD, 0x31, 0xF4, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, -0x12, 0x90, 0x04, 0x30, 0xE0, 0x70, 0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0x04, -0xCF, 0x04, 0xF0, 0x90, 0x93, 0x61, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x94, 0x22, 0x12, 0x43, 0xC8, 0x90, 0x94, 0x25, 0xE0, 0x54, 0xF0, 0x44, 0x06, 0xFF, 0xF0, -0xED, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x94, 0x22, 0x12, -0x43, 0xA8, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x25, 0x12, 0x66, -0x89, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, -0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x80, -0x11, 0x74, 0x27, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, -0x88, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x8B, 0xF0, 0x75, 0xF0, 0x09, -0xEC, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x8D, 0xF0, 0x75, 0xF0, 0x09, 0xEC, -0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x8E, 0xF0, 0xEC, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8F, 0xCB, -0xF0, 0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, -0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x91, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, 0xC6, 0x2C, 0xF5, -0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, 0x90, 0x93, 0x8E, -0xE0, 0x90, 0x93, 0x8B, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0xED, 0x70, 0x02, 0xA1, 0x70, 0x90, 0x93, -0x8C, 0xED, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x8B, 0xE0, 0x90, 0x93, -0x88, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x14, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x70, 0x02, 0xA1, 0x70, -0x90, 0x93, 0x8B, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0xA1, 0x70, 0xE4, 0x90, 0x93, 0x8A, -0xF0, 0xEF, 0x14, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0xFD, 0x90, 0x93, 0x89, 0xE0, -0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, 0xFF, 0x74, 0x01, -0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, -0x93, 0x91, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x89, 0xE0, 0xFF, -0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8F, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, -0x60, 0x1A, 0x90, 0x93, 0x89, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, -0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0x6F, 0x60, 0x08, 0x90, 0x93, 0x89, 0xE0, -0x14, 0xF0, 0x80, 0x83, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xC3, 0x9F, 0x50, -0x0F, 0x90, 0x93, 0x89, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x93, 0x8D, 0xE0, 0x90, 0x93, 0x88, 0xF0, -0x90, 0x93, 0x88, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, -0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, -0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, -0xFF, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x93, 0x88, 0xE0, 0xFD, 0x31, 0xF4, 0x90, 0x93, 0x88, 0xE0, 0xFF, -0x22, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, 0xF0, 0xFD, -0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x0F, -0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, -0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x4D, 0xF0, -0x22, 0xAD, 0x07, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x88, -0xE0, 0xF9, 0x54, 0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, -0xE0, 0xFF, 0x90, 0x93, 0x8B, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, -0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8C, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xED, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, -0x8E, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, 0x25, 0xE0, 0x24, 0x34, 0xF5, -0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, 0x25, 0xE0, -0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xEE, 0xC3, -0x9F, 0x40, 0x02, 0xE1, 0x5E, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, 0x8B, 0xE0, -0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xE1, 0x98, 0xEE, 0xC3, 0x94, 0x10, -0x40, 0x21, 0xEE, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, -0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8C, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, -0x4E, 0x70, 0x27, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, 0x74, 0x01, 0x7E, -0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, -0x8E, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x8A, 0xE0, 0xB4, 0x11, -0x0D, 0x90, 0x93, 0x8D, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x93, 0x8A, 0x74, 0x17, 0xF0, 0x90, 0x93, -0x8A, 0xE0, 0xFF, 0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, 0x8C, 0xE0, 0x30, -0xE0, 0x06, 0x90, 0x93, 0x8A, 0x74, 0x18, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x90, 0x93, 0x89, 0xF0, -0x90, 0x93, 0x88, 0xF0, 0x80, 0x42, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, 0xC1, 0xBC, 0x90, 0x93, -0x8B, 0xE0, 0xFC, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, -0x9C, 0xE0, 0xB4, 0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x89, 0xE0, 0x44, 0x40, 0x90, -0x93, 0x88, 0xF0, 0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x25, 0xE0, 0x24, -0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, -0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, -0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, -0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, 0x93, 0x89, 0xE0, -0xD3, 0x9C, 0x40, 0x5E, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x89, 0xEF, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0xFC, 0xA3, -0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, -0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, -0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, -0x04, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, -0x90, 0x93, 0x88, 0xE0, 0x44, 0x80, 0xFD, 0x12, 0x79, 0xF4, 0x90, 0x93, 0x88, 0xE0, 0x44, 0x80, -0xFF, 0x22, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, -0x03, 0x02, 0x88, 0x64, 0xEF, 0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, 0x90, 0x89, -0x01, 0xE0, 0xFF, 0x90, 0x8F, 0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, -0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, -0x88, 0x5B, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, -0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x88, 0x5B, 0x90, 0x93, 0x78, -0xE0, 0x94, 0x20, 0x40, 0x09, 0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x88, 0x64, 0x90, 0x93, -0x78, 0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, 0x5A, 0x01, -0xF5, 0x5B, 0x89, 0x5C, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, -0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x93, 0x7D, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0, -0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7F, -0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, -0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x79, 0xF0, -0x80, 0x14, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, -0x54, 0x3F, 0x90, 0x93, 0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, 0xF0, 0x90, -0x93, 0x78, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x82, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, -0x40, 0x02, 0x61, 0xF9, 0x90, 0x93, 0x82, 0xE0, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0x9F, 0x40, 0x13, -0x90, 0x93, 0x82, 0xE0, 0x90, 0x93, 0x7A, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, 0x93, 0x79, 0xF0, -0xEF, 0x4E, 0xF0, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0x90, 0x41, 0x18, 0x93, 0xFE, 0x90, 0x93, 0x78, -0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, -0x90, 0x40, 0xE0, 0x80, 0x07, 0x90, 0x93, 0x7A, 0xE0, 0x90, 0x40, 0xFC, 0x93, 0x90, 0x93, 0x81, -0xF0, 0x90, 0x93, 0x81, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x56, 0xF9, 0x74, 0x40, 0x35, 0xF0, -0xFA, 0x7B, 0xFF, 0x8B, 0x57, 0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x78, 0xE0, 0x25, 0xE0, 0x24, -0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7B, 0xCF, -0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, -0x12, 0x42, 0x9D, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, -0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, -0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, -0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, -0xA9, 0x59, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, -0x5C, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, -0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x03, 0x12, -0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x06, 0x12, 0x42, -0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, -0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, -0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, -0x90, 0x00, 0x05, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, 0xE0, 0xFC, 0xA3, 0xE0, -0xFD, 0x12, 0x1F, 0x3C, 0xD3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x40, -0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0xF0, 0x80, 0x07, 0xE4, 0x90, 0x93, -0x7B, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x78, 0xE0, -0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, -0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, 0x61, 0xC8, 0x90, -0x93, 0x78, 0xE0, 0xFF, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0x74, -0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, 0x40, 0x03, 0xEF, -0x80, 0x1C, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0xFE, 0x74, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x90, -0x93, 0x83, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, 0x23, 0x90, 0x93, -0x78, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x01, -0x40, 0x0F, 0x74, 0xC6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x14, 0xF0, 0x80, -0x0F, 0x90, 0x93, 0x78, 0xE0, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, -0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x60, -0x02, 0xE1, 0x09, 0x12, 0x7E, 0x01, 0xE1, 0x09, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x6C, -0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC3, 0x90, -0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x40, 0x02, 0xE1, 0x09, 0x90, 0x93, 0x78, -0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x7B, 0xF6, 0xE1, 0x09, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xA1, 0xD7, 0x90, -0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x19, 0x40, 0x3D, -0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x11, 0x40, 0x2E, 0x80, -0x1F, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x0A, -0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x0D, -0x90, 0x8E, 0xC5, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, 0x90, 0x93, 0x78, -0xE0, 0xFE, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x87, 0xF0, -0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30, 0x50, -0x0A, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x74, 0x67, 0x2F, 0xA1, 0x82, 0x90, 0x8E, 0xC5, 0xE0, 0x64, -0x01, 0x60, 0x02, 0xA1, 0x77, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xEE, 0x24, 0x05, 0xFB, -0xE4, 0x33, 0xFA, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, -0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x78, 0xE0, 0xFE, 0xEF, -0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, 0x93, 0x78, 0xE0, -0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0x6F, -0x60, 0x56, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, -0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x93, 0x87, 0x74, 0x05, 0xF0, 0x80, 0x11, 0xEF, 0xD3, -0x94, 0x39, 0x90, 0x93, 0x87, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, -0x93, 0x78, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, -0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x24, -0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x80, 0x2F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, 0xF5, -0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x90, 0x93, 0x78, 0xE0, -0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7A, 0xE0, 0xFE, -0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEE, 0xF0, -0x90, 0x93, 0x87, 0xE0, 0xFE, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xEE, -0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x11, 0xE4, -0x90, 0x93, 0x87, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, -0x90, 0x93, 0x87, 0xE0, 0xFD, 0xE1, 0x06, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xE1, 0x09, 0x90, 0x93, -0x7B, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xE1, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, 0xE0, 0xFC, -0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x85, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, -0x78, 0xE0, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x87, 0xF0, -0xE4, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0xD3, 0x94, 0x04, 0x50, 0x47, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, -0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xDC, 0x93, 0xFF, 0x7E, 0x00, 0x12, 0x1F, 0x3C, -0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x85, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0xD3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x50, 0x08, 0x90, 0x93, -0x84, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x93, 0x84, 0xE0, 0xC3, 0x13, 0xF0, 0x90, 0x93, 0x87, -0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x93, 0x84, 0xE0, 0x70, 0x5D, 0x90, 0x93, 0x87, 0x04, 0xF0, -0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x87, -0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x87, 0x74, 0x01, 0xF0, 0x80, -0x3C, 0x80, 0x35, 0x90, 0x93, 0x87, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, 0x84, 0xE0, 0xFF, -0x70, 0x08, 0x90, 0x93, 0x87, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, 0x87, 0xB4, 0x01, -0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x80, 0xE0, 0x94, 0x03, -0x90, 0x93, 0x7F, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0xD3, 0x90, 0x93, -0x80, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x7F, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x87, -0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFD, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC4, 0xF5, 0x82, 0xE4, -0x34, 0x8C, 0xF5, 0x83, 0xED, 0xF0, 0x12, 0x7D, 0xC1, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, 0x74, 0x67, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x78, 0xE0, -0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7F, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, 0x93, 0x78, 0xE0, -0xFD, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, -0xD3, 0x9F, 0xEA, 0x9E, 0x50, 0x1C, 0x90, 0x93, 0x7F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, -0x80, 0x14, 0x90, 0x93, 0x78, 0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, -0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x84, 0xF5, -0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, 0xFF, 0x9D, 0xFB, -0x74, 0xFF, 0x9C, 0xFA, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x78, 0xE0, 0x50, 0x13, 0x25, 0xE0, -0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, 0x42, 0x87, 0x80, -0x10, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, -0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x04, 0xE4, -0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, -0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, -0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, -0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, -0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, -0xF0, 0x02, 0x80, 0x67, 0x22, 0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0xF0, 0xF0, 0xA3, -0x74, 0x0F, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, -0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE4, 0xF0, -0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, 0x90, 0x89, 0x01, -0x04, 0xF0, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, -0x02, 0x41, 0x5E, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, -0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, -0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, -0x84, 0x08, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE4, 0xF0, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x07, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0xE4, 0xF0, 0x90, 0x8E, 0x04, 0xF0, 0x90, 0x41, 0x92, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x90, -0x41, 0x5A, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, -0x90, 0x93, 0x78, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, -0x01, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x74, -0xC2, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, 0x75, 0xF0, 0x09, 0xED, -0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, -0x8A, 0x84, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, -0x8A, 0x88, 0x12, 0x43, 0x9C, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x89, 0x12, -0x43, 0x9C, 0xE4, 0xF0, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x01, 0xA7, 0x22, 0x12, -0x1E, 0xF6, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x74, -0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, 0x40, 0x0A, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, -0x0F, 0xFF, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFD, 0xAF, -0x06, 0x02, 0x74, 0x30, 0x12, 0x1E, 0xF6, 0x90, 0x89, 0x01, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, -0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, 0x94, 0x40, 0x40, 0x02, -0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x83, 0xF0, 0xEE, 0xA3, -0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, -0xE0, 0x90, 0x93, 0x85, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xEC, -0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, -0x93, 0x89, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x8B, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xEC, 0xF0, -0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x02, 0x67, 0xB2, 0x12, 0x1E, 0xF6, -0xF5, 0x62, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, -0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x59, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, -0x90, 0x93, 0x3C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x01, 0x90, 0x93, 0x3D, -0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, -0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x44, 0xF0, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, -0x93, 0x4A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, 0x01, 0x90, 0x93, 0x46, -0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, -0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x49, 0xF0, 0xE0, 0x70, 0x38, 0x90, 0x93, 0x47, -0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, -0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, -0x03, 0x00, 0x90, 0x93, 0x86, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, -0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x3D, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x12, 0x4D, 0xC1, 0x90, 0x93, 0x59, 0xE0, 0x90, 0x01, 0xE6, 0xF0, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, 0xE0, 0x25, 0x12, 0x1E, -0xF6, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x4B, 0xF0, 0xEF, -0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x45, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, -0x50, 0xF0, 0x22, 0x90, 0x93, 0x48, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4B, 0x74, 0x05, 0xF0, 0x90, -0x93, 0x45, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x50, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x30, -0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, -0xFF, 0x90, 0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x4F, 0x74, 0x05, -0xF0, 0x90, 0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xA3, 0xE0, -0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x4C, 0xF0, 0x60, 0x20, 0x90, 0x93, -0x15, 0xE0, 0x20, 0xE0, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x3D, 0xE0, -0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x51, 0x69, 0x90, 0x93, -0x4C, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x02, 0x43, 0xC8, 0x12, 0x1E, 0xF6, -0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xFF, -0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x70, 0xFF, 0x90, 0x93, 0x36, 0xE0, 0x54, -0x8F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x00, 0x03, -0x12, 0x1F, 0x0F, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x3A, -0xF0, 0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, -0xD3, 0x94, 0x20, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x01, 0xF0, 0x80, 0x57, 0xEF, 0xD3, 0x94, -0x40, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x02, 0xF0, 0x80, 0x49, 0xEF, 0xD3, 0x94, 0x60, 0x50, -0x08, 0x90, 0x93, 0x37, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, -0x93, 0x37, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, 0x94, 0xA0, 0x50, 0x08, 0x90, 0x93, 0x37, -0x74, 0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x06, -0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, 0x37, 0x50, 0x05, 0x74, 0x07, 0xF0, 0x80, -0x03, 0x74, 0x08, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x90, 0x93, 0x3B, 0xF0, 0x22, 0x12, 0x1E, 0xF6, -0x60, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x02, -0x09, 0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, 0xA8, 0xF0, 0x90, -0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xA9, 0xF0, 0x90, 0x00, 0x02, 0x12, -0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAA, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, -0xED, 0x2F, 0x90, 0x93, 0xAB, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xAE, 0x05, 0xED, -0x2F, 0x90, 0x93, 0xAC, 0xF0, 0x22, 0xEF, 0x70, 0x21, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x14, 0x90, -0x00, 0x40, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x01, -0xF0, 0x80, 0x07, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x6A, 0x12, -0x1E, 0xF6, 0x90, 0x00, 0x01, 0x30, 0xE0, 0x2E, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC0, 0xF0, 0x90, -0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, -0x06, 0xC2, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC3, 0xF0, 0x90, 0x06, 0xCC, -0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x2C, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC5, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC6, -0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, -0x01, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x02, 0xF0, 0xEF, 0xB4, 0x02, 0x11, 0x12, 0x1E, 0xF6, -0x90, 0x06, 0xC8, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC9, 0xF0, 0xEF, 0xB4, -0x03, 0x11, 0x12, 0x1E, 0xF6, 0x90, 0x06, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0x06, 0xCB, 0xF0, 0xEF, 0x64, 0x04, 0x70, 0x1F, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x07, 0x83, 0x30, -0xE0, 0x06, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0x6F, 0xF0, 0xEF, 0x30, 0xE1, 0x07, -0x90, 0x07, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0x90, 0x92, 0x6B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0x90, 0x92, 0x6C, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6D, 0xF0, 0x90, -0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x73, 0x5E, 0xEF, 0xB4, 0x02, 0x03, 0x43, 0x14, 0x01, 0x22, -0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, -0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x17, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, -0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x18, 0x02, -0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x19, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, -0x1A, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, -0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1B, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, -0x01, 0x7F, 0x1C, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, -0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x1D, 0x02, 0x73, 0x62, 0x90, -0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, -0xA8, 0x7D, 0x01, 0x7F, 0x1E, 0x02, 0x73, 0x62, 0x12, 0x1E, 0xF6, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, -0x78, 0x18, 0x12, 0x1F, 0xB6, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0x0B, -0x12, 0x43, 0x84, 0xEC, 0x54, 0x03, 0xFC, 0x12, 0x43, 0x59, 0x90, 0x93, 0x07, 0x02, 0x1F, 0xC9, -0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, -0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1F, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, -0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x20, 0x02, -0x73, 0x62, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xBC, 0xF0, 0xEF, 0x30, 0xE0, 0x5C, -0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x4E, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x52, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, -0x0F, 0x90, 0xFD, 0x53, 0xF0, 0xA3, 0xE4, 0xF0, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x90, 0xFD, 0x55, -0x30, 0xE0, 0x05, 0x74, 0xA0, 0xF0, 0x80, 0x03, 0x74, 0xC0, 0xF0, 0x90, 0xFD, 0x56, 0x74, 0x10, -0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, -0xFD, 0x58, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x00, 0x02, 0x12, -0x1F, 0x0F, 0xFE, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, -0xFE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFC, 0x74, 0x20, 0x2F, 0xFF, 0xE4, 0x3E, -0xFE, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0xEE, 0xF9, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x02, 0xF0, 0x90, -0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xEC, 0xC3, 0x99, 0x50, 0x43, 0xEC, 0x70, -0x04, 0x7D, 0x04, 0x80, 0x02, 0xE4, 0xFD, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x07, 0xAF, 0x05, 0x31, -0x79, 0x0D, 0x80, 0xF3, 0x0C, 0x90, 0xFD, 0x10, 0xE0, 0x04, 0xF0, 0xEC, 0xB5, 0x01, 0xDA, 0xE4, -0xFD, 0xED, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0xC3, 0xEF, 0x9B, 0x74, -0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x07, 0xAF, 0x05, 0x31, 0x79, 0x0D, 0x80, 0xE3, 0x0C, 0x80, -0xB8, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x81, 0x12, 0x54, 0x0A, 0x90, 0x01, 0xBD, -0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, 0x08, -0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0xF1, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, -0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x51, 0xF0, 0xEF, 0x75, -0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x52, -0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x90, 0xFD, 0x53, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x54, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, -0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x55, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, -0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x56, 0xF0, 0xEF, 0x75, 0xF0, -0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x57, 0xF0, -0xA3, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0xFE, 0x10, 0x60, 0x05, 0xE0, 0x44, 0x01, -0xF0, 0x22, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, -0x87, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, -0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, -0x54, 0x04, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xE0, -0x54, 0xEF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, -0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFC, -0x54, 0x80, 0xFF, 0x90, 0x93, 0x15, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, -0x0F, 0xFD, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xED, 0x54, 0x02, -0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFD, 0x54, 0x04, 0xFF, -0x90, 0x93, 0x18, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x18, 0xE0, 0x54, -0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, -0x1F, 0x0F, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x04, -0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, -0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, -0x80, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xE0, 0x54, -0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x19, -0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0xEC, 0x20, -0xE0, 0x02, 0x81, 0xB1, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x93, -0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, -0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x16, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, -0x17, 0xF0, 0x80, 0x4E, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, -0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x93, 0x16, 0x50, 0x05, 0x74, -0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x16, 0x74, 0x2A, 0xF0, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x93, -0x17, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x17, 0x74, -0x2A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3D, 0x90, 0x93, -0x16, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x1E, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, -0x93, 0x17, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x20, 0xF0, 0x90, 0x93, 0x16, 0xE0, 0xC3, -0x13, 0x90, 0x93, 0x21, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x22, 0xF0, 0x90, -0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, 0xE4, 0x90, 0x93, 0x11, 0xF0, -0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xC4, 0x13, 0x13, 0x54, -0x03, 0x20, 0xE0, 0x14, 0x12, 0x1E, 0xF6, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, -0x01, 0x80, 0x02, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, -0xE0, 0x18, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x75, 0x64, 0x04, -0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, -0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x80, 0x2B, 0x90, -0x93, 0x1D, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x80, 0x1C, 0x90, 0x93, -0x1D, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x93, 0x27, 0x74, 0x02, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0x1D, -0xE0, 0xB4, 0x07, 0x06, 0x90, 0x93, 0x27, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x80, -0x64, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, -0x90, 0x93, 0x83, 0x30, 0xE0, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, 0x07, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0xB1, 0x4D, 0x90, 0x00, 0x40, 0x74, 0x20, 0xF0, 0x90, 0x93, -0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, -0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0x83, 0x12, 0x55, 0x67, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, -0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0x93, 0x26, -0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0x93, -0x04, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x55, 0xB2, 0x90, 0x93, 0x04, 0xE0, -0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x5E, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x15, -0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x93, 0x26, -0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, -0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, -0x18, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xEF, -0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, -0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, 0x28, 0x74, 0x02, 0xF0, -0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, -0xA3, 0xF0, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x93, -0x23, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x29, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFD, -0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, -0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x22, -0x90, 0x93, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, -0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, 0x1F, 0xD5, 0x20, 0x08, 0x30, 0x70, 0x90, 0x93, 0x0B, -0x12, 0x1F, 0xD5, 0xC0, 0x08, 0x30, 0x70, 0xE4, 0x90, 0x93, 0x11, 0xF0, 0xA3, 0xF0, 0x43, 0xE8, -0x04, 0x90, 0xFD, 0x68, 0x74, 0x02, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x07, -0x83, 0xE4, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x04, 0x64, 0xE4, 0xF0, 0x90, 0x00, -0x40, 0x74, 0x20, 0xF0, 0xB1, 0x4D, 0x90, 0x93, 0x2C, 0x74, 0x01, 0xF0, 0x7D, 0x04, 0x7F, 0x02, -0x02, 0x3A, 0xAD, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, -0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x24, 0x02, 0x73, 0x62, 0x12, 0x1E, 0xF6, 0xFF, -0x54, 0x01, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, -0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, -0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, -0x1F, 0x0F, 0x90, 0x93, 0x1B, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x26, 0x02, 0x73, 0x62, -0x12, 0x1E, 0xF6, 0x90, 0x93, 0xB0, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0x8A, 0x12, 0x43, 0xC8, 0xE4, 0xFE, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x2F, 0x90, 0xFD, -0x50, 0xEF, 0xF0, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x8E, -0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, -0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xAE, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0x93, 0xAF, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x46, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, -0xC0, 0x60, 0x43, 0xC3, 0x90, 0x94, 0x47, 0xE0, 0x94, 0x88, 0x90, 0x94, 0x46, 0xE0, 0x94, 0x13, -0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x46, 0xE4, -0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x94, -0x47, 0xE0, 0x94, 0x64, 0x90, 0x94, 0x46, 0xE0, 0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, -0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0x90, 0x93, 0xE2, 0x12, 0x1F, 0xC9, 0x90, -0x93, 0xE6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, -0x93, 0xE6, 0x12, 0x43, 0x90, 0xD3, 0x12, 0x43, 0x73, 0x50, 0x41, 0x90, 0x93, 0xE6, 0x12, 0x43, -0x84, 0xA9, 0x07, 0x90, 0x93, 0xE2, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, -0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x7B, 0x01, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, -0x1B, 0x90, 0x93, 0xE6, 0x12, 0x43, 0x84, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, -0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0xE6, 0x12, 0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xE6, 0x02, -0x43, 0x84, 0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, -0xB8, 0x12, 0x43, 0x90, 0xC3, 0x12, 0x43, 0x73, 0x90, 0x93, 0xB4, 0x60, 0x68, 0x12, 0x43, 0x84, -0x12, 0x2C, 0x6E, 0x90, 0x93, 0xC0, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x84, 0x12, -0x97, 0x89, 0x90, 0x93, 0xC4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x84, 0x12, 0x43, -0x66, 0x90, 0x93, 0xC0, 0x12, 0x43, 0x90, 0x12, 0x43, 0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, -0xC0, 0x07, 0x90, 0x93, 0xC4, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xBC, 0x12, 0x43, 0x84, -0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, -0x90, 0x93, 0xC8, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, -0x90, 0x93, 0xC8, 0x80, 0x0A, 0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xBC, 0x12, -0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xEA, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, -0x90, 0x93, 0xEE, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, -0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, -0x74, 0x03, 0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x14, 0x12, 0x51, 0xBB, 0xBF, 0x01, 0x0B, 0x90, -0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x2D, -0xE0, 0x20, 0xE0, 0x24, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x1E, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, -0x93, 0x5B, 0xE0, 0x60, 0x13, 0x90, 0x93, 0xEE, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7B, -0x01, 0x7A, 0x93, 0x79, 0xEE, 0x12, 0x55, 0x67, 0x12, 0x54, 0x4B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x4E, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, -0x47, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, -0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x52, 0x90, 0x94, 0x4E, 0xE0, 0xFD, 0x74, 0x01, -0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, -0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, -0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4C, 0x90, 0x94, 0x4E, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, -0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, -0x62, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x52, 0x90, 0x94, 0x4E, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, -0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, -0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, -0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x12, -0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x94, 0x3E, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xE0, 0x30, 0xE0, -0x03, 0x12, 0x44, 0xFE, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x30, -0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x94, 0x3F, 0xF0, 0x22, 0x90, 0x93, 0x6C, -0xE0, 0x54, 0xF0, 0x44, 0x0A, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x90, 0xFD, -0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, -0x64, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, -0x60, 0xE0, 0x90, 0x93, 0x6C, 0x30, 0xE6, 0x08, 0xE0, 0x54, 0x0F, 0x44, 0x50, 0xF0, 0x80, 0x16, -0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0x73, 0xF0, 0x90, 0xFD, -0x67, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, -0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x66, 0x89, 0xAD, 0x07, 0x90, 0x93, 0xFA, 0xE0, 0x54, -0xF0, 0x44, 0x0C, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0xFC, 0xF0, 0x90, -0xFD, 0x63, 0xE0, 0x90, 0x93, 0xFD, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0xFE, 0xF0, 0x90, -0xFD, 0x65, 0xE0, 0x90, 0x93, 0xFF, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x94, 0x00, 0xF0, 0x90, -0xFD, 0x67, 0xE0, 0x90, 0x94, 0x01, 0xF0, 0xED, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0xFA, 0xE0, 0x54, -0x0F, 0x44, 0x20, 0xF0, 0x80, 0x3C, 0xED, 0xB4, 0x04, 0x0B, 0x90, 0x93, 0xFA, 0xE0, 0x54, 0x0F, -0x44, 0x60, 0xF0, 0x80, 0x2D, 0xED, 0xF4, 0x70, 0x29, 0x90, 0x93, 0xFA, 0xE0, 0x54, 0x0F, 0x44, -0x60, 0xF0, 0x90, 0x93, 0x2C, 0xE0, 0x60, 0x08, 0x90, 0x93, 0xFC, 0x74, 0x01, 0xF0, 0x80, 0x05, -0xE4, 0x90, 0x93, 0xFC, 0xF0, 0xE4, 0x90, 0x93, 0xFD, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xFC, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, -0x79, 0xFA, 0x02, 0x66, 0x89, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0E, 0xF0, -0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, -0x93, 0x70, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, -0x93, 0x72, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0x73, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, -0x93, 0x74, 0xF0, 0xED, 0xB4, 0x01, 0x11, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, -0x90, 0x93, 0x6E, 0x74, 0x01, 0xF0, 0x80, 0x13, 0xED, 0xB4, 0x02, 0x0F, 0x90, 0x93, 0x6C, 0xE0, -0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x93, 0x6E, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x6C, 0xE0, 0xFF, -0xC4, 0x54, 0x0F, 0x60, 0x13, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, -0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x12, 0x66, 0x89, 0x22, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x27, 0x90, -0x93, 0x4A, 0xE0, 0x70, 0x21, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, -0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x44, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, -0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x20, 0xE0, 0x02, 0xA1, 0x4F, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x01, 0x70, 0x39, 0x90, 0x06, 0x92, -0xE0, 0x20, 0xE2, 0x06, 0x90, 0x94, 0x4B, 0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, -0x90, 0x93, 0x29, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x4B, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFF, -0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0x3A, 0xE4, 0x90, 0x93, 0x1D, 0xF0, -0x90, 0x93, 0x27, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x04, 0x70, 0x3A, 0x90, 0x06, -0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x94, 0x4B, 0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, -0xF0, 0x90, 0x93, 0x29, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x4B, 0xF0, 0x90, 0x93, 0x20, 0xE0, -0xFF, 0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0x3A, 0xE4, 0x90, 0x93, 0x1D, -0xF0, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x06, 0x60, 0x02, -0x81, 0xFE, 0x90, 0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, -0x90, 0x93, 0x27, 0x30, 0xE0, 0x4E, 0xA1, 0x4C, 0x90, 0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, -0x30, 0xE0, 0x45, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, -0x0F, 0x30, 0xE0, 0x02, 0xA1, 0x0D, 0x90, 0x93, 0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, -0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, -0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x90, 0x93, 0x27, -0x40, 0x02, 0xA1, 0x4C, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, -0x12, 0x4E, 0x27, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, -0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, -0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, -0x12, 0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, -0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x58, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, -0x1D, 0xE0, 0x64, 0x07, 0x70, 0x49, 0x90, 0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0x93, 0x27, -0x80, 0x3A, 0x90, 0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x27, 0x80, 0x23, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, -0x01, 0x12, 0x4E, 0x27, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, -0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x22, -0xEF, 0x64, 0x01, 0x70, 0x3C, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, -0x07, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x22, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, -0xE0, 0x0D, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x24, 0x80, 0x0E, 0x90, -0x93, 0x18, 0xE0, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x02, 0x80, 0x14, 0x74, 0x09, 0xF0, -0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, -0x04, 0x74, 0x03, 0xF0, 0x22, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, -0x15, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x4B, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x30, 0xE0, 0x2A, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x21, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, -0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x1D, 0x74, -0x01, 0xF0, 0xE4, 0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, -0x90, 0x93, 0x5D, 0xE0, 0xFF, 0x90, 0x93, 0x16, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, -0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x63, -0x74, 0x05, 0xF0, 0x90, 0x93, 0x26, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, -0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x15, 0xE0, -0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, -0x30, 0xE0, 0x03, 0x12, 0x51, 0x48, 0xE4, 0x90, 0x94, 0x4B, 0xF0, 0x22, 0x85, 0xD2, -}; - - - -const u8 Rtl8723SFwUMCBCutImgArrayWithBT[Rtl8723SUMCBCutImgArrayWithBTLength] = { -0x02, 0x23, 0x02, 0x00, 0x21, 0x00, 0x00, 0x00, 0x03, 0x28, 0x14, 0x04, 0x16, 0x5E, 0x01, 0x00, -0x73, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4A, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x61, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x67, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0x82, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x6B, 0xB8, 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, -0x00, 0x04, 0x06, 0x05, 0x04, 0x02, 0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, -0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, -0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, 0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, -0x00, 0x18, 0x22, 0x21, 0x20, 0x18, 0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, -0x20, 0x08, 0x00, 0x20, 0x22, 0x21, 0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, -0x22, 0x20, 0x18, 0x08, 0x00, 0x20, 0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, -0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, -0x10, 0x00, 0x00, 0x30, 0x31, 0x20, 0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, -0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, -0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, -0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, -0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, 0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, -0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, -0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, -0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, -0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, -0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, -0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, -0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, -0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, -0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, -0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, -0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, -0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, -0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, -0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, -0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, -0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, -0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, -0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, -0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, -0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, -0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, -0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, -0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, -0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, -0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, -0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, -0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, -0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, -0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, -0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, -0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, -0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, -0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, -0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, -0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, -0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, -0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, -0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, -0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, -0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, -0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, -0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, -0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, -0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0xFB, 0x90, 0x93, 0x63, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, -0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xF0, 0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0xF0, -0x0B, 0x90, 0x93, 0x40, 0xF0, 0x04, 0x70, 0x03, 0x02, 0x44, 0xF0, 0x43, 0x66, 0x10, 0x90, 0x93, -0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0xE0, 0x54, 0x0F, 0xFF, 0x90, -0x93, 0x58, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0xF5, 0x49, -0xE4, 0x1B, 0x80, 0x56, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, -0x58, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x04, 0x2F, 0xF5, -0x49, 0xE4, 0xFB, 0x80, 0x35, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x13, -0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, -0xFB, 0x80, 0x17, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, -0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, -0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, -0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x12, 0x9B, 0x40, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x22, 0xE4, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x41, 0xF0, 0xF5, 0x66, 0x22, 0x22, 0xE4, 0xFF, -0x02, 0x4E, 0x27, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0xFB, 0x90, 0x93, 0x5D, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x62, 0x64, 0x01, -0x60, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x65, 0x14, 0x60, 0x2B, 0x24, 0xFD, 0x60, 0x27, 0x24, 0x02, -0x24, 0xFB, 0x50, 0x02, 0x80, 0x21, 0x90, 0x93, 0x40, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, -0xE0, 0x60, 0x14, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x08, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, -0xF0, 0x7B, 0x01, 0x80, 0x02, 0x7B, 0x01, 0xEB, 0x70, 0x03, 0x02, 0x46, 0x78, 0x43, 0x66, 0x10, -0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, 0xE0, 0x54, 0x0F, -0xFF, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0x80, -0x2D, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, -0xFE, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x08, -0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3A, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0x80, -0x2D, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, -0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, -0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, -0xE5, 0x63, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x93, 0x13, 0xE0, 0xFF, 0x90, 0x93, 0x58, 0xE0, 0xD3, -0x9F, 0x40, 0x08, 0x90, 0x93, 0x14, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0x14, 0xF0, -0x90, 0x93, 0x58, 0xE0, 0x90, 0x93, 0x13, 0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x46, 0xE4, -0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, -0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, 0x4A, 0x65, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x55, 0x80, 0x09, 0x43, 0x66, 0x01, 0x12, 0x51, 0x48, 0x90, -0x93, 0x51, 0x74, 0x01, 0xF0, 0x12, 0x9B, 0x40, 0x22, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0xE5, 0x65, -0x70, 0x03, 0x02, 0x47, 0x32, 0x90, 0x93, 0x5A, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, -0xE5, 0x66, 0x54, 0x07, 0x60, 0x03, 0x02, 0x47, 0x32, 0x02, 0x47, 0x2F, 0x90, 0x93, 0x41, 0xE0, -0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x36, -0xE0, 0x54, 0x0F, 0xB5, 0x07, 0x0A, 0x90, 0x93, 0x39, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, -0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, -0x90, 0x93, 0x58, 0xE0, 0xB5, 0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, -0x03, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, -0x93, 0x63, 0x74, 0x5A, 0xF0, 0x90, 0x93, 0x63, 0xE0, 0xFF, 0x90, 0x93, 0x48, 0xE0, 0x2F, 0xFF, -0xE4, 0x33, 0xFE, 0x90, 0x93, 0x41, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, -0x40, 0x0D, 0xE5, 0x62, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, -0x52, 0x17, 0x22, 0xE4, 0xF5, 0x66, 0xF5, 0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, -0x59, 0xF0, 0x90, 0x93, 0x55, 0xF0, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x93, 0x57, 0x04, 0xF0, 0x90, -0x93, 0x40, 0xF0, 0xE4, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x93, 0x4F, 0x74, -0x05, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x4D, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, -0x93, 0x48, 0xF0, 0x90, 0x93, 0x4B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x45, 0x74, 0x14, 0xF0, 0x90, -0x93, 0x50, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x43, 0xF0, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x93, -0xB2, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x93, 0x5C, 0xF0, 0x90, 0x93, 0x58, 0xF0, 0x90, 0x93, -0x3D, 0xF0, 0x90, 0x93, 0x56, 0xF0, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x93, 0x44, 0xF0, 0x90, 0x93, -0x51, 0xF0, 0x90, 0x93, 0x4A, 0xF0, 0x90, 0x93, 0x46, 0xF0, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x93, -0x49, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, -0x36, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x93, 0x39, 0xF0, 0x22, 0xEF, 0x60, 0x5F, 0xAF, 0x05, -0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x93, -0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x30, 0xE0, 0x6B, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xE0, 0x25, 0xE0, 0x25, -0xE0, 0xFF, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, -0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xAF, 0x05, 0x74, -0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x19, -0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, -0xE0, 0x0C, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x22, 0x90, -0x93, 0x15, 0xE0, 0x30, 0xE0, 0x22, 0x90, 0x93, 0x26, 0xE0, 0x60, 0x09, 0x90, 0x01, 0xB9, 0x74, -0x40, 0xF0, 0x02, 0x49, 0x29, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x02, 0x80, 0x2F, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x67, 0x80, 0x5D, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, -0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, -0xB9, 0x74, 0x02, 0xF0, 0x80, 0x53, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, -0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x42, 0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, -0x08, 0xF0, 0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, -0x28, 0x90, 0x93, 0x42, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, -0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, -0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, -0x00, 0x22, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0xE0, -0x54, 0xC0, 0x70, 0x18, 0x90, 0x93, 0x51, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x14, 0x12, 0x52, 0x17, 0x80, 0x0F, 0x90, 0x93, 0x3D, 0xE0, -0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x5D, 0xE0, 0x30, -0xE6, 0x1B, 0x43, 0x66, 0x01, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, -0x0C, 0x60, 0x13, 0x12, 0x51, 0x48, 0x80, 0x0E, 0x12, 0x50, 0x77, 0x80, 0x09, 0x90, 0x93, 0x51, -0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x5D, 0xE0, 0x30, -0xE7, 0x2A, 0x43, 0x66, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, -0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x93, -0x5A, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, -0x8E, 0x25, 0x8F, 0x26, 0xAD, 0x26, 0xAC, 0x25, 0xAF, 0x24, 0x12, 0x47, 0xEB, 0xAF, 0x26, 0xAE, -0x25, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, -0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x8F, 0x68, 0x8D, 0x69, 0xE5, 0x68, 0x54, 0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, -0xE5, 0x68, 0x30, 0xE2, 0x30, 0xE5, 0x63, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0xA1, 0xE5, -0x63, 0x30, 0xE3, 0x10, 0xE5, 0x68, 0x20, 0xE3, 0x0B, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x53, 0x12, -0x51, 0xD4, 0x80, 0x4E, 0xE5, 0x63, 0x20, 0xE3, 0x49, 0xE5, 0x68, 0x30, 0xE3, 0x44, 0xAF, 0x69, -0x12, 0x51, 0x86, 0x80, 0x3D, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x68, 0x20, -0xE3, 0x09, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x2A, 0x12, 0x51, 0xD4, 0xE5, 0x63, 0x54, 0x0F, 0xFF, -0xBF, 0x04, 0x0E, 0xE5, 0x68, 0x20, 0xE2, 0x09, 0x12, 0x48, 0x8F, 0xEF, 0x60, 0x14, 0x12, 0x51, -0x1F, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4B, 0xF7, 0xEF, 0x60, 0x03, 0x12, -0x52, 0x04, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x02, 0x4B, 0x35, 0x02, 0x52, 0xF4, 0xE4, 0x93, 0xA3, -0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, -0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, -0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, -0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4F, 0x75, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, -0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, -0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, -0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, -0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x7D, -0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, 0x01, 0x36, -0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, -0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x4A, 0x65, 0x90, 0x06, -0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, -0x74, 0x7B, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, -0x03, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, -0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4F, 0x28, 0xE5, 0x62, 0x20, 0xE0, -0x05, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0x22, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x10, 0x12, 0x51, -0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x5C, 0xE5, 0x14, -0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x50, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, -0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x3F, 0x90, 0x02, 0x87, 0xE0, 0x60, -0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x31, 0x90, 0x01, 0xAF, 0xE0, 0x60, 0x02, 0x80, -0x07, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, -0x90, 0x93, 0x43, 0xE0, 0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, -0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, -0x7F, 0x00, 0x22, 0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, 0x64, -0x02, 0x60, 0x06, 0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, 0x40, -0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x93, 0x57, 0xF0, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x07, 0x90, -0x93, 0x57, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x93, 0x40, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xEF, 0xF0, -0x90, 0x93, 0x42, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x58, -0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, -0x02, 0xF0, 0x53, 0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, -0x03, 0x12, 0x49, 0x32, 0x22, 0x90, 0x93, 0xB1, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, -0x90, 0x93, 0xB1, 0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0x7D, 0x40, 0x7F, 0x93, 0x12, 0x54, -0x0A, 0x90, 0x00, 0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x28, -0xE0, 0x54, 0xFC, 0xFD, 0x7F, 0x28, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, -0x7F, 0x08, 0x12, 0x54, 0x0A, 0x7F, 0x01, 0x12, 0x4E, 0x81, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, -0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, -0x54, 0x0A, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x54, 0x0A, 0x7F, 0x14, -0x7E, 0x00, 0x02, 0x3B, 0x09, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x93, 0x1A, 0xE0, -0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x49, 0x12, -0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, -0x93, 0x55, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x52, -0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, 0xD3, -0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, -0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, -0x22, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xC8, 0x12, 0x44, 0xF1, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, -0x12, 0x1E, 0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, -0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, -0x1F, 0x0F, 0xFD, 0xE4, 0xFF, 0x12, 0x50, 0x39, 0x80, 0x29, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x50, 0x39, 0x1F, 0x80, 0x14, 0x90, -0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x50, -0x39, 0xE4, 0xFF, 0x12, 0x4B, 0x7A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x24, -0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, -0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x27, 0x74, 0xFF, 0xF0, 0x12, 0x5E, -0x42, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x1F, 0x12, 0x49, -0xD0, 0x90, 0x05, 0x22, 0xE5, 0x27, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, 0x01, -0x12, 0x58, 0x1F, 0x12, 0x49, 0xD0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x8F, 0x6C, 0xE4, 0x90, 0x94, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, -0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6C, 0x60, 0x3E, 0xC3, 0x90, 0x94, 0x45, 0xE0, 0x94, -0x88, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, -0x22, 0x90, 0x94, 0x44, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, -0x3B, 0x09, 0xD3, 0x90, 0x94, 0x45, 0xE0, 0x94, 0x32, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x00, 0x40, -0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, 0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, -0x7F, 0x20, 0x12, 0x54, 0x0A, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, -0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, -0x28, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x54, 0x0A, -0xE4, 0xFF, 0x12, 0x4E, 0x81, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, -0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x54, 0x0A, 0xE4, 0xFF, 0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, -0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, -0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, -0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, 0x4E, 0xE0, 0x9D, 0x90, 0x93, 0x4D, -0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xA3, 0xE0, -0x90, 0x05, 0x58, 0xF0, 0x22, 0x48, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x48, 0x93, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0x9F, 0x00, 0x41, -0x93, 0xAE, 0x00, 0x41, 0x93, 0x94, 0x00, 0x41, 0x94, 0x4C, 0x00, 0x41, 0x93, 0x13, 0x00, 0x41, -0x93, 0x14, 0x00, 0x41, 0x92, 0x69, 0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, 0x41, -0x94, 0x3D, 0x00, 0x41, 0x94, 0x4A, 0x00, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0x56, 0x74, 0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x94, 0x31, 0x12, -0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x94, 0x31, 0x12, -0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, -0x7E, 0x08, 0x12, 0x34, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, -0x02, 0x80, 0x35, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x2E, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, -0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x9B, 0x40, 0x90, 0x93, 0x59, 0xE0, -0x60, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0D, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, -0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, -0x24, 0x02, 0x70, 0x32, 0x80, 0x0A, 0x90, 0x93, 0x57, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x40, 0xF0, -0xE4, 0x90, 0x93, 0x5C, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x50, 0xE0, 0x90, 0x93, 0x57, -0xF0, 0x80, 0x05, 0x90, 0x93, 0x57, 0xED, 0xF0, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, 0xF0, -0x90, 0x93, 0x5C, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, -0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, -0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, -0xF0, 0x90, 0x93, 0x52, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x0C, 0x50, 0x03, 0x12, -0x4A, 0x65, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, -0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x3E, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, -0xFF, 0x74, 0x40, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, -0xF9, 0x90, 0x93, 0x54, 0xF0, 0xEE, 0x90, 0x93, 0x53, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x93, -0xB0, 0xE0, 0x90, 0x94, 0x35, 0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0xB0, 0xE0, 0x90, 0x94, 0x35, -0x60, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, -0x01, 0x10, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x35, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x55, 0x6B, 0x90, -0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x5E, 0x42, 0xEF, 0x70, -0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x12, 0x54, -0x62, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x90, 0x93, 0x46, 0xE0, 0x70, 0x1A, 0x90, 0x04, -0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, 0x1F, 0x8E, 0x6A, -0x8F, 0x6B, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x16, 0x90, -0x93, 0x4A, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x44, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, -0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, -0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x0C, -0x22, 0x90, 0x94, 0x4D, 0xEF, 0xF0, 0x12, 0x98, 0x56, 0x90, 0x94, 0x4D, 0xE0, 0x60, 0x05, 0x90, -0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, -0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, -0x02, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x05, -0x7F, 0x01, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0xE5, 0x64, 0x30, 0xE6, -0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, -0x53, 0x64, 0xBF, 0x22, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0xE5, 0x12, 0x4E, 0xD9, -0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x7D, 0x01, 0xAF, 0x64, 0x02, 0x4A, 0x69, 0x90, 0x02, -0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, 0x43, -0xF7, 0x52, 0x49, 0x00, 0x40, 0x52, 0x71, 0x00, 0x80, 0x52, 0x9C, 0x01, 0x00, 0x52, 0xB0, 0x02, -0x00, 0x52, 0xC8, 0x04, 0x00, 0x00, 0x00, 0x52, 0xE5, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, 0xFF, -0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, 0xCE, -0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x80, -0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, 0x2D, -0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x07, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, 0xFE, -0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, 0x35, -0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, 0x2D, -0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, 0xFF, -0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, 0x00, -0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x21, 0xF0, -0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x75, 0xF0, 0xA3, 0xF0, 0xF1, 0x9F, 0x75, 0x8E, 0x02, -0xB1, 0x34, 0xF1, 0xBF, 0x90, 0x93, 0xB1, 0xEF, 0xF0, 0xF1, 0xA7, 0x90, 0x93, 0xB3, 0xEF, 0xF0, -0x12, 0x60, 0x3E, 0x90, 0x93, 0x95, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x14, 0xF5, 0x09, -0xF5, 0x62, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x88, 0x77, -0x12, 0x47, 0x33, 0x12, 0x37, 0x1C, 0xF1, 0xB3, 0x71, 0xE1, 0x12, 0x60, 0x02, 0xF1, 0xD2, 0xF1, -0x98, 0x12, 0x60, 0x20, 0x12, 0x44, 0xFD, 0x12, 0x60, 0xAC, 0xB1, 0x1C, 0x90, 0x93, 0x77, 0xE5, -0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x52, 0x75, 0xE8, 0x03, -0x43, 0xA8, 0x85, 0x12, 0x96, 0x12, 0xD2, 0xAF, 0x51, 0xEA, 0x12, 0x60, 0x56, 0x90, 0x93, 0x75, -0xE0, 0x64, 0x01, 0xF0, 0x24, 0xF4, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, 0xA3, 0xF0, 0xE5, 0x14, -0x30, 0xE0, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0xFE, 0xB1, 0x44, 0xD2, 0xAF, 0xE5, 0x14, 0x30, 0xE4, -0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xEF, 0xD2, 0xAF, 0x12, 0x6F, 0xCE, 0xE5, 0x14, 0x30, 0xE6, 0x0A, -0xC2, 0xAF, 0x53, 0x14, 0xBF, 0xD2, 0xAF, 0x12, 0x80, 0x74, 0xE5, 0x14, 0x30, 0xE7, 0x09, 0xC2, -0xAF, 0x53, 0x14, 0x7F, 0xD2, 0xAF, 0xB1, 0xD2, 0xC2, 0xAF, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0xBF, -0x01, 0x0D, 0x90, 0x93, 0x43, 0x74, 0x01, 0xF0, 0x51, 0x17, 0xE4, 0x90, 0x93, 0x43, 0xF0, 0xD2, -0xAF, 0x90, 0x01, 0xBD, 0xE5, 0x63, 0xF0, 0x90, 0x93, 0x59, 0xE0, 0x90, 0x01, 0xBC, 0xF0, 0x80, -0x8C, 0x90, 0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x91, 0x0A, 0x7D, 0xFF, 0x7F, 0x55, 0x91, 0x0A, -0x7D, 0xFF, 0x7F, 0x56, 0x91, 0x0A, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x91, 0x52, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x91, 0x0A, 0xE4, 0xFD, 0x7F, 0x51, 0x91, 0x0A, 0xE4, -0xFD, 0x7F, 0x52, 0x91, 0x0A, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0x90, 0x00, 0x02, 0xE0, 0x44, -0x01, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xF2, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x00, 0x00, 0x90, 0x93, 0xF6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x02, -0xE0, 0x54, 0xFE, 0xF0, 0x91, 0x52, 0x91, 0x4B, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x90, -0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, -0xF0, 0x90, 0x93, 0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x3D, -0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x56, 0xF0, 0xFF, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, -0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, 0xEC, 0x54, 0xFD, 0xFC, 0x90, 0x93, -0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, -0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x22, 0xE4, 0xFF, 0x11, -0xEB, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xF6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, -0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xF6, 0xB1, 0x67, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, -0x93, 0x51, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x94, 0x3E, 0xE0, -0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x94, 0x40, 0xF0, 0x90, 0x94, 0x3E, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, -0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, -0x7F, 0x80, 0x81, 0x0A, 0xE4, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x6B, 0x12, 0x73, 0x70, 0xEF, 0xB4, -0x02, 0x14, 0x90, 0x94, 0x4A, 0xE0, 0x64, 0x04, 0x60, 0x07, 0x43, 0x14, 0x01, 0xE0, 0x04, 0xF0, -0x22, 0xE4, 0x90, 0x94, 0x4A, 0xF0, 0x22, 0x7F, 0x70, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, 0xEE, 0x44, 0xF0, 0xA3, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, -0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEE, 0xF0, 0x12, 0x1E, 0xF6, -0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, 0x12, 0x96, 0xFC, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x90, 0x93, 0x04, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x16, 0xEF, 0x7B, 0x01, 0xB4, 0x01, -0x06, 0x7A, 0x93, 0x79, 0x0B, 0x80, 0x04, 0x7A, 0x93, 0x79, 0x07, 0x7F, 0x80, 0x7E, 0x08, 0xB1, -0x6B, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x40, 0xEF, 0x60, 0x4E, 0x90, 0x92, -0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, -0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, -0xFA, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0xD0, 0x01, 0xD0, 0x02, 0xD1, 0x31, 0x90, 0x92, 0x69, -0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, -0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x10, 0x12, 0x43, 0xC8, 0x90, 0x92, -0x68, 0xE0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0xF1, 0x40, 0xEF, 0x70, 0x02, 0xC1, 0xEC, 0x90, -0x94, 0x10, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, -0x7A, 0x01, 0x79, 0xA0, 0xD1, 0xF1, 0x90, 0x94, 0x13, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, -0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, -0x23, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0xD1, 0xF1, 0x90, 0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, -0x93, 0xB1, 0xE0, 0x64, 0x01, 0x70, 0x48, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, -0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x20, 0xD1, 0xF1, 0x90, 0x94, -0x13, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, -0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x22, 0xD1, -0xF1, 0x90, 0x93, 0x95, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, -0x92, 0x68, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x94, -0x0A, 0x12, 0x43, 0xC8, 0xAB, 0x20, 0xAA, 0x21, 0xA9, 0x22, 0x90, 0x94, 0x0D, 0x12, 0x43, 0xC8, -0xAF, 0x23, 0x15, 0x23, 0xEF, 0x60, 0x1E, 0x90, 0x94, 0x0D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, -0xB1, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x94, 0x0A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, -0x12, 0x42, 0x53, 0x80, 0xDB, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x94, 0x39, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, -0xF0, 0x90, 0x94, 0x39, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, -0x90, 0x94, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0x3B, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, -0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x3B, 0xE4, 0x75, 0xF0, 0x01, 0x12, -0x42, 0x87, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, 0x7F, 0x01, 0x22, 0x8F, 0x82, -0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0x20, 0xF0, 0x22, 0x90, -0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, -0x7F, 0x01, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0x90, -0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, 0x02, 0x22, 0x7F, -0x00, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, -0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, -0xC4, 0x74, 0xE7, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, -0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, -0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, -0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, -0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, -0x54, 0xEF, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, -0x62, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x67, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x54, 0x3F, 0x25, -0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x68, 0xF0, 0x90, -0x93, 0x67, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xE4, 0xFF, 0x90, 0x94, 0x1C, 0xEF, 0xF0, 0xA3, 0xED, -0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, -0x21, 0xF0, 0xD1, 0x3C, 0xBF, 0x01, 0x02, 0x11, 0xEC, 0x90, 0x94, 0x21, 0xE0, 0x90, 0x05, 0x22, -0xF0, 0x80, 0x02, 0x11, 0xEC, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0xAC, 0xE0, -0xFF, 0x7D, 0x01, 0x11, 0x1F, 0x90, 0x94, 0x1F, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, -0x94, 0x1C, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x94, 0x2B, 0xF0, 0xEF, 0x60, 0x10, -0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0E, -0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, -0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x11, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, 0x16, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x16, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0xAE, 0x05, 0x74, 0x22, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEB, 0xF0, 0x90, 0x94, 0x2B, 0xE0, 0xFF, 0x74, 0x23, 0x2E, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x12, 0x9B, 0x6E, 0x90, 0x93, 0x27, 0xE0, -0x64, 0x01, 0x60, 0x02, 0x41, 0xAE, 0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x18, 0xE0, 0xC3, 0x13, -0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0xA3, -0xE0, 0x90, 0x93, 0x63, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x63, 0xE0, 0x24, 0x03, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x27, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, -0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, -0x90, 0x93, 0x16, 0xE0, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xB9, -0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, -0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x06, 0xF0, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0xA1, 0xAC, 0x90, 0x93, -0x27, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x61, 0x8D, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, -0x3F, 0x30, 0xE0, 0x08, 0xD1, 0x3C, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x62, 0xE4, 0xFF, 0xD1, 0xE6, -0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x1F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, -0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x90, 0x93, 0x63, 0xF0, 0x90, -0x93, 0x1A, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x16, 0xE0, 0x24, 0x03, 0xFF, -0x90, 0x93, 0x63, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0xFF, 0x90, 0x93, 0x64, -0xE0, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x63, 0x74, 0x05, 0xF0, 0xE4, 0xFF, 0xD1, 0x83, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, -0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, -0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x20, 0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, -0x65, 0x60, 0x0D, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0xC1, 0x36, 0x90, 0x93, 0x27, -0xE0, 0x64, 0x03, 0x60, 0x02, 0x81, 0xE1, 0x7F, 0x01, 0xD1, 0xE6, 0x90, 0x93, 0x19, 0xE0, 0xFF, -0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x98, 0x56, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0x81, 0x3D, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x90, 0x93, 0x29, -0xE0, 0xD3, 0x9F, 0x40, 0x4D, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, -0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0x17, 0xE0, 0xD3, 0x9D, -0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0x93, 0x66, 0xF0, 0x80, -0x06, 0x90, 0x93, 0x66, 0x74, 0x03, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x66, 0xE0, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, -0x80, 0x24, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x22, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, -0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x1D, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x27, 0xF0, -0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x29, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, -0x90, 0x93, 0x65, 0xE0, 0xFF, 0x90, 0x93, 0x17, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, -0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x63, -0x74, 0x05, 0xF0, 0x7F, 0x01, 0xD1, 0x83, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, -0xE0, 0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0x93, 0x1A, 0xE0, -0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x02, 0x80, 0x0F, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x08, 0xE5, 0x65, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, -0x69, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, -0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x51, 0x48, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, -0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x7F, 0x01, 0xC1, -0x38, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xA1, 0xB2, 0xF5, 0x48, 0x75, 0x49, 0x03, -0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, -0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, -0x90, 0x93, 0x17, 0xE0, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xB9, -0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, -0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x07, 0xF0, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x90, 0x05, 0x22, 0xE4, -0xF0, 0x22, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x3B, 0x90, 0x93, 0x19, 0xE0, -0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xD1, 0x3C, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x62, -0xE4, 0xFF, 0xD1, 0xE6, 0xD1, 0x83, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, -0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x20, 0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, -0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, -0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x22, 0x90, 0x05, 0x22, 0x74, -0xFF, 0xF0, 0xE4, 0x90, 0x94, 0x48, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, -0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, -0x94, 0x49, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0x48, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, -0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x94, 0x48, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, -0x87, 0x80, 0xC6, 0x90, 0x94, 0x2C, 0xEF, 0xF0, 0x12, 0x9D, 0x17, 0x90, 0x93, 0x18, 0xE0, 0xFF, -0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x08, 0x90, 0x94, 0x2C, 0xE0, 0xFF, 0x12, 0x50, 0xEB, 0x90, -0x94, 0x2D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x90, 0x94, 0x2C, 0xE0, 0xB4, 0x01, 0x10, -0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x80, 0x0A, -0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x94, 0x2D, 0x12, 0x1F, 0xD5, -0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x2D, 0x12, 0x55, 0x67, 0x90, 0x94, 0x2C, -0xE0, 0x90, 0x93, 0x26, 0xF0, 0x22, 0xEF, 0x64, 0x03, 0x60, 0x02, 0xE1, 0xB4, 0x90, 0x94, 0x02, -0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x30, 0xE0, 0x30, 0x90, 0x94, 0x06, 0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0xA3, -0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x41, 0x90, 0x94, 0x02, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, -0x74, 0x55, 0xF0, 0x80, 0x2D, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x17, 0x90, -0x94, 0x02, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, -0xF0, 0xA3, 0x74, 0x5A, 0x80, 0x05, 0x90, 0x94, 0x06, 0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x94, 0x02, 0xE0, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x94, 0x03, 0xE0, 0x90, 0x06, -0xC1, 0xF0, 0x90, 0x94, 0x04, 0xE0, 0x90, 0x06, 0xC2, 0xF0, 0x90, 0x94, 0x05, 0xE0, 0x90, 0x06, -0xC3, 0xF0, 0x90, 0x94, 0x06, 0xE0, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x94, 0x07, 0xE0, 0x90, 0x06, -0xC5, 0xF0, 0x90, 0x94, 0x08, 0xE0, 0x90, 0x06, 0xC6, 0xF0, 0x90, 0x94, 0x09, 0xE0, 0x90, 0x06, -0xC7, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, -0x17, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEF, 0x90, -0x06, 0xCC, 0xB4, 0x01, 0x03, 0xE4, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x57, 0xE7, 0xBF, -0x01, 0x0F, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x1F, 0x90, 0x04, 0x1F, 0x74, 0x20, -0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, 0xE0, 0x02, -0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90, 0x01, 0x30, -0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B, 0xF0, 0x22, -0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x43, 0x32, 0x20, 0x90, -0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, 0x22, 0x90, 0x93, -0xB3, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, -0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, -0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, -0x79, 0xE0, 0x94, 0x88, 0x90, 0x93, 0x78, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, -0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x78, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, -0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x78, 0xE0, -0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x01, 0xE0, -0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, -0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, -0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, -0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, -0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x93, 0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, -0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07, 0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3C, 0x90, 0x93, -0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D, 0xF0, 0x79, 0x40, 0x90, 0x93, 0x5D, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0x9F, -0xF0, 0x22, 0x90, 0x93, 0x9F, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0C, 0xE4, 0xF0, -0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x5F, 0xCC, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, -0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, -0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x4B, 0xF0, 0x74, 0x61, -0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28, 0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, -0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0, 0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, -0x02, 0x61, 0x45, 0x90, 0x01, 0x34, 0x74, 0x01, 0xF0, 0x85, 0xD1, 0x0A, 0x85, 0xD3, 0x0C, 0x85, -0xD4, 0x0D, 0x85, 0xD5, 0x0E, 0x85, 0xD6, 0x0F, 0x85, 0xD7, 0x10, 0x85, 0xD9, 0x11, 0x85, 0xD2, -0x0B, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x0A, 0x75, 0x23, 0x08, 0xFB, 0x7A, 0x93, -0x79, 0xA0, 0x12, 0x56, 0xF1, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, -0xC4, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x70, 0x02, 0x41, 0xF0, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x41, 0xF0, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, -0x93, 0xA2, 0xE0, 0x54, 0x3F, 0xF5, 0x4E, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, -0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, -0x87, 0xE5, 0x4E, 0xD3, 0x94, 0x04, 0x40, 0x03, 0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, -0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, -0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, -0x9C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xA1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, -0x2F, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, -0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFF, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x67, 0xAF, 0x4D, 0x12, 0x7A, 0xB3, 0x80, 0x60, -0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x53, 0x90, 0x93, 0xA4, -0xE0, 0x54, 0x1F, 0xFF, 0xFD, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, -0xF5, 0x83, 0xE4, 0x8D, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFE, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0xEE, 0x54, 0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, -0x12, 0x7A, 0x4F, 0x80, 0x1B, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, -0x04, 0x30, 0xE0, 0xB4, 0x01, 0x0A, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, -0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x46, 0x90, 0x93, 0x59, 0xE0, 0x60, 0x37, 0x90, -0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, -0x70, 0x2D, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, -0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, -0x90, 0x93, 0x55, 0xF0, 0x80, 0x09, 0x12, 0x51, 0xBB, 0xBF, 0x01, 0x03, 0x12, 0x52, 0x17, 0x90, -0x94, 0x4B, 0xE0, 0x04, 0xF0, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0xE7, 0x90, 0x01, 0x34, 0x74, -0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, 0x0B, 0x75, -0x4F, 0x88, 0x75, 0x50, 0x0F, 0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, 0x75, 0x50, 0x08, -0x75, 0x51, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x12, 0x90, 0x04, 0x7E, 0xE0, 0x55, -0x51, 0xF5, 0x13, 0x65, 0x12, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x12, 0x75, 0xF0, 0x08, 0xA4, 0x25, -0x4F, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x15, 0x2F, -0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x15, -0x75, 0x23, 0x08, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x97, 0x12, 0x56, 0xF1, 0x90, 0x93, 0x97, 0xE0, -0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0x6A, 0xE5, 0x12, 0x24, 0x01, -0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, 0x12, 0x90, -0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x13, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, -0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x14, 0x10, -0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, -0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x54, 0x1F, 0x90, -0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x54, 0x52, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x06, -0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x81, 0xF1, 0x90, 0x93, 0xB2, -0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, -0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x12, 0x45, 0x09, 0x90, -0x93, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xE6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, -0x12, 0x50, 0xEB, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0xFF, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9F, 0x40, 0x30, 0xE0, 0x54, 0xFE, -0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x90, 0x93, 0x32, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, -0xC9, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2E, 0x12, 0x43, 0x84, 0x90, 0x81, -0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x80, 0x1C, 0x90, 0x93, 0x2D, -0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0xFE, -0x25, 0xE0, 0x4F, 0xF0, 0x80, 0x03, 0x12, 0x6B, 0x41, 0x12, 0x6B, 0x0A, 0x90, 0x93, 0xB2, 0xE4, -0xF0, 0xE5, 0x2E, 0x30, 0xE1, 0x45, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x43, 0x14, 0x40, 0x12, -0x9D, 0x70, 0x11, 0xDC, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x1D, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, -0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, -0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, 0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, -0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x43, -0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x12, 0x4C, 0x73, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x34, 0x90, -0x93, 0x57, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x57, 0xE0, 0x90, -0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, -0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x40, -0xE0, 0x14, 0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x62, -0x64, 0x01, 0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, -0x74, 0x02, 0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, -0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, -0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, 0x60, 0x1C, -0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x5A, 0xE4, 0xF0, -0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2E, 0x30, 0xE5, -0x25, 0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x1A, 0xE5, 0x65, 0x60, 0x16, -0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x08, 0x12, 0x51, -0x48, 0x80, 0x03, 0x12, 0x50, 0x77, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, -0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, 0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, 0x66, 0x54, -0x07, 0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2F, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x37, 0x74, 0x02, -0xF0, 0x12, 0x4F, 0xFA, 0x74, 0x4B, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, -0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, -0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x5D, 0xE0, 0x54, 0xF0, -0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x15, 0x90, 0x94, -0x19, 0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x5D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x94, 0x16, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, -0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x92, 0x69, 0xE0, 0x70, 0x06, 0xA3, -0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, -0x12, 0x57, 0x40, 0xEF, 0x60, 0x72, 0x12, 0x55, 0xD2, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x90, -0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xA8, 0x01, -0xFC, 0x7D, 0x01, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x7E, 0x00, 0x7F, 0x02, 0x12, 0x1E, 0xD0, -0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, -0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0x19, 0x12, 0x43, 0xA8, 0x8B, 0x20, -0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, -0x0F, 0xF5, 0x23, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x56, 0xF1, 0x90, 0x92, 0x6A, 0xE0, -0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0x90, -0x93, 0x63, 0xE0, 0x54, 0xF0, 0x44, 0x05, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x65, -0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x65, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, -0x79, 0x63, 0xC1, 0x89, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x09, 0xF0, 0x54, -0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x6E, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, -0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0xC1, 0x89, 0x90, 0x93, 0x8F, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x92, 0xE0, 0x54, 0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, -0x93, 0x8F, 0x12, 0x43, 0xA8, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, -0x92, 0xC1, 0x89, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0D, 0xF0, 0x54, 0x0F, 0x44, 0x10, -0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, -0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0xC1, 0x89, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, -0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x7D, 0xDB, 0x90, 0x01, -0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, -0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, -0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, -0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, -0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, -0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, -0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, -0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, -0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, -0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, -0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, -0x56, 0x00, 0x90, 0x01, 0xC4, 0x74, 0x82, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, -0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, -0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34, 0x30, 0xE0, 0x06, 0x90, 0x01, -0x3C, 0x74, 0x01, 0xF0, 0xE5, 0x34, 0x30, 0xE1, 0x10, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x46, 0x79, 0xE5, 0x34, 0x30, 0xE2, 0x36, 0x90, 0x01, -0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, -0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x55, 0xE4, -0xF0, 0x12, 0x52, 0x17, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0x90, -0x06, 0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, -0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, -0x06, 0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x52, 0xE4, 0xF0, 0x12, 0x52, 0x17, 0xE5, -0x34, 0x30, 0xE4, 0x34, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x30, 0xE0, -0x24, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x07, 0x78, 0x74, -0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, -0x12, 0x34, 0x30, 0x80, 0x03, 0x12, 0x59, 0x97, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, -0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, -0x83, 0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, 0x64, 0xF0, 0x12, 0x51, 0xEC, 0x12, 0x52, 0x17, -0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, -0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, 0xAE, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, -0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x06, -0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0xE5, 0x36, 0x30, 0xE1, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x02, -0xF0, 0xE5, 0x36, 0x30, 0xE3, 0x08, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xD1, 0x43, 0xE5, 0x36, -0x30, 0xE4, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x76, 0x90, 0x01, -0x3E, 0x74, 0x04, 0xF0, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE7, 0x13, 0x74, 0x80, 0xF0, 0x90, 0x07, -0x95, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, -0x8F, 0xE0, 0x30, 0xE6, 0x12, 0x74, 0x40, 0xF0, 0x90, 0x07, 0x7C, 0xE0, 0xB4, 0x06, 0x08, 0x90, -0x07, 0x80, 0xE0, 0xFF, 0x12, 0x67, 0x3D, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE5, 0x14, 0x74, 0x20, -0xF0, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, -0x01, 0xF0, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE2, 0x0D, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, -0xF0, 0x7F, 0x01, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE0, 0x07, 0x74, 0x01, 0xF0, -0xFF, 0x12, 0x55, 0xB2, 0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, -0x36, 0x30, 0xE6, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, -0x01, 0x3E, 0x74, 0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, -0x43, 0x14, 0x80, 0xE5, 0x37, 0x30, 0xE4, 0x1C, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x44, -0x24, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, -0x71, 0x41, 0x71, 0x0A, 0x74, 0x82, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, -0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, -0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x94, 0x3E, 0xE0, 0x30, 0xE0, -0x2F, 0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x94, 0x3D, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, -0x90, 0x94, 0x40, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x3D, 0xF0, 0x90, 0x94, 0x40, 0xE0, 0xFF, -0x90, 0x94, 0x3F, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x44, 0xFE, 0xE4, 0x90, 0x94, 0x40, 0xF0, -0x22, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x6F, 0x7F, 0x01, 0x12, 0x5E, 0xE6, 0x90, 0x93, 0x19, -0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x98, 0x56, 0x7F, 0x01, 0x12, 0x5E, -0x83, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x29, 0x90, 0x93, 0x15, 0xE0, -0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, -0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, -0x7F, 0x0C, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x4C, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, 0x74, 0x6F, -0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, -0xE0, 0x05, 0x7F, 0x01, 0x12, 0x55, 0xB2, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, -0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, -0x05, 0xC0, 0x06, 0xC0, 0x07, 0x53, 0x91, 0xBF, 0x90, 0xFD, 0x68, 0xE0, 0x20, 0xE0, 0x02, 0xC1, -0x28, 0x90, 0x93, 0x94, 0xE0, 0x70, 0x16, 0x90, 0x00, 0x2E, 0xE0, 0x90, 0x93, 0x0F, 0xF0, 0x90, -0x00, 0x2D, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x94, 0x74, 0x01, 0xF0, 0x90, 0xFD, 0x60, -0xE0, 0x54, 0x3F, 0xD3, 0x94, 0x09, 0x50, 0x03, 0x12, 0x99, 0xB4, 0x90, 0xFD, 0x60, 0xE0, 0x64, -0x0E, 0x60, 0x02, 0x81, 0xB9, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, -0xE0, 0x02, 0x81, 0xB9, 0x90, 0xFD, 0x62, 0xE0, 0x54, 0xC0, 0xFE, 0x90, 0x07, 0x90, 0xE0, 0x54, -0x3F, 0x4E, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x07, 0x91, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, -0x07, 0x92, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x07, 0x93, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x01, -0xF0, 0xEF, 0x20, 0xE0, 0x44, 0x90, 0x93, 0x04, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x19, -0x90, 0x07, 0x78, 0x12, 0x58, 0x7F, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x49, -0x90, 0x07, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x80, 0x40, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, -0x30, 0xE0, 0x11, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, -0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, 0x78, 0x80, 0x14, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, -0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x12, 0x58, 0x7F, 0x80, 0x0C, 0xE0, 0x44, 0x10, -0xF0, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x0F, 0x0A, -0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD1, 0x89, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x15, -0x70, 0x76, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6A, 0xF0, 0xE0, 0x30, 0xE6, 0x1C, 0xF4, 0x54, -0x3F, 0x04, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9F, 0x90, 0x93, 0x69, -0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x20, 0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, -0x54, 0x3F, 0xFF, 0x90, 0x93, 0x6A, 0xE0, 0x54, 0x3F, 0x2F, 0x90, 0x93, 0x69, 0xF0, 0xD3, 0x94, -0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0x93, 0x69, 0xE0, 0xFF, 0x90, 0x01, 0xE7, 0xF0, 0xEF, -0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x69, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, -0x90, 0x93, 0x6B, 0xF0, 0x90, 0x00, 0x2E, 0xF0, 0xEE, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x93, 0x10, -0xE0, 0x54, 0x0F, 0x4F, 0x90, 0x00, 0x2D, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x21, 0x08, 0x90, -0xFD, 0x62, 0xE0, 0xFF, 0x12, 0x67, 0x64, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x22, 0x02, 0xD1, 0x61, -0x90, 0xFD, 0x60, 0xE0, 0x64, 0x23, 0x70, 0x7B, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x2C, 0x30, -0xE0, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE1, 0x5B, -0x90, 0x93, 0x2D, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x60, 0x7E, -0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x32, 0x12, 0x1F, 0xC9, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x7F, -0x70, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x2E, 0x12, 0x1F, 0xC9, 0x90, 0x81, 0x57, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x01, 0xBE, -0xE0, 0x04, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x2D, 0x30, 0xE2, 0x08, 0xE0, 0x54, 0x1F, -0x44, 0x20, 0xF0, 0x80, 0x06, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0xFF, -0x12, 0x9A, 0x20, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x24, 0x03, 0x12, 0x67, 0xB3, 0x90, 0xFD, 0x60, -0xE0, 0xB4, 0x25, 0x13, 0x90, 0xFD, 0x62, 0xE0, 0x60, 0x0D, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x01, -0xF0, 0x90, 0x93, 0x24, 0x74, 0x04, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x26, 0x05, 0x7F, 0x01, -0x12, 0x9A, 0xBC, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x30, 0x07, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0xD1, -0xB4, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, -0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, -0xD0, 0xE0, 0x32, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, -0x93, 0x1C, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, -0x22, 0x90, 0x00, 0x75, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, -0xFE, 0x13, 0x74, 0x03, 0xF0, 0x7F, 0x02, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0xE4, -0xF0, 0x90, 0x00, 0x75, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xAE, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, -0xF0, 0x44, 0x04, 0xF0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x6E, 0xEE, 0xF0, 0xA3, 0xED, -0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, -0x6C, 0x02, 0x66, 0x89, 0xAC, 0x07, 0x90, 0x93, 0xD9, 0xE0, 0x44, 0x0F, 0xF0, 0x54, 0x0F, 0x44, -0x70, 0xF0, 0x90, 0x93, 0xDB, 0xEC, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0xDC, -0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0x93, 0xDD, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0xDE, -0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xDF, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0xE0, -0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0xE1, 0xF0, 0x80, 0x11, 0x90, 0x93, 0xDC, 0xED, 0xF0, -0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, -0x79, 0xDB, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0xD9, 0x02, 0x66, 0x89, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x83, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x1F, 0x0F, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x85, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x86, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, -0x0F, 0x90, 0x93, 0x87, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, -0x14, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x7F, 0x30, 0xF1, 0x84, 0x90, 0x93, 0x83, 0xE0, 0xFB, -0x7D, 0x01, 0xE4, 0x80, 0x07, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0xB4, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x8A, 0x12, 0x43, -0xC8, 0xE4, 0xFE, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x2F, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0xEE, -0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x8E, 0x82, 0x75, 0x83, 0x00, -0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, -0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x78, 0xF0, 0x90, -0x93, 0x78, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x71, 0x18, 0x90, 0x94, 0x4C, 0xE0, 0xFF, 0x74, 0x01, -0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, -0x5D, 0x70, 0x02, 0x21, 0x11, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, -0x43, 0x9C, 0xE0, 0x90, 0x93, 0x79, 0xF0, 0x75, 0x20, 0x01, 0x75, 0x21, 0x93, 0x75, 0x22, 0x79, -0x75, 0x23, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7A, 0x12, 0x56, 0xF1, 0x90, 0x93, 0x7A, 0xE0, -0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x94, 0x4C, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, -0x02, 0x90, 0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4C, 0xE0, -0x75, 0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, -0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, -0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x7E, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x7F, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, -0xE0, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, -0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, -0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0x7B, 0x31, 0x1D, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x90, 0x94, 0x4C, 0xE0, 0xFE, 0x74, -0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, 0x78, 0xF0, -0x90, 0x94, 0x4C, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, -0x90, 0x01, 0xCC, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x02, 0x6F, -0xDF, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x80, -0x12, 0x43, 0xC8, 0xEF, 0x12, 0x43, 0xD1, 0x71, 0xC1, 0x01, 0x71, 0xB8, 0x02, 0x72, 0x09, 0x03, -0x72, 0x12, 0x05, 0x72, 0x1B, 0x06, 0x73, 0x5D, 0x07, 0x72, 0x23, 0x0B, 0x72, 0x2C, 0x10, 0x72, -0x34, 0x11, 0x72, 0x3C, 0x12, 0x72, 0x44, 0x16, 0x72, 0x4E, 0x17, 0x72, 0x58, 0x18, 0x72, 0x62, -0x19, 0x73, 0x29, 0x1B, 0x73, 0x32, 0x1C, 0x72, 0x6B, 0x1D, 0x72, 0x75, 0x1E, 0x72, 0x80, 0x21, -0x72, 0x89, 0x22, 0x72, 0x92, 0x23, 0x72, 0x9B, 0x24, 0x72, 0xA4, 0x25, 0x72, 0xAD, 0x26, 0x72, -0xB6, 0x27, 0x72, 0xBF, 0x28, 0x72, 0xC8, 0x29, 0x71, 0xCA, 0x2D, 0x71, 0xD3, 0x2E, 0x72, 0xD1, -0x2F, 0x73, 0x3B, 0x30, 0x72, 0xE2, 0x32, 0x72, 0xD9, 0x33, 0x71, 0xE5, 0x34, 0x72, 0xEB, 0x36, -0x72, 0xF4, 0x37, 0x72, 0xFD, 0x38, 0x73, 0x05, 0x3A, 0x71, 0xDC, 0x3B, 0x73, 0x0E, 0x3E, 0x73, -0x17, 0x3F, 0x73, 0x20, 0x41, 0x73, 0x44, 0x46, 0x71, 0xEE, 0x47, 0x72, 0x00, 0x48, 0x71, 0xF7, -0x49, 0x73, 0x4D, 0x4B, 0x00, 0x00, 0x73, 0x56, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8B, -0x8F, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8B, 0x95, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, -0x02, 0x8C, 0x76, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8C, 0xBE, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x02, 0x8C, 0xF7, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0x29, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0x2F, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0xEF, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0xE2, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x8E, 0x00, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0x71, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x81, 0x2E, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0xBE, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x61, 0x5E, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x61, 0x64, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x61, 0x6A, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x01, 0x80, 0x2F, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x7F, 0x02, 0x80, 0x25, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x03, -0x80, 0x1B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x2A, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0xE4, 0xFF, 0x80, 0x08, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x04, 0x02, 0x8E, 0x48, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x62, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x8F, 0x7B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x94, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x8F, 0xAD, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xC6, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x02, 0x8F, 0xDF, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xF8, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x11, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, -0x2A, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x81, 0x1F, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x90, 0x52, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x6B, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x90, 0x84, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x37, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x61, 0xFD, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x49, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0x75, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0x8E, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0xC9, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x8A, 0xB6, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0x9D, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x99, 0x80, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x6F, 0x1F, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x02, 0x96, 0xEA, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x05, -0x7F, 0x0B, 0x80, 0x10, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0A, 0x7D, 0x01, 0x7F, 0x0D, 0x80, 0x04, -0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x41, 0x12, 0x43, -0xC8, 0xE4, 0xFE, 0x90, 0x00, 0xA3, 0xE0, 0x54, 0xF8, 0x44, 0x05, 0xF0, 0x90, 0x00, 0xA0, 0xE0, -0x54, 0x0F, 0x64, 0x04, 0x70, 0x5A, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x49, 0x90, 0xFD, 0x50, -0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0x94, 0x41, 0x12, 0x43, 0xA8, -0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0F, 0x74, 0x52, -0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0x90, 0xFD, 0x58, -0x74, 0x01, 0xF0, 0xFF, 0x80, 0x12, 0x90, 0x01, 0x43, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, 0x08, -0x90, 0x01, 0x42, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x83, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, -0x01, 0x7F, 0x23, 0x71, 0x74, 0xEF, 0xB4, 0x03, 0x05, 0x7F, 0xFF, 0x12, 0x9A, 0x20, 0x22, 0x12, -0x1E, 0xF6, 0xFF, 0xE9, 0x24, 0x01, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x04, 0x61, 0x74, 0x90, 0x00, -0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, -0xAF, 0x06, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, -0x93, 0x88, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x86, 0x12, -0x43, 0x9C, 0xAD, 0x82, 0xAC, 0x83, 0x90, 0x93, 0x8A, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, -0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x0F, 0xFF, -0x90, 0x93, 0x8C, 0x12, 0x43, 0xA8, 0xEF, 0x12, 0x42, 0x53, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x8C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, -0xEF, 0x12, 0x42, 0x65, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, -0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, -0x1E, 0xF6, 0x8D, 0x82, 0x8C, 0x83, 0xA3, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFE, 0x90, 0x93, 0x83, -0xE0, 0xFF, 0x24, 0xC2, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x84, -0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x75, 0xF0, -0x09, 0xEF, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, -0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x8F, 0x57, 0xEF, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, 0x57, -0x75, 0xF0, 0x02, 0xA4, 0x24, 0x02, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, -0x89, 0x5C, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, 0x85, -0x83, 0x5D, 0x8F, 0x5E, 0xE5, 0x57, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, -0xF0, 0x75, 0x5F, 0x01, 0xF5, 0x60, 0x89, 0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, -0x89, 0xF5, 0x83, 0xE0, 0x12, 0x43, 0xD1, 0x75, 0xBC, 0x00, 0x75, 0xD1, 0x01, 0x75, 0xE6, 0x02, -0x75, 0xFB, 0x03, 0x76, 0x24, 0x04, 0x76, 0x39, 0x05, 0x76, 0x4E, 0x06, 0x76, 0x74, 0x0C, 0x76, -0xA1, 0x0D, 0x76, 0xCE, 0x0E, 0x76, 0xFB, 0x0F, 0x00, 0x00, 0x77, 0x2F, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, -0x3C, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, -0xF0, 0xA3, 0x74, 0x10, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, -0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x57, -0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, -0x8F, 0xF0, 0xE1, 0x2F, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF5, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x57, -0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, -0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xE1, 0x2F, 0x90, 0x04, 0x47, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, -0x53, 0x90, 0x04, 0x46, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, -0x65, 0x90, 0x04, 0x45, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, 0xE1, -0x26, 0x90, 0x04, 0x4B, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, -0x4A, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, -0x49, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, -0x4F, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, 0x85, -0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, -0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, 0x85, -0x58, 0x83, 0xF0, 0x90, 0x04, 0x50, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, -0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x12, 0x1E, 0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, -0x42, 0x53, 0xAB, 0x5A, 0xE5, 0x5C, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, 0xC0, -0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, 0x01, -0x12, 0x1F, 0x0F, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, 0x82, -0x85, 0x58, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xE0, -0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xC0, -0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, -0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x4C, 0x90, 0x93, 0x8F, 0x74, 0x0B, 0xF0, 0x90, -0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x78, 0x75, 0x74, 0x01, 0x7E, 0x00, -0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, -0x4E, 0x60, 0x0A, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x8F, -0xE0, 0x14, 0xF0, 0x80, 0xBA, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x47, 0x90, 0x93, 0x8F, 0x74, 0x0F, 0xF0, 0x90, -0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, -0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, -0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, -0x90, 0x93, 0x8F, 0xE0, 0xA3, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0x8F, 0xE0, 0x14, 0xF0, 0x80, 0xBF, -0xE4, 0x90, 0x93, 0x90, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, -0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, 0x02, 0x21, 0x2E, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, -0x06, 0x90, 0x93, 0x8F, 0xE0, 0x80, 0x63, 0x90, 0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, -0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, -0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, -0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0x80, -0x09, 0x90, 0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0x90, 0x93, -0x90, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, -0x90, 0x93, 0x91, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, -0xEE, 0xF0, 0xE5, 0x57, 0xC3, 0x94, 0x20, 0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, -0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, -0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x91, 0xE0, 0xA3, -0xF0, 0x80, 0x37, 0x80, 0x2D, 0x74, 0x27, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0xE0, 0xFF, 0x90, 0x93, 0x90, 0xE0, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x92, 0xEE, -0xF0, 0x80, 0x17, 0x90, 0x93, 0x91, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, -0x80, 0x08, 0x90, 0x93, 0x90, 0xE0, 0x90, 0x93, 0x92, 0xF0, 0x90, 0x93, 0x92, 0xE0, 0xFD, 0xAF, -0x57, 0x51, 0x06, 0x90, 0x93, 0x92, 0xE0, 0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, -0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, -0x8A, 0x83, 0x74, 0x03, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, -0x02, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x03, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, 0x22, -0xE4, 0x90, 0x8A, 0x83, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, -0x20, 0x50, 0x0E, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, -0x29, 0x74, 0x27, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0xCC, -0xEF, 0xF0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0xCD, 0xF0, -0x7B, 0x01, 0x7A, 0x93, 0x79, 0xCC, 0x7D, 0x02, 0x71, 0xCB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, -0x52, 0x8D, 0x53, 0xE5, 0x53, 0x54, 0x1F, 0x90, 0x93, 0x5F, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x60, 0x74, 0x01, 0xF0, -0xEB, 0xC3, 0x94, 0x01, 0x40, 0x02, 0x80, 0x3B, 0x90, 0x93, 0x5D, 0xE0, 0x25, 0x55, 0xFF, 0xA3, -0xF0, 0xA3, 0xE0, 0x90, 0x41, 0xA4, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x13, 0x74, 0x01, 0x25, -0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x41, 0x06, -0x90, 0x93, 0x5E, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, -0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x62, 0xF0, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, -0x1F, 0x90, 0x93, 0x61, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, -0x04, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, -0x40, 0x5D, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x89, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xEF, 0xF0, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, -0x40, 0x0D, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, -0x93, 0x62, 0xE0, 0xFF, 0x90, 0x93, 0x61, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, -0x61, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, -0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, -0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, -0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0xAF, 0x05, 0x90, 0x93, 0x61, 0xE0, 0xFD, 0x51, 0x06, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, -0x03, 0x60, 0x12, 0x90, 0x04, 0x30, 0xE0, 0x70, 0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, -0x90, 0x04, 0xCF, 0x04, 0xF0, 0x90, 0x93, 0x61, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x90, 0x94, 0x22, 0x12, 0x43, 0xC8, 0x90, 0x94, 0x25, 0xE0, 0x54, 0xF0, 0x44, 0x06, -0xFF, 0xF0, 0xED, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x94, -0x22, 0x12, 0x43, 0xA8, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x25, -0x12, 0x66, 0x89, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, 0x13, -0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, -0xF0, 0x80, 0x11, 0x74, 0x27, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, -0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x8B, 0xF0, 0x75, -0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x8D, 0xF0, 0x75, 0xF0, -0x09, 0xEC, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x8E, 0xF0, 0xEC, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, -0x8F, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, -0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x91, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, 0xC6, -0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, 0x90, -0x93, 0x8E, 0xE0, 0x90, 0x93, 0x8B, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0xED, 0x70, 0x02, 0xA1, 0x82, -0x90, 0x93, 0x8C, 0xED, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x8B, 0xE0, -0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x14, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x70, 0x02, -0xA1, 0x82, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0xA1, 0x82, 0xE4, 0x90, -0x93, 0x8A, 0xF0, 0xEF, 0x14, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0xFD, 0x90, 0x93, -0x89, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, 0xFF, -0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0xFF, 0x90, 0x93, 0x91, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x89, -0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8F, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, -0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x93, 0x89, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x8A, 0xE0, -0x04, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0x6F, 0x60, 0x08, 0x90, 0x93, -0x89, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xC3, -0x9F, 0x50, 0x0F, 0x90, 0x93, 0x89, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x93, 0x8D, 0xE0, 0x90, 0x93, -0x88, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, -0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, -0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, -0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, -0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x93, 0x88, 0xE0, 0xFD, 0x51, 0x06, 0x90, 0x93, 0x88, -0xE0, 0xFF, 0x22, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, -0xF0, 0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, -0x54, 0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, -0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, -0x4D, 0xF0, 0x22, 0xAD, 0x07, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x11, 0x74, 0x27, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x90, -0x93, 0x88, 0xE0, 0xF9, 0x54, 0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, -0x43, 0x9C, 0xE0, 0xFF, 0x90, 0x93, 0x8B, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, -0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8C, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, -0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, -0x90, 0x93, 0x8E, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, 0x25, 0xE0, 0x24, -0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, -0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, -0xEE, 0xC3, 0x9F, 0x40, 0x02, 0xE1, 0x70, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, -0x8B, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xE1, 0xAA, 0xEE, 0xC3, -0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8C, 0xE0, 0x5E, 0xFE, 0xA3, -0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, 0x74, -0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, -0x90, 0x93, 0x8E, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x8A, 0xE0, -0xB4, 0x11, 0x0D, 0x90, 0x93, 0x8D, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x93, 0x8A, 0x74, 0x17, 0xF0, -0x90, 0x93, 0x8A, 0xE0, 0xFF, 0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, 0x8C, -0xE0, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x8A, 0x74, 0x18, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x90, 0x93, -0x89, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x42, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, 0xC1, 0xCE, -0x90, 0x93, 0x8B, 0xE0, 0xFC, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, -0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x89, 0xE0, 0x44, -0x40, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x25, -0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, -0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, -0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, -0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, 0x93, -0x89, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x89, 0xEF, 0xF0, 0x90, 0x93, 0x88, 0xF0, -0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, -0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, -0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, -0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, -0xAF, 0x05, 0x90, 0x93, 0x88, 0xE0, 0x44, 0x80, 0xFD, 0x12, 0x7A, 0x06, 0x90, 0x93, 0x88, 0xE0, -0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, -0x40, 0x40, 0x03, 0x02, 0x88, 0x76, 0xEF, 0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, -0x90, 0x89, 0x01, 0xE0, 0xFF, 0x90, 0x8F, 0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, -0x78, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, -0x03, 0x02, 0x88, 0x6D, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x88, 0x6D, 0x90, -0x93, 0x78, 0xE0, 0x94, 0x20, 0x40, 0x09, 0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x88, 0x76, -0x90, 0x93, 0x78, 0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, -0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, -0x87, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x93, 0x7D, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, -0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, -0x93, 0x7F, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, -0x13, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, -0x79, 0xF0, 0x80, 0x14, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, -0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, -0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x82, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, -0x94, 0x05, 0x40, 0x02, 0x81, 0x0B, 0x90, 0x93, 0x82, 0xE0, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0x9F, -0x40, 0x13, 0x90, 0x93, 0x82, 0xE0, 0x90, 0x93, 0x7A, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, 0x93, -0x79, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0x90, 0x41, 0x18, 0x93, 0xFE, 0x90, -0x93, 0x78, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, -0x06, 0xEF, 0x90, 0x40, 0xE0, 0x80, 0x07, 0x90, 0x93, 0x7A, 0xE0, 0x90, 0x40, 0xFC, 0x93, 0x90, -0x93, 0x81, 0xF0, 0x90, 0x93, 0x81, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x56, 0xF9, 0x74, 0x40, -0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x8B, 0x57, 0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x78, 0xE0, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, -0x7B, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, -0xA9, 0x5C, 0x12, 0x42, 0x9D, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, -0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, -0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, 0xFD, -0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, -0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, -0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, -0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x06, -0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, -0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, -0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, -0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, -0xA9, 0x59, 0x90, 0x00, 0x05, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, 0xE0, 0xFC, -0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0xD3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, -0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0xF0, 0x80, 0x07, 0xE4, -0x90, 0x93, 0x7B, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, -0x78, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, -0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, 0x61, -0xDA, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, -0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, 0x40, -0x03, 0xEF, 0x80, 0x1C, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, -0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, -0x9E, 0x90, 0x93, 0x83, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, 0x23, -0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, -0x94, 0x01, 0x40, 0x0F, 0x74, 0xC6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x14, -0xF0, 0x80, 0x0F, 0x90, 0x93, 0x78, 0xE0, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0x60, 0x02, 0xE1, 0x1B, 0x12, 0x7E, 0x13, 0xE1, 0x1B, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, -0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, -0xC3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x40, 0x02, 0xE1, 0x1B, 0x90, -0x93, 0x78, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x7C, 0x08, 0xE1, 0x1B, 0x90, 0x93, 0x78, 0xE0, 0xFF, -0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xA1, -0xE9, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x19, -0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x11, 0x40, -0x2E, 0x80, 0x1F, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, -0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x03, -0x40, 0x0D, 0x90, 0x8E, 0xC5, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, 0x90, -0x93, 0x78, 0xE0, 0xFE, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, -0x87, 0xF0, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, -0x30, 0x50, 0x0A, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x74, 0x67, 0x2F, 0xA1, 0x94, 0x90, 0x8E, 0xC5, -0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x89, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xEE, 0x24, -0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, -0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x78, 0xE0, -0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, -0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, 0x93, -0x78, 0xE0, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x7A, -0xE0, 0x6F, 0x60, 0x56, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, -0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x93, 0x87, 0x74, 0x05, 0xF0, 0x80, 0x11, -0xEF, 0xD3, 0x94, 0x39, 0x90, 0x93, 0x87, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, -0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, -0xFE, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x78, -0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x80, 0x2F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, -0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x90, 0x93, -0x78, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7A, -0xE0, 0xFE, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0xEE, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFE, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, -0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, -0x11, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0xE4, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFD, 0xE1, 0x18, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xE1, 0x1B, -0x90, 0x93, 0x7B, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xE1, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, -0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x85, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x93, 0x78, 0xE0, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, -0x87, 0xF0, 0xE4, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0xD3, 0x94, 0x04, 0x50, -0x47, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, 0xF0, -0x83, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xDC, 0x93, 0xFF, 0x7E, 0x00, 0x12, -0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x85, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x50, 0x08, -0x90, 0x93, 0x84, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x93, 0x84, 0xE0, 0xC3, 0x13, 0xF0, 0x90, -0x93, 0x87, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x93, 0x84, 0xE0, 0x70, 0x5D, 0x90, 0x93, 0x87, -0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x70, 0x08, 0x90, -0x93, 0x87, 0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x87, 0x74, 0x01, -0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, 0x93, 0x87, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, 0x84, -0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x87, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, 0x87, -0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x80, 0xE0, -0x94, 0x03, 0x90, 0x93, 0x7F, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0xD3, -0x90, 0x93, 0x80, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x7F, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, -0x93, 0x87, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFD, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC4, 0xF5, -0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xED, 0xF0, 0x12, 0x7D, 0xD3, 0x90, 0x93, 0x78, 0xE0, 0xFF, -0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, 0x74, -0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, 0x93, -0x78, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7F, -0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, 0x93, -0x78, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFA, -0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, 0x50, 0x1C, 0x90, 0x93, 0x7F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, -0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, -0x42, 0x87, 0x80, 0x14, 0x90, 0x93, 0x78, 0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, -0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, 0x24, -0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, 0xFF, -0x9D, 0xFB, 0x74, 0xFF, 0x9C, 0xFA, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x78, 0xE0, 0x50, 0x13, -0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, 0x42, -0x87, 0x80, 0x10, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, -0xF0, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, -0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, -0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, -0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, -0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, -0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x78, -0xE0, 0x04, 0xF0, 0x02, 0x80, 0x79, 0x22, 0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0xF0, -0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, -0xFF, 0xC3, 0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, -0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, 0x90, -0x89, 0x01, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, -0x40, 0x40, 0x02, 0x41, 0x70, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0xE4, -0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, -0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, -0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE4, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, -0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8E, 0x04, 0xF0, 0x90, 0x41, 0x92, 0x93, 0xFE, 0x74, 0x01, 0x93, -0xFF, 0x90, 0x41, 0x5A, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, -0x13, 0xFF, 0x90, 0x93, 0x78, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, -0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, 0x12, 0x43, -0x9C, 0x74, 0x01, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0x74, 0x01, -0xF0, 0x74, 0xC2, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, 0x75, 0xF0, -0x09, 0xED, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x09, -0xED, 0x90, 0x8A, 0x84, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, 0xF0, 0x09, -0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, -0x89, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x01, 0xB9, -0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, -0x40, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, 0x90, 0x00, 0x04, -0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0xFD, 0xAF, 0x06, 0x02, 0x74, 0x42, 0x12, 0x1E, 0xF6, 0x90, 0x89, 0x01, 0xF0, 0x22, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, 0x94, 0x40, -0x40, 0x02, 0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x83, 0xF0, -0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, -0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x85, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x74, 0xFF, -0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, -0xE0, 0x90, 0x93, 0x89, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x8B, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, -0xEC, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x02, 0x67, 0x8B, 0x12, -0x1E, 0xF6, 0xF5, 0x62, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x83, 0x12, -0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x83, 0x12, -0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x59, 0xF0, 0x90, 0x00, 0x03, 0x12, -0x1F, 0x0F, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x01, 0x90, -0x93, 0x3D, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x00, 0x04, 0x12, -0x1F, 0x0F, 0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x44, 0xF0, 0xEF, 0x13, 0x13, 0x13, 0x54, -0x01, 0x90, 0x93, 0x4A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, 0x01, 0x90, -0x93, 0x46, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x00, 0x04, 0x12, -0x1F, 0x0F, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x49, 0xF0, 0xE0, 0x70, 0x38, 0x90, -0x93, 0x47, 0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x03, 0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, -0x00, 0x00, 0x03, 0x00, 0x90, 0x93, 0x86, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, -0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x3D, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, -0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x4D, 0xC1, 0x90, 0x93, 0x59, 0xE0, 0x90, 0x01, 0xE6, -0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, 0xE0, 0x25, -0x12, 0x1E, 0xF6, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x4B, -0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x45, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, -0x90, 0x93, 0x50, 0xF0, 0x22, 0x90, 0x93, 0x48, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4B, 0x74, 0x05, -0xF0, 0x90, 0x93, 0x45, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x50, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x1E, -0xF6, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, -0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x4F, -0x74, 0x05, 0xF0, 0x90, 0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4D, 0xE0, -0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x4C, 0xF0, 0x60, 0x20, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, -0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x51, 0x69, -0x90, 0x93, 0x4C, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x02, 0x43, 0xC8, 0x12, -0x1E, 0xF6, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, -0x0F, 0xFF, 0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x70, 0xFF, 0x90, 0x93, 0x36, -0xE0, 0x54, 0x8F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x38, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, -0x93, 0x3A, 0xF0, 0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0xFF, 0xD3, 0x94, 0x20, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x01, 0xF0, 0x80, 0x57, 0xEF, -0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x02, 0xF0, 0x80, 0x49, 0xEF, 0xD3, 0x94, -0x60, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0xEF, 0xD3, 0x94, 0x80, 0x50, -0x08, 0x90, 0x93, 0x37, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, 0x94, 0xA0, 0x50, 0x08, 0x90, -0x93, 0x37, 0x74, 0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, 0x50, 0x08, 0x90, 0x93, 0x37, -0x74, 0x06, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, 0x37, 0x50, 0x05, 0x74, 0x07, -0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x90, 0x93, 0x3B, 0xF0, 0x22, 0x12, -0x1E, 0xF6, 0x60, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, -0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, 0xA8, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xA9, 0xF0, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAA, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, -0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAB, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xAE, -0x05, 0xED, 0x2F, 0x90, 0x93, 0xAC, 0xF0, 0x22, 0xEF, 0x70, 0x21, 0x12, 0x1E, 0xF6, 0x30, 0xE0, -0x14, 0x90, 0x00, 0x40, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x07, 0x78, 0xE0, -0x44, 0x01, 0xF0, 0x80, 0x07, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x64, 0x01, 0x70, -0x6A, 0x12, 0x1E, 0xF6, 0x90, 0x00, 0x01, 0x30, 0xE0, 0x2E, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC0, -0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, -0x0F, 0x90, 0x06, 0xC2, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC3, 0xF0, 0x90, -0x06, 0xCC, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x2C, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC4, 0xF0, 0x90, -0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC5, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, -0x06, 0xC6, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x06, 0xCC, -0xE0, 0x44, 0x01, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x02, 0xF0, 0xEF, 0xB4, 0x02, 0x11, 0x12, -0x1E, 0xF6, 0x90, 0x06, 0xC8, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC9, 0xF0, -0xEF, 0xB4, 0x03, 0x11, 0x12, 0x1E, 0xF6, 0x90, 0x06, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0x90, 0x06, 0xCB, 0xF0, 0xEF, 0x64, 0x04, 0x70, 0x1F, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x07, -0x83, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0x6F, 0xF0, 0xEF, 0x30, -0xE1, 0x07, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, -0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0x90, 0x92, 0x6B, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6C, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6D, -0xF0, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x73, 0x70, 0xEF, 0xB4, 0x02, 0x03, 0x43, 0x14, -0x01, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x17, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, -0x18, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, -0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x19, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, -0x01, 0x7F, 0x1A, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, -0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1B, 0x02, 0x73, 0x74, 0x90, -0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, -0xA8, 0x7D, 0x01, 0x7F, 0x1C, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x1D, 0x02, 0x73, -0x74, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, -0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1E, 0x02, 0x73, 0x74, 0x12, 0x1E, 0xF6, 0xFF, 0xE4, 0xFC, -0xFD, 0xFE, 0x78, 0x18, 0x12, 0x1F, 0xB6, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, -0x93, 0x0B, 0x12, 0x43, 0x84, 0xEC, 0x54, 0x03, 0xFC, 0x12, 0x43, 0x59, 0x90, 0x93, 0x07, 0x02, -0x1F, 0xC9, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1F, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, -0x20, 0x02, 0x73, 0x74, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xBC, 0xF0, 0xEF, 0x30, -0xE0, 0x5C, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x4E, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, -0x74, 0x06, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x52, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x53, 0xF0, 0xA3, 0xE4, 0xF0, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x90, -0xFD, 0x55, 0x30, 0xE0, 0x05, 0x74, 0xA0, 0xF0, 0x80, 0x03, 0x74, 0xC0, 0xF0, 0x90, 0xFD, 0x56, -0x74, 0x10, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, -0xF0, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x7C, 0x00, 0x24, 0x00, 0xFF, -0xEC, 0x3E, 0xFE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFC, 0x74, 0x20, 0x2F, 0xFF, -0xE4, 0x3E, 0xFE, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0xEE, 0xF9, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x02, -0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xEC, 0xC3, 0x99, 0x50, 0x43, -0xEC, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x02, 0xE4, 0xFD, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x07, 0xAF, -0x05, 0x31, 0x8B, 0x0D, 0x80, 0xF3, 0x0C, 0x90, 0xFD, 0x10, 0xE0, 0x04, 0xF0, 0xEC, 0xB5, 0x01, -0xDA, 0xE4, 0xFD, 0xED, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0xC3, 0xEF, -0x9B, 0x74, 0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x07, 0xAF, 0x05, 0x31, 0x8B, 0x0D, 0x80, 0xE3, -0x0C, 0x80, 0xB8, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x81, 0x12, 0x54, 0x0A, 0x90, -0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x30, -0xE0, 0x08, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0xF1, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, -0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, 0xEF, 0x75, 0xF0, -0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x51, 0xF0, -0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, -0xFD, 0x52, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x90, 0xFD, 0x53, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x54, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x55, 0xF0, 0xEF, 0x75, 0xF0, 0x08, -0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x56, 0xF0, 0xEF, -0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, -0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0xFE, 0x10, 0x60, 0x05, 0xE0, -0x44, 0x01, 0xF0, 0x22, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x15, -0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, -0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x10, -0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x15, -0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x12, 0x1E, -0xF6, 0xFC, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x15, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x03, -0x12, 0x1F, 0x0F, 0xFD, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xED, -0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFD, 0x54, -0x04, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x10, 0xFF, 0xE0, 0x54, -0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x18, -0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, -0x03, 0x12, 0x1F, 0x0F, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, -0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xDF, 0x4E, -0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, -0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, -0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x04, 0xFE, 0x90, -0x93, 0x19, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, -0xEC, 0x20, 0xE0, 0x02, 0x81, 0xC3, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x25, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x16, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0x90, 0x93, 0x17, 0xF0, 0x80, 0x4E, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, -0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x93, 0x16, 0x50, -0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x16, 0x74, 0x2A, 0xF0, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, -0x90, 0x93, 0x17, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, -0x17, 0x74, 0x2A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3D, -0x90, 0x93, 0x16, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x1E, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, -0xF0, 0x90, 0x93, 0x17, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x20, 0xF0, 0x90, 0x93, 0x16, -0xE0, 0xC3, 0x13, 0x90, 0x93, 0x21, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x22, -0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, 0xE4, 0x90, 0x93, -0x11, 0xF0, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x20, 0xE0, 0x14, 0x12, 0x1E, 0xF6, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, -0x04, 0x7F, 0x01, 0x80, 0x02, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, -0x0F, 0x30, 0xE0, 0x18, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x75, -0x64, 0x04, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, -0x03, 0xF0, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x80, -0x2B, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x80, 0x1C, -0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x93, 0x27, 0x74, 0x02, 0xF0, 0x80, 0x0D, 0x90, -0x93, 0x1D, 0xE0, 0xB4, 0x07, 0x06, 0x90, 0x93, 0x27, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x1D, -0xF0, 0x80, 0x64, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x90, 0x93, 0x83, 0x30, 0xE0, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, -0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0xB1, 0x5F, 0x90, 0x00, 0x40, 0x74, 0x20, 0xF0, -0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x13, 0x13, 0x13, 0x54, -0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x7B, -0x01, 0x7A, 0x93, 0x79, 0x83, 0x12, 0x55, 0x67, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x00, -0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, -0x93, 0x26, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, -0x90, 0x93, 0x04, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x55, 0xB2, 0x90, 0x93, -0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x5E, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0x93, 0x15, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0x90, -0x93, 0x26, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, -0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, -0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, -0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, 0x28, 0x74, -0x02, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, -0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, -0x90, 0x93, 0x23, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x29, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x1C, 0xE0, -0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, -0xFB, 0xF0, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xE1, -0xF0, 0x22, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, -0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, 0x1F, 0xD5, 0x20, 0x08, 0x30, 0x70, 0x90, -0x93, 0x0B, 0x12, 0x1F, 0xD5, 0xC0, 0x08, 0x30, 0x70, 0xE4, 0x90, 0x93, 0x11, 0xF0, 0xA3, 0xF0, -0x43, 0xE8, 0x04, 0x90, 0xFD, 0x68, 0x74, 0x02, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x44, 0x10, 0xF0, -0x90, 0x07, 0x83, 0xE4, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x04, 0x64, 0xE4, 0xF0, -0x90, 0x00, 0x40, 0x74, 0x20, 0xF0, 0xB1, 0x5F, 0x90, 0x93, 0x2C, 0x74, 0x01, 0xF0, 0x7D, 0x04, -0x7F, 0x02, 0x02, 0x3A, 0xAD, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x24, 0x02, 0x73, 0x74, 0x12, 0x1E, -0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, -0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x1A, -0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x90, 0x00, -0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x1B, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, -0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x26, 0x02, -0x73, 0x74, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xB0, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xAE, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0xAF, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x46, -0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, 0x60, 0x43, 0xC3, 0x90, 0x94, 0x47, 0xE0, -0x94, 0x88, 0x90, 0x94, 0x46, 0xE0, 0x94, 0x13, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, -0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x46, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, -0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x94, 0x47, 0xE0, 0x94, 0x64, 0x90, 0x94, 0x46, 0xE0, -0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, -0x22, 0x90, 0x93, 0xE2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xE6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, -0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xE6, 0x12, 0x43, 0x90, 0xD3, 0x12, 0x43, -0x73, 0x50, 0x41, 0x90, 0x93, 0xE6, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xE2, 0x12, 0x43, -0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x7B, 0x01, -0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, 0x1B, 0x90, 0x93, 0xE6, 0x12, 0x43, 0x84, 0xEF, -0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0xE6, 0x12, -0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xE6, 0x02, 0x43, 0x84, 0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, -0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x90, 0xC3, 0x12, 0x43, 0x73, -0x90, 0x93, 0xB4, 0x60, 0x67, 0x12, 0x43, 0x84, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xC0, 0x12, 0x1F, -0xC9, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x84, 0xF1, 0x51, 0x90, 0x93, 0xC4, 0x12, 0x1F, 0xC9, 0x90, -0x93, 0xB8, 0x12, 0x43, 0x84, 0x12, 0x43, 0x66, 0x90, 0x93, 0xC0, 0x12, 0x43, 0x90, 0x12, 0x43, -0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xC4, 0x12, 0x43, 0x84, 0xA9, -0x07, 0x90, 0x93, 0xBC, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, 0xD0, 0x02, -0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, 0x90, 0x93, 0xC8, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, -0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xC8, 0x80, 0x0A, 0x12, 0x43, 0x84, 0xC0, -0x06, 0xC0, 0x07, 0x90, 0x93, 0xBC, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0xD0, -0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xEA, -0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xEE, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, -0x00, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x93, -0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x14, -0x12, 0x51, 0xBB, 0xBF, 0x01, 0x0B, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x2D, 0xE0, 0x20, 0xE0, 0x24, 0x90, 0x93, 0x47, 0xE0, 0x60, -0x1E, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x13, 0x90, 0x93, 0xEE, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xEE, 0x12, 0x55, 0x67, 0x12, -0x54, 0x4B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, -0x4E, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x47, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, -0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x52, -0x90, 0x94, 0x4E, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, -0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4C, 0x90, -0x94, 0x4E, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, -0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x52, 0x90, 0x94, -0x4E, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, -0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, -0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x94, 0x3E, 0xE0, -0x54, 0xFE, 0x4F, 0xF0, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x44, 0xFE, 0x90, 0x93, 0x83, 0x12, 0x43, -0xA8, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0x94, 0x3F, 0xF0, 0x22, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0A, 0xF0, 0x90, 0xFD, 0x60, -0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0xFD, 0x63, -0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x90, 0xFD, 0x65, -0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x93, 0x6C, 0x30, 0xE6, 0x08, 0xE0, -0x54, 0x0F, 0x44, 0x50, 0xF0, 0x80, 0x16, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0xFD, 0x66, -0xE0, 0x90, 0x93, 0x73, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x66, 0x89, -0xAD, 0x07, 0x90, 0x93, 0xFA, 0xE0, 0x54, 0xF0, 0x44, 0x0C, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, -0x62, 0xE0, 0x90, 0x93, 0xFC, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0xFD, 0xF0, 0x90, 0xFD, -0x64, 0xE0, 0x90, 0x93, 0xFE, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xFF, 0xF0, 0x90, 0xFD, -0x66, 0xE0, 0x90, 0x94, 0x00, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x94, 0x01, 0xF0, 0xED, 0xB4, -0x02, 0x0B, 0x90, 0x93, 0xFA, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x80, 0x3C, 0xED, 0xB4, 0x04, -0x0B, 0x90, 0x93, 0xFA, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x80, 0x2D, 0xED, 0xF4, 0x70, 0x29, -0x90, 0x93, 0xFA, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x90, 0x93, 0x2C, 0xE0, 0x60, 0x08, 0x90, -0x93, 0xFC, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0xFC, 0xF0, 0xE4, 0x90, 0x93, 0xFD, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xFC, 0x90, -0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0xFA, 0x02, 0x66, 0x89, 0xAD, 0x07, 0x90, 0x93, -0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0E, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, -0x6F, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, -0x71, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, -0x73, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0xED, 0xB4, 0x01, 0x11, 0x90, 0x93, -0x6C, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x6E, 0x74, 0x01, 0xF0, 0x80, 0x13, 0xED, -0xB4, 0x02, 0x0F, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x93, 0x6E, 0x74, -0x02, 0xF0, 0x90, 0x93, 0x6C, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x13, 0x7B, 0x01, 0x7A, 0x93, -0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x12, 0x66, 0x89, 0x22, -0x90, 0x93, 0x47, 0xE0, 0x60, 0x27, 0x90, 0x93, 0x4A, 0xE0, 0x70, 0x21, 0x90, 0x93, 0x18, 0xE0, -0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x44, -0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, -0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xA1, 0x16, 0x90, 0x93, 0x1D, 0xE0, -0x64, 0x01, 0x70, 0x39, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x94, 0x4B, 0xE0, 0x60, -0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x29, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, -0x4B, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, -0xA1, 0x01, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, 0x27, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, -0xE0, 0x64, 0x04, 0x70, 0x3A, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x94, 0x4B, 0xE0, -0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x29, 0xE0, 0x04, 0xF0, 0xE4, 0x90, -0x94, 0x4B, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, -0x02, 0xA1, 0x01, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x22, 0x90, -0x93, 0x1D, 0xE0, 0x64, 0x06, 0x60, 0x02, 0x81, 0xC5, 0x90, 0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x0F, -0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x27, 0x30, 0xE0, 0x4E, 0xA1, 0x13, 0x90, -0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, -0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0x81, 0xD4, 0x90, 0x93, 0x2A, -0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, -0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, -0x64, 0x80, 0x94, 0x80, 0x90, 0x93, 0x27, 0x40, 0x02, 0xA1, 0x13, 0x74, 0x02, 0xF0, 0x22, 0x90, -0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x27, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, -0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, -0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, -0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, -0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x58, 0x90, 0x07, -0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x07, 0x70, 0x49, 0x90, 0x93, 0x2A, -0xE0, 0xB4, 0x04, 0x05, 0x90, 0x93, 0x27, 0x80, 0x3A, 0x90, 0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, -0x3F, 0x30, 0xE0, 0x0C, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x27, 0x80, 0x23, -0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x27, 0x90, 0x93, 0x2A, 0xE0, 0x04, -0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, -0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x3C, 0x90, 0x93, 0x15, 0xE0, -0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x22, 0x90, -0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, -0x78, 0x30, 0xE0, 0x24, 0x80, 0x0E, 0x90, 0x93, 0x18, 0xE0, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, -0xE0, 0x02, 0x80, 0x14, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x13, -0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x03, 0xF0, 0x22, 0x74, 0x01, 0xF0, 0x22, -0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x12, 0x90, 0x93, -0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2A, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x21, -0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x06, 0x92, -0x74, 0x04, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, -0x27, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x5D, 0xE0, 0xFF, 0x90, 0x93, 0x16, 0xE0, -0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, -0x27, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x26, 0x74, 0x01, 0xF0, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x05, -0x22, 0xE4, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, -0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x51, 0x48, 0xE4, 0x90, 0x94, -0x4B, 0xF0, 0x22, 0x00, 0x8C, 0xC1, -}; - - - -const u8 Rtl8723SFwUMCBCutImgArrayWithoutBT[Rtl8723SUMCBCutImgArrayWithoutBTLength] = { -0x02, 0x23, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x02, 0x01, 0x10, 0x06, 0xE0, 0x4A, 0x01, 0x00, -0x03, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4A, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x59, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x61, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x61, 0xDA, 0x00, 0x00, -0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, 0x00, 0x04, 0x06, 0x05, 0x04, 0x02, -0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, 0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, -0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, -0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x18, 0x22, 0x21, 0x20, 0x18, -0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, 0x20, 0x08, 0x00, 0x20, 0x22, 0x21, -0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, 0x22, 0x20, 0x18, 0x08, 0x00, 0x20, -0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, 0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, -0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, 0x10, 0x00, 0x00, 0x30, 0x31, 0x20, -0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, -0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, -0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, -0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, -0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, -0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, -0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, -0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, -0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, -0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, -0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, -0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, -0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, -0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, 0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, -0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, -0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, -0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, 0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, -0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, -0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, -0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, -0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, -0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, -0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, -0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, -0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, -0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, -0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, -0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, -0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, -0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, -0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, -0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, -0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, -0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, -0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, -0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, -0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, -0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, -0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, -0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, -0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, -0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, -0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, -0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, -0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, -0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, -0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, -0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, -0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0x90, 0x93, 0x07, 0xF0, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xDD, -0x90, 0x93, 0x51, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x60, -0x03, 0x02, 0x44, 0xDD, 0x02, 0x44, 0xDA, 0x90, 0x93, 0x38, 0xE0, 0x04, 0xF0, 0x53, 0x66, 0xEF, -0x90, 0x93, 0x4F, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0x30, 0xE0, 0x3A, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x0F, 0xB5, 0x07, -0x0A, 0x90, 0x93, 0x30, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, 0x90, 0x93, 0x2D, 0xE0, 0xC4, -0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x4F, 0xE0, 0xB5, -0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x2D, -0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x07, 0x74, 0x5A, 0xF0, -0x90, 0x93, 0x07, 0xE0, 0xFF, 0x90, 0x93, 0x3F, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, -0x38, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x0D, 0xE5, 0x62, 0xB4, -0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x51, 0x9C, 0x22, 0xEF, 0x60, -0x0F, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, -0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x02, -0x55, 0xE5, 0x22, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0xA3, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0xAB, 0xE5, 0x62, 0x64, -0x01, 0x60, 0x03, 0x02, 0x46, 0xAB, 0xE5, 0x65, 0x14, 0x60, 0x29, 0x24, 0xFD, 0x60, 0x25, 0x24, -0x02, 0x24, 0xFB, 0x50, 0x02, 0x80, 0x23, 0x90, 0x93, 0x37, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, -0xA3, 0xE0, 0x60, 0x16, 0x90, 0x93, 0x37, 0xE0, 0x70, 0x0A, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x93, -0x37, 0xF0, 0x80, 0x00, 0x90, 0x93, 0x01, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, -0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x91, -0xEF, 0x70, 0x04, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x93, 0x01, 0xE0, 0x70, 0x03, 0x02, 0x46, 0x9B, -0x43, 0x66, 0x10, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, -0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, -0x93, 0x2E, 0x80, 0x2D, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, -0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, -0x98, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x31, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x2E, 0xE0, 0x80, 0x2D, 0x90, 0x93, 0x4F, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, -0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, -0x48, 0x90, 0x93, 0x4F, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x04, -0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, -0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, -0x12, 0x48, 0xF4, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x93, 0x2B, 0xE0, 0xFF, 0x90, 0x93, -0x4F, 0xE0, 0xD3, 0x9F, 0x40, 0x08, 0x90, 0x93, 0x2C, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, -0x93, 0x2C, 0xF0, 0x90, 0x93, 0x4F, 0xE0, 0x90, 0x93, 0x2B, 0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, -0x40, 0x46, 0xE4, 0xF0, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x4D, 0xE0, 0x70, 0x03, -0x12, 0x4F, 0x63, 0x90, 0x93, 0x50, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, 0x48, 0xF0, 0xE4, 0xF5, -0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, -0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x4C, 0x80, 0x09, 0x43, 0x66, 0x01, 0x12, -0x51, 0x2B, 0x90, 0x93, 0x48, 0x74, 0x01, 0xF0, 0x12, 0x51, 0x4C, 0x90, 0x93, 0x98, 0xE0, 0x30, -0xE0, 0x09, 0x12, 0x67, 0x4A, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x07, -0xF0, 0xA3, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x47, 0xA2, -0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x47, 0xA2, 0x90, 0x93, 0x07, 0x04, 0xF0, 0xE4, 0x90, -0x93, 0x37, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, -0x90, 0x93, 0x07, 0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x04, 0x90, 0x93, 0x07, 0xF0, -0x90, 0x93, 0x07, 0xE0, 0x70, 0x03, 0x02, 0x47, 0xA2, 0x43, 0x66, 0x10, 0x90, 0x93, 0x2D, 0xE0, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x32, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, -0xE0, 0xD3, 0x9F, 0x50, 0x09, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x2E, 0xE0, 0x80, 0x4A, 0xE4, 0xF5, -0x48, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, -0x03, 0xA4, 0xFF, 0x90, 0x93, 0x2E, 0xE0, 0x04, 0x2F, 0x80, 0x2D, 0x90, 0x93, 0x4F, 0xE0, 0x64, -0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, -0x46, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0x14, 0x75, 0xF0, 0x03, -0xA4, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, -0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, -0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x12, 0x51, 0x4C, 0x90, 0x05, 0x22, -0xE4, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x09, 0x12, 0x67, 0x4A, 0x90, 0x05, 0x22, 0x74, -0xFF, 0xF0, 0x22, 0xE4, 0xF5, 0x66, 0xF5, 0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, -0x50, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x93, 0x49, 0xF0, 0x90, 0x93, 0x4E, 0x04, 0xF0, 0x90, -0x93, 0x37, 0xF0, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x93, 0x46, 0x74, -0x05, 0xF0, 0xE4, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x93, 0x44, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, -0x93, 0x3F, 0xF0, 0x90, 0x93, 0x42, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x3C, 0x74, 0x14, 0xF0, 0x90, -0x93, 0x47, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x93, 0x33, 0xF0, 0x90, 0x93, -0x71, 0xF0, 0x90, 0x93, 0x43, 0xF0, 0x90, 0x93, 0x53, 0xF0, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x93, -0x34, 0xF0, 0x90, 0x93, 0x4D, 0xF0, 0x90, 0x93, 0x3E, 0xF0, 0x90, 0x93, 0x3B, 0xF0, 0x90, 0x93, -0x48, 0xF0, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x3D, 0xF0, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x93, -0x40, 0xF0, 0x90, 0x93, 0x70, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, -0x2D, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x93, 0x30, 0xF0, 0x22, 0x8E, 0x69, 0x8F, 0x6A, 0xAD, -0x6A, 0xAC, 0x69, 0xAF, 0x68, 0x12, 0x44, 0xDE, 0xAF, 0x6A, 0xAE, 0x69, 0x90, 0x04, 0x80, 0xE0, -0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, -0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, -0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, -0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, -0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, -0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, -0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, -0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x6C, 0x8D, 0x6D, 0xE5, -0x6C, 0x54, 0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x6C, 0x30, 0xE2, 0x30, -0xE5, 0x63, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0x69, 0xE5, 0x63, 0x30, 0xE3, 0x10, 0xE5, -0x6C, 0x20, 0xE3, 0x0B, 0x12, 0x4D, 0x9D, 0xEF, 0x60, 0x53, 0x12, 0x51, 0x05, 0x80, 0x4E, 0xE5, -0x63, 0x20, 0xE3, 0x49, 0xE5, 0x6C, 0x30, 0xE3, 0x44, 0xAF, 0x6D, 0x12, 0x50, 0x8A, 0x80, 0x3D, -0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x6C, 0x20, 0xE3, 0x09, 0x12, 0x4D, 0x9D, -0xEF, 0x60, 0x2A, 0x12, 0x51, 0x05, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, 0xE5, 0x6C, -0x20, 0xE2, 0x09, 0x12, 0x4B, 0x16, 0xEF, 0x60, 0x14, 0x12, 0x50, 0xB3, 0xE5, 0x63, 0x54, 0x0F, -0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4C, 0x72, 0xEF, 0x60, 0x03, 0x12, 0x51, 0xB0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x01, 0xF0, 0xE0, -0x54, 0xC0, 0x70, 0x11, 0x90, 0x93, 0x48, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, -0x12, 0x51, 0x9C, 0x80, 0x0F, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x4D, 0xE0, 0x70, -0x03, 0x12, 0x4F, 0x63, 0x90, 0x93, 0x01, 0xE0, 0x30, 0xE6, 0x15, 0x43, 0x66, 0x01, 0x90, 0x93, -0x50, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x51, 0x2B, 0x80, 0x0E, 0x12, 0x4F, 0x1D, 0x80, 0x09, -0x90, 0x93, 0x48, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x93, -0x01, 0xE0, 0x30, 0xE7, 0x23, 0x43, 0x66, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x42, 0xE0, 0xF5, -0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, -0xF0, 0x90, 0x93, 0x51, 0x74, 0x01, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, 0xEF, 0x64, 0x01, 0x70, -0x48, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, -0x01, 0x36, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, -0x3A, 0x3F, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x48, 0xF0, -0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x67, 0x4A, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, -0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B, 0xF0, 0xA3, -0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, -0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x06, -0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4E, 0x3E, 0xE5, 0x62, 0x20, 0xE0, 0x05, 0xE4, 0x90, 0x93, -0x39, 0xF0, 0x22, 0x02, 0x4A, 0xD1, 0x02, 0x52, 0xA5, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, -0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, -0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, -0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, -0x80, 0x90, 0x4F, 0xE3, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, -0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, -0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, -0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, -0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, -0xB9, 0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, -0x02, 0xF0, 0x80, 0x53, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, 0x01, 0xB9, -0x74, 0x04, 0xF0, 0x80, 0x42, 0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, -0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x28, 0x90, -0x93, 0x39, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, 0x93, 0x43, -0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, -0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, -0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, 0x64, 0x02, 0x60, 0x06, -0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, 0x37, 0xF0, 0x90, 0x06, -0xAA, 0xE0, 0x90, 0x93, 0x4E, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x70, 0x07, 0x90, 0x93, 0x4E, 0xE0, -0xFF, 0x80, 0x05, 0x90, 0x93, 0x37, 0xE0, 0xFF, 0x90, 0x93, 0x37, 0xEF, 0xF0, 0x90, 0x93, 0x39, -0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x05, -0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x53, -0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x49, -0x82, 0x22, 0x90, 0x93, 0x70, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, 0x90, 0x93, 0x70, -0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0x7D, 0x40, 0x7F, 0x93, 0x12, 0x53, 0xB6, 0x90, 0x00, -0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x28, 0xE0, 0x54, 0xFC, -0xFD, 0x7F, 0x28, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, -0x53, 0xB6, 0x7F, 0x01, 0x12, 0x4D, 0x45, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, 0xFD, 0xE4, 0xFF, -0x12, 0x53, 0xB6, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, 0x53, 0xB6, 0x90, -0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x53, 0xB6, 0x7F, 0x14, 0x7E, 0x00, 0x02, -0x3B, 0x09, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, -0x80, 0x54, 0xE5, 0x18, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x48, 0xE5, 0x64, -0x54, 0x0F, 0xD3, 0x94, 0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x37, 0x90, -0x02, 0x87, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x29, 0x90, 0x02, 0x86, -0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, 0x90, 0x93, 0x3A, 0xE0, -0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, -0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, -0x93, 0x21, 0x12, 0x43, 0xC8, 0x12, 0x51, 0xC3, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x12, 0x1E, -0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, 0x70, 0x44, -0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0xFD, 0xE4, 0xFF, 0x12, 0x4F, 0xA5, 0x80, 0x29, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x4F, 0xA5, 0x1F, 0x80, 0x14, 0x90, 0x93, 0x21, -0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x4F, 0xA5, 0xE4, -0xFF, 0x12, 0x4A, 0x0C, 0x22, 0x8F, 0x70, 0xE4, 0x90, 0x93, 0xE3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, -0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x70, 0x60, 0x3E, 0xC3, 0x90, -0x93, 0xE4, 0xE0, 0x94, 0x88, 0x90, 0x93, 0xE3, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, -0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0xE3, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, -0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0xE4, 0xE0, 0x94, 0x32, 0x90, 0x93, 0xE3, -0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x12, 0x51, 0x83, -0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, 0x93, 0x4C, -0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x49, 0xE0, 0x60, -0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x04, -0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, -0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, -0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x20, 0x12, 0x53, 0xB6, 0x7F, 0xF4, 0x7E, 0x01, 0x12, -0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, 0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x53, 0xB6, 0x90, 0x00, -0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, 0x28, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, -0xFD, 0x7F, 0x08, 0x12, 0x53, 0xB6, 0xE4, 0xFF, 0x12, 0x4D, 0x45, 0x7F, 0x64, 0x7E, 0x00, 0x12, -0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, 0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x53, 0xB6, 0xE4, 0xFF, -0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, 0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, -0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, 0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, -0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, 0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, -0x45, 0xE0, 0x9D, 0x90, 0x93, 0x44, 0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x93, 0x44, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x8F, 0x68, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x6B, -0x74, 0xFF, 0xF0, 0x12, 0x8A, 0x65, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0x69, 0xE0, 0xFF, 0x7D, 0x01, -0x12, 0x58, 0x95, 0x12, 0x48, 0x5B, 0x90, 0x05, 0x22, 0xE5, 0x6B, 0xF0, 0x80, 0x0D, 0x90, 0x93, -0x69, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x95, 0x12, 0x48, 0x5B, 0x90, 0x04, 0x1F, 0x74, 0x20, -0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x3D, 0x90, -0x93, 0x50, 0xE0, 0x60, 0x27, 0x12, 0x48, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, -0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, -0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x22, 0xE5, 0x63, 0x54, 0x0F, -0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x22, 0x90, 0x01, 0x5F, -0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, -0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, -0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x49, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, -0xC3, 0x94, 0x0C, 0x50, 0x0D, 0x12, 0x48, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x03, 0x12, -0x67, 0x4A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x4D, 0x74, 0x01, 0xF0, -0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xD3, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xD3, -0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x93, 0xD3, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xD3, -0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, 0x24, 0x02, 0x70, 0x32, -0x80, 0x0A, 0x90, 0x93, 0x4E, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x37, 0xF0, 0xE4, 0x90, 0x93, 0x53, -0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x47, 0xE0, 0x90, 0x93, 0x4E, 0xF0, 0x80, 0x05, 0x90, -0x93, 0x4E, 0xED, 0xF0, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x93, 0x37, 0xF0, 0x90, 0x93, 0x53, 0x74, -0x01, 0xF0, 0x22, 0x48, 0x93, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x93, -0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0x5E, 0x00, 0x41, 0x93, 0x6D, -0x00, 0x41, 0x93, 0xE9, 0x00, 0x41, 0x93, 0x2B, 0x00, 0x41, 0x93, 0x2C, 0x00, 0x41, 0x92, 0x69, -0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, 0x41, 0x93, 0xDF, 0x00, 0x00, 0x90, 0x01, -0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x93, -0x35, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, 0xFF, 0x74, 0x40, 0x7E, 0x00, -0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x90, 0x93, 0x4B, 0xF0, -0xEE, 0x90, 0x93, 0x4A, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x93, 0x6F, 0xE0, 0x90, 0x93, 0xD7, -0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0x6F, 0xE0, 0x90, 0x93, 0xD7, 0x60, 0x09, 0x12, 0x1F, 0xD5, -0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x01, 0x10, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0xD7, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x56, 0x9D, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, -0xF0, 0xEF, 0x60, 0x0A, 0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x8B, 0x53, 0x63, -0xF0, 0x43, 0x63, 0x0C, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x07, 0x90, 0x05, 0x27, 0xE0, 0x54, -0x7F, 0xF0, 0x22, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, -0x8A, 0x65, 0xEF, 0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, -0x3A, 0x93, 0x12, 0x54, 0x14, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0xE5, 0x64, 0x30, 0xE6, -0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, -0x53, 0x64, 0xBF, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x83, 0xE0, 0x30, 0xE0, -0x03, 0x75, 0x64, 0x02, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, -0x05, 0x7F, 0x01, 0x12, 0x4E, 0x8B, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x90, 0x93, 0x98, 0xE0, -0x30, 0xE0, 0x07, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x3D, 0xE0, 0x70, -0x1A, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0x68, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, -0x95, 0x8E, 0x6E, 0x8F, 0x6F, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x3E, 0xE0, -0x60, 0x16, 0x90, 0x93, 0x41, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x3B, 0xE0, 0x90, 0x07, 0x78, 0x60, -0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0xEA, 0xEF, 0xF0, 0x12, 0x56, -0x14, 0x90, 0x93, 0xEA, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, -0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, -0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x98, 0xE0, -0x30, 0xE0, 0x05, 0xAF, 0x64, 0x02, 0x5F, 0x72, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, 0xF4, 0x22, -0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0x02, 0x12, 0x4D, 0xEF, 0x53, 0x63, 0xF0, 0x43, -0x63, 0x02, 0x22, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x38, 0xF0, 0xF5, 0x66, 0x22, 0x90, -0x02, 0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, -0x43, 0xF7, 0x51, 0xFA, 0x00, 0x40, 0x52, 0x22, 0x00, 0x80, 0x52, 0x4D, 0x01, 0x00, 0x52, 0x61, -0x02, 0x00, 0x52, 0x79, 0x04, 0x00, 0x00, 0x00, 0x52, 0x96, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, -0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, -0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0x80, 0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, -0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, -0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, -0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, -0x35, 0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, -0x2D, 0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, -0xFF, 0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, -0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1F, -0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x0C, 0xF0, 0xA3, 0xF0, 0x12, 0x60, 0xFB, 0x75, -0x8E, 0x02, 0x91, 0xE6, 0x12, 0x60, 0x52, 0x90, 0x93, 0x70, 0xEF, 0xF0, 0x12, 0x60, 0x65, 0x90, -0x93, 0x72, 0xEF, 0xF0, 0x12, 0x60, 0x71, 0x90, 0x93, 0x54, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, -0xF5, 0x18, 0xF5, 0x0D, 0xF5, 0x62, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, -0xF0, 0x12, 0x7E, 0x58, 0x12, 0x47, 0xA3, 0x12, 0x37, 0x1C, 0x7F, 0x03, 0x12, 0x88, 0x1B, 0x71, -0x8D, 0x12, 0x60, 0x16, 0x12, 0x60, 0x89, 0x12, 0x60, 0x9E, 0x12, 0x60, 0x34, 0x12, 0x45, 0x02, -0x12, 0x61, 0x03, 0x91, 0xCE, 0x90, 0x93, 0x0E, 0xE5, 0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, -0xE0, 0x44, 0x40, 0xF0, 0x71, 0xFE, 0x75, 0xE8, 0x03, 0x43, 0xA8, 0x85, 0xD2, 0xAF, 0x12, 0x82, -0xBB, 0x51, 0x9B, 0x12, 0x60, 0xA5, 0x90, 0x93, 0x0C, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xA5, 0x90, -0x01, 0xC4, 0xF0, 0x74, 0x52, 0xA3, 0xF0, 0xE5, 0x18, 0x30, 0xE4, 0x0A, 0xC2, 0xAF, 0x53, 0x18, -0xEF, 0xD2, 0xAF, 0x12, 0x67, 0x8F, 0xE5, 0x18, 0x30, 0xE6, 0x0A, 0xC2, 0xAF, 0x53, 0x18, 0xBF, -0xD2, 0xAF, 0x12, 0x76, 0x54, 0xE5, 0x18, 0x30, 0xE7, 0x0A, 0xC2, 0xAF, 0x53, 0x18, 0x7F, 0xD2, -0xAF, 0x12, 0x82, 0x61, 0xC2, 0xAF, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0xBF, 0x01, 0x0D, 0x90, 0x93, -0x3A, 0x74, 0x01, 0xF0, 0x31, 0x9C, 0xE4, 0x90, 0x93, 0x3A, 0xF0, 0xD2, 0xAF, 0x90, 0x01, 0xBD, -0xE5, 0x63, 0xF0, 0x90, 0x93, 0x50, 0xE0, 0x90, 0x01, 0xBC, 0xF0, 0x80, 0x99, 0x90, 0x01, 0x3C, -0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, -0xF0, 0xFD, 0x7F, 0x54, 0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x55, 0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x56, -0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, -0x83, 0x00, 0xED, 0xF0, 0x71, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xFD, 0x7F, 0x50, 0x71, 0xB6, 0xE4, 0xFD, 0x7F, 0x51, 0x71, 0xB6, 0xE4, 0xFD, 0x7F, 0x52, 0x71, -0xB6, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xF0, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, -0x22, 0x74, 0xFF, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xB4, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xB8, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, -0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x71, 0xFE, 0x71, 0xF7, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, -0xF0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, -0x44, 0x20, 0xF0, 0x90, 0x93, 0x41, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, -0x93, 0x34, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x4D, 0xF0, 0xFF, 0x7E, 0x08, 0x12, 0x2C, 0x6E, -0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0xEC, 0x54, 0xFD, 0xFC, -0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, -0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x22, 0xE4, -0xFF, 0x11, 0x56, 0x90, 0x93, 0x52, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xB8, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB8, 0xD1, 0x99, 0x90, 0x07, 0x78, 0x74, 0x01, -0xF0, 0x90, 0x93, 0x48, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, -0xE0, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x93, 0xE2, 0xF0, 0x90, 0x93, 0xE0, 0xE0, 0x54, 0x7F, -0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x6C, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, -0x80, 0xFD, 0x7F, 0x80, 0x61, 0xB6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x8A, 0x65, 0xEF, -0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x91, 0x14, 0x90, 0x93, 0x9F, 0x74, 0x02, 0xF0, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x9F, 0xE0, 0x90, 0x93, 0xEB, 0xF0, -0x6F, 0x70, 0x02, 0xA1, 0xDC, 0xEF, 0x14, 0x60, 0x3B, 0x14, 0x60, 0x5F, 0x14, 0x70, 0x02, 0xA1, -0xB6, 0x24, 0x03, 0x60, 0x02, 0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x03, 0x04, 0xD1, 0xE4, -0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x02, 0x04, 0xD1, 0xFC, 0xA1, 0xDC, 0x90, 0x93, 0xEB, -0xE0, 0xB4, 0x04, 0x04, 0xF1, 0x00, 0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0x64, 0x01, 0x70, 0x7C, -0xD1, 0xE6, 0x80, 0x78, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x03, 0x04, 0xF1, 0x35, 0x80, 0x6C, -0xEF, 0xB4, 0x02, 0x04, 0xF1, 0x04, 0x80, 0x64, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x04, 0x04, -0xF1, 0x1A, 0x80, 0x58, 0xEF, 0x70, 0x55, 0xD1, 0x01, 0x80, 0x51, 0x90, 0x93, 0xEB, 0xE0, 0xB4, -0x03, 0x04, 0xF1, 0x25, 0x80, 0x46, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x01, 0x04, 0x91, 0xF6, 0x80, -0x3B, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x04, 0x04, 0xF1, 0x11, 0x80, 0x30, 0x90, 0x93, 0xEB, 0xE0, -0x70, 0x2A, 0xB1, 0xE1, 0x80, 0x26, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x01, 0x04, 0xB1, 0xE5, -0x80, 0x1A, 0xEF, 0xB4, 0x02, 0x04, 0xB1, 0xFD, 0x80, 0x12, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, -0x04, 0x05, 0x12, 0x44, 0xFF, 0x80, 0x05, 0xEF, 0x70, 0x02, 0xB1, 0xF9, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD1, 0x01, 0x81, 0xF6, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, -0xBF, 0xF0, 0x90, 0x93, 0x9F, 0x74, 0x03, 0xF0, 0x22, 0xD1, 0x01, 0x80, 0xE8, 0xD1, 0x14, 0x80, -0xE4, 0x90, 0x01, 0x3E, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, 0x90, 0x93, 0x9F, -0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xAC, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xB0, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, -0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x41, 0xE0, -0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x0A, 0x31, 0x83, -0xEF, 0x64, 0x01, 0x60, 0x03, 0x12, 0x4F, 0x63, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x1C, 0x7F, 0x01, -0x11, 0x56, 0x90, 0x93, 0x52, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xB0, 0x12, 0x1F, 0xD5, 0x00, 0x00, -0x03, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB0, 0xD1, 0x99, 0x71, 0xF7, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x90, 0x93, 0xEC, 0xEF, 0xF0, 0xD1, 0x14, 0x90, 0x93, 0xEC, 0xE0, 0x60, 0x05, 0x90, 0x05, -0x22, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x22, 0x7F, 0x70, 0x7E, 0x08, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, 0xEE, 0x44, 0xF0, 0xA3, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, -0x0F, 0x90, 0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEE, 0xF0, 0x12, -0x1E, 0xF6, 0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, 0x12, 0x88, 0x6C, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x35, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x3A, 0x3F, 0x90, 0x05, 0x27, -0xE4, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x93, 0x9F, 0xF0, 0x22, 0xF1, 0x04, 0x80, 0xE6, -0xF1, 0x1A, 0x80, 0xE2, 0xD1, 0x14, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x9F, 0x04, 0xF0, -0x22, 0x91, 0x14, 0x90, 0x93, 0x9F, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, -0x93, 0x9F, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x0E, 0x90, 0x93, -0x9F, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, -0xF0, 0x90, 0x93, 0x9F, 0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0xED, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x46, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, -0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x71, 0xFE, -0x90, 0x93, 0xED, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, -0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4B, 0x90, -0x93, 0xED, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, -0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, 0xF0, 0x71, 0xFE, 0x90, 0x93, 0xED, -0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, -0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, -0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x8B, 0x21, 0x8A, 0x22, 0x89, 0x23, 0x90, 0x93, 0xBC, 0x12, 0x43, 0xC8, 0xAB, 0x24, 0xAA, 0x25, -0xA9, 0x26, 0x90, 0x93, 0xBF, 0x12, 0x43, 0xC8, 0xAF, 0x27, 0x15, 0x27, 0xEF, 0x60, 0x1E, 0x90, -0x93, 0xBF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x93, 0xBC, -0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, 0x12, 0x42, 0x53, 0x80, 0xDB, 0xAB, 0x21, 0xAA, -0x22, 0xA9, 0x23, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x01, 0xC4, 0x74, 0x48, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, -0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, -0xC7, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x11, 0x48, 0xBF, 0x01, 0x0F, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x95, 0x90, 0x04, -0x1F, 0x74, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, -0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, -0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, -0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, -0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, -0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13, -0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x93, 0x01, -0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07, -0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3B, 0x90, 0x93, 0x01, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D, -0xF0, 0x79, 0x40, 0x90, 0x93, 0x01, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0, -0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0x5E, 0xF0, 0x22, 0x90, 0x93, 0x5E, 0xE0, 0x04, -0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0B, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x02, -0x11, 0x80, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, -0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, -0x90, 0x01, 0xC4, 0x74, 0x63, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28, -0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0, -0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x61, 0x57, 0x90, 0x01, 0x34, 0x74, 0x01, -0xF0, 0x85, 0xD1, 0x0E, 0x85, 0xD3, 0x10, 0x85, 0xD4, 0x11, 0x85, 0xD5, 0x12, 0x85, 0xD6, 0x13, -0x85, 0xD7, 0x14, 0x85, 0xD9, 0x15, 0x85, 0xD2, 0x0F, 0x75, 0x24, 0x00, 0x75, 0x25, 0x00, 0x75, -0x26, 0x0E, 0x75, 0x27, 0x08, 0xFB, 0x7A, 0x93, 0x79, 0x5F, 0x12, 0x57, 0xF9, 0x90, 0x93, 0x60, -0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x70, 0x02, -0x61, 0x08, 0x90, 0x93, 0x60, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, -0x61, 0x08, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, 0x93, 0x61, 0xE0, 0x54, 0x3F, 0xF5, 0x4E, 0x90, -0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, -0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xE5, 0x4E, 0xD3, 0x94, 0x04, 0x40, 0x03, -0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, -0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x63, 0xE0, 0x54, -0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, -0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, -0x60, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2F, 0x90, 0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, -0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, -0x12, 0x42, 0x87, 0x90, 0x93, 0x62, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, -0x67, 0xAF, 0x4D, 0x12, 0x71, 0x11, 0x80, 0x60, 0x90, 0x93, 0x60, 0xE0, 0xFF, 0xC4, 0x13, 0x13, -0x54, 0x03, 0x30, 0xE0, 0x53, 0x90, 0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, 0xFD, 0xE5, 0x4D, 0x25, -0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8D, 0xF0, 0x12, 0x42, 0x87, -0x90, 0x93, 0x62, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0xEE, 0x54, -0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, 0x12, 0x70, 0xAD, 0x80, 0x1B, 0x90, 0x01, 0x02, -0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, 0x0A, 0xE4, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, -0x46, 0x90, 0x93, 0x50, 0xE0, 0x60, 0x37, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, -0x04, 0xF0, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, -0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, -0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x80, 0x09, 0x12, 0x51, -0x83, 0xBF, 0x01, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0xF9, 0x90, 0x01, -0x34, 0x74, 0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, -0x0B, 0x75, 0x4F, 0x88, 0x75, 0x50, 0x0F, 0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, 0x75, -0x50, 0x08, 0x75, 0x51, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x16, 0x90, 0x04, 0x7E, -0xE0, 0x55, 0x51, 0xF5, 0x17, 0x65, 0x16, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x16, 0x75, 0xF0, 0x08, -0xA4, 0x25, 0x4F, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, -0x19, 0x2F, 0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x24, 0x00, 0x75, 0x25, 0x00, 0x75, -0x26, 0x19, 0x75, 0x27, 0x08, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x56, 0x12, 0x57, 0xF9, 0x90, 0x93, -0x56, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0x9F, 0xE5, 0x16, -0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, -0x16, 0x90, 0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x17, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, -0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, -0x18, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, -0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x53, -0xCB, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x53, 0xFE, 0x80, 0xFE, 0xE5, 0x2C, 0x30, -0xE6, 0x06, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x30, 0xE0, 0x52, 0x90, 0x93, 0x71, -0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x93, 0x6E, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, -0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x9E, 0xE0, -0x30, 0xE0, 0x0D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x06, 0x90, 0x93, 0xA0, 0x74, 0x01, 0xF0, -0x90, 0x93, 0x98, 0xE0, 0xFF, 0x30, 0xE0, 0x0D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x06, 0x90, -0x93, 0x9A, 0x74, 0x01, 0xF0, 0x12, 0x45, 0x09, 0xF1, 0xBF, 0x90, 0x93, 0x71, 0xE4, 0xF0, 0xE5, -0x2E, 0x30, 0xE1, 0x7D, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, -0x05, 0x61, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xF5, 0x0A, 0xEC, 0x3E, 0xF5, 0x09, 0x90, 0x05, 0x22, -0xE0, 0xB4, 0xFF, 0x06, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x01, -0xE4, 0xF0, 0x43, 0x18, 0x40, 0x11, 0xF5, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0C, 0xE4, 0xFF, -0xD1, 0x91, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x53, 0xE0, 0x60, 0x1D, -0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, -0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, -0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, -0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x7B, 0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x62, 0xE0, -0xFE, 0x90, 0x05, 0x61, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xF5, 0x0C, 0xEC, 0x3E, 0xF5, 0x0B, 0xD3, -0xE5, 0x0C, 0x95, 0x0A, 0xE5, 0x0B, 0x95, 0x09, 0x40, 0x06, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, -0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0D, 0x90, 0x93, 0x39, 0xE4, 0xF0, 0x90, 0x93, 0x99, 0xE0, -0x64, 0x06, 0x60, 0x3D, 0x12, 0x4B, 0x90, 0x90, 0x93, 0x53, 0xE0, 0x60, 0x34, 0x90, 0x93, 0x4E, -0xE0, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x05, 0x73, -0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, 0x01, 0x7F, -0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x37, 0xE0, 0x14, -0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x62, 0x64, 0x01, -0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, -0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x42, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, -0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, 0x90, -0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, 0x60, 0x1C, 0x90, 0x01, -0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x51, 0xE4, 0xF0, 0x53, 0x66, -0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2E, 0x30, 0xE5, 0x1F, 0x90, -0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x14, 0xE5, 0x65, 0x60, 0x10, 0x90, 0x93, -0x50, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x51, 0x2B, 0x80, 0x03, 0x12, 0x4F, 0x1D, 0xE5, 0x2E, -0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, -0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2F, -0x30, 0xE1, 0x18, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x08, -0x90, 0x93, 0x9D, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x12, 0x4E, 0xD6, 0x74, 0x63, 0x04, 0x90, 0x01, -0xC4, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, -0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, -0x32, 0x8F, 0x71, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, -0x93, 0x01, 0xE0, 0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, -0x00, 0x79, 0x19, 0x90, 0x93, 0xCB, 0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x01, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, 0xFF, -0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x92, -0x69, 0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, 0xFF, -0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0x12, 0x81, 0x51, 0xEF, 0x60, 0x72, 0x12, 0x82, 0x61, 0x90, 0x01, -0x3F, 0x74, 0x02, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6B, 0xF9, 0x74, -0x92, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xA8, 0x7E, 0x00, -0x7F, 0x02, 0x12, 0x1E, 0xD0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6D, 0xF9, -0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xCB, -0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xA8, 0x12, -0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x27, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x57, -0xF9, 0x90, 0x92, 0x6A, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xAE, 0x07, 0xE4, 0xFF, 0xD1, 0x91, 0xEF, 0x60, 0x19, 0x90, 0x93, 0x98, 0xE0, 0xC4, -0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0D, 0xAF, 0x06, 0x7D, 0x01, 0x12, 0x48, 0xF4, 0x12, 0x67, -0x4A, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x26, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x29, -0xE0, 0x54, 0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, 0x93, 0x26, 0x12, 0x43, -0xA8, 0x90, 0x93, 0xCB, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x29, 0xC1, 0xBE, 0x90, -0x93, 0xE0, 0xE0, 0x30, 0xE0, 0x2F, 0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x93, 0xDF, 0xE0, 0x04, -0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x93, 0xE2, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0xDF, 0xF0, -0x90, 0x93, 0xE2, 0xE0, 0xFF, 0x90, 0x93, 0xE1, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x8A, 0xA6, -0xE4, 0x90, 0x93, 0xE2, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, -0xEF, 0x30, 0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, -0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, -0x2B, 0x90, 0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, -0xE5, 0x2B, 0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, -0x43, 0x32, 0x20, 0x90, 0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, -0xF0, 0x22, 0x90, 0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, -0x02, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, 0x7F, 0x01, -0x22, 0x90, 0x93, 0x72, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, -0xFD, 0x7F, 0x33, 0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, -0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, -0x64, 0x74, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, -0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, 0x10, -0xE0, 0x94, 0x88, 0x90, 0x93, 0x0F, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, -0x80, 0xF0, 0x22, 0x90, 0x93, 0x0F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, -0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0x10, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x0F, 0xE0, 0x94, -0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, -0x01, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, -0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, -0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, -0x04, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, -0xC0, 0x06, 0xC0, 0x07, 0x7D, 0x33, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x61, 0xFF, 0xA3, 0xF0, -0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, -0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, -0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, -0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, -0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, -0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, -0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, -0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, -0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, -0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, -0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, 0x56, 0x00, 0x90, 0x01, 0xC4, 0x74, 0xDA, 0xF0, -0x74, 0x61, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, -0xE0, 0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, -0x37, 0xE5, 0x34, 0x30, 0xE0, 0x1A, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x98, 0xE0, -0x30, 0xE0, 0x0D, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0xE5, 0x34, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x44, 0x24, 0xE5, 0x34, -0x30, 0xE2, 0x36, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, -0x75, 0x48, 0x00, 0x90, 0x93, 0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, -0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, -0x08, 0x90, 0x93, 0x4C, 0xE4, 0xF0, 0x12, 0x51, 0x9C, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, -0x3C, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, -0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x49, 0xE4, -0xF0, 0x12, 0x51, 0x9C, 0xE5, 0x34, 0x30, 0xE4, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0xE5, -0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, 0x90, -0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, 0x64, -0xF0, 0x12, 0x50, 0xDC, 0x12, 0x51, 0x9C, 0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, 0x74, -0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x6D, -0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, -0x04, 0xF0, 0xE5, 0x36, 0x20, 0xE0, 0x02, 0x61, 0xAF, 0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0x90, -0x93, 0x9E, 0xE0, 0x30, 0xE0, 0x13, 0xA3, 0xE0, 0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x5E, -0x91, 0xEF, 0x60, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x11, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x5F, -0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x60, 0x3B, 0x91, 0x86, 0x90, 0x93, 0x99, 0xE0, 0xFF, 0x64, -0x06, 0x60, 0x30, 0xEF, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x04, -0xE4, 0xFF, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, -0x93, 0x99, 0xE0, 0xB4, 0x02, 0x04, 0x7F, 0x01, 0x91, 0xDA, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, -0xF4, 0xF1, 0x4A, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x75, 0x48, 0x00, 0x75, 0x49, 0x03, 0xE4, -0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0xE5, -0x36, 0x30, 0xE1, 0x3C, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0x30, 0xE0, -0x13, 0xA3, 0xE0, 0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x05, 0x7F, -0x02, 0x12, 0x55, 0x11, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x15, 0x12, 0x89, 0xF6, 0x90, 0x93, -0x99, 0xE0, 0x64, 0x06, 0x60, 0x0A, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x02, 0x91, 0xA8, -0xE5, 0x36, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xE5, 0x36, 0x30, 0xE4, 0x06, -0x90, 0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x04, -0xF0, 0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, 0x30, 0xE6, -0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, 0x3E, 0x74, -0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, 0x18, 0x80, -0xE5, 0x37, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x46, 0xAC, 0x90, 0x93, -0x4E, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x12, 0x5F, 0xBF, -0x74, 0xDA, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, -0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, -0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x98, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x30, 0xE0, 0x0A, 0xA3, 0xE0, 0x64, 0x06, 0x60, 0x04, 0x7F, 0x06, 0x91, 0xDA, 0x90, 0x93, 0x99, -0xE0, 0x64, 0x06, 0x60, 0x02, 0xF1, 0x29, 0x22, 0x90, 0x93, 0x39, 0xE0, 0x60, 0x16, 0x90, 0x93, -0x99, 0xE0, 0x70, 0x04, 0x7F, 0x05, 0x80, 0x1F, 0x90, 0x93, 0x99, 0xE0, 0x64, 0x01, 0x70, 0x19, -0x7F, 0x02, 0x80, 0x13, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x08, 0x90, -0x93, 0x99, 0xE0, 0x70, 0x04, 0x7F, 0x04, 0x91, 0xDA, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xC1, 0xAC, 0xEF, 0x12, 0x43, 0xD1, 0x65, -0x08, 0x00, 0x65, 0x43, 0x01, 0x65, 0x8A, 0x02, 0x65, 0xC5, 0x03, 0x65, 0xFE, 0x04, 0x66, 0x37, -0x05, 0x66, 0x73, 0x06, 0x00, 0x00, 0x66, 0xAC, 0xEE, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, -0x81, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xFF, 0xB4, 0x05, 0x04, 0xD1, 0xBB, 0xC1, 0xAC, 0xEF, -0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x06, -0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xD1, -0xF0, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, -0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, -0xD1, 0xE6, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, -0xC1, 0xAC, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xD1, 0xB1, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, -0x64, 0x02, 0x60, 0x02, 0xC1, 0xAC, 0xD1, 0xC5, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, -0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, -0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, 0xD1, 0xE6, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xFE, -0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, 0x80, 0x08, 0xEE, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0xD1, -0xB1, 0xF1, 0x1C, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, -0x81, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, -0x70, 0x04, 0xD1, 0xE6, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, -0xD1, 0xD0, 0x80, 0x06, 0xEE, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xF1, 0x05, 0xC1, 0xAC, 0x90, 0x93, -0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, 0xD1, 0xD0, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, -0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0x90, -0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0xF0, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, -0x02, 0xD1, 0xBB, 0xD1, 0xFB, 0x80, 0x75, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, -0xFF, 0xD1, 0xD0, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, -0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0xD1, -0xF0, 0x80, 0x0C, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x05, 0x7F, 0x01, 0x12, 0x56, 0x81, 0xF1, -0x0F, 0x80, 0x39, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, -0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, -0xD1, 0xE6, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x06, 0xE4, 0xFF, 0xD1, 0xB1, 0x80, -0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xF1, 0x36, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x12, 0x51, 0x69, 0x90, 0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x90, 0x93, 0x99, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x99, 0x04, 0xF0, 0x22, -0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, -0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x51, 0x05, 0x90, 0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, -0x7F, 0x01, 0x12, 0x50, 0x8A, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x22, 0x12, 0x54, 0x0E, 0x90, 0x93, -0x99, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x50, 0xB3, 0x90, 0x93, 0x99, 0x74, 0x03, 0xF0, 0x22, 0x90, -0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, -0xFF, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x93, 0x9D, 0xE0, 0xB4, 0x01, 0x05, -0xE4, 0xF0, 0x12, 0x4E, 0xD6, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x06, 0xF0, 0x22, 0x90, 0x93, 0x99, 0xE0, 0x64, 0x06, -0x60, 0x3C, 0xE5, 0x63, 0x54, 0x0F, 0x14, 0x60, 0x2E, 0x14, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x0E, -0x24, 0xF8, 0x70, 0x2A, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x90, 0x05, 0x22, 0xF0, 0x22, 0x90, 0x93, -0x99, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x99, 0x74, 0x03, 0xF0, -0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x0F, 0xF0, -0x90, 0x93, 0x0F, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x68, 0xDA, 0x90, 0x93, 0xE9, 0xE0, 0xFF, 0x74, -0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, -0xEF, 0x5D, 0x70, 0x03, 0x02, 0x68, 0xD3, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, -0xD0, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x75, 0x24, 0x01, 0x75, 0x25, 0x93, 0x75, -0x26, 0x10, 0x75, 0x27, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x11, 0x12, 0x57, 0xF9, 0x90, 0x93, -0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0xE9, 0x30, 0xE0, 0x59, 0xE0, -0x75, 0xF0, 0x02, 0x90, 0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x12, 0xF0, 0x90, 0x93, -0xE9, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x13, 0xF0, -0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x14, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x15, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, -0x9C, 0xE0, 0x90, 0x93, 0x16, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, -0x43, 0x9C, 0xE0, 0x90, 0x93, 0x12, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, -0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x13, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, -0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x14, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, -0x01, 0x7A, 0x93, 0x79, 0x12, 0x11, 0xDF, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x90, 0x93, 0xE9, 0xE0, -0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, -0x0F, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, -0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, -0x02, 0x67, 0xA0, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0x93, 0x17, 0x12, 0x43, 0xC8, 0xEF, 0x12, 0x43, 0xD1, 0x69, 0x2E, 0x01, 0x69, 0x26, 0x02, 0x69, -0x73, 0x03, 0x69, 0x7C, 0x05, 0x69, 0x85, 0x06, 0x69, 0xC8, 0x07, 0x69, 0x8D, 0x08, 0x69, 0x96, -0x0B, 0x69, 0x9F, 0x1B, 0x69, 0xA7, 0x1C, 0x69, 0x37, 0x2D, 0x69, 0x40, 0x2E, 0x69, 0xAF, 0x30, -0x69, 0x52, 0x34, 0x69, 0x49, 0x3B, 0x69, 0x5A, 0x47, 0x69, 0x6B, 0x48, 0x69, 0x63, 0x49, 0x69, -0xB8, 0x4B, 0x00, 0x00, 0x69, 0xC1, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xB9, 0x90, 0x93, -0x17, 0x12, 0x43, 0xA8, 0x02, 0x82, 0xC7, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x83, 0xA8, -0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x83, 0xF0, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, -0x84, 0x29, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xBF, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, -0x02, 0x84, 0x54, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xD5, 0x90, 0x93, 0x17, 0x12, 0x43, -0xA8, 0xE1, 0xCD, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x85, 0x14, 0x90, 0x93, 0x17, 0x12, -0x43, 0xA8, 0x02, 0x80, 0x54, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x80, 0x3C, 0x90, 0x93, 0x17, -0x12, 0x43, 0xA8, 0x02, 0x85, 0x5C, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x80, 0x80, 0x90, -0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xC5, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xA1, 0x90, -0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0xAB, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x88, -0x5A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, -0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0x90, 0x93, 0x1A, -0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x00, -0x04, 0x12, 0x1F, 0x0F, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, 0x20, 0xF0, 0x90, -0x93, 0x1A, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAD, 0x82, 0xAC, -0x83, 0x90, 0x93, 0x21, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, -0xF9, 0x74, 0x8A, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1C, 0x12, -0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x23, 0x12, 0x43, -0xA8, 0xEF, 0x12, 0x42, 0x53, 0x90, 0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, -0x0F, 0xFF, 0x90, 0x93, 0x23, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x90, -0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x21, 0xE0, -0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0x8D, 0x82, 0x8C, -0x83, 0xA3, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0xFF, 0x24, 0xC2, 0xF5, -0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFE, 0x75, 0xF0, 0x09, -0xEF, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8B, -0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, -0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x8F, 0x57, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, -0xE4, 0x34, 0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, 0x57, 0x75, 0xF0, 0x02, 0xA4, 0x24, -0x02, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0x75, 0xF0, 0x09, -0xE5, 0x57, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, 0x85, 0x83, 0x5D, 0x8F, 0x5E, 0xE5, -0x57, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0x75, 0x5F, 0x01, 0xF5, -0x60, 0x89, 0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x12, -0x43, 0xD1, 0x6B, 0x57, 0x00, 0x6B, 0x6C, 0x01, 0x6B, 0x81, 0x02, 0x6B, 0x96, 0x03, 0x6B, 0xBF, -0x04, 0x6B, 0xD4, 0x05, 0x6B, 0xE9, 0x06, 0x6C, 0x0F, 0x0C, 0x6C, 0x3C, 0x0D, 0x6C, 0x69, 0x0E, -0x6C, 0x96, 0x0F, 0x00, 0x00, 0x6C, 0xCA, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80, -0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, -0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, -0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, -0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, 0x81, 0xCA, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, -0x74, 0xF5, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x81, 0xCA, 0x90, -0x04, 0x47, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x46, 0xE0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x45, 0xE0, -0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, 0x81, 0xC1, 0x90, 0x04, 0x4B, 0xE0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4A, 0xE0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x49, 0xE0, 0x85, 0x59, 0x82, -0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, -0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, -0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, -0x12, 0x42, 0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, -0x12, 0x42, 0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, -0x50, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, -0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, -0x12, 0x1E, 0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0xAB, 0x5A, 0xE5, -0x5C, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, -0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x5F, 0xD0, -0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xC0, 0x83, -0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, -0xD0, 0x83, 0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, -0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, -0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, -0xE0, 0x4E, 0x60, 0x4B, 0x90, 0x93, 0x26, 0x74, 0x0B, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, -0x94, 0x00, 0x50, 0x02, 0xC1, 0x0F, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, -0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, -0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x0A, 0x90, 0x93, 0x26, -0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x26, 0xE0, 0x14, 0xF0, 0x80, 0xBB, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, -0x4E, 0x60, 0x47, 0x90, 0x93, 0x26, 0x74, 0x0F, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, -0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, -0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x26, 0xE0, 0xA3, 0xF0, -0x80, 0x0D, 0x90, 0x93, 0x26, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, -0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x26, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, 0x10, -0x40, 0x02, 0xC1, 0xC8, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, -0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, -0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, 0x93, 0x26, 0xE0, 0x80, -0x63, 0x90, 0x93, 0x26, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, -0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, -0x26, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, -0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, -0x4E, 0x60, 0x08, 0x90, 0x93, 0x26, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, 0x93, 0x26, 0xE0, 0x04, -0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x28, 0xF0, 0x90, 0x93, 0x27, 0xE0, 0xFF, 0x75, 0xF0, 0x09, -0xE5, 0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, 0x90, 0x93, 0x28, 0xE0, 0xFE, 0x75, -0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xE5, 0x57, 0xC3, 0x94, -0x20, 0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, -0x9F, 0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, -0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x28, 0xE0, 0xA3, 0xF0, 0x80, 0x37, 0x80, 0x2D, 0x74, -0x27, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x27, 0xE0, -0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x29, 0xEE, 0xF0, 0x80, 0x17, 0x90, 0x93, 0x28, -0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x27, 0xE0, -0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, 0x29, 0xE0, 0xFD, 0xAF, 0x57, 0x12, 0x70, 0x63, 0x90, 0x93, -0x29, 0xE0, 0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, -0x90, 0x93, 0x27, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x03, 0xF0, -0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3, -0x94, 0x03, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x8A, 0x83, 0xF0, -0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x80, 0xC4, 0x13, -0x13, 0x13, 0x54, 0x01, 0xFD, 0xAF, 0x06, 0x21, 0xDD, 0x12, 0x1E, 0xF6, 0xF5, 0x62, 0x22, 0x90, -0x93, 0x1A, 0x02, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0x90, 0x89, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, -0x90, 0x93, 0x6F, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x60, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, -0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xCE, -0x12, 0x43, 0xC8, 0x90, 0x93, 0xD1, 0xE0, 0x54, 0xF0, 0x44, 0x06, 0xFF, 0xF0, 0xED, 0x54, 0x0F, -0xC4, 0x54, 0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x93, 0xCE, 0x12, 0x43, 0xA8, 0x90, -0x93, 0xCB, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xD1, 0x12, 0x5E, 0xBE, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, -0xF0, 0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, -0x54, 0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, -0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, -0x4D, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x0E, -0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, 0x2A, 0x74, 0x27, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0x8B, 0xEF, 0xF0, 0x24, -0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x8C, 0xF0, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0x8B, 0x7D, 0x02, 0x12, 0x6F, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, -0x53, 0xE5, 0x53, 0x54, 0x1F, 0x90, 0x93, 0x03, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x88, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x93, 0x04, 0x74, 0x01, 0xF0, 0xEB, 0xC3, -0x94, 0x01, 0x40, 0x02, 0x80, 0x3B, 0x90, 0x93, 0x01, 0xE0, 0x25, 0x55, 0xFF, 0xA3, 0xF0, 0xA3, -0xE0, 0x90, 0x41, 0x9E, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x13, 0x74, 0x01, 0x25, 0x52, 0xF5, -0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x01, 0x63, 0x90, 0x93, -0x02, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEF, 0xF0, -0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x06, 0xF0, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, -0x93, 0x05, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, -0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x5D, -0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, -0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFF, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, -0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x0D, -0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, 0x93, 0x06, -0xE0, 0xFF, 0x90, 0x93, 0x05, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, 0x05, 0xE0, -0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, -0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, -0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, -0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, -0x90, 0x93, 0x05, 0xE0, 0xFD, 0x11, 0x63, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, -0x12, 0x90, 0x04, 0x30, 0xE0, 0x70, 0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0x04, -0xCF, 0x04, 0xF0, 0x90, 0x93, 0x05, 0xE0, 0xFF, 0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, -0x13, 0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, -0x1F, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, -0x7F, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x22, 0xF0, -0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x24, 0xF0, 0x75, -0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x25, 0xF0, 0xEC, -0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, -0x93, 0x26, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, -0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x28, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, -0xC6, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, -0x90, 0x93, 0x25, 0xE0, 0x90, 0x93, 0x22, 0xF0, 0x90, 0x93, 0x1F, 0xF0, 0xED, 0x70, 0x02, 0x61, -0xA3, 0x90, 0x93, 0x23, 0xED, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x22, -0xE0, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0x14, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0x70, -0x02, 0x61, 0xA3, 0x90, 0x93, 0x22, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0x61, 0xA3, 0xE4, -0x90, 0x93, 0x21, 0xF0, 0xEF, 0x14, 0x90, 0x93, 0x20, 0xF0, 0x90, 0x93, 0x24, 0xE0, 0xFD, 0x90, -0x93, 0x20, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, -0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, -0xF9, 0xFF, 0x90, 0x93, 0x28, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, -0x20, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x26, 0xE0, 0x5E, 0xFE, 0xA3, -0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x93, 0x20, 0xE0, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x21, -0xE0, 0x04, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0x6F, 0x60, 0x08, 0x90, -0x93, 0x20, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, 0x93, 0x23, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, -0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x93, 0x20, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x93, 0x24, 0xE0, 0x90, -0x93, 0x1F, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, -0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, -0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x93, 0x1F, 0xE0, 0xFD, 0x11, 0x63, 0x90, 0x93, -0x1F, 0xE0, 0xFF, 0x22, 0xAD, 0x07, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x11, 0x74, -0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x1F, 0xF0, -0x90, 0x93, 0x1F, 0xE0, 0xF9, 0x54, 0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, -0x12, 0x43, 0x9C, 0xE0, 0xFF, 0x90, 0x93, 0x22, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, -0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x23, 0xCB, 0xF0, 0xA3, 0xEB, -0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, -0xE0, 0x90, 0x93, 0x25, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFE, 0x25, 0xE0, -0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, -0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, -0xF0, 0xEE, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0x51, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x74, 0x28, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x93, 0x21, 0xF0, 0x90, -0x93, 0x22, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xA1, 0x8B, 0xEE, -0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, -0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x23, 0xE0, 0x5E, 0xFE, -0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x21, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, -0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0xFF, 0x90, 0x93, 0x25, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x21, -0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x93, 0x24, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x93, 0x21, 0x74, 0x17, -0xF0, 0x90, 0x93, 0x21, 0xE0, 0xFF, 0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, -0x23, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x21, 0x74, 0x18, 0xF0, 0x90, 0x93, 0x21, 0xE0, 0x90, -0x93, 0x20, 0xF0, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x42, 0x90, 0x93, 0x21, 0xE0, 0x04, 0xF0, 0x81, -0xAF, 0x90, 0x93, 0x22, 0xE0, 0xFC, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, -0x8A, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x20, 0xE0, -0x44, 0x40, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x93, 0x20, 0xE0, 0xFF, -0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, -0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, -0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, -0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, -0x93, 0x20, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90, 0x93, 0x22, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x20, 0xEF, 0xF0, 0x90, 0x93, 0x1F, -0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, -0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, -0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, -0xF0, 0xAF, 0x05, 0x90, 0x93, 0x1F, 0xE0, 0x44, 0x80, 0xFD, 0x11, 0x63, 0x90, 0x93, 0x1F, 0xE0, -0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, 0x94, -0x40, 0x40, 0x03, 0x02, 0x7E, 0x57, 0xEF, 0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, -0x90, 0x89, 0x01, 0xE0, 0xFF, 0x90, 0x8F, 0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, -0x0F, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, -0x03, 0x02, 0x7E, 0x4E, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x7E, 0x4E, 0x90, -0x93, 0x0F, 0xE0, 0x94, 0x20, 0x40, 0x09, 0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x7E, 0x57, -0x90, 0x93, 0x0F, 0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, -0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, -0x87, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x93, 0x14, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, -0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, -0x93, 0x16, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, -0x13, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, -0x10, 0xF0, 0x80, 0x14, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, -0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x10, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, -0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x19, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, -0x94, 0x05, 0x40, 0x03, 0x02, 0x79, 0xEC, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x90, 0x93, 0x11, 0xE0, -0x9F, 0x40, 0x13, 0x90, 0x93, 0x19, 0xE0, 0x90, 0x93, 0x11, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, -0x93, 0x10, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0x93, 0x11, 0xE0, 0xFF, 0x90, 0x41, 0x12, 0x93, 0xFE, -0x90, 0x93, 0x0F, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, -0x40, 0x06, 0xEF, 0x90, 0x40, 0xDA, 0x80, 0x07, 0x90, 0x93, 0x11, 0xE0, 0x90, 0x40, 0xF6, 0x93, -0x90, 0x93, 0x18, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x50, 0xF9, 0x74, -0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x8B, 0x57, 0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x0F, 0xE0, -0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, -0x93, 0x12, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x9D, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, -0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, -0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, -0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, -0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, -0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, -0x06, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, -0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, -0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, -0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, -0x58, 0xA9, 0x59, 0x90, 0x00, 0x05, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x14, 0xE0, -0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0xD3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, -0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0xF0, 0x80, 0x07, -0xE4, 0x90, 0x93, 0x12, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x12, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, -0x93, 0x0F, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x10, 0xE0, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, -0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, -0x21, 0xBB, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, -0xE0, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, -0x40, 0x03, 0xEF, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, -0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, -0xC3, 0x9E, 0x90, 0x93, 0x1A, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, -0x23, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, -0xD3, 0x94, 0x01, 0x40, 0x0F, 0x74, 0xC6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, -0x14, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, -0x83, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, -0x83, 0xE0, 0x60, 0x02, 0x81, 0xFC, 0x12, 0x73, 0xF4, 0x81, 0xFC, 0x90, 0x93, 0x10, 0xE0, 0x25, -0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, -0xFF, 0xC3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0x40, 0x02, 0x81, 0xFC, -0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x72, 0x29, 0x81, 0xFC, 0x90, 0x93, 0x0F, 0xE0, -0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, -0x61, 0xCA, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, -0x19, 0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, 0x11, -0x40, 0x2E, 0x80, 0x1F, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x11, 0xE0, -0xC3, 0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, -0x03, 0x40, 0x0D, 0x90, 0x8E, 0xC5, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, -0x90, 0x93, 0x0F, 0xE0, 0xFE, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, -0x93, 0x1E, 0xF0, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, -0x94, 0x30, 0x50, 0x0A, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x74, 0x67, 0x2F, 0x61, 0x75, 0x90, 0x8E, -0xC5, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x6A, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x06, 0xF5, 0x82, -0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xEE, -0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, -0xE0, 0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x0F, -0xE0, 0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, -0x93, 0x0F, 0xE0, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, -0x11, 0xE0, 0x6F, 0x60, 0x56, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, -0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x93, 0x1E, 0x74, 0x05, 0xF0, 0x80, -0x11, 0xEF, 0xD3, 0x94, 0x39, 0x90, 0x93, 0x1E, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, -0x01, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0xFE, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, -0x0F, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x80, 0x2F, 0x90, 0x93, 0x0F, 0xE0, 0xFF, -0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x90, -0x93, 0x0F, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, -0x11, 0xE0, 0xFE, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, -0x83, 0xEE, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFE, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, -0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, -0x01, 0x11, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, -0x83, 0xE4, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFD, 0x81, 0xF9, 0xEC, 0x64, 0x06, 0x60, 0x02, 0x81, -0xFC, 0x90, 0x93, 0x12, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xDB, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, -0x14, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x1C, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, -0x93, 0x1E, 0xF0, 0xE4, 0x90, 0x93, 0x1B, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0xD3, 0x94, 0x04, -0x50, 0x47, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, -0xF0, 0x83, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xD6, 0x93, 0xFF, 0x7E, 0x00, -0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x1C, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0x50, -0x08, 0x90, 0x93, 0x1B, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x93, 0x1B, 0xE0, 0xC3, 0x13, 0xF0, -0x90, 0x93, 0x1E, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x93, 0x1B, 0xE0, 0x70, 0x5D, 0x90, 0x93, -0x1E, 0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0x70, 0x08, -0x90, 0x93, 0x1E, 0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x1E, 0x74, -0x01, 0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, 0x93, 0x1E, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, -0x1B, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x1E, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, -0x1E, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x17, -0xE0, 0x94, 0x03, 0x90, 0x93, 0x16, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x1E, 0xF0, -0xD3, 0x90, 0x93, 0x17, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x16, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, -0x90, 0x93, 0x1E, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFD, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC4, -0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xED, 0xF0, 0x12, 0x70, 0x23, 0x90, 0x93, 0x0F, 0xE0, -0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, -0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, -0x93, 0x0F, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, -0x16, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, -0x93, 0x0F, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, -0xFA, 0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, 0x50, 0x1C, 0x90, 0x93, 0x16, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, -0x12, 0x42, 0x87, 0x80, 0x14, 0x90, 0x93, 0x0F, 0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x25, 0xE0, -0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, -0xFF, 0x9D, 0xFB, 0x74, 0xFF, 0x9C, 0xFA, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, -0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x0F, 0xE0, 0x50, -0x13, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, -0x42, 0x87, 0x80, 0x10, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, -0xFF, 0xF0, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, -0x00, 0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, -0x1F, 0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x25, -0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, -0x0F, 0xE0, 0x04, 0xF0, 0x02, 0x76, 0x59, 0x22, 0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, -0xF0, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, -0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, -0x83, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, -0x90, 0x89, 0x01, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, -0x94, 0x40, 0x40, 0x03, 0x02, 0x80, 0x53, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, -0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, -0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, -0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, -0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8E, 0x04, 0xF0, 0x90, 0x41, 0x8C, 0x93, 0xFE, 0x74, -0x01, 0x93, 0xFF, 0x90, 0x41, 0x54, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, -0xFE, 0xEF, 0x13, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, -0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, -0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, -0x74, 0x01, 0xF0, 0x74, 0xC2, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, -0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x09, 0xED, 0x90, 0x8A, 0x84, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, -0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, -0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x04, 0xF0, -0x02, 0x7E, 0x9A, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x90, 0x00, 0x02, -0x12, 0x1F, 0x0F, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, -0x22, 0xEF, 0xB4, 0x40, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, -0x94, 0x40, 0x40, 0x02, 0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, -0x1A, 0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, -0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x1C, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, -0x74, 0xFF, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, -0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x20, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, -0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x22, 0xF0, 0xEE, 0xA3, -0xF0, 0xA3, 0xEC, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x1A, 0x02, 0x5F, -0x97, 0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x93, 0xDB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x93, 0xDB, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, -0xC3, 0x90, 0x93, 0xDE, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0xDD, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, -0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xDD, 0xE4, 0x75, 0xF0, 0x01, -0x12, 0x42, 0x87, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, 0x7F, 0x01, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x68, 0xE0, -0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x31, 0x51, 0xEF, 0x70, 0x02, 0x41, -0x5C, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x75, 0x27, 0x02, -0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x57, 0xF9, 0x90, 0x93, 0xC5, 0x12, 0x43, 0xA8, 0x8B, -0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, -0x54, 0x0F, 0xF5, 0x27, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0x12, 0x57, 0xF9, 0x90, 0x01, 0xAF, -0x74, 0xFF, 0xF0, 0x90, 0x93, 0x70, 0xE0, 0x64, 0x01, 0x70, 0x4A, 0x90, 0x93, 0xC2, 0x12, 0x43, -0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x75, 0x27, 0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x20, -0x12, 0x57, 0xF9, 0x90, 0x93, 0xC5, 0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, -0x93, 0xC2, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x27, 0x7B, 0x01, -0x7A, 0xFD, 0x79, 0x22, 0x12, 0x57, 0xF9, 0x90, 0x93, 0x54, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, -0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, -0x24, 0x6B, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, -0xF0, 0x0F, 0xA4, 0x24, 0x6D, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x90, 0x93, 0xC5, 0x12, 0x43, -0xC8, 0xD0, 0x01, 0xD0, 0x02, 0x31, 0x9F, 0x90, 0x92, 0x69, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, -0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, -0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, -0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, -0x1A, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, -0x1A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x50, 0xF0, 0x90, 0x00, -0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x33, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, -0x01, 0x90, 0x93, 0x34, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x3E, 0xF0, 0x90, 0x00, -0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x3B, 0xF0, 0xEF, 0x13, 0x13, -0x13, 0x54, 0x01, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, -0x01, 0x90, 0x93, 0x3D, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x00, -0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x40, 0xF0, 0xE0, 0x70, -0x38, 0x90, 0x93, 0x3E, 0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0x56, 0x90, 0x93, 0x1D, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0x56, 0x90, 0x93, 0x1D, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x90, 0x93, 0x1D, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, -0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x34, 0xE0, 0x70, 0x03, 0x12, -0x4F, 0x63, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x4C, 0xDF, 0x90, 0x93, 0x50, 0xE0, 0x90, -0x01, 0xE6, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, -0xE0, 0x25, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x3F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0x93, 0x42, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x00, 0x03, 0x12, -0x1F, 0x0F, 0x90, 0x93, 0x47, 0xF0, 0x22, 0x90, 0x93, 0x3F, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x42, -0x74, 0x05, 0xF0, 0x90, 0x93, 0x3C, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x47, 0x74, 0x05, 0xF0, 0x22, -0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x46, 0xF0, 0x90, 0x00, -0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x44, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, -0x93, 0x46, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x44, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, -0x44, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x43, 0xF0, -0x60, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, -0x93, 0x4D, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x63, 0x12, 0x51, 0x4C, 0x90, 0x93, 0x43, 0xE0, 0x90, -0x01, 0xE7, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x2D, 0xE0, 0x54, -0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xFF, 0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, -0x70, 0xFF, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x8F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0x90, 0x93, 0x2F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x30, 0xF0, 0x90, 0x00, -0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, -0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xD3, 0x94, 0x20, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, -0x01, 0xF0, 0x80, 0x57, 0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x02, 0xF0, -0x80, 0x49, 0xEF, 0xD3, 0x94, 0x60, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x03, 0xF0, 0x80, 0x3B, -0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, -0x94, 0xA0, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, -0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x06, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, -0x2E, 0x50, 0x05, 0x74, 0x07, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x93, 0x2E, 0xE0, 0x90, -0x93, 0x32, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, -0x2E, 0x90, 0x93, 0x67, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, -0x68, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x69, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x6A, 0xF0, 0x90, 0x00, 0x04, 0x12, -0x1F, 0x0F, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x6B, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xC8, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x12, 0x1E, -0xF6, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xC1, 0xB6, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, -0xF6, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0x93, 0x9E, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, -0x01, 0xFF, 0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x08, 0xFD, 0xEF, -0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x93, 0x9E, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, -0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0x93, -0x9E, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xC1, 0xA2, -0x90, 0x93, 0x1D, 0x74, 0x21, 0xF0, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, -0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x9E, 0xE0, 0xFD, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x60, -0x31, 0xEF, 0x54, 0x04, 0xFF, 0xED, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, -0xE0, 0x15, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x3A, 0x93, 0x90, 0x93, -0x1D, 0xE0, 0x44, 0x08, 0xF0, 0x80, 0x0B, 0xE4, 0x90, 0x93, 0xA0, 0xF0, 0x7D, 0x40, 0xFF, 0x12, -0x3A, 0x22, 0x90, 0x93, 0x9E, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, -0x93, 0x1D, 0xE0, 0x44, 0x12, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, -0xE0, 0x44, 0x14, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, -0x93, 0x1D, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, -0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x1D, 0xE0, 0x90, 0x05, 0x27, -0xF0, 0x90, 0x93, 0x9F, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x11, 0x90, 0x93, 0x9E, 0xE0, -0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x0E, 0x7F, 0x01, 0x12, 0x5E, -0x91, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x55, 0x11, 0x7F, 0x02, 0x02, -0x88, 0x14, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0xE4, 0xFF, 0x12, 0x55, -0x11, 0x7F, 0x03, 0x02, 0x88, 0x14, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, -0x54, 0x02, 0xFE, 0x90, 0x93, 0x98, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x01, 0xFF, -0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, -0x4D, 0xFF, 0x90, 0x93, 0x98, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, -0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x93, 0x98, 0xF0, -0xEE, 0x54, 0x04, 0xFE, 0xEF, 0x54, 0xFB, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xE1, 0xC7, 0x90, 0x93, -0x1D, 0x74, 0x31, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x15, 0x90, -0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x3A, 0x93, 0x90, 0x93, 0x1D, 0xE0, 0x44, -0x08, 0xF0, 0x80, 0x0B, 0xE4, 0x90, 0x93, 0x9A, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x3A, 0x22, 0x90, -0x93, 0x98, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, -0x44, 0x02, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, 0x44, 0x04, -0xF0, 0x90, 0x93, 0x1D, 0xE0, 0x54, 0x0E, 0x60, 0x0C, 0x90, 0x01, 0x3E, 0x74, 0x03, 0xF0, 0xFD, -0x7F, 0x02, 0x12, 0x3A, 0xAD, 0x90, 0x93, 0x1D, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0x93, 0x98, -0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x64, 0x06, 0x60, 0x33, -0x7F, 0x06, 0x12, 0x64, 0xDA, 0x80, 0x2C, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, -0x99, 0xE0, 0xB4, 0x06, 0x1B, 0x7F, 0x01, 0x12, 0x64, 0xDA, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, -0x60, 0x09, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, 0xF4, 0x80, 0x05, 0x12, 0x64, 0xA8, 0x80, 0x03, -0x12, 0x67, 0x4A, 0x7F, 0x01, 0x80, 0x4D, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, -0xF0, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x3A, 0x3F, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x06, 0x02, 0x80, -0x1B, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, -0x04, 0xE4, 0xFF, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, -0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x05, 0x7F, 0x01, 0x12, 0x64, 0xDA, 0x12, 0x67, 0x29, 0x12, -0x51, 0x9C, 0x7F, 0x03, 0x11, 0x1B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0xEF, 0x64, 0x01, -0x60, 0x04, 0xEF, 0xB4, 0x03, 0x15, 0x90, 0x93, 0x9E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, -0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xED, 0x64, 0x02, 0x60, 0x04, -0xED, 0xB4, 0x03, 0x15, 0x90, 0x93, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x6D, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x6E, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xE5, -0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, 0x60, 0x43, 0xC3, 0x90, 0x93, 0xE6, 0xE0, -0x94, 0x88, 0x90, 0x93, 0xE5, 0xE0, 0x94, 0x13, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, -0xF0, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xE5, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, -0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0xE6, 0xE0, 0x94, 0x64, 0x90, 0x93, 0xE5, 0xE0, -0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, -0x22, 0x90, 0x93, 0xA4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xA8, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, -0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x90, 0xD3, 0x12, 0x43, -0x73, 0x50, 0x41, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xA4, 0x12, 0x43, -0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x7B, 0x01, -0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, 0x1B, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x84, 0xEF, -0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0xA8, 0x12, -0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xA8, 0x02, 0x43, 0x84, 0x90, 0x93, 0x73, 0x12, 0x1F, 0xC9, -0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0x77, 0x12, 0x43, 0x90, 0xC3, 0x12, 0x43, 0x73, -0x90, 0x93, 0x73, 0x60, 0x67, 0x12, 0x43, 0x84, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x7F, 0x12, 0x1F, -0xC9, 0x90, 0x93, 0x77, 0x12, 0x43, 0x84, 0x11, 0xC1, 0x90, 0x93, 0x83, 0x12, 0x1F, 0xC9, 0x90, -0x93, 0x77, 0x12, 0x43, 0x84, 0x12, 0x43, 0x66, 0x90, 0x93, 0x7F, 0x12, 0x43, 0x90, 0x12, 0x43, -0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x83, 0x12, 0x43, 0x84, 0xA9, -0x07, 0x90, 0x93, 0x7B, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, 0xD0, 0x02, -0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, 0x90, 0x93, 0x87, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0x73, -0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x87, 0x80, 0x0A, 0x12, 0x43, 0x84, 0xC0, -0x06, 0xC0, 0x07, 0x90, 0x93, 0x7B, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0xD0, -0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x9F, 0x74, -0x04, 0xF0, 0x22, 0x12, 0x56, 0x01, 0x80, 0xEE, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x05, -0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x9F, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x56, 0x14, 0x90, -0x93, 0x9F, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x3C, 0x90, 0x01, 0x57, 0xE4, -0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x51, 0xE0, 0x60, 0x07, 0xE4, 0xF0, 0x53, -0x66, 0xFD, 0x80, 0x24, 0x90, 0x93, 0x38, 0xE0, 0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, 0x3F, -0xE0, 0xFF, 0x90, 0x93, 0x38, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0xE5, 0x62, 0xB4, 0x01, 0x09, 0x90, -0x93, 0x39, 0xE0, 0x70, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x5B, 0xE0, 0x60, 0x10, 0x90, 0x01, -0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x01, -0x5F, 0xE0, 0x60, 0x10, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, -0x90, 0x93, 0x49, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xE7, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, -0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, -0x22, 0xD3, 0x90, 0x93, 0xE8, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0xE7, 0xE0, 0x94, 0x03, 0x40, 0x03, -0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x93, 0xE7, 0xE4, 0x75, 0xF0, -0x01, 0x12, 0x42, 0x87, 0x80, 0xC6, 0xE4, 0xFF, 0x02, 0x4E, 0x8B, 0x90, 0x93, 0x1A, 0x12, 0x43, -0xC8, 0x12, 0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x93, 0xE0, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xE0, -0x30, 0xE0, 0x02, 0x51, 0xA6, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xC3, 0x13, -0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0xE1, 0xF0, 0x22, 0x7E, 0xBF, -}; - -#ifdef CONFIG_MP_INCLUDED -u8 Rtl8723EFwBTImgArray[Rtl8723EBTImgArrayLength] = { -0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x4E,0xB2,0xCF,0xF7,0x12,0x6B,0x6B,0xEB, -0x4F,0xB4,0x60,0xCA,0x4C,0xB2,0x68,0xF1,0x1A,0x6B,0x4E,0xB5,0x60,0xCA,0x4B,0xB2, -0x00,0x68,0x0A,0x6E,0x00,0x18,0x2E,0x2E,0x00,0xC2,0x44,0xB7,0x4A,0xB2,0x4B,0xB3, -0xE8,0x4F,0x00,0xC2,0xC0,0xF0,0x58,0x9F,0x40,0xF0,0x0C,0xC7,0x4A,0xB0,0x6D,0xEA, -0xC0,0xF0,0x58,0xDF,0x45,0xF1,0x09,0x6A,0x00,0xF1,0x50,0xCF,0x0E,0xF0,0x1D,0x6A, -0x80,0xF1,0x62,0xA7,0x43,0xDF,0x42,0xB2,0x00,0x69,0x25,0xDF,0x44,0xDF,0x68,0x32, -0x69,0xE2,0x40,0xB3,0x44,0x32,0x26,0xDF,0x27,0xDF,0x28,0xDF,0x29,0xDF,0x40,0xCB, -0x90,0x67,0xB1,0x67,0x30,0x6E,0x00,0x18,0x64,0x2E,0x04,0xD7,0x01,0x6A,0x4B,0xEA, -0x47,0xD8,0x3A,0xB3,0x40,0x98,0x3A,0xB4,0xB1,0x67,0x6D,0xEA,0x40,0xD8,0x0A,0x6B, -0x08,0x6A,0x6C,0xC0,0x0C,0x6E,0x00,0x18,0x64,0x2E,0x4D,0xC0,0x27,0xB3,0x02,0x6C, -0x8B,0xEC,0x40,0x9B,0x03,0x6B,0x6B,0xEB,0x8C,0xEA,0x6C,0xEA,0x05,0x6B,0x6B,0xEB, -0x6C,0xEA,0x22,0xB3,0x40,0xDB,0x22,0xB3,0x40,0x9B,0x8C,0xEA,0x40,0xDB,0x04,0x97, -0x0E,0xF0,0x1D,0x6A,0x2C,0xB3,0x43,0xDF,0x2A,0xB2,0x60,0xDA,0x2C,0xB3,0x2B,0xB2, -0x60,0xDA,0x2D,0xB3,0x2B,0xB2,0x60,0xDA,0x2D,0xB3,0x2C,0xB2,0x60,0xDA,0x2E,0xB3, -0x2C,0xB2,0x60,0xDA,0x2E,0xB3,0x2D,0xB2,0x60,0xDA,0x2F,0xB3,0x2D,0xB2,0x60,0xDA, -0x2F,0xB3,0x2E,0xB2,0x60,0xDA,0x30,0xB3,0x2E,0xB2,0x60,0xDA,0x30,0xB3,0x2F,0xB2, -0x60,0xDA,0x31,0xB3,0x2F,0xB2,0x60,0xDA,0x30,0xB2,0x32,0xB3,0x20,0xCA,0x30,0xB2, -0x60,0xDA,0x31,0xB2,0x08,0xF1,0x11,0x6B,0x6B,0xEB,0x20,0xCA,0x2F,0xB2,0x60,0xCA, -0x2F,0xB2,0x20,0xDA,0x2F,0xB2,0x80,0x18,0x43,0x36,0x20,0xDA,0x08,0x97,0x07,0x91, -0x06,0x90,0x00,0xEF,0x05,0x63,0x00,0x00,0xF4,0x00,0x11,0x80,0xF0,0x00,0x11,0x80, -0xD0,0x04,0x11,0x80,0xD2,0x04,0x11,0x80,0xCA,0xA0,0x11,0x80,0xCC,0xA0,0x11,0x80, -0xC4,0xF5,0x04,0x80,0xD6,0xA0,0x11,0x80,0x00,0x00,0x00,0x18,0x58,0xC5,0xC8,0x19, -0x14,0xA1,0x11,0x80,0xD8,0xA0,0x11,0x80,0x00,0x00,0x00,0x70,0x08,0xA1,0x11,0x80, -0xBC,0x00,0x11,0x80,0xA1,0xA9,0x10,0x80,0x44,0x00,0x11,0x80,0x21,0xA3,0x10,0x80, -0x4C,0x05,0x11,0x80,0x25,0xAD,0x10,0x80,0x44,0x05,0x11,0x80,0x3D,0xCD,0x10,0x80, -0x58,0x09,0x11,0x80,0x11,0xD1,0x10,0x80,0x3C,0x00,0x11,0x80,0x6D,0xA6,0x10,0x80, -0xA0,0x05,0x11,0x80,0x41,0xAA,0x10,0x80,0x5C,0x05,0x11,0x80,0x61,0xD7,0x10,0x80, -0x90,0x06,0x11,0x80,0x45,0xC9,0x10,0x80,0xEC,0x04,0x11,0x80,0xAD,0xAE,0x10,0x80, -0x6C,0x06,0x11,0x80,0x45,0xD0,0x10,0x80,0x16,0xA1,0x11,0x80,0xD4,0x04,0x11,0x80, -0xB1,0xCE,0x10,0x80,0xC8,0xA0,0x11,0x80,0x18,0xA1,0x11,0x80,0x1C,0xA1,0x11,0x80, -0x20,0xA1,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x04,0x67,0x2F,0x24, -0x80,0x98,0x00,0x6A,0x00,0xF4,0x24,0x98,0xBD,0x67,0x00,0xF4,0x44,0xD8,0xE1,0xF7, -0x1F,0x6A,0x4C,0xEC,0x00,0x18,0x2A,0xDF,0x10,0x4D,0x12,0x2A,0x5D,0x67,0x68,0xAA, -0xFF,0xF7,0x1F,0x6A,0x4C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32, -0x6B,0xE2,0x0E,0xB3,0x48,0x32,0x69,0xE2,0xE0,0xF0,0x4B,0xA2,0x01,0x72,0x0A,0x60, -0x0B,0xB2,0xB0,0x67,0x00,0x18,0xE0,0x1D,0x83,0x9A,0x07,0x2A,0x00,0x18,0x6A,0x1E, -0x11,0x67,0x04,0x10,0x00,0x18,0x7B,0x57,0x90,0x67,0x11,0x67,0xD1,0x29,0x08,0x97, -0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0x9C,0x31,0x11,0x80, -0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x0A,0xD4,0xFF,0x6C,0x8C,0xEE,0x04,0x76, -0x04,0xD6,0x34,0x61,0x1F,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA, -0x01,0x72,0x2C,0x61,0x0A,0x93,0x40,0xA3,0x8C,0xEA,0x03,0x72,0x27,0x61,0x22,0xA3, -0x8C,0xE9,0x24,0x29,0x44,0xA3,0x03,0xA3,0x8C,0xEA,0x40,0x32,0x8C,0xE8,0x00,0x1C, -0xDD,0x31,0x4D,0xE8,0x14,0xB3,0x1A,0x65,0x40,0xAB,0x0E,0xEA,0x14,0x2A,0x13,0xB2, -0x98,0x67,0x00,0x9A,0x20,0xDA,0x12,0xB2,0x20,0xDA,0x08,0xF1,0x11,0x6A,0x4B,0xEA, -0x00,0x1C,0xE5,0x31,0x40,0xCB,0x00,0x18,0xA9,0x1D,0x01,0x6C,0x07,0x20,0x80,0x18, -0x79,0x28,0x90,0x67,0x03,0x10,0x00,0x1C,0xE5,0x31,0x98,0x67,0x0A,0x94,0x00,0x18, -0xBD,0x89,0x04,0x95,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x00,0x00, -0x6C,0x1D,0x11,0x80,0x18,0xA1,0x11,0x80,0x1C,0xA1,0x11,0x80,0x20,0xA1,0x11,0x80, -0x03,0xB2,0x01,0x6B,0x40,0x9A,0x52,0x32,0x20,0xE8,0x6C,0xEA,0x50,0x60,0x00,0xB0, -0x03,0xB2,0x01,0x6B,0x40,0x9A,0x4A,0x32,0x20,0xE8,0x6C,0xEA,0x50,0x60,0x00,0xB0, -0xF3,0x63,0x18,0x62,0x17,0xD1,0x16,0xD0,0x7D,0x67,0x00,0x6A,0x20,0xF0,0x50,0xC3, -0xB4,0xB3,0x9D,0x67,0x00,0x69,0x58,0xAB,0x40,0xF0,0x48,0xCC,0x20,0xF0,0x5A,0xA3, -0x20,0xF0,0x79,0xA3,0x40,0x32,0x4D,0xEB,0xAF,0xB2,0x0D,0xD3,0x01,0x6B,0x40,0x9A, -0x0F,0xD2,0xAE,0xB2,0x40,0x9A,0x0E,0xD2,0xAD,0xB2,0x00,0x9A,0xAD,0xB2,0x40,0x9A, -0x10,0xD2,0x0E,0x92,0x6C,0xEA,0x3A,0x22,0xBD,0x67,0x83,0x67,0x30,0x4D,0x00,0x6E, -0x00,0x18,0x71,0x23,0x23,0x67,0x02,0x2A,0x03,0x69,0x26,0x11,0x9D,0x67,0x20,0xF0, -0x70,0xA4,0x0F,0x94,0xFF,0x6A,0x4C,0xEB,0x80,0xF7,0x82,0x32,0x2C,0xEA,0x4E,0xEB, -0xA2,0xB4,0x1B,0x2B,0xA0,0xB2,0x4D,0xE8,0x40,0x9C,0x56,0x32,0x2C,0xEA,0x02,0x2A, -0x9F,0xB2,0x4D,0xE8,0x7D,0x67,0x40,0xF0,0x68,0xAB,0x01,0xF0,0x00,0x6A,0x05,0x69, -0x6C,0xEA,0xFF,0xF7,0x1F,0x6B,0x6C,0xEA,0x04,0x22,0x00,0x18,0xA4,0x1D,0x0D,0x94, -0x0D,0x10,0x00,0x18,0xA9,0x1D,0x0D,0x94,0x09,0x10,0x96,0xB2,0x4C,0xE8,0x40,0x9C, -0x56,0x32,0x2C,0xEA,0x02,0x2A,0x94,0xB2,0x4C,0xE8,0x09,0x69,0x0E,0x94,0x01,0x6F, -0x86,0x32,0xEC,0xEA,0x41,0x22,0x8D,0xB3,0x40,0x9B,0x56,0x32,0xEC,0xEA,0x3C,0x22, -0xBD,0x67,0x10,0x6A,0xC7,0x67,0x02,0x6C,0x30,0x4D,0x14,0xD7,0x00,0x18,0x71,0x23, -0x4D,0xE9,0x14,0x97,0x06,0x2A,0x20,0x6A,0x4D,0xE9,0xFF,0xF7,0x1F,0x6C,0x8C,0xE9, -0xDB,0x10,0x0F,0x94,0x5D,0x67,0x20,0xF0,0x70,0xA2,0x40,0xF7,0x82,0x32,0xEC,0xEA, -0x4E,0xEB,0x7E,0xB2,0x80,0x9A,0x19,0x2B,0x7D,0xB2,0x4D,0xE8,0x44,0x67,0xEC,0xEA, -0x02,0x2A,0x79,0xB2,0x4D,0xE8,0x7D,0x67,0x40,0xF0,0x68,0xAB,0x01,0xF0,0x00,0x6A, -0xFF,0xF7,0x1F,0x6C,0x6C,0xEA,0x8C,0xEA,0x04,0x22,0x00,0x18,0xA4,0x1D,0x0D,0x94, -0x0B,0x10,0x00,0x18,0xA9,0x1D,0x0D,0x94,0x07,0x10,0x73,0xB2,0x4C,0xE8,0x44,0x67, -0xEC,0xEA,0x02,0x2A,0x6F,0xB2,0x4C,0xE8,0x0E,0x93,0x01,0x6C,0x6A,0x32,0x8C,0xEA, -0x41,0x22,0x6A,0xB3,0x40,0x9B,0x0F,0x6B,0x46,0xEC,0x6C,0xEA,0x03,0x72,0x3A,0x60, -0xFF,0x6A,0xBD,0x67,0x01,0x4A,0x04,0x6C,0x30,0x4D,0x02,0x6E,0x00,0x18,0x71,0x23, -0x4D,0xE9,0x03,0x2A,0x00,0xF2,0x00,0x6A,0x45,0x10,0x9D,0x67,0x20,0xF0,0x50,0xA4, -0x5E,0xB3,0x80,0x9B,0x13,0x22,0x61,0xB2,0x03,0x6B,0x4D,0xE8,0x82,0x32,0x4A,0x32, -0x6C,0xEA,0x01,0x72,0x04,0x60,0x96,0x32,0x01,0x6C,0x8C,0xEA,0x02,0x2A,0x5C,0xB2, -0x4D,0xE8,0x00,0xF4,0x00,0x6A,0x4D,0xE9,0x01,0x6B,0x12,0x10,0x5A,0xB2,0x03,0x6B, -0x4C,0xE8,0x82,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x60,0x96,0x32,0x01,0x6B, -0x6C,0xEA,0x02,0x2A,0x55,0xB2,0x4C,0xE8,0x01,0xF0,0x00,0x6A,0x4D,0xE9,0x00,0x6B, -0x50,0xB2,0x60,0xC2,0x0E,0x94,0x01,0x6B,0x8E,0x32,0x6C,0xEA,0x18,0x22,0x47,0xB2, -0x40,0x9A,0x46,0xEB,0x0F,0x6B,0x6C,0xEA,0x03,0x72,0x11,0x60,0xBD,0x67,0x02,0xF0, -0x00,0x6A,0x08,0x6C,0x30,0x4D,0x03,0x6E,0x00,0x18,0x71,0x23,0x4D,0xE9,0x07,0x2A, -0x04,0xF0,0x00,0x6A,0x4D,0xE9,0xFF,0xF7,0x1F,0x6A,0x4C,0xE9,0x4D,0x10,0x44,0xB2, -0x3E,0xB3,0x0C,0xEA,0x6E,0xEA,0x11,0x2A,0x38,0xB2,0x0F,0x6B,0x40,0x9A,0x46,0x32, -0x6C,0xEA,0x01,0x72,0x0A,0x61,0x80,0x18,0xC0,0x28,0x00,0x65,0x06,0x22,0x80,0x6A, -0x4D,0xE9,0x39,0xB2,0x4C,0xE8,0x39,0xB2,0x4C,0xE8,0xC0,0xF5,0x02,0x32,0x01,0x6B, -0x6C,0xEA,0x0C,0x22,0x2D,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA, -0x01,0x72,0x04,0x61,0x2B,0xB2,0x4C,0xE8,0x2B,0xB2,0x4C,0xE8,0x04,0x6A,0x2C,0xEA, -0x08,0x2A,0x2D,0xB2,0x4C,0xE8,0x2D,0xB2,0x4C,0xE8,0x26,0xB2,0x4C,0xE8,0x26,0xB2, -0x4C,0xE8,0x2C,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x0C,0x2A,0x1F,0xB2,0x03,0x6B, -0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x61,0x1F,0xB2,0x4D,0xE8, -0x1F,0xB2,0x4D,0xE8,0x24,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x03,0x2A,0x00,0x18, -0xBB,0x30,0x00,0x6C,0x12,0xB2,0x00,0xDA,0x05,0x6A,0x10,0x94,0x04,0xD2,0x0C,0x0A, -0x05,0xD2,0x0E,0x93,0x0F,0x92,0x0A,0xD4,0xFA,0x6D,0x04,0x6C,0x21,0xF3,0x1F,0x6E, -0xA1,0xF1,0x1A,0x6F,0x06,0xD1,0x09,0xD0,0x07,0xD2,0x20,0x18,0x1B,0x32,0x08,0xD3, -0x18,0x97,0x17,0x91,0x16,0x90,0x00,0xEF,0x0D,0x63,0x00,0x00,0x41,0x00,0x00,0x00, -0xDC,0x00,0x11,0x80,0x44,0xA0,0x00,0xB0,0x40,0x60,0x00,0xB0,0x40,0xA0,0x00,0xB0, -0x50,0xA0,0x00,0xB0,0x00,0x00,0x80,0x00,0x6C,0x1D,0x11,0x80,0x00,0x00,0x40,0x00, -0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xBF,0xFF,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00, -0x17,0x00,0x11,0x80,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xEF,0xFF,0x00,0x00,0xA0,0x00, -0x00,0x00,0xC0,0x00,0x00,0x00,0x30,0x00,0x01,0x6D,0xA4,0xEC,0x07,0xB2,0x06,0xB4, -0x60,0x9C,0x40,0x9A,0x6E,0xEA,0xAC,0xEA,0x02,0x2A,0xAE,0xEB,0x60,0xDC,0x20,0xE8, -0x00,0x65,0x00,0x00,0x3C,0x60,0x00,0xB0,0x50,0x60,0x00,0xB0,0xF8,0x63,0x0E,0x62, -0x0D,0xD1,0x0C,0xD0,0x6A,0xB2,0x01,0x6F,0x20,0x9A,0x2A,0x65,0x36,0x36,0xEC,0xEE, -0x0B,0x2E,0x68,0xB4,0x03,0x6B,0x6B,0xEB,0x40,0x9C,0x6C,0xEA,0x40,0xDC,0x66,0xB4, -0x02,0x6B,0x40,0x9C,0x6D,0xEA,0x40,0xDC,0x64,0xB2,0x00,0x6B,0x0A,0xD3,0xA3,0x67, -0x60,0x9A,0x63,0xB2,0x40,0x9A,0x0A,0x65,0x62,0xB2,0x00,0x9A,0x51,0x67,0xEC,0xEA, -0x10,0x22,0x80,0xF7,0x62,0x32,0x88,0x67,0x8E,0xEA,0xEC,0xEA,0x01,0x5A,0xA7,0x67, -0x08,0x60,0x5D,0xB2,0x03,0x6D,0x4D,0xE8,0x03,0x2E,0x5C,0xB2,0x07,0x6D,0x4D,0xE8, -0x0A,0xD7,0x29,0x67,0xC0,0x99,0x01,0x6C,0xD6,0x32,0x8C,0xEA,0x1E,0x22,0x08,0x6A, -0x4D,0xED,0x02,0x32,0x52,0x32,0x8C,0xEA,0xFF,0xF7,0x1F,0x6F,0x16,0x22,0x28,0x67, -0x26,0x32,0x40,0xF7,0x62,0x33,0x4E,0xEB,0x8C,0xEB,0x83,0xEB,0x0E,0x60,0x10,0x6A, -0x4D,0xED,0x4E,0xB2,0xEC,0xED,0x4D,0xE8,0x46,0x67,0x8C,0xEA,0x05,0x2A,0x4A,0xB2, -0x4D,0xE8,0x20,0x6A,0x4D,0xED,0xEC,0xED,0x0A,0xD4,0x68,0x67,0x6A,0x32,0x01,0x6E, -0xCC,0xEA,0x16,0x22,0x40,0x6A,0x29,0x67,0x4D,0xED,0x80,0x99,0x44,0xB2,0x03,0x6B, -0x4D,0xE8,0x82,0x32,0x4A,0x32,0x6C,0xEA,0xCA,0xEA,0x03,0x60,0x96,0x32,0xCC,0xEA, -0x07,0x2A,0x80,0x6A,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x4C,0xED,0x3D,0xB2,0x4D,0xE8, -0x02,0x6A,0xAC,0xEA,0x08,0x2A,0x3C,0xB2,0x4C,0xE8,0x3C,0xB2,0x4C,0xE8,0x3C,0xB2, -0x4C,0xE8,0x3C,0xB2,0x4C,0xE8,0x3C,0xB2,0x0C,0xEA,0x07,0x22,0x36,0xB2,0x01,0x6B, -0x4C,0xE8,0x36,0xB2,0x4C,0xE8,0x39,0xB2,0x60,0xC2,0x29,0xB3,0x03,0x69,0x40,0x9B, -0x42,0x32,0x4A,0x32,0x2C,0xEA,0x01,0x72,0x04,0x61,0x31,0xB2,0x4C,0xE8,0x2E,0xB2, -0x4C,0xE8,0x33,0xB2,0x88,0x67,0x06,0xD5,0x07,0xD4,0xFA,0x6D,0x04,0x6C,0x01,0xF4, -0x00,0x6E,0xA1,0xF1,0x19,0x6F,0x04,0xD1,0x05,0xD2,0x20,0x18,0x1B,0x32,0x08,0xD0, -0x0A,0x92,0x12,0x22,0x2B,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x0B,0x2A,0x18,0xB3, -0x40,0x9B,0x42,0x32,0x4A,0x32,0x2C,0xEA,0x01,0x72,0x04,0x61,0x1C,0xB2,0x4D,0xE8, -0x1C,0xB2,0x4D,0xE8,0x17,0xB2,0x00,0xDA,0x23,0xB2,0x01,0x6C,0xA0,0x9A,0xBE,0x32, -0x8C,0xEA,0x17,0x22,0x40,0xF5,0x02,0x32,0x8C,0xEA,0x07,0x22,0x1B,0xB2,0x00,0x6B, -0x80,0xC2,0x1E,0xB2,0x60,0xC2,0x1E,0xB2,0x60,0xC2,0xA2,0x32,0x8C,0xEA,0x05,0x22, -0x00,0x18,0xA5,0x23,0x00,0x65,0x19,0xB3,0x40,0xC3,0x14,0xB2,0x00,0x18,0x04,0x24, -0x80,0xA2,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0x6C,0x1D,0x11,0x80, -0x30,0x60,0x00,0xB0,0x34,0x60,0x00,0xB0,0x44,0xA0,0x00,0xB0,0x50,0x60,0x00,0xB0, -0x40,0xA0,0x00,0xB0,0x00,0x00,0x80,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00, -0x00,0x00,0x10,0x00,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0x7F,0xFF, -0xFF,0xFF,0xBF,0xFF,0x00,0x00,0x30,0x00,0x17,0x00,0x11,0x80,0xFC,0xA5,0x10,0x80, -0x00,0x00,0xC0,0x00,0x54,0x45,0x11,0x80,0x16,0x00,0x11,0x80,0x18,0x00,0x11,0x80, -0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x34,0xB2,0x00,0x6E,0x01,0x6B,0x20,0x6C, -0xFF,0xF7,0x1F,0x6D,0x0A,0x65,0xE6,0x67,0x06,0x67,0x4B,0x65,0x2C,0x65,0x6D,0x65, -0x2D,0xB1,0xC8,0x32,0x15,0xE1,0x10,0x27,0x68,0x67,0x69,0xE2,0x80,0x9A,0x6A,0x67, -0x64,0xEF,0x86,0xEF,0x80,0xDD,0x41,0x9A,0xFF,0x4B,0x29,0x67,0x6C,0xEA,0xEF,0xE1, -0x44,0xEB,0x4D,0xEC,0x80,0xDD,0x04,0x10,0x68,0x67,0x69,0xE2,0x40,0x9A,0x40,0xDD, -0x01,0x4E,0xFF,0x69,0x2C,0xEE,0x10,0x76,0x11,0x61,0x88,0x67,0x1E,0xB5,0x01,0x4F, -0x60,0x9C,0x2C,0xEF,0x4A,0x67,0x44,0xEF,0x11,0xE5,0xFF,0x4A,0xA9,0x67,0x4C,0xEB, -0xEB,0xE5,0x64,0xEA,0x40,0x9C,0x00,0x6E,0x6D,0xEA,0x40,0xDC,0x04,0x48,0x4B,0x67, -0x4C,0xE8,0x00,0xF4,0x01,0x58,0xCC,0x61,0x13,0xB4,0xFF,0x6E,0x55,0x6D,0x00,0xF4, -0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x0F,0xB4,0xFF,0x6E,0x00,0x6D,0x00,0xF5, -0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x0B,0xB4,0xFF,0x6E,0xB1,0x67,0x00,0xF6, -0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x07,0xB4,0xFF,0x6E,0x0F,0x6D,0x00,0xF7, -0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF, -0x04,0x63,0x00,0x00,0x00,0xF8,0x10,0x80,0xDC,0xF4,0x04,0x80,0xFD,0x63,0x05,0x62, -0x04,0xD0,0x11,0xB2,0x00,0x68,0xEE,0x6C,0x00,0xDA,0x10,0xB2,0x07,0x6D,0x00,0xDA, -0x00,0x18,0x9A,0x33,0x00,0x65,0x0E,0xB4,0x4A,0xF5,0x16,0x6B,0x6B,0xEB,0xFF,0xF7, -0x1F,0x6A,0x01,0x48,0x4C,0xE8,0x00,0xF4,0x00,0x58,0x60,0xCC,0xFA,0x61,0x07,0xB2, -0x03,0x6B,0x05,0x97,0x60,0xDA,0x04,0x90,0x03,0xB2,0x01,0x6B,0x60,0xDA,0x00,0xEF, -0x03,0x63,0x00,0x00,0x10,0xA3,0x00,0xB0,0x20,0xA3,0x00,0xB0,0xF0,0x00,0x00,0xB6, -0xFD,0x63,0x04,0x62,0x17,0xB3,0x16,0xB2,0x80,0x18,0x53,0x2A,0x60,0xDA,0x16,0xB3, -0x16,0xB2,0x21,0xB4,0x04,0x97,0x52,0xDB,0x15,0xB2,0x55,0xDB,0x15,0xB2,0x49,0xDB, -0x15,0xB2,0x4C,0xDB,0x15,0xB2,0x4F,0xDB,0x15,0xB2,0x46,0xDB,0x15,0xB2,0x5B,0xDB, -0x15,0xB2,0x40,0xDB,0x15,0xB2,0x58,0xDB,0x16,0xB3,0x15,0xB2,0x60,0xDA,0xC0,0xF0, -0x50,0x9C,0x40,0x6B,0x6D,0xEA,0xC0,0xF0,0x50,0xDC,0x14,0xB3,0x49,0x9C,0x6D,0xEA, -0x13,0xB3,0x6D,0xEA,0x49,0xDC,0x00,0xEF,0x03,0x63,0x00,0x00,0xCC,0x2C,0x11,0x80, -0xB9,0xAD,0x10,0x80,0xB8,0x95,0x11,0x80,0x45,0xD4,0x10,0x80,0xB9,0xAF,0x10,0x80, -0x4D,0xB0,0x10,0x80,0x51,0xB1,0x10,0x80,0x95,0xD0,0x10,0x80,0x01,0xD1,0x10,0x80, -0x01,0xC8,0x10,0x80,0x0D,0xD0,0x10,0x80,0x35,0xC9,0x10,0x80,0x3C,0x1C,0x11,0x80, -0x61,0xA2,0x10,0x80,0xDC,0x00,0x11,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x00, -0xF6,0x63,0x12,0x62,0x11,0xD1,0x10,0xD0,0x14,0xD4,0x16,0xD6,0x80,0xAC,0xFF,0xF7, -0x1F,0x6B,0x8C,0xEB,0x7F,0xF4,0x08,0x73,0x47,0x60,0x7F,0xF4,0x08,0x6A,0x62,0xEA, -0x0E,0x61,0x3F,0xF4,0x00,0x73,0x35,0x60,0x3F,0xF4,0x00,0x6A,0x42,0xEB,0x20,0xF1, -0x04,0x61,0x7F,0xF4,0x06,0x6A,0x42,0xEB,0x00,0xF1,0x1F,0x61,0x0F,0x10,0x7F,0xF4, -0x0A,0x73,0x5C,0x60,0x7F,0xF4,0x0A,0x6A,0x42,0xEB,0x34,0x61,0x5F,0xF5,0x00,0x73, -0x5E,0x60,0x5F,0xF5,0x03,0x73,0x00,0xF1,0x02,0x60,0x0F,0x11,0xFF,0xF7,0x1F,0x6A, -0x8C,0xEA,0x7F,0xF4,0x06,0x72,0x03,0x61,0x88,0xB2,0x00,0x6B,0x60,0xDA,0x88,0xB2, -0x0F,0x6B,0x40,0x9A,0x46,0x32,0x6C,0xEA,0x03,0x72,0x04,0x61,0x85,0xB2,0x60,0x9A, -0x85,0xB2,0x60,0xDA,0x86,0xB3,0x85,0xB2,0x60,0xDA,0x87,0xB3,0x85,0xB2,0x60,0xDA, -0xFF,0x17,0x7E,0xB2,0x85,0xB3,0x40,0x9A,0x6E,0xEA,0xE0,0xF0,0x0E,0x2A,0x14,0x92, -0x63,0xA2,0x83,0xB2,0x60,0xC2,0xE1,0x10,0x14,0x94,0x82,0xB2,0x63,0xA4,0x80,0xF1, -0x61,0xC2,0xDB,0x10,0x14,0x93,0x80,0xB1,0xFF,0xF7,0x1F,0x6C,0x43,0xA3,0x44,0x33, -0x4D,0xE3,0x6C,0x33,0x4D,0xE3,0x40,0x99,0x68,0x30,0x8C,0xE8,0x4F,0xEA,0x03,0x22, -0x00,0x18,0xFD,0x1D,0x91,0x67,0x0F,0x20,0x00,0x18,0x40,0xA4,0x00,0x65,0x77,0xB6, -0x00,0x6A,0x01,0x6C,0xB1,0x67,0xE2,0x67,0x00,0x18,0xF3,0x1D,0x04,0xD2,0x80,0x99, -0x00,0x18,0x0C,0x1E,0xB0,0x67,0x72,0xB2,0x00,0xCA,0xB7,0x10,0x14,0x93,0x00,0x6E, -0x43,0xA3,0x01,0x22,0x01,0x6E,0x6B,0xB2,0x80,0xF1,0xD1,0xC2,0xAE,0x10,0x14,0x94, -0x14,0x93,0x61,0xF3,0x06,0x6D,0x85,0xA4,0x0E,0xD4,0x48,0xA3,0x27,0xA3,0xFF,0xF7, -0x1F,0x6C,0x40,0x32,0x4D,0xE9,0x00,0x6A,0x45,0xC3,0x4A,0xC3,0x8C,0xE9,0x00,0x18, -0x9A,0x33,0x22,0x6C,0x5F,0xB0,0xF3,0x6A,0xFF,0xF7,0x1F,0x6B,0x20,0xF0,0xBF,0xA0, -0x24,0x6C,0xA0,0x35,0x4D,0xED,0x00,0x18,0x9A,0x33,0x6C,0xED,0x40,0xF0,0x41,0xA0, -0x40,0xF0,0xA0,0xA0,0x26,0x6C,0x40,0x32,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18, -0x9A,0x33,0x4C,0xED,0xEB,0xF0,0x12,0x6D,0x00,0x18,0x9A,0x33,0x28,0x6C,0x93,0xF7, -0x1A,0x6D,0x00,0x18,0x9A,0x33,0x2A,0x6C,0x00,0x18,0xEE,0x33,0x01,0x6C,0x7D,0x21, -0xFF,0xF7,0x1F,0x6B,0x51,0x67,0x6C,0xE9,0x00,0xF4,0x01,0x59,0x02,0x61,0x00,0xF4, -0x00,0x6A,0xFF,0xF7,0x1F,0x69,0x4C,0xE9,0x0E,0x92,0xFF,0x6C,0xFF,0x4A,0x8C,0xEA, -0x04,0x5A,0x28,0x61,0x47,0xB0,0x00,0x6A,0x7D,0x67,0x06,0xD2,0x0C,0xCB,0xE0,0xF7, -0x1F,0x6A,0x4C,0xE9,0x44,0xB3,0x06,0x92,0x80,0xF4,0x20,0x34,0x01,0x6D,0x6C,0xEA, -0x8D,0xEA,0x06,0xD2,0x00,0x6C,0x41,0xB2,0x04,0xD4,0x05,0xD4,0x9D,0x67,0x18,0x4C, -0xC5,0x67,0x00,0x6F,0x07,0xD2,0x3F,0x10,0xE0,0xF7,0x1F,0x6A,0x8C,0xEA,0x88,0x67, -0x80,0xF4,0x40,0x32,0x8C,0xEB,0x4D,0xEB,0x38,0xB2,0xFF,0x6D,0xEC,0xED,0x60,0xDE, -0x41,0xDE,0x2B,0x10,0x0E,0x92,0x00,0x6D,0x91,0x67,0x40,0x33,0x34,0xB2,0x25,0x67, -0x41,0xE3,0x7D,0x67,0x18,0x4B,0x30,0xB2,0x8B,0x65,0x32,0xB3,0x0A,0x65,0xFF,0xF7, -0x1F,0x6A,0x6B,0x65,0xFF,0x6B,0x4A,0x65,0x2B,0x65,0x6C,0x67,0xAC,0x32,0x79,0xE2, -0x20,0xDE,0x00,0xF1,0x01,0x5C,0x00,0xCE,0x21,0xDE,0x60,0x9E,0xE1,0x45,0xD4,0x61, -0x48,0x67,0x6C,0xEA,0xA9,0x67,0x6B,0x67,0x6D,0xEA,0x80,0x4C,0xEC,0xED,0x40,0xDE, -0x80,0x4C,0x4A,0x67,0x04,0x5D,0x4C,0xEC,0xE8,0x61,0x00,0x6F,0x9D,0x67,0x04,0xD7, -0x05,0xD7,0x18,0x4C,0x01,0x6E,0x00,0x18,0xF7,0x33,0x00,0x65,0x0E,0x10,0x02,0x6C, -0x01,0x6D,0x00,0x18,0x1C,0x80,0x00,0x6E,0x08,0x10,0x14,0x93,0x16,0x92,0x80,0xAB, -0x00,0x18,0xFA,0x8B,0xA0,0xA2,0x01,0x6A,0x01,0x10,0x00,0x6A,0x12,0x97,0x11,0x91, -0x10,0x90,0x00,0xEF,0x0A,0x63,0x00,0x00,0x38,0x91,0x10,0x80,0x6C,0x1D,0x11,0x80, -0x2C,0x00,0x00,0xB5,0x48,0x91,0x10,0x80,0x44,0x91,0x10,0x80,0x32,0x97,0x79,0x23, -0x78,0xA0,0x00,0xB0,0x01,0x00,0xA5,0x01,0xAE,0x23,0x87,0x54,0xD0,0x00,0x11,0x80, -0xDC,0x00,0x11,0x80,0x88,0x07,0x11,0x80,0x01,0x91,0x02,0x80,0x14,0xA1,0x11,0x80, -0x00,0xF8,0x10,0x80,0xFF,0xFF,0x03,0xE0,0x00,0x00,0x00,0x80,0x00,0xFB,0x10,0x80, -0x00,0x00,0x00,0x04,0x03,0xB2,0x00,0x6B,0x60,0xDA,0x20,0xE8,0x00,0x65,0x00,0x00, -0x04,0x60,0x00,0xB0,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x40,0xAC,0x01,0xF4, -0x03,0x72,0x2C,0x61,0x80,0x18,0x53,0x2A,0x00,0x69,0x80,0x18,0x45,0x2B,0x00,0x65, -0x16,0xB2,0x08,0xF1,0x11,0x6B,0x6B,0xEB,0x60,0xCA,0x15,0xB2,0x91,0x67,0x20,0xDA, -0x14,0xB2,0x20,0x18,0x83,0x39,0x20,0xDA,0x14,0xB2,0x15,0xB0,0xB1,0x67,0x80,0xF1, -0x62,0xA2,0x90,0x67,0x30,0x6E,0x68,0x32,0x69,0xE2,0x0F,0xB3,0x44,0x32,0x00,0x18, -0x64,0x2E,0x40,0xCB,0x01,0x6A,0x4B,0xEA,0x47,0xD8,0x0E,0xB3,0x40,0x98,0x0E,0xB4, -0xB1,0x67,0x6D,0xEA,0x40,0xD8,0x00,0x18,0x64,0x2E,0x0C,0x6E,0x06,0x97,0x05,0x91, -0x04,0x90,0x00,0x6A,0x00,0xEF,0x04,0x63,0x18,0xA1,0x11,0x80,0x1C,0xA1,0x11,0x80, -0x20,0xA1,0x11,0x80,0x14,0xA1,0x11,0x80,0xDC,0x00,0x11,0x80,0xD8,0xA0,0x11,0x80, -0x00,0x00,0x00,0x70,0x08,0xA1,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0, -0xFF,0xF7,0x1F,0x6A,0xCC,0xEA,0x02,0x74,0x0A,0xD4,0x0B,0xD5,0x0D,0xD7,0x04,0xD2, -0x0D,0x61,0x33,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72, -0x05,0x61,0x30,0xB3,0x40,0x9B,0xC0,0xF7,0x42,0x32,0xFC,0x2A,0x0A,0x93,0x04,0x73, -0x3A,0x61,0x0B,0x95,0xFF,0x6C,0x44,0x67,0x60,0xA5,0x6C,0xEA,0x10,0x72,0x0A,0x61, -0x42,0xA5,0x8C,0xEA,0x02,0x72,0x06,0x61,0x27,0xB2,0x00,0x18,0xE0,0x1D,0x81,0x9A, -0x00,0x6A,0x3E,0x10,0xFF,0x6A,0x6C,0xEA,0x02,0x72,0x01,0x6D,0x04,0x60,0x22,0x72, -0x02,0x60,0x2F,0x72,0x20,0x61,0xFF,0x6C,0x44,0x67,0x6C,0xEA,0x2F,0x72,0x01,0x6A, -0x03,0x60,0x0B,0x93,0x42,0xA3,0x8C,0xEA,0xFF,0x6E,0x6F,0x42,0xCC,0xEB,0xCA,0xEB, -0x12,0x60,0xE6,0x67,0x01,0x68,0x0B,0x92,0x06,0x4D,0xCC,0xED,0xB1,0xE2,0x42,0xA4, -0xCC,0xEA,0x03,0x5A,0x01,0x61,0x02,0xC4,0xFF,0x4B,0xEC,0xEB,0xFF,0x6E,0x08,0x4D, -0xCA,0xEB,0xEC,0xED,0xF0,0x61,0x00,0x1C,0xDD,0x31,0x00,0x65,0x0F,0xB1,0x02,0x67, -0x40,0xA1,0x05,0x22,0x00,0x18,0x43,0x30,0x00,0x65,0x00,0x6A,0x40,0xC1,0x00,0x1C, -0xE5,0x31,0x90,0x67,0x0A,0x94,0x0B,0x95,0x04,0x96,0x00,0x18,0xCA,0x1E,0x0D,0x97, -0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x00,0x00,0x6C,0x1D,0x11,0x80, -0x1C,0xA3,0x00,0xB0,0x9C,0x31,0x11,0x80,0x17,0x00,0x11,0x80,0xFD,0x63,0x04,0x62, -0x09,0xB2,0x0F,0x6B,0x40,0x9A,0x46,0x32,0x6C,0xEA,0x01,0x72,0x07,0x61,0x80,0x18, -0xC0,0x28,0x00,0x65,0x03,0x22,0x00,0x18,0xA2,0x31,0x00,0x65,0x04,0x97,0x00,0xEF, -0x03,0x63,0x00,0x00,0x6C,0x1D,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0, -0xFF,0xF7,0x1F,0x69,0x8C,0xE9,0x24,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x4C,0x32, -0x18,0xB3,0x2B,0xE2,0x48,0x32,0x61,0xE2,0x5C,0x98,0x4F,0xEA,0x05,0x22,0x01,0x6A, -0x00,0x6B,0x20,0xF2,0x5E,0xC0,0x1E,0x10,0x00,0x18,0x41,0x5E,0x91,0x67,0x04,0xD2, -0x0C,0x6B,0x18,0x2A,0x5F,0x98,0x41,0xA2,0x44,0x72,0x14,0x60,0x00,0x18,0xA5,0x5E, -0x91,0x67,0x06,0x22,0x00,0x18,0x69,0x5E,0x91,0x67,0x1F,0x6B,0x0B,0x22,0x05,0x10, -0x00,0x18,0x80,0x49,0x91,0x67,0x62,0x67,0x05,0x10,0x91,0x67,0x20,0x18,0x13,0x26, -0x0E,0x6D,0x04,0x93,0x08,0x97,0x07,0x91,0x06,0x90,0x43,0x67,0x00,0xEF,0x05,0x63, -0x48,0x60,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x03,0x44,0x90,0x67, -0x00,0x18,0xF2,0x5A,0x0B,0xD5,0x22,0x67,0x1A,0x65,0x1E,0x2A,0xBD,0x67,0x90,0x67, -0x00,0x18,0x07,0xDF,0x10,0x4D,0x7D,0x67,0x48,0xAB,0x0B,0x93,0xFF,0xF7,0x1F,0x6D, -0x40,0xCB,0x65,0x67,0x4C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32, -0x6B,0xE2,0x09,0xB3,0x48,0x32,0x69,0xE2,0x20,0xF2,0x3E,0xC2,0x5D,0x67,0x88,0xAA, -0x80,0x18,0xB6,0x2B,0xAC,0xEC,0x1A,0x65,0x08,0x97,0x07,0x91,0x06,0x90,0x58,0x67, -0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0, -0x20,0xB0,0x00,0x6A,0x04,0xD2,0x40,0x98,0x01,0x69,0xC0,0xF6,0x42,0x32,0x2C,0xEA, -0x09,0x22,0x00,0x18,0x4F,0x9A,0x06,0xD4,0x04,0xD1,0x40,0x98,0x1A,0xB3,0x6C,0xEA, -0x40,0xD8,0x06,0x94,0x44,0xAC,0xFF,0xF7,0x1F,0x6B,0x06,0x72,0x19,0x61,0x40,0x9C, -0x17,0x2A,0x45,0xAC,0x6C,0xEA,0x17,0x2A,0x41,0x9C,0x82,0x67,0x42,0x32,0x42,0x32, -0x6C,0xEA,0x01,0xF0,0x0B,0x72,0x6C,0xEC,0x04,0x61,0x80,0x18,0xB6,0x2B,0x00,0x65, -0x0A,0x10,0x01,0xF0,0x05,0x72,0x07,0x61,0x00,0x18,0x2C,0x48,0x00,0x65,0x03,0x10, -0x00,0x18,0x74,0x56,0x00,0x65,0x04,0x92,0x05,0x22,0x06,0xB2,0x07,0xB4,0x60,0x9A, -0x8D,0xEB,0x60,0xDA,0x0A,0x97,0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0x00,0x00, -0x54,0x45,0x11,0x80,0xFF,0xFF,0xFF,0xF7,0x00,0x00,0x00,0x08,0xF8,0x63,0x0E,0x62, -0x0D,0xD1,0x0C,0xD0,0x39,0xB2,0x03,0x6E,0x40,0x9A,0x42,0x32,0x4A,0x32,0xCC,0xEA, -0x01,0x72,0x61,0x61,0x44,0xAC,0xFF,0xF7,0x1F,0x69,0x07,0x72,0x11,0x61,0x60,0x9C, -0xFF,0x6E,0x40,0xA3,0x03,0x72,0x57,0x61,0x42,0xA3,0xCC,0xEA,0x54,0x2A,0x43,0xA3, -0x64,0xA3,0xCC,0xEA,0xCC,0xEB,0x60,0x33,0x6D,0xEA,0x2D,0xB3,0x40,0xCB,0x4B,0x10, -0x08,0x72,0x49,0x61,0xA0,0x9C,0x60,0x9D,0x62,0x32,0x5A,0x32,0xCC,0xEA,0x2C,0x22, -0xE1,0xF7,0x1F,0x6A,0x4C,0xEB,0x1C,0x73,0x27,0x61,0x26,0xB2,0x00,0x18,0xE0,0x1D, -0x83,0x9A,0x00,0x18,0x6A,0x1E,0x00,0x65,0x23,0xB2,0x60,0xF1,0x47,0xA2,0x18,0x2A, -0x22,0xB2,0x11,0x67,0xFF,0x6C,0x40,0xAA,0x1F,0x4C,0x4C,0xE8,0xFF,0xF7,0x0F,0x6A, -0x4C,0xE8,0x00,0x18,0x9A,0x33,0xB0,0x67,0x00,0x18,0xE2,0xBF,0x00,0x65,0x10,0x6A, -0x4D,0xE8,0xB0,0x67,0xFF,0x6C,0x1F,0x4C,0x00,0x18,0x9A,0x33,0x2C,0xED,0x1E,0x10, -0x00,0x18,0xF7,0x4F,0x33,0x6C,0x1A,0x10,0x66,0x6A,0x7D,0x67,0x50,0xCB,0x14,0xB2, -0xFD,0x67,0x06,0xD5,0x80,0x9A,0x00,0x6D,0x04,0x06,0x24,0x4F,0xA9,0xE7,0x40,0xA2, -0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x06,0x95,0x07,0x96,0x00,0x18, -0x40,0x1E,0x08,0x97,0x03,0x10,0x00,0x18,0x64,0x8B,0x00,0x65,0x0E,0x97,0x0D,0x91, -0x0C,0x90,0x00,0xEF,0x08,0x63,0x00,0x00,0x6C,0x1D,0x11,0x80,0x18,0xA1,0x11,0x80, -0x9C,0x31,0x11,0x80,0x48,0x5C,0x11,0x80,0x1E,0x01,0x00,0xB6,0x84,0x21,0x11,0x80, -0xFD,0x63,0x04,0x62,0x17,0xB2,0x03,0x6B,0xC4,0x67,0x40,0x9A,0x42,0x32,0x4A,0x32, -0x6C,0xEA,0x01,0x72,0x1E,0x61,0x44,0xAC,0x66,0x72,0x1B,0x61,0xA0,0x9C,0xE1,0xF7, -0x1F,0x6A,0xFF,0xF7,0x1F,0x6B,0x80,0x9D,0x4C,0xEC,0x0F,0xB2,0x40,0xAA,0x6C,0xEA, -0x4E,0xEC,0x0F,0x2C,0x0D,0xB3,0x00,0x6A,0x00,0xF4,0x44,0xDD,0x40,0x9B,0x02,0x2A, -0xA0,0xDB,0x04,0x10,0x0A,0xB2,0x40,0x9A,0x00,0xF4,0xA4,0xDA,0x08,0xB2,0xA0,0xDA, -0x03,0x10,0x00,0x18,0x18,0x58,0x86,0x67,0x04,0x97,0x00,0xEF,0x03,0x63,0x00,0x00, -0x6C,0x1D,0x11,0x80,0x18,0xA1,0x11,0x80,0x1C,0xA1,0x11,0x80,0x20,0xA1,0x11,0x80, -0xFD,0x63,0x05,0x62,0x04,0xD0,0x0B,0xB0,0xE3,0xF7,0x1F,0x6B,0x7C,0x6C,0x40,0x98, -0x01,0x6D,0x56,0x32,0x6C,0xEA,0x69,0x98,0x58,0xEB,0x12,0xEA,0x00,0x18,0xEB,0x9F, -0x4A,0xD8,0x6B,0x98,0x05,0x97,0x4D,0xE3,0x6B,0xD8,0x04,0x90,0x00,0xEF,0x03,0x63, -0xD8,0xA0,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0x3B,0xB0,0xBD,0x67, -0x10,0x4D,0x90,0xA0,0x4F,0xA0,0x80,0x34,0x4D,0xEC,0x4E,0xA0,0x80,0x34,0x00,0x18, -0x3A,0xBA,0x4D,0xEC,0x7D,0x67,0x48,0xAB,0x8F,0xA0,0xFD,0x67,0x4C,0xCB,0x49,0xAB, -0x4D,0xCB,0x6A,0xAB,0x03,0x6A,0x4C,0xEB,0x4E,0xA0,0x48,0x32,0x4D,0xEB,0x80,0x32, -0x48,0x32,0x4D,0xEB,0x50,0xA0,0x6E,0xCF,0x70,0x80,0x48,0x32,0x9A,0x34,0x4D,0xEC, -0x00,0x53,0x8F,0xCF,0x05,0x60,0x09,0xF4,0x00,0x6A,0x8D,0xEA,0x4F,0xCF,0x06,0x10, -0x0A,0xF0,0x00,0x6A,0x4B,0xEA,0x8D,0xEA,0x7D,0x67,0x4F,0xCB,0x9D,0x67,0x10,0x4C, -0xFF,0xF7,0x1F,0x6F,0x0F,0x6A,0x00,0x6E,0x2C,0x65,0x0F,0x65,0x01,0x69,0x4A,0x65, -0x89,0x67,0xC4,0x30,0x89,0xE0,0x84,0xAA,0x00,0x6D,0xE8,0x67,0x65,0x67,0xEC,0xEC, -0x44,0x67,0x47,0xEB,0x2C,0xEA,0x07,0x22,0xEA,0x67,0x6B,0xE7,0xF1,0x67,0xE4,0xEA, -0xED,0xED,0x48,0x67,0x4C,0xED,0x01,0x4B,0xFF,0x6F,0xEC,0xEB,0x10,0x5B,0xF0,0x61, -0x01,0x4E,0x69,0x67,0xEC,0xEE,0x69,0xE0,0x04,0x5E,0xA4,0xCA,0xE1,0x61,0xFD,0x67, -0xCC,0xAF,0x51,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x5D,0x67,0xCD,0xAA,0x50,0x6C, -0x00,0x18,0x01,0xA0,0x01,0x6D,0x7D,0x67,0xCE,0xAB,0x4F,0x6C,0x00,0x18,0x01,0xA0, -0x01,0x6D,0xFD,0x67,0xCF,0xAF,0x4E,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x0A,0x97, -0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0xD8,0xA0,0x11,0x80,0xFB,0x63,0x08,0x62, -0x07,0xD1,0x06,0xD0,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6B, -0x04,0xD3,0x6C,0xEA,0xFF,0x6B,0x02,0x4B,0x6B,0xEB,0x6C,0xEA,0xFF,0x6B,0x01,0x4B, -0xC2,0x67,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x51,0xB1,0x52,0xB3, -0x07,0x68,0x41,0x99,0x51,0xB4,0x01,0x6D,0x4E,0x32,0x0C,0xEA,0x69,0xE2,0x60,0xA2, -0x40,0x99,0x0C,0xEB,0x40,0xF6,0x60,0x33,0x8C,0xEA,0x6D,0xEA,0x57,0x6C,0x00,0x18, -0xEB,0x9F,0x40,0xD9,0x04,0x93,0x57,0x6C,0x01,0x6D,0x4C,0xEB,0x71,0x6A,0x04,0xD3, -0x4B,0xEA,0x4C,0xEB,0x40,0x99,0xC3,0x67,0x40,0xF6,0x42,0x32,0x0C,0xEA,0x50,0x32, -0x00,0x18,0x01,0xA0,0x4D,0xEE,0x40,0x99,0x01,0x6B,0x03,0x67,0x6C,0xEA,0x06,0x22, -0x41,0x99,0x80,0x6B,0x6C,0xEA,0x01,0x5A,0x18,0x67,0x02,0x48,0x56,0x6C,0x00,0x18, -0xEB,0x9F,0x01,0x6D,0x00,0x36,0x37,0xB0,0xFF,0xF7,0x1F,0x69,0x1C,0xF0,0x00,0x6B, -0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x60,0x98,0xE3,0xF7,0x1F,0x6C,0xD8,0x36,0x76,0x33, -0x8C,0xEB,0x6D,0xEE,0xFB,0xF7,0x1F,0x6B,0x6C,0xEE,0x4D,0xEE,0x56,0x6C,0x00,0x18, -0x01,0xA0,0x01,0x6D,0x47,0xA0,0xC6,0xA0,0x58,0x6C,0x40,0x32,0x4D,0xEE,0x00,0x18, -0x01,0xA0,0x01,0x6D,0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xC8,0xA0,0x04,0x6B, -0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x03,0x6B,0x6C,0xEE,0x4D,0xEE,0x59,0x6C,0x00,0x18, -0x01,0xA0,0x01,0x6D,0x80,0x18,0x7D,0x2C,0x00,0x65,0x40,0x98,0xC0,0xF7,0x42,0x32, -0x24,0x22,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x81,0x6B,0x2C,0xEA,0x6B,0xEB, -0x6C,0xEA,0xC2,0x67,0x80,0x6B,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D, -0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x4C,0xE9,0xE0,0xF1,0x1D,0x6A,0x4B,0xEA, -0x4C,0xE9,0x45,0xA0,0xFF,0x6B,0xD1,0x67,0x6C,0xEA,0x48,0x32,0xE0,0xF1,0x1C,0x6B, -0x6C,0xEA,0x59,0x6C,0x01,0x6D,0x4D,0xEE,0x0B,0x10,0x57,0x6C,0x00,0x18,0xEB,0x9F, -0x01,0x6D,0x4C,0xE9,0x81,0x6A,0x4B,0xEA,0xD1,0x67,0x57,0x6C,0x01,0x6D,0x4C,0xEE, -0x00,0x18,0x01,0xA0,0x00,0x65,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63, -0xD8,0xA0,0x11,0x80,0x78,0xDB,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0xFB,0x63,0x08,0x62, -0x07,0xD1,0x06,0xD0,0x0F,0xB1,0xFF,0x68,0x8C,0xE8,0x47,0x99,0x4F,0xEA,0x04,0x22, -0x87,0x41,0x00,0x18,0xFD,0x1D,0x15,0x4C,0x0E,0x20,0x0B,0xB6,0x00,0x68,0xA7,0x41, -0x01,0x6C,0x15,0x4D,0xF0,0x67,0x00,0x18,0xF3,0x1D,0x04,0xD0,0x87,0x99,0x00,0x18, -0x0C,0x1E,0x14,0x6D,0x10,0xC9,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63, -0xD8,0xA0,0x11,0x80,0x85,0xB5,0x10,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0, -0x00,0x6C,0x02,0xF0,0x00,0x6E,0x00,0x18,0x01,0xA0,0xA4,0x67,0x2D,0xB2,0x3C,0x6C, -0x00,0x6D,0xC0,0x9A,0x7F,0x6A,0xFF,0xF7,0x1F,0x68,0x80,0xF4,0xC2,0x36,0x4C,0xEE, -0xC4,0x36,0xFF,0x6A,0x01,0x4E,0x4C,0xEE,0x00,0x18,0x01,0xA0,0xC0,0x36,0x57,0x6C, -0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x01,0xF6,0x01,0x69,0x2B,0xE9,0xC2,0x67, -0x2C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F, -0x01,0x6D,0x0C,0xEA,0x2C,0xEA,0x01,0xF6,0x00,0x6B,0xC2,0x67,0x6D,0xEE,0x57,0x6C, -0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA, -0x03,0x69,0x2B,0xE9,0xC2,0x67,0x2C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D, -0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x2C,0xEA,0x02,0x6B,0xC2,0x67, -0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F, -0x01,0x6D,0x4C,0xE8,0xD0,0x67,0x2C,0xEE,0x01,0x6D,0x00,0x18,0x01,0xA0,0x57,0x6C, -0x80,0x18,0x1B,0x2D,0x01,0x6C,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63, -0xD8,0xA0,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x1A,0xB2,0x06,0xD4,0x47,0x9A, -0x8E,0xEA,0x05,0x22,0x8F,0xEA,0x03,0x22,0x00,0x18,0xFD,0x1D,0x06,0x04,0x15,0xB0, -0x42,0x6B,0x41,0x98,0x6C,0xEA,0x6A,0xEA,0x08,0x60,0x47,0x98,0x4F,0xEA,0x1C,0x22, -0x87,0x40,0x00,0x18,0xFD,0x1D,0x15,0x4C,0x17,0x10,0x7D,0x6C,0x00,0x18,0xEB,0x9F, -0x01,0x6D,0x02,0x6E,0x4C,0xEE,0x04,0x26,0x50,0xA8,0x01,0x4A,0x50,0xC8,0x0C,0x10, -0x86,0x67,0x00,0x18,0x01,0xA0,0xA6,0x67,0x49,0x98,0x01,0x4A,0x80,0x18,0x70,0x2C, -0x49,0xD8,0x80,0x18,0x2E,0x2D,0x00,0x65,0x05,0x97,0x04,0x90,0x00,0xEF,0x03,0x63, -0xD8,0xA0,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x00,0x6C,0xC4,0x67,0x00,0x18, -0x01,0xA0,0xA4,0x67,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E, -0x4C,0xEE,0xFF,0x6A,0x04,0x4A,0x4B,0xEA,0x4C,0xEE,0x01,0x6D,0x00,0x18,0x01,0xA0, -0x57,0x6C,0x0A,0xB0,0x41,0x6B,0x6B,0xEB,0x41,0x98,0x00,0x6C,0x6C,0xEA,0x80,0x18, -0x1B,0x2D,0x41,0xD8,0x80,0x18,0x70,0x2C,0x00,0x65,0x00,0x6A,0x49,0xC0,0x05,0x97, -0x04,0x90,0x00,0xEF,0x03,0x63,0x00,0x00,0xD8,0xA0,0x11,0x80,0xFD,0x63,0x04,0x62, -0x80,0x18,0xBB,0x2C,0x00,0x65,0x0D,0xB3,0x00,0x6A,0x59,0x6C,0x4B,0xDB,0x49,0xDB, -0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x00,0xF2,0x01,0x6A, -0x4B,0xEA,0x59,0x6C,0x01,0x6D,0x00,0x18,0x01,0xA0,0x4C,0xEE,0x80,0x18,0x2E,0x2D, -0x00,0x65,0x04,0x97,0x00,0xEF,0x03,0x63,0xD8,0xA0,0x11,0x80,0xFD,0x63,0x04,0x62, -0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x02,0xF1, -0x01,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x00,0x6C, -0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x06,0xB4,0x41,0x6B,0x6B,0xEB,0x41,0x9C, -0x04,0x97,0x6C,0xEA,0x41,0xDC,0x00,0x6A,0x49,0xC4,0x00,0xEF,0x03,0x63,0x00,0x00, -0xD8,0xA0,0x11,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x80,0x18,0xBB,0x2C, -0x00,0x65,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x69,0x02,0xF0, -0x01,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x02,0xF0,0x00,0x68,0xC2,0x67,0x0D,0xEE, -0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D, -0x2C,0xEA,0x00,0xF2,0x01,0x6B,0x6B,0xEB,0xC2,0x67,0x6C,0xEE,0x59,0x6C,0x00,0x18, -0x01,0xA0,0x01,0x6D,0x00,0x6C,0xD0,0x67,0x00,0x18,0x01,0xA0,0xA4,0x67,0x28,0xB2, -0x03,0x6C,0x00,0x6D,0x00,0x9A,0x07,0x6A,0x00,0xF7,0x02,0x30,0x00,0x18,0xEB,0x9F, -0x4C,0xE8,0x2C,0xEA,0x1F,0xF4,0x01,0x6B,0x6B,0xEB,0x6C,0xEA,0x21,0xB3,0x05,0x48, -0x1F,0xF4,0x00,0x6C,0x61,0xE0,0x20,0xF1,0x7A,0xA0,0xC2,0x67,0x00,0x6D,0x60,0x33, -0x68,0x33,0x8C,0xEB,0x6D,0xEE,0x00,0x18,0x01,0xA0,0x03,0x6C,0x18,0xB3,0x7F,0x6A, -0x3C,0x6C,0xC0,0x9B,0x00,0x6D,0x01,0x68,0x80,0xF4,0xC2,0x36,0x4C,0xEE,0xC4,0x36, -0xFF,0x6A,0x06,0x4E,0x4C,0xEE,0x00,0x18,0x01,0xA0,0xC0,0x36,0x57,0x6C,0x00,0x18, -0xEB,0x9F,0x01,0x6D,0x02,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0xC2,0x67,0x0D,0xEE, -0xB0,0x67,0x00,0x18,0x01,0xA0,0x57,0x6C,0xB0,0x67,0x00,0x18,0xEB,0x9F,0x57,0x6C, -0x02,0x6E,0x4C,0xE9,0xCB,0xEE,0xB0,0x67,0x2C,0xEE,0x00,0x18,0x01,0xA0,0x57,0x6C, -0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63,0x00,0x00,0xD8,0xA0,0x11,0x80, -0xDC,0x00,0x11,0x80,0xFD,0x63,0x04,0x62,0x7F,0xF7,0x0F,0x6D,0x00,0x18,0x5D,0xBA, -0x5E,0x6C,0x0E,0xB2,0xFF,0xF6,0x1F,0x6D,0x00,0x18,0x5D,0xBA,0x81,0xA2,0xFF,0x6D, -0xD8,0x6C,0x00,0x18,0x9A,0x33,0x08,0x4D,0xFF,0x6C,0x09,0x4C,0x00,0x18,0x9A,0x33, -0x00,0x6D,0x07,0xB4,0x41,0x6B,0x6B,0xEB,0x41,0x9C,0x04,0x97,0x6C,0xEA,0x41,0xDC, -0x00,0x6A,0x49,0xC4,0x00,0xEF,0x03,0x63,0x30,0xF4,0x04,0x80,0xD8,0xA0,0x11,0x80, -0xF7,0x63,0x10,0x62,0x0F,0xD1,0x0E,0xD0,0x72,0xB5,0x73,0xB3,0x07,0x6C,0xC0,0x9D, -0xFF,0xF7,0x1F,0x6F,0xC0,0x32,0x58,0x32,0x80,0xF5,0x42,0x31,0x41,0x9D,0x4E,0x32, -0x8C,0xEA,0x69,0xE2,0x60,0xA2,0x6D,0xB2,0x8C,0xEB,0x40,0xF6,0x60,0x33,0xCC,0xEA, -0x6D,0xEA,0x40,0xF6,0x42,0x33,0x40,0xDD,0xFF,0x6E,0x8C,0xEB,0x61,0x21,0x51,0x67, -0xEC,0xE9,0x00,0xF4,0x01,0x59,0x02,0x61,0x00,0xF4,0x00,0x6A,0x27,0x67,0x4C,0xE9, -0x4F,0x43,0xCC,0xEA,0x04,0x5A,0x23,0x61,0x61,0xB0,0x00,0x6F,0x5D,0x67,0x06,0xD7, -0x0C,0xCA,0x06,0x92,0x5F,0xB3,0x80,0xF4,0x20,0x34,0x01,0x6D,0x6C,0xEA,0x8D,0xEA, -0x06,0xD2,0x5D,0xB2,0x9D,0x67,0x18,0x4C,0xC5,0x67,0x07,0xD2,0x04,0xD7,0x05,0xD7, -0x3C,0x10,0xE0,0xF7,0x1F,0x6A,0x4C,0xEB,0x49,0x67,0x80,0xF4,0x60,0x33,0xCC,0xEA, -0x6D,0xEA,0x40,0xDC,0x54,0xB2,0xFF,0x6D,0xEC,0xED,0x41,0xDC,0x28,0x10,0x53,0xB2, -0x60,0x33,0x00,0x6D,0x41,0xE3,0x5D,0x67,0x18,0x4A,0xAA,0x65,0x4D,0xB2,0x71,0x67, -0x0D,0x65,0x2A,0x65,0x4E,0xB2,0x6F,0x65,0x4E,0x65,0x8A,0x65,0xAC,0x32,0xCD,0x67, -0xD1,0xE2,0x48,0x67,0x40,0xDC,0x00,0xF1,0x01,0x5B,0x00,0xCC,0x41,0xDC,0xC0,0x9C, -0xE1,0x45,0xD7,0x61,0x49,0x67,0xCC,0xEA,0xAC,0x67,0xAD,0xEA,0xAA,0x67,0x80,0x4B, -0xEC,0xED,0x80,0x4B,0xCB,0x67,0x04,0x5D,0x40,0xDC,0xCC,0xEB,0xE7,0x61,0x00,0x6F, -0x9D,0x67,0x04,0xD7,0x05,0xD7,0x18,0x4C,0x01,0x6E,0x00,0x18,0xF7,0x33,0x00,0x65, -0x34,0xB2,0xC4,0x6C,0xA0,0x9A,0x7F,0x6A,0x80,0xF4,0xA2,0x35,0x4C,0xED,0xA0,0x32, -0x00,0x18,0x9A,0x33,0x4D,0xED,0x5E,0x6C,0x00,0x18,0x78,0xBA,0x60,0x6D,0x35,0xB2, -0x35,0xB0,0x2C,0xB3,0x81,0xA2,0x01,0xF4,0x00,0x6D,0x09,0xE4,0x40,0xAA,0x4C,0xED, -0x40,0x9B,0x0F,0x6B,0x46,0x32,0x6C,0xEA,0x40,0x32,0x50,0x32,0x4D,0xED,0x00,0x18, -0x9A,0x33,0x2D,0xED,0x2D,0xB2,0x23,0xB6,0xEE,0xF1,0x1F,0x6D,0x21,0xA2,0x60,0x9E, -0x01,0xE1,0x40,0xA8,0x07,0x68,0x91,0x67,0x4C,0xED,0x01,0x6A,0x6C,0xEA,0x00,0xF7, -0x62,0x33,0x0C,0xEB,0x40,0x32,0x5C,0x32,0x60,0x33,0x64,0x33,0x4D,0xED,0x00,0x18, -0x9A,0x33,0x6D,0xED,0x17,0xB2,0x01,0x6C,0xA0,0x9A,0x00,0xF7,0xA2,0x35,0x00,0x18, -0x68,0x91,0x0C,0xED,0x13,0xB3,0x01,0x6C,0xA0,0x9B,0x00,0xF7,0xA2,0x35,0x00,0x18, -0x82,0x91,0x0C,0xED,0x5E,0x6C,0x00,0x18,0x78,0xBA,0x90,0x6D,0xFF,0x6D,0x91,0x67, -0x00,0x18,0x78,0xBA,0x01,0x4D,0xFF,0x6C,0x09,0x4C,0x00,0x18,0x9A,0x33,0x03,0x6D, -0xFF,0x6D,0xD8,0x6C,0x00,0x18,0x9A,0x33,0x08,0x4D,0xFE,0xF7,0x1F,0x6D,0x00,0x18, -0x5D,0xBA,0x5E,0x6C,0x10,0x97,0x0F,0x91,0x0E,0x90,0x00,0xEF,0x09,0x63,0x00,0x00, -0xD8,0xA0,0x11,0x80,0x80,0xDB,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0x00,0xF8,0x10,0x80, -0xFF,0xFF,0x03,0xE0,0x00,0x00,0x00,0x80,0x00,0xFB,0x10,0x80,0x00,0x00,0x00,0x04, -0x38,0xF4,0x04,0x80,0x00,0x00,0x00,0xB6,0x30,0xF4,0x04,0x80,0xE0,0x63,0x3F,0x62, -0x3E,0xD0,0x0F,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x00,0x68, -0x7D,0x67,0x04,0xF0,0x1F,0x6A,0x9D,0x67,0x12,0xC3,0x48,0xCB,0x00,0x18,0xEC,0xC6, -0x10,0x4C,0x08,0xB4,0x04,0x63,0x41,0x6B,0x41,0x9C,0x09,0xC4,0x3F,0x97,0x3E,0x90, -0x6B,0xEB,0x6C,0xEA,0x41,0xDC,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80, -0xD8,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x18,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18, -0x64,0x2E,0x08,0x6E,0x16,0xB5,0x17,0xB3,0x07,0x6E,0x41,0x9D,0x16,0xB4,0x4E,0x32, -0xCC,0xEA,0x69,0xE2,0x40,0xA2,0x60,0x9D,0xCC,0xEA,0x40,0xF6,0x40,0x32,0x8C,0xEB, -0x4D,0xEB,0x9D,0x67,0x04,0xF0,0x1E,0x6A,0x60,0xDD,0x48,0xCC,0x03,0x6A,0x52,0xC4, -0x80,0xF4,0x62,0x32,0x7F,0x6C,0x8C,0xEA,0x9D,0x67,0x53,0xC4,0x62,0x32,0x40,0xF6, -0x62,0x33,0xCC,0xEB,0x75,0xC4,0x54,0xC4,0x00,0x18,0xAA,0xC6,0x10,0x4C,0x04,0x63, -0x3E,0x97,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0xD8,0xA0,0x11,0x80, -0x70,0xDB,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0xE0,0x63,0x3E,0x62,0x3D,0xD1,0x3C,0xD0, -0x11,0xB4,0xFB,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x7D,0x67,0x04,0xF0, -0x1F,0x6A,0x48,0xCB,0x0D,0xB2,0x0E,0xB0,0x00,0x69,0xA1,0xF1,0x48,0xAA,0x9D,0x67, -0x32,0xC3,0x49,0xD8,0x00,0x18,0xEC,0xC6,0x10,0x4C,0x41,0x98,0x41,0x6B,0x6B,0xEB, -0x05,0x63,0x6C,0xEA,0x29,0xC0,0x41,0xD8,0x3E,0x97,0x3D,0x91,0x3C,0x90,0x00,0xEF, -0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0x58,0x46,0x11,0x80,0xD8,0xA0,0x11,0x80, -0xE0,0x63,0x3E,0x62,0x0E,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E, -0x7D,0x67,0x04,0xF0,0x1D,0x6A,0x48,0xCB,0x01,0x6A,0x52,0xC3,0x09,0xB2,0x7F,0x6B, -0x9D,0x67,0x40,0x9A,0x10,0x4C,0x80,0xF4,0x42,0x32,0x6C,0xEA,0x7D,0x67,0x00,0x18, -0x7C,0xC6,0x53,0xC3,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x76,0x5D,0x11,0x80, -0xD8,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x24,0xB4,0xFC,0x63,0x08,0x6E,0x00,0x18, -0x64,0x2E,0x00,0x6D,0x7D,0x67,0x04,0xF0,0x0D,0x6A,0x48,0xCB,0x19,0x6A,0x00,0x6C, -0x52,0xC3,0x60,0x6A,0x4B,0xEA,0x53,0xC3,0x94,0xC3,0x55,0xC3,0x96,0xC3,0x97,0xC3, -0x98,0xC3,0x1B,0xB3,0xBD,0x67,0x9F,0xC5,0x54,0xA3,0x20,0xF0,0x80,0xC5,0x20,0xF0, -0x82,0xC5,0x59,0xC5,0x55,0xA3,0x20,0xF0,0x84,0xC5,0x20,0xF0,0x85,0xC5,0x5A,0xC5, -0x56,0xA3,0x20,0xF0,0x87,0xC5,0x20,0xF0,0x89,0xC5,0x5B,0xC5,0x57,0xA3,0x5C,0xC5, -0x58,0xA3,0x5D,0xC5,0x59,0xA3,0x5E,0xC5,0x02,0x6A,0x20,0xF0,0x41,0xC5,0x20,0xF0, -0x43,0xC5,0x1E,0x6A,0x20,0xF0,0x46,0xC5,0x12,0x6A,0x20,0xF0,0x48,0xC5,0x20,0xF0, -0x4A,0xC5,0x20,0xF0,0x8B,0xC5,0x9D,0x67,0x00,0x18,0xFC,0xC2,0x10,0x4C,0x04,0x63, -0x3E,0x97,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0xD8,0xA0,0x11,0x80, -0xE0,0x63,0x3E,0x62,0x1A,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E, -0x7D,0x67,0x04,0xF0,0x06,0x6A,0x48,0xCB,0x0F,0x6A,0x9D,0x67,0x52,0xC3,0x00,0x6A, -0x54,0xC4,0x56,0xC4,0x57,0xC4,0x58,0xC4,0x59,0xC4,0x5A,0xC4,0x5B,0xC4,0x5C,0xC4, -0x5D,0xC4,0x5E,0xC4,0x5F,0xC4,0x07,0x6A,0x20,0x6B,0x20,0xF0,0x40,0xC4,0x03,0x6A, -0x73,0xC4,0x75,0xC4,0x20,0xF0,0x41,0xC4,0x00,0x18,0xA8,0xC1,0x10,0x4C,0x7D,0x67, -0x04,0xF0,0x0A,0x6A,0x48,0xCB,0x9D,0x67,0x01,0x6A,0x52,0xC3,0x53,0xC3,0x00,0x18, -0x5E,0xC2,0x10,0x4C,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x76,0x5D,0x11,0x80, -0xE0,0x63,0x3E,0x62,0xFB,0x63,0x7D,0x67,0x00,0xF4,0x06,0x6A,0x48,0xCB,0x03,0x6A, -0x52,0xC3,0x13,0x6A,0x55,0xC3,0x26,0xB2,0x6D,0xA2,0x08,0x73,0x22,0x60,0x70,0x32, -0x69,0xE2,0x24,0xB6,0x48,0x32,0x6B,0xE2,0x48,0x32,0xD1,0xE2,0x20,0xF1,0x4F,0xA4, -0x01,0x6D,0xAC,0xEA,0x16,0x22,0x00,0xF1,0x52,0xAE,0x47,0xEB,0xAC,0xEA,0x11,0x22, -0x20,0xF1,0x6C,0xAC,0xFF,0xF7,0x1F,0x6A,0x9D,0x67,0x4C,0xEB,0x5D,0x67,0x73,0xC2, -0xBD,0x67,0x62,0x32,0x7D,0x67,0x54,0xC3,0x00,0xF1,0x18,0x4D,0x00,0x18,0xD2,0x48, -0x10,0x4C,0x13,0xB2,0x6C,0xA2,0x0A,0x73,0x1D,0x60,0x64,0x32,0x69,0xE2,0x4C,0x32, -0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x10,0xB3,0x48,0x32,0x71,0xE2,0xE0,0xF0,0x4B,0xA4, -0xFF,0x6B,0x6C,0xEA,0x01,0x72,0x0E,0x61,0x60,0xF2,0x7C,0xAC,0x5D,0x67,0x9D,0x67, -0x73,0xC2,0xBD,0x67,0x62,0x32,0x7D,0x67,0x54,0xC3,0x00,0xF1,0x18,0x4D,0x00,0x18, -0xD2,0x48,0x10,0x4C,0x05,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0xD8,0xA0,0x11,0x80, -0x58,0x46,0x11,0x80,0x48,0x60,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x12,0xB0, -0x00,0x6A,0xFF,0x6D,0xC0,0xF1,0x46,0xC0,0xC0,0xF1,0x5A,0xC0,0x03,0x6A,0xC0,0xF1, -0x58,0xC0,0x0E,0xB2,0x02,0x6B,0xAC,0xEC,0xC0,0xF1,0x65,0xC0,0xC0,0xF1,0x64,0xC0, -0xC0,0xF1,0x79,0xC0,0x40,0xF1,0x9E,0xC0,0x60,0xC2,0x00,0x18,0xEB,0xA4,0xAC,0xEC, -0x20,0xF1,0x8E,0x40,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x05,0x97,0x04,0x90, -0x00,0xEF,0x03,0x63,0x48,0x5C,0x11,0x80,0xBD,0x5B,0x11,0x80,0xE0,0x63,0x3E,0x62, -0x3D,0xD1,0x3C,0xD0,0xF5,0x63,0x7D,0x67,0x00,0xF4,0x05,0x6A,0x7E,0xB5,0x54,0xCB, -0x9D,0x67,0x0D,0x6A,0x20,0xF0,0x4A,0xC3,0x2B,0x4C,0x00,0x18,0x2E,0x2E,0x06,0x6E, -0x7A,0xB0,0x00,0x6A,0x9D,0x67,0x01,0x6B,0x20,0xF0,0x51,0xC4,0x20,0xF0,0x52,0xC4, -0x20,0xF0,0x73,0xC4,0x20,0xF0,0x54,0xC4,0x20,0xF0,0x55,0xC4,0x20,0xF0,0x56,0xC4, -0x20,0xF0,0x77,0xC4,0xC0,0xF1,0x46,0xC0,0xC0,0xF1,0x5A,0xC0,0x03,0x6A,0xC0,0xF1, -0x58,0xC0,0x6F,0xB2,0x02,0x6B,0xC0,0xF1,0x65,0xC0,0xC0,0xF1,0x64,0xC0,0xC0,0xF1, -0x79,0xC0,0x20,0xF1,0x8E,0x40,0x60,0xC2,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E, -0x60,0xF1,0x4E,0xA0,0x02,0x72,0x07,0x60,0x03,0x52,0x02,0x60,0x01,0x72,0x01,0x10, -0x03,0x72,0x15,0x61,0xAF,0x10,0x63,0xB5,0x00,0x6B,0xFF,0x6C,0x64,0x32,0x69,0xE2, -0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x48,0x32,0xA9,0xE2,0x20,0xF0,0x58,0xA2, -0x8C,0xEA,0x80,0xF0,0x1F,0x2A,0x01,0x4B,0x8C,0xEB,0x0A,0x5B,0xEF,0x61,0x00,0x18, -0xD4,0x5A,0x0A,0x04,0x62,0x67,0x80,0xF0,0x1D,0x2A,0x0A,0x02,0x06,0x4A,0x64,0xA2, -0xFF,0xF7,0x1F,0x6C,0xBD,0x67,0x60,0x33,0x4C,0xD3,0x43,0xA2,0x22,0x4D,0x4D,0xEB, -0x8C,0xEB,0x4C,0xD3,0x5D,0x67,0x20,0xF0,0x53,0xA2,0x7D,0x67,0x4D,0xD2,0x20,0xF0, -0x74,0xA3,0x0A,0x02,0x0A,0x4A,0x4E,0xD3,0x24,0xA2,0x43,0xA2,0x20,0x31,0x8C,0xE9, -0x4D,0xE9,0x8C,0xE9,0x9D,0x67,0x20,0xF0,0x97,0xA4,0x4F,0xD4,0x9D,0x67,0x00,0x18, -0x8E,0xDF,0x20,0x4C,0x50,0xD2,0x62,0x67,0x75,0x2A,0x5D,0x67,0x71,0xAA,0xFF,0xF7, -0x1F,0x6C,0x3D,0xB5,0x8C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32, -0x6B,0xE2,0x3C,0xB3,0x48,0x32,0x61,0xE2,0xE0,0xF0,0x8D,0x40,0x00,0x18,0x2E,0x2E, -0x06,0x6E,0x5D,0x67,0x20,0xF1,0x50,0xAA,0x7D,0x67,0x9D,0x67,0x60,0xF2,0x5E,0xC8, -0x20,0xF1,0x74,0xA3,0x5D,0x67,0xE0,0xF0,0x7A,0xC0,0x20,0xF1,0x98,0xA4,0x7D,0x67, -0xE0,0xF0,0x9C,0xC0,0x20,0xF1,0x5C,0xA2,0xE0,0xF0,0x5D,0xC0,0x20,0xF0,0x40,0xA3, -0xE0,0xF0,0x53,0xC0,0x01,0x6A,0x80,0xF2,0x42,0xC0,0x91,0xAB,0xFF,0xF7,0x1F,0x6A, -0x00,0x18,0x45,0x95,0x4C,0xEC,0x7D,0x67,0x40,0xF1,0x60,0xA3,0x22,0x32,0x5E,0x32, -0x00,0xF1,0x71,0xC0,0x18,0x22,0xEF,0xF7,0x1F,0x6A,0x4C,0xE9,0x01,0x6A,0x80,0xF0, -0x3E,0xC8,0x04,0xD2,0x20,0xB2,0xFF,0xF7,0x1F,0x6C,0xFA,0x6D,0x05,0xD2,0x80,0xF0, -0x5E,0xA8,0x24,0xF2,0x15,0x6E,0x20,0xF5,0x17,0x6F,0x8C,0xEA,0x06,0x6C,0x20,0x18, -0x1B,0x32,0x06,0xD2,0x05,0x10,0x5D,0x67,0x40,0xF1,0x40,0xAA,0x80,0xF0,0x5E,0xC8, -0x00,0x18,0x4E,0x9B,0x0A,0x04,0x22,0x67,0x0F,0x22,0x7D,0x67,0x20,0xF0,0x80,0xA3, -0xE0,0xF0,0xA8,0xA0,0x00,0x18,0xB6,0xDF,0x00,0x65,0x0B,0xB4,0x00,0x18,0xD3,0xDF, -0x00,0x65,0x07,0x10,0x0C,0x6B,0x06,0x10,0x5D,0x67,0x91,0xAA,0x20,0x18,0x13,0x26, -0x01,0x6D,0x71,0x67,0x0B,0x63,0x3E,0x97,0x3D,0x91,0x3C,0x90,0x43,0x67,0x00,0xEF, -0x20,0x63,0x00,0x00,0xEC,0xA0,0x11,0x80,0x48,0x5C,0x11,0x80,0xBD,0x5B,0x11,0x80, -0x48,0x60,0x11,0x80,0xFC,0xA5,0x10,0x80,0xF4,0x63,0x16,0x62,0x15,0xD1,0x14,0xD0, -0x00,0x6A,0x0B,0xD2,0x0C,0xD2,0x0D,0xD2,0x7D,0x67,0x01,0xF4,0x03,0x6A,0x18,0xD4, -0x54,0xCB,0x62,0xA4,0x23,0xA4,0x02,0x6A,0x1E,0x5B,0xC0,0xF3,0x1B,0x60,0x04,0x0A, -0x64,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3,0x00,0xEB,0x00,0x65,0x3D,0x00,0x49,0x00, -0x9D,0x00,0x5B,0x02,0x07,0x03,0x47,0x03,0xD3,0x03,0xAB,0x07,0xF5,0x03,0x07,0x04, -0x21,0x04,0x33,0x04,0x9D,0x06,0x9D,0x05,0x45,0x04,0x6D,0x05,0x85,0x05,0x9D,0x06, -0xAD,0x05,0xBF,0x05,0xD1,0x05,0xFF,0x05,0x0B,0x06,0x21,0x06,0x2D,0x06,0x41,0x06, -0x51,0x06,0x61,0x06,0x6D,0x06,0x7F,0x06,0xA0,0xF7,0x00,0xB2,0x03,0x6C,0x40,0xAA, -0x0B,0xD2,0x0A,0x13,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E, -0x4C,0xEE,0x02,0xF1,0x03,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0, -0x01,0x6D,0x00,0x6C,0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x80,0x18,0x1B,0x2D, -0x00,0x6C,0x00,0x18,0xFE,0x4F,0x00,0x65,0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18, -0x49,0x2B,0xC5,0x67,0x40,0xF7,0x18,0xB3,0x0A,0x6A,0x4C,0xC3,0x08,0x6A,0x4D,0xC3, -0x00,0x6A,0x49,0xC3,0x4A,0xC3,0x87,0x13,0x0B,0x59,0x18,0x67,0x60,0xF3,0x11,0x20, -0x20,0xF7,0x1C,0xB4,0x05,0x21,0x41,0x9C,0x40,0x6B,0x6C,0xEA,0x07,0x22,0x53,0x13, -0x41,0x9C,0x40,0x6B,0x6C,0xEA,0x02,0x2A,0x29,0xC4,0x75,0x13,0x20,0xF7,0x00,0xB3, -0x04,0x6A,0x01,0x6C,0x29,0xC3,0x04,0xD2,0x00,0xF7,0x18,0xB2,0x06,0xD1,0xFA,0x6D, -0x05,0xD2,0x4A,0xA3,0x43,0xF7,0x0A,0x6E,0xE1,0xF4,0x11,0x6F,0x07,0xD2,0x61,0x9B, -0x6A,0x32,0x66,0xEC,0x8C,0xEA,0x8C,0xEB,0x08,0xD2,0x20,0x18,0x1B,0x32,0x09,0xD3, -0xA0,0xF0,0x04,0x20,0x00,0xF0,0x10,0x0A,0x24,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3, -0x00,0xEB,0x00,0x65,0x17,0x00,0x8D,0x00,0xB9,0x00,0xEF,0x00,0x0F,0x01,0x13,0x01, -0x17,0x01,0x39,0x01,0x21,0x01,0x29,0x01,0x31,0x01,0xC0,0xF6,0x04,0xB2,0x61,0x9A, -0x01,0x6A,0x6C,0xEA,0x0B,0x22,0x02,0x6A,0x6C,0xEA,0x04,0x22,0x80,0x18,0x7D,0x2D, -0x00,0x65,0x15,0x10,0x80,0x18,0xA3,0x2D,0x00,0x65,0x11,0x10,0x02,0x6A,0x6C,0xEA, -0x04,0x22,0x80,0x18,0xB6,0x2E,0x00,0x65,0x0A,0x10,0x04,0x6A,0x6C,0xEA,0x04,0x22, -0x80,0x18,0x87,0x2E,0x00,0x65,0x03,0x10,0x80,0x18,0xF5,0x2D,0x00,0x65,0x80,0xF6, -0x00,0xB0,0x8A,0x98,0x4B,0x98,0x29,0x98,0x0E,0xD4,0x00,0x18,0xFE,0x4F,0x0F,0xD2, -0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18,0x49,0x2B,0xC5,0x67,0x0E,0x93,0x0F,0x94, -0x0A,0x6A,0x4C,0xC0,0x08,0x6A,0x4D,0xC0,0x29,0xD8,0x6A,0xD8,0x8B,0xD8,0x0B,0x13, -0x40,0xF6,0x0C,0xB4,0x02,0x6A,0x61,0x9C,0x4D,0xEB,0x04,0x6A,0x6C,0xEA,0x61,0xDC, -0x07,0x22,0x02,0x6A,0x4B,0xEA,0x6C,0xEA,0x80,0x18,0xCC,0x2E,0x41,0xDC,0x1A,0x10, -0x01,0x6A,0x6D,0xEA,0x80,0x18,0x93,0x2D,0x41,0xDC,0x14,0x10,0x20,0xF6,0x00,0xB4, -0x03,0x6A,0x4B,0xEA,0x61,0x9C,0x4C,0xEB,0x02,0x6A,0x4B,0xEA,0x4C,0xEB,0x04,0x6A, -0x6C,0xEA,0x61,0xDC,0x04,0x22,0x80,0x18,0x99,0x2E,0x00,0x65,0x03,0x10,0x80,0x18, -0x08,0x2E,0x00,0x65,0xE0,0xF5,0x18,0xB2,0x40,0x6C,0x61,0x9A,0x8D,0xEB,0x61,0xDA, -0xDA,0x12,0xE0,0xF5,0x0C,0xB0,0x03,0x6B,0x6B,0xEB,0x41,0x98,0x6C,0xEA,0x01,0x6B, -0x6D,0xEA,0x80,0x18,0xB5,0x2D,0x41,0xD8,0x41,0x98,0x40,0x6B,0x6D,0xEA,0x41,0xD8, -0xCA,0x12,0x01,0x6C,0x03,0x10,0x02,0x6C,0x01,0x10,0x03,0x6C,0x80,0x18,0x4E,0x2F, -0x00,0x65,0xC1,0x12,0x80,0x18,0xDD,0x2E,0x00,0x65,0xBD,0x12,0x80,0x18,0x04,0x2F, -0x00,0x65,0xB9,0x12,0x80,0x18,0x20,0x2F,0x00,0x65,0xB5,0x12,0x80,0x18,0x63,0x2F, -0x00,0x65,0xA0,0xF2,0x10,0x22,0x12,0x72,0x58,0x67,0x01,0x5A,0x78,0x67,0x01,0x5B, -0x58,0x67,0x03,0x4A,0xA7,0x12,0x04,0x59,0x60,0xF2,0x1D,0x60,0x80,0x18,0x1B,0x2D, -0x00,0x6C,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE, -0x02,0xF1,0x03,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D, -0x00,0x6C,0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x00,0x18,0xFE,0x4F,0x00,0x65, -0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18,0x49,0x2B,0xC5,0x67,0x40,0xF5,0x00,0xB0, -0x0A,0x6A,0x4C,0xC0,0x08,0x6A,0x2A,0xC0,0x00,0x1C,0xDD,0x31,0x4D,0xC0,0x10,0xD2, -0x41,0x98,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0x01,0x71,0x41,0xD8,0x06,0x61,0x80,0x18, -0x4E,0x2F,0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0x02,0x71,0x04,0x61,0x41,0x98, -0x04,0x6B,0x6D,0xEA,0x41,0xD8,0x00,0x1C,0xE5,0x31,0x10,0x94,0x02,0x6A,0x04,0xD2, -0x00,0xF5,0x00,0xB2,0x06,0xD1,0x01,0x6C,0x05,0xD2,0x41,0x98,0xFA,0x6D,0xE3,0xF7, -0x1E,0x6E,0x4A,0x32,0x8C,0xEA,0xE1,0xF4,0x12,0x6F,0x20,0x18,0x1B,0x32,0x07,0xD2, -0x52,0x12,0x4F,0x59,0x25,0x60,0x18,0x93,0x44,0xA3,0x08,0x5A,0x21,0x60,0xC0,0xF4, -0x10,0xB5,0x7F,0x6A,0x4C,0xE9,0x80,0x9D,0xC0,0xF4,0x0C,0xB2,0x80,0xF4,0x20,0x33, -0x4C,0xEC,0x6D,0xEC,0x80,0xDD,0x18,0x92,0x64,0xA2,0xFF,0x6A,0x4C,0xEB,0x07,0x6A, -0x4C,0xEB,0xA0,0xF4,0x18,0xB2,0x00,0xF7,0x60,0x33,0x8C,0xEA,0x6D,0xEA,0x40,0xDD, -0x32,0x12,0x18,0x93,0x0A,0x59,0x45,0xA3,0x84,0xA3,0x40,0x32,0x4D,0xEC,0x03,0x61, -0x03,0x6C,0x0C,0xD4,0x28,0x12,0x80,0xF4,0x08,0xB6,0x80,0xF4,0x14,0xB3,0xE3,0xF7, -0x1F,0x6A,0xA0,0x9E,0x8C,0xEA,0x54,0x32,0x6C,0xED,0x80,0xF4,0x08,0xB3,0x4D,0xED, -0x24,0x32,0x69,0xE2,0x40,0xAA,0xFF,0xF7,0x1F,0x6B,0xA0,0xDE,0x6C,0xEA,0x4C,0x32, -0x82,0xEA,0xE0,0xF1,0x1E,0x61,0x03,0x59,0x05,0x60,0x02,0x6A,0x4B,0xEA,0x4C,0xED, -0xA0,0xDE,0x0F,0x10,0x06,0x59,0xFF,0x6B,0x58,0x67,0x01,0x6C,0x6C,0xEA,0x61,0x9E, -0x8D,0xED,0x8C,0xEA,0x81,0x6C,0x8B,0xEC,0x5C,0x32,0x8C,0xEB,0x4D,0xEB,0xA0,0xDE, -0x61,0xDE,0x40,0xF4,0x04,0xB2,0x1F,0x6B,0x6B,0xEB,0x49,0xE1,0x80,0xA2,0x0F,0x6A, -0x4C,0xEC,0x40,0x9E,0x84,0x34,0x6C,0xEA,0x8D,0xEA,0x40,0xDE,0xEC,0x11,0x18,0x92, -0x85,0xA2,0x05,0x5C,0xA0,0xF1,0x1F,0x60,0x00,0xF4,0x04,0xB5,0x07,0x6A,0x4C,0xEC, -0x41,0x9D,0x39,0x6B,0x6B,0xEB,0x8C,0x34,0x6C,0xEA,0x8D,0xEA,0x41,0xDD,0xDB,0x11, -0x18,0x94,0xFB,0xB3,0x43,0xA4,0x46,0xC3,0x44,0xA4,0x47,0xC3,0x45,0xA4,0x48,0xC3, -0xD2,0x11,0xF7,0xB5,0xFD,0xB3,0x3E,0x34,0x40,0x9D,0xC0,0xF7,0x80,0x34,0x6C,0xEA, -0x8D,0xEA,0x40,0xDD,0x7F,0x6A,0x4C,0xE9,0x25,0xC5,0xC5,0x11,0x18,0x94,0xF0,0xB3, -0x43,0xA4,0x4E,0xC3,0x44,0xA4,0x4F,0xC3,0x45,0xA4,0x50,0xC3,0xBC,0x11,0x18,0x94, -0xEB,0xB3,0x43,0xA4,0x51,0xC3,0x44,0xA4,0x52,0xC3,0x45,0xA4,0x53,0xC3,0xB3,0x11, -0xE7,0xB6,0xFF,0x6C,0xA4,0x67,0x69,0xA6,0x6C,0xED,0x0A,0x75,0x3F,0x61,0x4C,0xA6, -0x00,0x6F,0x8C,0xEA,0x0A,0x72,0x13,0x60,0x22,0x67,0x44,0x32,0x29,0xE2,0x4C,0x32, -0x2B,0xE2,0x4C,0x32,0xE6,0xB3,0x2B,0xE2,0x48,0x32,0x69,0xE2,0x20,0xF0,0x58,0xA2, -0x05,0x6F,0x8C,0xEA,0x04,0x72,0x03,0x60,0x0A,0x6A,0x00,0x6F,0x4C,0xC6,0x4D,0xA6, -0x08,0x72,0x6A,0x60,0x22,0x67,0x50,0x32,0x29,0xE2,0xDE,0xB4,0x48,0x32,0x2B,0xE2, -0x48,0x32,0x89,0xE2,0x20,0xF1,0x4F,0xA2,0x01,0x6B,0x05,0x6F,0x6C,0xEA,0x05,0x22, -0x00,0xF1,0x52,0xAC,0x47,0xE9,0x6C,0xEA,0x57,0x2A,0x08,0x6A,0x00,0x6F,0x4D,0xC6, -0x53,0x10,0xD5,0xB0,0x7F,0x4D,0x6E,0x4D,0x05,0x6F,0x90,0x67,0xB5,0xE3,0x06,0x6E, -0x00,0x18,0x2E,0x2E,0x13,0xD7,0xFF,0xF7,0x38,0xC0,0x25,0x10,0x4B,0x43,0x8C,0xEA, -0x03,0x5A,0x23,0x60,0xCA,0xB5,0x04,0x6F,0x00,0x69,0x24,0x32,0x29,0xE2,0x4C,0x32, -0x2B,0xE2,0x4C,0x32,0x2B,0xE2,0x48,0x33,0xA9,0xE3,0x20,0xF0,0x58,0xA2,0x8C,0xEA, -0x04,0x72,0xDF,0x60,0x01,0x49,0x8C,0xE9,0x0A,0x59,0xEF,0x61,0x2D,0x10,0xC2,0xB0, -0x60,0xF1,0x02,0x4D,0x05,0x6F,0x90,0x67,0xB5,0xE3,0x06,0x6E,0x00,0x18,0x2E,0x2E, -0x13,0xD7,0xFF,0xF7,0x39,0xC0,0x13,0x97,0x1F,0x10,0x48,0x43,0x8C,0xEA,0x02,0x5A, -0xE5,0x67,0x1A,0x60,0xB7,0xB5,0x04,0x6F,0x00,0x69,0x01,0x6E,0xFF,0xF7,0x1F,0x68, -0x30,0x32,0x29,0xE2,0x48,0x32,0x2B,0xE2,0x48,0x33,0xA9,0xE3,0x20,0xF1,0x4F,0xA2, -0xCC,0xEA,0x06,0x22,0x00,0xF1,0x52,0xAD,0x0C,0xEA,0x47,0xE9,0xCC,0xEA,0xD7,0x2A, -0x01,0x49,0x8C,0xE9,0x08,0x59,0xEC,0x61,0xA1,0xB2,0x4A,0xA2,0x0B,0xD2,0x0B,0x93, -0xE0,0x32,0x4D,0xEB,0x0B,0xD3,0x77,0x10,0xA8,0xB2,0x20,0xF0,0x7C,0xA2,0x0B,0xD3, -0x20,0xF0,0x7D,0xA2,0x0B,0x94,0x20,0xF0,0x5E,0xA2,0x60,0x33,0x6D,0xEC,0x85,0x10, -0xA2,0xB2,0x20,0xF0,0x7F,0xA2,0x0B,0xD3,0x40,0xF0,0x60,0xA2,0x0B,0x94,0x40,0xF0, -0x41,0xA2,0x60,0x33,0x6D,0xEC,0x79,0x10,0x18,0x93,0x43,0xA3,0x62,0xAB,0x60,0x33, -0x6D,0xEA,0x9B,0xB3,0x41,0xDB,0xFF,0x10,0x18,0x94,0x8D,0xB3,0x43,0xA4,0x54,0xC3, -0x44,0xA4,0x55,0xC3,0x45,0xA4,0x56,0xC3,0xF6,0x10,0x18,0x94,0x88,0xB3,0x43,0xA4, -0x57,0xC3,0x44,0xA4,0x58,0xC3,0x45,0xA4,0x59,0xC3,0xED,0x10,0x4F,0x41,0xFF,0x6B, -0x6C,0xEA,0x09,0x5A,0xC0,0xF0,0x15,0x60,0x5C,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D, -0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x79,0x6A,0x4B,0xEA,0x4C,0xEE,0x2C,0x33,0x78,0x6A, -0x4C,0xEB,0x5C,0x6C,0x01,0x6D,0x6D,0xEE,0xA7,0x10,0x79,0xB2,0x92,0xAA,0x69,0x9A, -0x0B,0xD4,0x84,0xB4,0x07,0x10,0x76,0xB2,0x69,0x9A,0x62,0x34,0x82,0x34,0x0B,0xD4, -0xFF,0xF7,0x1F,0x6C,0x8C,0xEB,0x69,0xDA,0x02,0x6A,0x3C,0x10,0x70,0xB2,0x96,0xAA, -0x6B,0x9A,0x0B,0xD4,0x7B,0xB4,0x07,0x10,0x6D,0xB2,0x6B,0x9A,0x62,0x34,0x82,0x34, -0x0B,0xD4,0xFF,0xF7,0x1F,0x6C,0x8C,0xEB,0x6B,0xDA,0xEE,0x17,0x78,0x6C,0x00,0x18, -0xEB,0x9F,0x01,0x6D,0x02,0x6B,0x0B,0xD2,0x0D,0xD3,0xAD,0x10,0x76,0x6C,0x00,0x18, -0xEB,0x9F,0x01,0x6D,0x0B,0xD2,0x02,0x6C,0x0D,0xD4,0xA5,0x10,0x77,0x6C,0x00,0x18, -0xEB,0x9F,0x01,0x6D,0x0B,0xD2,0xD8,0x17,0x5D,0xB2,0x74,0xA2,0x0B,0xD3,0x75,0xA2, -0x0B,0x94,0x56,0xA2,0x60,0x33,0x6D,0xEC,0x08,0x10,0x59,0xB2,0x77,0xA2,0x0B,0xD3, -0x78,0xA2,0x0B,0x94,0x59,0xA2,0x60,0x33,0x6D,0xEC,0x40,0x32,0x40,0x32,0x4D,0xEC, -0x0B,0xD4,0x03,0x6A,0x0D,0xD2,0x87,0x10,0x00,0x6B,0x05,0x59,0x11,0xD3,0x78,0x67, -0x70,0x23,0x18,0x94,0x42,0xA4,0x02,0xAC,0x0C,0x72,0x05,0x61,0x58,0xB2,0x01,0x6F, -0x41,0x9A,0x11,0xD2,0x03,0x10,0x11,0x97,0x03,0x6A,0x0D,0xD2,0x74,0x23,0x00,0xF0, -0x12,0x0A,0x24,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3,0x00,0xEB,0x00,0x65,0x0B,0x00, -0x29,0x00,0x83,0x00,0xA5,0x00,0xAF,0x00,0x06,0x27,0x11,0x96,0x3F,0x6A,0x90,0x67, -0x4C,0xEC,0x00,0x6D,0x31,0x10,0x3F,0x6A,0x90,0x67,0x4C,0xEC,0x00,0x18,0xEB,0x9F, -0xA7,0x67,0x0B,0xD2,0x58,0x10,0x02,0x31,0x01,0x6B,0x6C,0xE9,0x09,0x21,0xA3,0x67, -0x40,0x6C,0xD1,0x67,0x12,0xD3,0x00,0x18,0x01,0xA0,0x13,0xD7,0x13,0x97,0x12,0x93, -0x0C,0x27,0x7F,0x6A,0x4C,0xE8,0x07,0x34,0x40,0x6A,0x11,0x96,0x4D,0xEC,0xFF,0x6A, -0x4C,0xEC,0x00,0x18,0x01,0xA0,0xA3,0x67,0x0B,0x10,0x7F,0x6A,0x4C,0xE8,0x07,0x34, -0x40,0x6A,0x4D,0xEC,0xFF,0x6A,0x4C,0xEC,0x00,0x18,0xEB,0x9F,0xA3,0x67,0x0B,0xD2, -0x32,0x21,0x40,0x6C,0x01,0x6D,0x00,0x6E,0x00,0x18,0x01,0xA0,0x00,0x65,0x2B,0x10, -0x01,0x6A,0x0C,0xEA,0x03,0x22,0x03,0x6B,0x0C,0xD3,0x25,0x10,0x08,0x27,0x11,0x95, -0xFF,0xF7,0x1F,0x6A,0x90,0x67,0x00,0x18,0x9A,0x33,0x4C,0xED,0x1C,0x10,0x2A,0xB2, -0x12,0x10,0x01,0x6A,0x0C,0xEA,0x05,0x2A,0x28,0xB2,0x06,0x10,0x01,0x6A,0x0C,0xEA, -0x02,0x22,0x03,0x6A,0x0F,0x10,0x26,0xB2,0x06,0x27,0x7D,0x67,0x40,0xF0,0x64,0xAB, -0x49,0xE0,0x60,0xCA,0x08,0x10,0x49,0xE0,0x40,0xAA,0xFF,0xF7,0x1F,0x6C,0x4C,0xEC, -0x0B,0xD4,0x01,0x10,0x0C,0xD2,0x0D,0x93,0x0C,0x94,0x70,0x32,0x4D,0xEC,0x18,0x92, -0x83,0xC2,0x18,0x93,0x18,0x94,0x41,0xA3,0x10,0x6B,0x6B,0xEB,0x6C,0xEA,0x41,0xC4, -0x18,0x92,0x0B,0x96,0x02,0x6C,0x00,0x18,0x2C,0x2B,0xA0,0x9A,0x16,0x97,0x15,0x91, -0x14,0x90,0x00,0xEF,0x0C,0x63,0x00,0x00,0xD2,0x04,0x11,0x80,0xD8,0xA0,0x11,0x80, -0xFC,0xA5,0x10,0x80,0xFF,0xFF,0x03,0xFE,0xFF,0xFF,0xFF,0x8F,0x1F,0x00,0xFC,0xFF, -0x88,0xDB,0x10,0x80,0x9C,0xDB,0x10,0x80,0xFF,0xFF,0xFF,0x7F,0x48,0x60,0x11,0x80, -0x58,0x46,0x11,0x80,0xEC,0xA0,0x11,0x80,0xDC,0x00,0x11,0x80,0x08,0xA1,0x11,0x80, -0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0xB6,0x00,0xA0,0x00,0xB0,0x00,0x10,0x00,0xB6, -0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0x44,0xAC,0x24,0x67,0x01,0x72,0x55,0x61, -0x00,0x9C,0x5D,0x67,0xFA,0x6D,0x20,0xF0,0x08,0xC2,0x02,0x6A,0x04,0xD2,0x3F,0xB2, -0x06,0xD0,0x44,0xF2,0x1E,0x6E,0x05,0xD2,0x41,0x9C,0xC1,0xF4,0x1C,0x6F,0x04,0x6C, -0x20,0x18,0x1B,0x32,0x07,0xD2,0x3F,0x6A,0x4C,0xE8,0x20,0x70,0x0A,0x61,0x62,0xA1, -0xFF,0x6A,0x4C,0xEB,0x06,0x2B,0x36,0xB2,0x60,0xDA,0x36,0xB2,0x60,0xDA,0x01,0x6A, -0x42,0xC1,0x7D,0x67,0x20,0xF0,0x68,0xA3,0x3F,0x6A,0x6C,0xEA,0x24,0x72,0x03,0x67, -0x24,0x61,0x7D,0x67,0x01,0xF4,0x03,0x6A,0x00,0x1C,0xDD,0x31,0x50,0xCB,0x00,0x18, -0xFE,0x4F,0x02,0x67,0x00,0x6D,0x9D,0x67,0x20,0x4C,0x80,0x18,0x49,0x2B,0xC5,0x67, -0x29,0xB3,0x40,0x99,0x6C,0xEA,0x29,0xB3,0x6E,0xEA,0x06,0x2A,0x80,0x18,0x4E,0x2F, -0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0xA0,0x99,0x02,0x6C,0x00,0x18,0x2C,0x2B, -0x00,0x6E,0x00,0x1C,0xE5,0x31,0x90,0x67,0x32,0x10,0xFF,0x6A,0x4C,0xE8,0x30,0x70, -0x04,0x61,0x80,0x18,0xEA,0x2F,0x91,0x67,0x2A,0x10,0x44,0xA9,0x02,0x72,0x24,0x61, -0x1B,0xB2,0x40,0xA2,0x21,0x2A,0x40,0x99,0x04,0xF0,0x0F,0x6B,0x6C,0xEA,0x6A,0xEA, -0x0B,0x61,0x18,0xB2,0xFF,0xF7,0x1F,0x6B,0x40,0xAA,0x6C,0xEA,0x40,0x32,0x40,0x32, -0x00,0xF2,0x0F,0x6B,0x6D,0xEA,0x40,0xD9,0x02,0x6A,0x04,0xD2,0x0B,0xB2,0x05,0x6C, -0xFA,0x6D,0x05,0xD2,0x40,0x99,0xA4,0xF2,0x0E,0x6E,0xC1,0xF4,0x1D,0x6F,0x06,0xD2, -0x41,0x99,0x20,0x18,0x1B,0x32,0x07,0xD2,0x00,0x18,0xF4,0x2C,0x91,0x67,0x0E,0x97, -0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0xFC,0xA5,0x10,0x80,0xAC,0xDB,0x10,0x80, -0x38,0x91,0x10,0x80,0x00,0x00,0xFF,0x00,0x00,0x00,0x01,0x00,0x98,0x00,0x11,0x80, -0x04,0x09,0x11,0x80,0xFD,0x63,0x04,0x62,0x00,0x18,0x23,0xEA,0x00,0x65,0x04,0x97, -0x00,0xEF,0x03,0x63,0xEF,0x63,0x20,0x62,0x1F,0xD1,0x1E,0xD0,0x80,0xAC,0x00,0x6A, -0xC6,0xB3,0x11,0xD4,0xA0,0xA5,0x1B,0xD2,0x84,0x32,0x89,0xE2,0x4C,0x32,0x8B,0xE2, -0x4C,0x32,0x8B,0xE2,0x48,0x32,0x69,0xE2,0x19,0xD2,0x12,0xD5,0xE0,0xF0,0x6C,0xA2, -0x18,0xD3,0xA0,0xF0,0x9A,0xAA,0x19,0x93,0x13,0xD4,0xA0,0xF0,0x58,0xAA,0x19,0x94, -0x14,0xD2,0xA0,0xF0,0x7C,0xAB,0x19,0x92,0x15,0xD3,0x7D,0x67,0x60,0xF0,0x6C,0xA3, -0xC0,0xF0,0x80,0xAC,0x16,0xD4,0xC0,0xF2,0x74,0xC2,0x9D,0x67,0xE0,0xF0,0x13,0xA2, -0x60,0xF0,0x8C,0xA4,0xE0,0xF0,0x28,0xA2,0xC0,0xF2,0x95,0xC2,0xB1,0x67,0x00,0x18, -0x7B,0xBB,0x90,0x67,0x17,0xD2,0x17,0x93,0x48,0x32,0x1C,0xD2,0x69,0xE2,0xAC,0xB3, -0x44,0x32,0x69,0xE2,0x1A,0xD2,0x19,0x92,0xE0,0xF0,0xA8,0xA2,0x00,0x18,0xC3,0x34, -0x90,0x67,0x12,0x93,0x0E,0x23,0x18,0x94,0x01,0x74,0x0B,0x61,0x1A,0x92,0x03,0xF4, -0x00,0x6C,0x18,0xF0,0x00,0x6D,0xC3,0xAA,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x8D,0x93, -0x4C,0xEE,0x14,0x93,0x05,0x23,0x19,0x94,0x00,0xF2,0x57,0xA4,0x01,0x72,0x15,0x60, -0x03,0x6A,0x04,0xD2,0x9B,0xB2,0x19,0x93,0x12,0x94,0x05,0xD2,0x14,0x92,0xFA,0x6D, -0xC4,0xF3,0x1C,0x6E,0x06,0xD2,0x00,0xF2,0x57,0xA3,0x64,0xF4,0x18,0x6F,0x08,0xD4, -0x04,0x6C,0x20,0x18,0x1B,0x32,0x07,0xD2,0x18,0x11,0x00,0x1C,0xDD,0x31,0x00,0x65, -0x9D,0x67,0x40,0x4C,0xB1,0x67,0x00,0x18,0x3B,0x94,0x1B,0xD2,0x10,0x92,0x8E,0xB6, -0x46,0x32,0x01,0x4A,0xCC,0xEA,0x10,0xD2,0x19,0x92,0xC0,0xF2,0xEE,0xAA,0x07,0x2F, -0x12,0x93,0x01,0x73,0x04,0x61,0x00,0x1C,0xE5,0x31,0x1B,0x94,0xFE,0x10,0x10,0x95, -0x08,0x25,0x14,0x94,0x06,0x24,0x9B,0xED,0x01,0x2C,0xE5,0xE8,0x10,0xEA,0x00,0x65, -0x01,0x10,0x00,0x6A,0x14,0x93,0xFF,0xF7,0x1F,0x6C,0x4B,0xE3,0x13,0x93,0x8C,0xEA, -0x65,0xE2,0x14,0x92,0x23,0xEA,0x01,0x60,0x47,0xE1,0x12,0x93,0x01,0x73,0x18,0x61, -0x19,0x92,0xEC,0xEC,0xA0,0xF2,0x74,0x9A,0x14,0xD4,0xCC,0xEB,0x73,0xE5,0xA3,0xEB, -0x44,0x67,0x02,0x61,0x75,0xB2,0x49,0xE4,0x14,0x94,0x9A,0xEA,0x01,0x2C,0xE5,0xE8, -0x12,0xE9,0x41,0x41,0x00,0x65,0x98,0xEA,0x12,0xEA,0x65,0xE2,0xA7,0xE1,0xCC,0xE9, -0x19,0x94,0xFF,0x6B,0x14,0x35,0xE0,0xF0,0x48,0xA4,0x6C,0xED,0x02,0x6C,0x6C,0xEA, -0x40,0x32,0x4C,0x32,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x9A,0x33,0x4C,0xED, -0x10,0x92,0x2D,0xE2,0x1D,0xD3,0x08,0x59,0x06,0x60,0x1D,0x94,0x14,0x93,0x71,0xE4, -0x65,0xE1,0x1D,0xD4,0xF8,0x17,0x1D,0x94,0x43,0xE4,0x00,0x18,0xC4,0x36,0x04,0x30, -0x41,0xE0,0x19,0x92,0x4E,0x6C,0x13,0xDA,0x00,0x18,0x9A,0x33,0x14,0x95,0x1D,0x95, -0xFF,0xF7,0x1F,0x6B,0x48,0x6C,0x00,0x18,0x9A,0x33,0x6C,0xED,0x18,0x94,0x14,0x24, -0x16,0x92,0x15,0x93,0x63,0xEA,0x06,0x60,0x43,0xE3,0xFF,0xF7,0x1F,0x6C,0xA2,0x67, -0x8C,0xE8,0x0C,0x10,0x15,0x92,0x16,0x93,0x63,0xEA,0x06,0x60,0x57,0xE3,0xFF,0xF7, -0x1F,0x6C,0x8C,0xED,0x02,0x67,0x02,0x10,0x16,0x95,0x15,0x90,0x00,0x18,0x9A,0x33, -0x4C,0x6C,0x4A,0x6C,0x00,0x18,0x9A,0x33,0xB0,0x67,0x00,0x6C,0x00,0x18,0x9A,0x33, -0x07,0x6D,0x12,0x92,0x0D,0x2A,0x18,0x93,0x01,0x73,0x0A,0x61,0x17,0x94,0x44,0xB2, -0x7D,0x67,0x40,0xF0,0x68,0xA3,0x49,0xE4,0x60,0xC2,0x42,0xB2,0x49,0xE4,0x60,0xC2, -0x1B,0x94,0x00,0x1C,0xE5,0x31,0x02,0x49,0x00,0x18,0x4E,0x05,0x00,0x65,0x01,0xF0, -0x00,0x6D,0x00,0x18,0x78,0xBA,0x5E,0x6C,0x12,0x92,0x21,0x2A,0x18,0x93,0x01,0x73, -0x0D,0x61,0x1A,0x92,0x18,0xF0,0x00,0x6C,0x03,0xF4,0x00,0x6D,0x00,0x18,0x8D,0x93, -0xC3,0xAA,0x19,0x93,0x20,0x6A,0x00,0xF2,0x55,0xC3,0x11,0x10,0x51,0x59,0x07,0x61, -0x11,0x95,0xFF,0xF7,0x1F,0x6A,0x91,0x67,0x00,0x18,0x3A,0x96,0x4C,0xEC,0x1A,0x92, -0x18,0xF0,0x00,0x6C,0x01,0xF4,0x00,0x6D,0x00,0x18,0x8D,0x93,0xC3,0xAA,0x18,0x93, -0x14,0x2B,0x12,0x94,0x12,0x24,0x51,0x59,0x10,0x61,0x11,0x95,0xFF,0xF7,0x1F,0x68, -0x91,0x67,0x00,0x18,0x3A,0x96,0x0C,0xEC,0x1A,0x92,0x01,0xF4,0x00,0x6C,0x18,0xF0, -0x00,0x6D,0xC3,0xAA,0x00,0x18,0x8D,0x93,0x0C,0xEE,0x2B,0x6A,0x7D,0x67,0x58,0xCB, -0x14,0x94,0x1D,0xB2,0xFD,0x67,0x0A,0xD4,0x80,0x9A,0x00,0x6D,0x04,0x06,0x34,0x4F, -0xA9,0xE7,0x40,0xA2,0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x0A,0x95, -0x0B,0x96,0x00,0x18,0x40,0x1E,0x0C,0x97,0x17,0x92,0x0F,0x22,0x1C,0x93,0x13,0xB2, -0x49,0xE3,0x00,0x6B,0xFF,0xF7,0x7C,0xDA,0x1C,0x94,0x11,0xB2,0x49,0xE4,0xFF,0xF7, -0x7C,0xDA,0x10,0xB2,0x49,0xE4,0xFF,0xF7,0x7C,0xDA,0x20,0x97,0x1F,0x91,0x1E,0x90, -0x01,0x6A,0x00,0xEF,0x11,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x70,0x45,0x11,0x80, -0xFC,0xA5,0x10,0x80,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x08,0x48,0x06,0x11,0x80, -0x3C,0x06,0x11,0x80,0x68,0x52,0x11,0x80,0x18,0x07,0x11,0x80,0xE8,0x06,0x11,0x80, -0xB8,0x06,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0xFF,0xF7,0x1F,0x6A, -0x8C,0xEA,0x04,0xD2,0x04,0x93,0x01,0x69,0x44,0xE9,0x69,0xE2,0x4C,0x32,0x6B,0xE2, -0x4C,0x32,0x6B,0xE2,0x20,0xB3,0x48,0x32,0x0D,0xD5,0x69,0xE2,0x05,0xD2,0x00,0x68, -0x20,0x18,0xE4,0x06,0x90,0x67,0x01,0x48,0xFF,0x6B,0x6C,0xE8,0x45,0xE1,0x04,0x58, -0x6C,0xE9,0xF6,0x61,0x05,0x94,0x44,0x41,0xA0,0xF0,0x88,0xAC,0x98,0xEA,0x17,0xB2, -0x06,0xD4,0x60,0xF1,0x42,0xA2,0x6C,0xEA,0x02,0x5A,0x12,0xE9,0x00,0x65,0x06,0x61, -0x40,0xF1,0x00,0x59,0x06,0x60,0xFF,0x69,0x41,0x49,0x03,0x10,0xEE,0x59,0x01,0x60, -0xEE,0x69,0x00,0x1C,0xDD,0x31,0x00,0x65,0x05,0x93,0x02,0x67,0x26,0x32,0xA0,0xF0, -0x48,0xCB,0x04,0x94,0x00,0x18,0x2A,0xFF,0x0D,0x95,0x9D,0x67,0x4C,0xAC,0x05,0x94, -0xA0,0xF0,0x48,0xCC,0x00,0x1C,0xE5,0x31,0x90,0x67,0x0A,0x97,0x09,0x91,0x08,0x90, -0x00,0xEF,0x06,0x63,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xF8,0x63,0x0E,0x62, -0x0D,0xD1,0x0C,0xD0,0x5D,0x67,0x03,0x46,0x10,0xD4,0x26,0x67,0x13,0xD7,0x06,0x04, -0x40,0xF0,0xA4,0xCA,0x06,0x6E,0x00,0x18,0x2E,0x2E,0xB0,0x67,0x69,0xA1,0x9D,0x67, -0x09,0xD3,0x40,0xF0,0x64,0xAC,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32, -0x6B,0xE2,0x4D,0xB3,0x48,0x32,0x69,0xE2,0x0A,0xD2,0x20,0xF0,0x58,0xA2,0x0D,0x72, -0x3D,0x60,0x0E,0x52,0x03,0x60,0x06,0x72,0x04,0x60,0x7F,0x10,0x1B,0x72,0x36,0x60, -0x7C,0x10,0x13,0x93,0x01,0x6A,0x00,0x6D,0x40,0xC3,0x80,0xA9,0xFF,0xF7,0x1F,0x6A, -0x00,0x18,0xC5,0x4A,0x4C,0xEC,0x0A,0x94,0x00,0x18,0xFD,0x1D,0x28,0x4C,0x09,0x93, -0x9D,0x67,0x40,0xF0,0x44,0xAC,0x01,0x73,0x14,0x60,0xFF,0xF7,0x1F,0x6C,0x20,0x18, -0x7C,0x2F,0x4C,0xEC,0x62,0x67,0x0A,0x92,0xE0,0xF0,0x9F,0xA2,0xFF,0x6A,0x4C,0xEC, -0x20,0x6A,0x4C,0xEC,0x01,0x2C,0x64,0x67,0x01,0x73,0x7D,0x67,0x40,0xF0,0x44,0xAB, -0x06,0x60,0xFF,0xF7,0x1F,0x6C,0x00,0x18,0xAD,0xE1,0x4C,0xEC,0x52,0x10,0xFF,0xF7, -0x1F,0x6C,0x4C,0xEC,0x80,0x18,0x25,0x33,0x06,0x05,0x4B,0x10,0x00,0x6C,0x40,0x6B, -0x1F,0x6A,0x66,0xC0,0x00,0xF0,0x47,0xC8,0x8C,0xC1,0x6A,0xC0,0x27,0xB3,0x00,0xF0, -0x4B,0xC8,0x10,0x6A,0x90,0xC1,0x8F,0xC0,0x4E,0xC0,0x50,0xAB,0xBD,0x67,0xDD,0x67, -0x50,0xC0,0x50,0xAB,0xE0,0x6B,0x44,0x4D,0x42,0x32,0x54,0xC1,0x20,0xB2,0x92,0xC0, -0x20,0x4E,0x41,0xA2,0x91,0x67,0x01,0x6F,0x48,0x32,0x6C,0xEA,0x56,0x32,0xC0,0xF3, -0x00,0x6B,0x6D,0xEA,0x00,0xF0,0x53,0xC8,0x13,0x93,0x01,0x6A,0x00,0x18,0x37,0x40, -0x40,0xC3,0x02,0x67,0x16,0x22,0x5D,0x67,0x40,0xF0,0x84,0xAA,0xFF,0xF7,0x1F,0x6B, -0x00,0x18,0xAE,0x5D,0x6C,0xEC,0x0A,0x94,0x0A,0x96,0x00,0x6F,0x60,0xF2,0xBC,0xAC, -0x7F,0x4E,0x04,0xD2,0xFF,0xF7,0x1F,0x6A,0x90,0x67,0x4C,0xED,0x00,0x18,0x6F,0x4E, -0x6E,0x4E,0x10,0x93,0x00,0x6C,0x80,0xC3,0x07,0x10,0x10,0x93,0x0C,0x6A,0x40,0xC3, -0x03,0x10,0x10,0x94,0x00,0x6A,0x40,0xC4,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF, -0x08,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xC0,0x5B,0x11,0x80, -0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x4C,0xB2,0x60,0xF1,0x42,0xA2,0x3C,0x22, -0x00,0x6C,0x84,0x32,0x89,0xE2,0x4C,0x32,0x8B,0xE2,0x4C,0x32,0x48,0xB3,0x8B,0xE2, -0x48,0x32,0x79,0xE2,0x47,0xB2,0xFF,0x6D,0x20,0xF1,0x4C,0xA2,0x28,0x22,0x46,0xB2, -0x40,0xA2,0xAC,0xEA,0x24,0x22,0x20,0xF0,0x78,0xA6,0xAC,0xEB,0x20,0x23,0x40,0xF2, -0x41,0xA6,0xAC,0xEA,0x01,0x72,0x1B,0x61,0x0F,0x73,0x19,0x60,0x14,0x73,0x17,0x60, -0x3E,0xB3,0xFF,0xF7,0x1F,0x6E,0x40,0xAB,0x01,0x4A,0x40,0xCB,0xCC,0xEA,0xE0,0xF3, -0x08,0x5A,0x12,0x61,0x00,0x6A,0x40,0xCB,0x39,0xB2,0x02,0x6C,0xA0,0xAA,0x04,0xF0, -0x0F,0x6A,0x4D,0xED,0xCC,0xED,0x00,0x18,0x2C,0x2B,0x00,0x6E,0x05,0x10,0x01,0x4C, -0xFF,0x6A,0x4C,0xEC,0x0A,0x5C,0xC5,0x61,0x2C,0xB5,0x01,0x68,0xFF,0x6E,0x40,0xF1, -0x5E,0xA5,0x0C,0xEA,0x4A,0x22,0x2F,0xB2,0x00,0x6F,0xFF,0xF7,0x1F,0x6C,0x60,0xAA, -0x02,0xF0,0x00,0x6A,0x6C,0xEA,0x25,0x2A,0x60,0xF1,0x42,0xA5,0xCC,0xEA,0x05,0x2A, -0x01,0x10,0x00,0x6F,0x28,0xB2,0xE0,0xCA,0x2E,0x10,0x06,0x67,0x20,0xB1,0x27,0xB6, -0x67,0x67,0xA4,0x67,0x64,0x34,0x69,0xE4,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2, -0x48,0x32,0x29,0xE2,0xE0,0xF0,0x4B,0xA2,0x0C,0xEA,0x01,0x72,0x05,0x61,0xC9,0xE4, -0x40,0xAA,0xAC,0xEA,0x02,0x5A,0xE5,0x61,0x01,0x4B,0xAC,0xEB,0x0A,0x5B,0xEA,0x61, -0x12,0x10,0x19,0xB2,0x60,0xAA,0x01,0x4B,0x60,0xCA,0x4F,0xAD,0x8C,0xEB,0x8C,0xEA, -0x4A,0x32,0x8C,0xEA,0x43,0xEB,0x07,0x61,0x4D,0xAD,0x8C,0xEA,0x4A,0x32,0x8C,0xEA, -0x43,0xEB,0x01,0x61,0xF0,0x67,0x09,0x27,0x00,0x18,0xB7,0xB5,0x00,0x65,0x00,0x18, -0x31,0xBE,0x00,0x65,0x0C,0xB2,0x00,0x6B,0x60,0xCA,0x06,0x97,0x05,0x91,0x04,0x90, -0x00,0x6A,0x00,0xEF,0x04,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0x48,0x60,0x11,0x80, -0xDC,0x00,0x11,0x80,0xFE,0x08,0x11,0x80,0x16,0xA1,0x11,0x80,0x04,0x09,0x11,0x80, -0xE0,0x00,0x00,0xB6,0xC8,0xA0,0x11,0x80,0x10,0x06,0x11,0x80,0xFD,0x63,0x04,0x62, -0x44,0xAC,0x04,0x72,0x0F,0x61,0x0A,0xB2,0x00,0x6B,0x00,0x18,0x3B,0x2B,0x60,0xC2, -0x08,0xB6,0x00,0x6B,0x0A,0x6D,0xFF,0x6C,0xC9,0xE3,0x01,0x4B,0x8C,0xEB,0x04,0x5B, -0xA0,0xC2,0xFA,0x61,0x04,0x97,0x00,0xEF,0x03,0x63,0x00,0x00,0xFE,0x08,0x11,0x80, -0xB4,0x5B,0x11,0x80,0xFD,0x63,0x04,0x62,0x80,0x18,0x45,0x2B,0x00,0x65,0x0E,0xB2, -0x00,0x6B,0x0F,0xB4,0x60,0xCA,0x0D,0xB2,0x02,0xF0,0x00,0x6D,0x04,0x97,0x60,0xC2, -0x0C,0xB2,0x01,0xF0,0x00,0x6B,0xA0,0xF0,0x72,0xCC,0x6C,0xCA,0xAE,0xCA,0x80,0xF0, -0x43,0xA4,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0xA0,0xF0,0xB6,0xCC,0x80,0xF0,0x43,0xC4, -0x00,0xEF,0x03,0x63,0xC8,0xA0,0x11,0x80,0xCA,0xA0,0x11,0x80,0xDC,0x00,0x11,0x80, -0x48,0x5C,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x44,0xAC,0xC9,0x72, -0x24,0x61,0x00,0x1C,0xDD,0x31,0x00,0x65,0x15,0xB1,0x04,0xD2,0x60,0xF1,0x54,0xA1, -0x40,0xF1,0x9E,0xA1,0x04,0x99,0x05,0xD2,0x80,0x6A,0x44,0xD9,0x55,0x6A,0x60,0xF1, -0x54,0xC1,0x00,0x18,0xEB,0xA4,0x00,0x65,0x60,0xF1,0x54,0xA1,0x04,0xD9,0x55,0x72, -0x04,0x60,0x00,0x18,0x31,0xBE,0x00,0x65,0x04,0x10,0x5D,0x67,0x54,0xA2,0x60,0xF1, -0x54,0xC1,0x00,0x1C,0xE5,0x31,0x04,0x94,0x03,0x10,0x00,0x18,0x2F,0xB9,0x00,0x65, -0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x00,0x00,0x48,0x5C,0x11,0x80, -0xFD,0x63,0x04,0x62,0x00,0x18,0x24,0xB4,0x00,0x65,0x04,0x97,0x00,0xEF,0x03,0x63, -0x0D,0xB2,0xFF,0xF7,0x1F,0x6B,0xAC,0xEB,0x43,0xA2,0x01,0x6D,0xAC,0xEA,0x10,0x22, -0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x07,0xB3,0x48,0x32, -0x69,0xE2,0x60,0xF2,0x4D,0xA2,0xAA,0xEA,0x03,0x61,0x45,0x67,0x20,0xE8,0xA0,0xC4, -0x20,0xE8,0x00,0x6A,0x00,0x46,0x11,0x80,0x48,0x60,0x11,0x80,0xF8,0x63,0x0E,0x62, -0x0D,0xD1,0x0C,0xD0,0xC4,0x67,0xFF,0xF7,0x1F,0x6D,0xAC,0xEE,0xFF,0x76,0x68,0x60, -0xC4,0x32,0xC9,0xE2,0x4C,0x32,0xCB,0xE2,0x35,0xB3,0x4C,0x32,0xCB,0xE2,0x48,0x32, -0x65,0xE2,0xC0,0xF0,0x74,0xA9,0x40,0x6F,0xAC,0xEB,0x6C,0xEF,0x25,0x27,0x04,0x6A, -0x6C,0xEA,0x08,0x22,0xE0,0xF0,0x8D,0x41,0x00,0xF1,0xA7,0x41,0x00,0x18,0x47,0x43, -0x0A,0xD6,0x0A,0x96,0x7D,0x67,0x01,0x6A,0x58,0xC3,0x86,0x67,0x00,0x6A,0x03,0x6E, -0xBD,0x67,0x5A,0xC3,0x00,0x68,0x00,0xF2,0x4A,0xC1,0x18,0x4D,0x64,0x6A,0xE6,0x67, -0x04,0xD2,0x00,0x18,0xA0,0xDD,0x05,0xD0,0x02,0x6C,0x00,0x18,0xE0,0xDC,0xB0,0x67, -0x6F,0x99,0x4D,0xEB,0x6F,0xD9,0x2D,0x10,0xE0,0xF0,0x4C,0xA1,0xFF,0x6C,0x01,0x72, -0x1C,0xB2,0x15,0x61,0x43,0xA2,0x01,0x6B,0x6C,0xEA,0x04,0x22,0xC0,0xF2,0x58,0xA1, -0x8C,0xEA,0x1F,0x2A,0x33,0x6A,0x7D,0x67,0xBD,0x67,0x58,0xC3,0x86,0x67,0x64,0x6A, -0x18,0x4D,0x02,0x6E,0x04,0xD2,0x00,0x18,0xA0,0xDD,0x05,0xD7,0x12,0x10,0x43,0xA2, -0x01,0x6B,0x6C,0xEA,0x04,0x22,0xC0,0xF2,0x57,0xA1,0x8C,0xEA,0x0A,0x2A,0x60,0xF2, -0x4D,0xA1,0x8C,0xEA,0x01,0x72,0x05,0x61,0x9D,0x67,0x20,0x4C,0x80,0x18,0x44,0x34, -0xA6,0x67,0xC0,0xF0,0x54,0xA9,0x07,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC9, -0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0x00,0x00,0x48,0x60,0x11,0x80, -0x00,0x46,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0xFF,0xF7,0x1F,0x6F, -0xAC,0xEF,0xE4,0x32,0xE9,0xE2,0x4C,0x32,0xEB,0xE2,0x38,0xB3,0x4C,0x32,0xEB,0xE2, -0x48,0x32,0x65,0xE2,0xC0,0xF0,0x54,0xA9,0xFF,0xF7,0x1F,0x6B,0xC4,0x67,0x6C,0xEA, -0x02,0x6B,0x6C,0xEA,0x09,0x2A,0xC4,0xA4,0x01,0x6A,0x87,0x67,0x28,0x6D,0x4C,0xEE, -0x20,0x18,0x9B,0x27,0x24,0x6F,0x52,0x10,0xF0,0xF0,0x0F,0x41,0xA5,0x46,0x90,0x67, -0x08,0x6E,0x00,0x18,0x2E,0x2E,0x04,0xD7,0x29,0xB2,0x01,0x6D,0xFF,0x6E,0x60,0xA2, -0x28,0xB2,0x04,0x97,0x83,0xA2,0xAC,0xEC,0x0E,0x24,0xC0,0xF2,0x56,0xA1,0xCC,0xEA, -0x03,0x2A,0xC0,0xF2,0xB6,0xC1,0x0C,0x10,0x60,0xF2,0xBC,0xA9,0xFF,0xF7,0x1F,0x6A, -0x00,0x6C,0x4C,0xED,0x29,0x10,0x20,0xF0,0x58,0xA1,0xCC,0xEA,0x03,0x72,0x1F,0x61, -0x00,0xF1,0x46,0x81,0x00,0x52,0x17,0x60,0x7E,0x32,0x15,0x22,0xC0,0xF0,0x54,0xA9, -0x04,0x68,0x03,0x6E,0x0D,0xEA,0x87,0x67,0xC0,0xF0,0x54,0xC9,0x00,0xF1,0xAF,0xC1, -0x00,0x18,0x2D,0xE2,0xE6,0x67,0x7F,0x6C,0x00,0x18,0xE0,0xDC,0xB0,0x67,0x6F,0x99, -0x4D,0xEB,0x6F,0xD9,0x13,0x10,0x80,0x18,0x53,0x34,0x87,0x67,0x0F,0x10,0x60,0xF2, -0xBC,0xA9,0xFF,0xF7,0x1F,0x6B,0x6C,0xED,0x00,0x18,0xF8,0x4E,0xD0,0x67,0xC0,0xF0, -0x54,0xA9,0x03,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC9,0x08,0x97,0x07,0x91, -0x06,0x90,0x01,0x6A,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0xC0,0x5B,0x11,0x80, -0x00,0x46,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0xFF,0xF7,0x1F,0x69, -0xAC,0xE9,0x24,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x38,0xB3,0x4C,0x32,0x2B,0xE2, -0x48,0x32,0x0C,0xD4,0x61,0xE2,0xC0,0xF0,0x54,0xA8,0x66,0xA4,0xFF,0xF7,0x1F,0x6C, -0x8C,0xEA,0x04,0x6E,0xCC,0xEA,0x06,0x22,0x00,0xF1,0x4F,0xA0,0xFF,0x6D,0xAC,0xEA, -0x6E,0xEA,0x0D,0x22,0x0C,0x92,0xFF,0x6C,0x7F,0x6D,0xE4,0xA2,0x24,0x6A,0x04,0xD2, -0x8C,0xEF,0x01,0x6A,0x91,0x67,0x00,0x18,0xEF,0xE1,0x4C,0xEF,0x47,0x10,0x02,0x5B, -0x0B,0x60,0x0C,0x95,0x6C,0x34,0x11,0xE4,0xE0,0xF0,0x1F,0x4C,0x08,0x4D,0x08,0x6E, -0x00,0x18,0x2E,0x2E,0x06,0xD3,0x06,0x93,0x21,0xB2,0x01,0x6D,0x83,0xA2,0xAC,0xEC, -0x15,0x24,0xC0,0xF2,0x57,0xA0,0xFF,0x6C,0x8C,0xEA,0x07,0x2A,0x80,0x18,0x53,0x34, -0x91,0x67,0x01,0x6D,0xC0,0xF2,0xB7,0xC0,0x29,0x10,0x1A,0xB2,0x60,0xF2,0xBC,0xA8, -0x00,0x6C,0xF0,0xA2,0x0C,0x92,0x08,0x4A,0x04,0xD2,0x11,0x10,0x20,0xF0,0x58,0xA0, -0xFF,0x6D,0xAC,0xEA,0x03,0x72,0x04,0x61,0x00,0x18,0xA5,0xFF,0x91,0x67,0x16,0x10, -0x10,0xB2,0x60,0xF2,0xBC,0xA8,0xF0,0xA2,0x0C,0x92,0x08,0x4A,0x04,0xD2,0xFF,0xF7, -0x1F,0x6A,0x4C,0xED,0xFF,0x6A,0xC3,0x67,0x00,0x18,0x8A,0x41,0x4C,0xEF,0xC0,0xF0, -0x54,0xA8,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC8,0x0A,0x97,0x09,0x91, -0x08,0x90,0x00,0xEF,0x06,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x00,0x46,0x11,0x80, -0xC0,0x5B,0x11,0x80,0xEF,0x63,0x20,0x62,0x1F,0xD1,0x1E,0xD0,0x64,0xAC,0xC4,0x67, -0x24,0x73,0x22,0x61,0x94,0xB2,0x60,0xF1,0x50,0xA2,0x1E,0x22,0x7D,0x67,0x01,0xF4, -0x03,0x6A,0x40,0xF0,0x58,0xCB,0x00,0x1C,0xDD,0x31,0x00,0x65,0x00,0x18,0xFE,0x4F, -0x02,0x67,0x00,0x6D,0x9D,0x67,0xC5,0x67,0x80,0x18,0x49,0x2B,0x58,0x4C,0x80,0x18, -0x4E,0x2F,0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0x20,0x18,0x10,0x2F,0x00,0x65, -0x00,0x1C,0xE5,0x31,0x90,0x67,0x01,0x11,0xFF,0xF7,0x1F,0x69,0x51,0x67,0x6C,0xEA, -0x9C,0x72,0x1A,0x61,0x00,0x9E,0xFF,0x6F,0x44,0xA0,0x46,0x32,0x2C,0xEA,0x18,0x72, -0x13,0x61,0xBA,0xA0,0x99,0xA0,0xDD,0x67,0xEC,0xED,0xEC,0xEC,0x00,0x18,0x1A,0xDF, -0x5A,0x4E,0x06,0x2A,0xBD,0x67,0x40,0xF0,0x9A,0xAD,0x20,0x18,0x62,0x23,0x2C,0xEC, -0x20,0x18,0xCF,0x06,0x90,0x67,0xD8,0x10,0xFF,0xF7,0x1F,0x6C,0x44,0x67,0x6C,0xEA, -0x93,0x72,0x29,0x61,0x00,0x9E,0x44,0xA0,0x46,0x32,0x11,0x72,0x07,0x60,0x7F,0x72, -0x22,0x61,0x45,0xA0,0xFF,0x6B,0x6C,0xEA,0x17,0x72,0x1D,0x61,0x6B,0xA8,0x8C,0xEB, -0xFF,0x73,0x19,0x60,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2, -0x67,0xB3,0x48,0x32,0x69,0xE2,0xBF,0x9A,0x82,0x67,0x00,0x18,0xB2,0x69,0x1C,0xD6, -0x01,0x72,0x64,0xA0,0x1C,0x96,0x03,0x61,0x01,0x6A,0x6D,0xEA,0x03,0x10,0x02,0x6A, -0x4B,0xEA,0x6C,0xEA,0x44,0xC0,0x44,0xAE,0xFF,0xF7,0x1F,0x6C,0x93,0x72,0xA0,0xF0, -0x09,0x61,0x00,0x9E,0xFF,0x6A,0xA2,0x67,0x64,0xA0,0x6C,0xED,0xA6,0x35,0x8C,0xED, -0x18,0xD5,0xA5,0xA0,0x4C,0xED,0x19,0xD5,0x4B,0xA8,0x18,0x95,0x8C,0xEA,0x7F,0x75, -0x1A,0xD2,0x03,0x61,0x19,0x92,0x04,0x72,0x04,0x60,0x18,0x95,0x28,0x75,0x80,0xF0, -0x11,0x61,0xFF,0x69,0xC1,0x9E,0x51,0x67,0x6C,0xEA,0x46,0x32,0x2C,0xEA,0xA6,0x67, -0x9D,0x67,0x18,0xD2,0x5C,0x4C,0xDA,0xC0,0x2C,0xED,0x00,0x18,0x3B,0x94,0x1C,0xD6, -0x18,0x92,0x1C,0x96,0x7F,0x72,0x58,0x67,0x1B,0xD2,0x04,0x22,0xE1,0xF4,0x03,0x6F, -0x00,0x6B,0x04,0x10,0x65,0xA0,0x01,0xF4,0x16,0x6F,0x2C,0xEB,0x10,0x6A,0x04,0xD2, -0x40,0xB2,0x18,0x95,0x08,0xD3,0x05,0xD2,0x17,0x92,0x07,0xD5,0x01,0x6B,0x06,0xD2, -0x59,0xA0,0x0A,0xD6,0x04,0x6C,0x09,0xD2,0x44,0xA0,0xFA,0x6D,0x6C,0xEA,0x0B,0xD2, -0x4B,0xA8,0x0C,0xD2,0x38,0xB2,0x49,0xE6,0x44,0xA2,0xA2,0xF4,0x10,0x6E,0x6C,0xEA, -0x0D,0xD2,0x44,0xA0,0x0E,0xD2,0x45,0xA0,0x0F,0xD2,0x46,0xA0,0x10,0xD2,0x47,0xA0, -0x11,0xD2,0x48,0xA0,0x12,0xD2,0x49,0xA0,0x13,0xD2,0x4A,0xA0,0x14,0xD2,0x4B,0xA0, -0x20,0x18,0x1B,0x32,0x15,0xD2,0x1A,0x92,0xFF,0x72,0x3E,0x60,0x1A,0x93,0x44,0x32, -0xFF,0x6D,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x24,0xB3,0x48,0x32, -0x65,0xE2,0xE0,0xF0,0x4B,0xA1,0xAC,0xEA,0x01,0x72,0x2E,0x61,0x20,0xF0,0x58,0xA1, -0xFF,0x6B,0x6C,0xEA,0x0B,0x72,0x13,0x61,0x1C,0xB2,0xB0,0x67,0x00,0x18,0xE0,0x1D, -0x80,0x9A,0x00,0xF2,0x54,0xA1,0xFF,0x6D,0xAC,0xEA,0x01,0x72,0x26,0x61,0x8D,0x99, -0x00,0x18,0x1A,0x1E,0x00,0x6D,0x00,0x6A,0x00,0xF2,0x54,0xC1,0x1E,0x10,0x1A,0x94, -0x00,0x18,0x5E,0xDE,0xB0,0x67,0x1B,0x92,0x08,0x2A,0x19,0x93,0x04,0x73,0x05,0x61, -0x1A,0x95,0x80,0x18,0xD1,0x34,0x90,0x67,0x07,0x10,0x18,0x95,0x28,0x75,0x04,0x61, -0x1A,0x95,0x80,0x18,0x91,0x34,0x90,0x67,0x08,0xB2,0xB0,0x67,0x00,0x18,0xE0,0x1D, -0x80,0x9A,0x03,0x10,0x20,0x18,0xFA,0x24,0x86,0x67,0x20,0x97,0x1F,0x91,0x1E,0x90, -0x00,0xEF,0x11,0x63,0x48,0x5C,0x11,0x80,0x64,0x52,0x11,0x80,0x48,0x60,0x11,0x80, -0xFC,0xA5,0x10,0x80,0x04,0x46,0x11,0x80,0xFF,0x63,0x00,0xD0,0x0F,0xB0,0xFF,0xF7, -0x1F,0x6A,0x4C,0xEC,0x00,0x6B,0xE2,0x67,0xFF,0x6E,0x64,0x32,0x69,0xE2,0x48,0x32, -0x6B,0xE2,0x48,0x32,0x15,0xE2,0x43,0xAD,0xEC,0xEA,0x8E,0xEA,0x05,0x2A,0x42,0x9D, -0x08,0x72,0x02,0x61,0x00,0x6A,0x05,0x10,0x01,0x4B,0xCC,0xEB,0x03,0x5B,0xED,0x61, -0x01,0x6A,0x00,0x90,0x20,0xE8,0x01,0x63,0x98,0x5F,0x11,0x80,0xFD,0x63,0x04,0x62, -0x16,0xB2,0x00,0x6B,0x60,0xF1,0x43,0xA2,0x01,0x72,0x14,0x61,0x14,0xB6,0x83,0x67, -0xFF,0x6D,0x84,0x32,0x89,0xE2,0x4C,0x32,0x8B,0xE2,0x4C,0x32,0x8B,0xE2,0x48,0x32, -0xC9,0xE2,0xE0,0xF0,0x4B,0xA2,0xAC,0xEA,0x01,0x72,0x0D,0x60,0x01,0x4C,0xAC,0xEC, -0x0A,0x5C,0xEF,0x61,0x09,0xB2,0x60,0xF1,0x43,0xA2,0x02,0x5A,0x02,0x60,0x43,0x67, -0x07,0x23,0x0C,0x6A,0x05,0x10,0x80,0x18,0xAE,0x35,0x00,0x65,0x62,0x67,0xF2,0x17, -0x04,0x97,0x00,0xEF,0x03,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0x48,0x60,0x11,0x80, -0xF9,0x63,0x0C,0x62,0x0B,0xD1,0x0A,0xD0,0x00,0x6A,0x0F,0xD5,0x06,0xD2,0x40,0xAC, -0x24,0x67,0x01,0xF0,0x0B,0x72,0x0C,0x61,0xBD,0x67,0x80,0x18,0xD5,0x2B,0x10,0x4D, -0x80,0xA9,0xFF,0xF7,0x1F,0x6B,0xA2,0x67,0x00,0x18,0xC5,0x4A,0x6C,0xEC,0xAC,0x10, -0x00,0xF4,0x19,0x72,0x2C,0x61,0x49,0xA4,0x03,0x5A,0x02,0x61,0x01,0x6A,0x49,0xC4, -0x7D,0x67,0x58,0xA3,0x00,0x1C,0xDD,0x31,0x52,0xC3,0xBD,0x67,0x91,0x67,0x12,0x4D, -0x00,0x18,0xB7,0x45,0x07,0xD2,0x02,0x67,0x0C,0x2A,0xA9,0xA1,0xFF,0x6B,0x20,0x6A, -0x6C,0xED,0xB8,0x35,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0xAA,0x6C,0x00,0x18,0xB6,0x33, -0x4C,0xED,0x00,0x1C,0xE5,0x31,0x07,0x94,0x7D,0x67,0x52,0xA3,0xFF,0x6B,0x6C,0xEA, -0x61,0x2A,0x80,0xA9,0xFF,0xF7,0x1F,0x6A,0xB0,0x67,0x4C,0xEC,0x58,0x10,0x00,0xF4, -0x05,0x72,0x06,0x61,0x4B,0xA4,0x03,0x5A,0x79,0x61,0x01,0x6A,0x4B,0xC4,0x76,0x10, -0x41,0xF4,0x12,0x72,0x10,0x61,0x00,0x18,0xE5,0x41,0x00,0x65,0x06,0x94,0x00,0x18, -0x78,0x36,0x02,0x67,0x80,0xA9,0x06,0x96,0xFF,0xF7,0x1F,0x6A,0x4C,0xEC,0x00,0x18, -0x33,0x4B,0xB0,0x67,0x3F,0x10,0x01,0xF0,0x04,0x72,0x3F,0x61,0x04,0xA4,0xFF,0xF7, -0x1F,0x6A,0xFF,0xF7,0x1F,0x6B,0x00,0x30,0x4C,0xE8,0x43,0xA4,0xBD,0x67,0x14,0x4D, -0x4D,0xE8,0x6C,0xE8,0x00,0x18,0x2A,0xDF,0x90,0x67,0x04,0x22,0x5D,0x67,0x0A,0xCA, -0x02,0x6A,0x23,0x10,0x7D,0x67,0xAA,0xAB,0xFF,0xF7,0x1F,0x6B,0xAC,0xEB,0x64,0x32, -0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x27,0xB3,0x48,0x32,0x69,0xE2, -0x20,0xF0,0x78,0xA2,0xFF,0x6A,0x4C,0xEB,0x12,0x73,0x0A,0x60,0x19,0x73,0x08,0x60, -0x80,0xA9,0xFF,0xF7,0x1F,0x6A,0x0C,0x6D,0x00,0x18,0xC5,0x4A,0x4C,0xEC,0x2E,0x10, -0xFF,0xF7,0x1F,0x6C,0x00,0x18,0x0C,0x48,0xAC,0xEC,0x80,0xA9,0xA2,0x67,0x00,0x18, -0xC5,0x4A,0x00,0x65,0x01,0x6B,0x06,0xD3,0x21,0x10,0x21,0xF4,0x06,0x72,0x1E,0x61, -0x80,0x18,0xBF,0x35,0x00,0x65,0x10,0x2A,0x14,0xB0,0x7D,0x67,0x78,0xA3,0x60,0xF1, -0x43,0xA0,0x91,0x67,0x60,0xF1,0x63,0xC0,0x00,0x18,0xFC,0x52,0x08,0xD2,0x7D,0x67, -0x20,0xF0,0x60,0xA3,0x60,0xF1,0x63,0xC0,0x80,0xA9,0x06,0x96,0xFF,0xF7,0x1F,0x6B, -0x6C,0xEC,0x00,0x18,0x33,0x4B,0xA2,0x67,0x01,0x6A,0x06,0xD2,0x06,0x92,0x03,0x22, -0x0F,0x93,0x66,0x6A,0x40,0xC3,0x0C,0x97,0x0B,0x91,0x0A,0x90,0x01,0x6A,0x00,0xEF, -0x07,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xF5,0x63,0x14,0x62, -0x13,0xD1,0x12,0xD0,0x00,0x6D,0x17,0xF7,0x0C,0x6E,0x00,0x18,0x01,0xA0,0x33,0x6C, -0x61,0xB4,0x20,0x18,0xD6,0x32,0x00,0x69,0x20,0x18,0x5B,0x30,0x00,0x65,0x00,0x18, -0xA6,0x5C,0x00,0x65,0x00,0x18,0xC8,0x8A,0x00,0x65,0x00,0x18,0xA3,0x9B,0x00,0x65, -0x5A,0xB4,0x00,0x18,0x44,0x81,0x00,0x65,0x59,0xB0,0x00,0x18,0x4C,0x81,0x90,0x67, -0x87,0x40,0x00,0x18,0x4C,0x81,0x01,0x4C,0x56,0xB4,0x57,0xB5,0x20,0xC0,0x00,0x18, -0x2E,0x2E,0x30,0x6E,0x55,0xB5,0x88,0x40,0xD8,0x4C,0x00,0x18,0x2E,0x2E,0x30,0x6E, -0x53,0xB5,0x87,0x40,0x11,0x4C,0x00,0x18,0x2E,0x2E,0x18,0x6E,0x51,0xB0,0x03,0x6B, -0x40,0x98,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x6A,0xEA,0x05,0x60,0x4E,0xB2,0x20,0xF1, -0x2C,0xC2,0x20,0xF1,0x36,0xC2,0x00,0x18,0x04,0xF6,0x00,0x65,0x00,0x18,0x48,0x3C, -0x00,0x65,0x00,0x18,0x71,0x32,0x00,0x65,0x00,0x18,0xE2,0x24,0x00,0x65,0x00,0x18, -0x9A,0x7E,0x00,0x65,0x00,0x18,0xB5,0xC8,0x00,0x65,0x45,0xB3,0x43,0xB2,0x60,0xDA, -0x00,0x18,0x0B,0x2B,0x00,0x65,0x40,0x98,0x0F,0x6B,0x46,0x32,0x6C,0xEA,0x03,0x72, -0x05,0x61,0x9D,0x67,0x40,0x4C,0x00,0x18,0x1B,0x28,0x00,0x6D,0x00,0x18,0xE9,0x2F, -0x00,0x65,0x80,0x18,0x68,0x2A,0x00,0x65,0x20,0x18,0xA2,0x39,0x00,0x65,0x80,0x18, -0x1C,0x2A,0x00,0x65,0x00,0x1C,0xAD,0x31,0x00,0x65,0x29,0xF6,0x00,0x6D,0x00,0x18, -0x17,0x2D,0x01,0x6C,0x09,0x6A,0x04,0xD2,0x32,0xB2,0x2F,0xB3,0x01,0x6C,0x05,0xD2, -0x68,0xF1,0x1A,0x6A,0x06,0xD2,0x30,0xF0,0x0E,0x6A,0x07,0xD2,0x2E,0xB2,0xFA,0x6D, -0x09,0xF6,0x17,0x6E,0x40,0x9A,0xA1,0xF3,0x16,0x6F,0x08,0xD2,0x40,0xF0,0x41,0xA3, -0x09,0xD2,0x40,0xF0,0x40,0xA3,0x0A,0xD2,0x20,0xF0,0x5F,0xA3,0x0B,0xD2,0x20,0xF0, -0x5E,0xA3,0x0C,0xD2,0x20,0xF0,0x5D,0xA3,0x0D,0xD2,0x20,0xF0,0x5C,0xA3,0x20,0x18, -0x1B,0x32,0x0E,0xD2,0x21,0xB2,0x22,0xB3,0x40,0x9A,0x6E,0xEA,0x19,0x2A,0x21,0xB1, -0x21,0xB3,0x40,0x99,0x6E,0xEA,0x14,0x2A,0x20,0xB0,0x21,0xB2,0x21,0xB3,0x80,0x98, -0x8C,0xEA,0x6E,0xEA,0x0B,0x2A,0x20,0xB3,0x00,0xF6,0x82,0x32,0x00,0x6D,0x3F,0xF4, -0x00,0x6C,0x00,0x18,0xFA,0x8B,0x40,0xC3,0x00,0x6A,0x40,0xD8,0x00,0x6A,0x40,0xD9, -0x13,0xB3,0x12,0xB2,0x20,0x18,0x3D,0x36,0x60,0xDA,0x14,0x97,0x13,0x91,0x12,0x90, -0x00,0xEF,0x0B,0x63,0x84,0xC8,0x00,0x80,0x03,0x00,0x00,0xC4,0x98,0x24,0x11,0x80, -0x38,0x24,0x11,0x80,0xF8,0xDA,0x10,0x80,0x40,0xDB,0x10,0x80,0x28,0xDB,0x10,0x80, -0x6C,0x1D,0x11,0x80,0xDC,0x00,0x11,0x80,0x5C,0xA1,0x00,0xB0,0x00,0x00,0x01,0x00, -0xFC,0xA5,0x10,0x80,0x90,0x1E,0x11,0x80,0x3C,0x91,0x10,0x80,0xEF,0xBE,0x23,0x87, -0x44,0x91,0x10,0x80,0x32,0x97,0x79,0x23,0x40,0x91,0x10,0x80,0xFF,0xFF,0xFF,0x00, -0xEE,0xFF,0xC0,0x00,0xD0,0x00,0x11,0x80,0x2E,0x5A,0x2C,0x4B,0xCF,0x9D,0xF2,0xCB, -0x74,0x9C,0x13,0xCE,0x57,0xF4,0x4C,0x54,0x48,0xA9,0xD3,0x53,0xC5,0x19,0x73,0x6F, -0xF7,0xEB,0x68,0x53,0xCC,0xAE,0x50,0xF1,0x57,0x02,0xE2,0x66,0xA3,0x5C,0xBC,0xD3, -0xB7,0xA6,0x2F,0xC9,0xAE,0xDC,0x77,0x9E,0x07,0x91,0x5F,0x86,0x91,0x8D,0xDC,0x27, -0x00,0x5D,0xF1,0xD6,0xCF,0x0C,0x14,0x2B,0x62,0x5E,0xD2,0xEF,0xF4,0xA5,0x18,0xFF, -0x15,0x20,0x70,0x09,0x98,0x44,0x21,0xA6,0x58,0x6F,0x9F,0xC3,0xFE,0x7E,0x43,0x29, -0xD2,0x80,0x9E,0xA5,0x11,0x25,0xF8,0xED,0xB0,0x9D,0x42,0xB8,0x1B,0xC5,0xBD,0x00, -0x9F,0x79,0xE4,0xB5,0x9D,0xBB,0xAA,0x85,0x7F,0xCA,0x85,0x6F,0xB9,0xF7,0xEA,0x25, -0x07,0x04,0x05,0x01,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x04,0x00,0x00,0x00, -0x01,0x03,0x02,0x04,0x00,0x00,0x00,0x00,0x1B,0x00,0xB7,0x00,0x53,0x01,0x36,0x00, -0x6F,0x01,0xA7,0x02,0x53,0x00,0x28,0x02,0xFD,0x03,0x25,0x00,0x04,0x0B,0x0F,0x04, -0x0A,0x0E,0x08,0x0B,0x0F,0x00,0x00,0x00,0x7A,0x41,0x2E,0x80,}; - -#endif //CONFIG_MP_INCLUDED -#ifndef CONFIG_PHY_SETTING_WITH_ODM -const u32 Rtl8723SPHY_REG_2TArray[Rtl8723SPHY_REG_2TArrayLength] = { -0x0, }; - -const u32 Rtl8723SPHY_REG_1TArray[Rtl8723SPHY_REG_1TArrayLength] = { -0x800,0x80040000, -0x804,0x00000003, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10005388, -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66f60110, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x32323200, -0x870,0x07000760, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xa78,0x00000900, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x69543420, -0xc54,0x43bc0094, -0xc58,0x69543420, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x7116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -const u32 Rtl8723SPHY_ChangeTo_1T1RArray[Rtl8723SPHY_ChangeTo_1T1RArrayLength] = { -0x0, }; - -const u32 Rtl8723SPHY_ChangeTo_1T2RArray[Rtl8723SPHY_ChangeTo_1T2RArrayLength] = { -0x0, }; - -const u32 Rtl8723SPHY_ChangeTo_2T2RArray[Rtl8723SPHY_ChangeTo_2T2RArrayLength] = { -0x0, }; - -const u32 Rtl8723SRadioA_2TArray[Rtl8723SRadioA_2TArrayLength] = { -0x0, }; - -const u32 Rtl8723SRadioB_2TArray[Rtl8723SRadioB_2TArrayLength] = { -0x0, }; - -const u32 Rtl8723SRadioA_1TArray[Rtl8723SRadioA_1TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00039c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001a3f1, -0x00b,0x00014787, -0x00c,0x000896fe, -0x00d,0x0000e02c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00030355, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0000024f, -0x01f,0x00000000, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x00057730, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f474, -0x015,0x0004f477, -0x015,0x0008f474, -0x015,0x000cf474, -0x016,0x00000339, -0x016,0x00040339, -0x016,0x00080339, -0x016,0x000c0366, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00000003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00000247, -0x01f,0x00000000, -0x000,0x00030159, -}; - -const u32 Rtl8723SRadioB_1TArray[Rtl8723SRadioB_1TArrayLength] = { -0x0, }; - -const u32 Rtl8723SRadioB_GM_Array[Rtl8723SRadioB_GM_ArrayLength] = { -0x0, }; - -const u32 Rtl8723SMAC_2T_Array[Rtl8723SMAC_2T_ArrayLength] = { -0x420,0x00000080, -0x423,0x00000000, -0x430,0x00000000, -0x431,0x00000000, -0x432,0x00000000, -0x433,0x00000001, -0x434,0x00000004, -0x435,0x00000005, -0x436,0x00000006, -0x437,0x00000007, -0x438,0x00000000, -0x439,0x00000000, -0x43a,0x00000000, -0x43b,0x00000001, -0x43c,0x00000004, -0x43d,0x00000005, -0x43e,0x00000006, -0x43f,0x00000007, -0x440,0x0000005d, -0x441,0x00000001, -0x442,0x00000000, -0x444,0x00000015, -0x445,0x000000f0, -0x446,0x0000000f, -0x447,0x00000000, -0x458,0x00000041, -0x459,0x000000a8, -0x45a,0x00000072, -0x45b,0x000000b9, -0x460,0x00000066, -0x461,0x00000066, -0x462,0x00000008, -0x463,0x00000003, -0x4c8,0x000000ff, -0x4c9,0x00000008, -0x4cc,0x000000ff, -0x4cd,0x000000ff, -0x4ce,0x00000001, -0x500,0x00000026, -0x501,0x000000a2, -0x502,0x0000002f, -0x503,0x00000000, -0x504,0x00000028, -0x505,0x000000a3, -0x506,0x0000005e, -0x507,0x00000000, -0x508,0x0000002b, -0x509,0x000000a4, -0x50a,0x0000005e, -0x50b,0x00000000, -0x50c,0x0000004f, -0x50d,0x000000a4, -0x50e,0x00000000, -0x50f,0x00000000, -0x512,0x0000001c, -0x514,0x0000000a, -0x515,0x00000010, -0x516,0x0000000a, -0x517,0x00000010, -0x51a,0x00000016, -0x524,0x0000000f, -0x525,0x0000004f, -0x546,0x00000040, -0x547,0x00000000, -0x550,0x00000010, -0x551,0x00000010, -0x559,0x00000002, -0x55a,0x00000002, -0x55d,0x000000ff, -0x605,0x00000030, -0x608,0x0000000e, -0x609,0x0000002a, -0x652,0x00000020, -0x63c,0x0000000a, -0x63d,0x0000000e, -0x63e,0x0000000a, -0x63f,0x0000000e, -0x66e,0x00000005, -0x700,0x00000021, -0x701,0x00000043, -0x702,0x00000065, -0x703,0x00000087, -0x708,0x00000021, -0x709,0x00000043, -0x70a,0x00000065, -0x70b,0x00000087, -}; - -const u32 Rtl8723SAGCTAB_2TArray[Rtl8723SAGCTAB_2TArrayLength] = { -0x0, }; - -const u32 Rtl8723SAGCTAB_1TArray[Rtl8723SAGCTAB_1TArrayLength] = { -0xc78,0x7b000001, -0xc78,0x7b010001, -0xc78,0x7b020001, -0xc78,0x7b030001, -0xc78,0x7b040001, -0xc78,0x7b050001, -0xc78,0x7a060001, -0xc78,0x79070001, -0xc78,0x78080001, -0xc78,0x77090001, -0xc78,0x760a0001, -0xc78,0x750b0001, -0xc78,0x740c0001, -0xc78,0x730d0001, -0xc78,0x720e0001, -0xc78,0x710f0001, -0xc78,0x70100001, -0xc78,0x6f110001, -0xc78,0x6e120001, -0xc78,0x6d130001, -0xc78,0x6c140001, -0xc78,0x6b150001, -0xc78,0x6a160001, -0xc78,0x69170001, -0xc78,0x68180001, -0xc78,0x67190001, -0xc78,0x661a0001, -0xc78,0x651b0001, -0xc78,0x641c0001, -0xc78,0x631d0001, -0xc78,0x621e0001, -0xc78,0x611f0001, -0xc78,0x60200001, -0xc78,0x49210001, -0xc78,0x48220001, -0xc78,0x47230001, -0xc78,0x46240001, -0xc78,0x45250001, -0xc78,0x44260001, -0xc78,0x43270001, -0xc78,0x42280001, -0xc78,0x41290001, -0xc78,0x402a0001, -0xc78,0x262b0001, -0xc78,0x252c0001, -0xc78,0x242d0001, -0xc78,0x232e0001, -0xc78,0x222f0001, -0xc78,0x21300001, -0xc78,0x20310001, -0xc78,0x06320001, -0xc78,0x05330001, -0xc78,0x04340001, -0xc78,0x03350001, -0xc78,0x02360001, -0xc78,0x01370001, -0xc78,0x00380001, -0xc78,0x00390001, -0xc78,0x003a0001, -0xc78,0x003b0001, -0xc78,0x003c0001, -0xc78,0x003d0001, -0xc78,0x003e0001, -0xc78,0x003f0001, -0xc78,0x7b400001, -0xc78,0x7b410001, -0xc78,0x7b420001, -0xc78,0x7b430001, -0xc78,0x7b440001, -0xc78,0x7b450001, -0xc78,0x7a460001, -0xc78,0x79470001, -0xc78,0x78480001, -0xc78,0x77490001, -0xc78,0x764a0001, -0xc78,0x754b0001, -0xc78,0x744c0001, -0xc78,0x734d0001, -0xc78,0x724e0001, -0xc78,0x714f0001, -0xc78,0x70500001, -0xc78,0x6f510001, -0xc78,0x6e520001, -0xc78,0x6d530001, -0xc78,0x6c540001, -0xc78,0x6b550001, -0xc78,0x6a560001, -0xc78,0x69570001, -0xc78,0x68580001, -0xc78,0x67590001, -0xc78,0x665a0001, -0xc78,0x655b0001, -0xc78,0x645c0001, -0xc78,0x635d0001, -0xc78,0x625e0001, -0xc78,0x615f0001, -0xc78,0x60600001, -0xc78,0x49610001, -0xc78,0x48620001, -0xc78,0x47630001, -0xc78,0x46640001, -0xc78,0x45650001, -0xc78,0x44660001, -0xc78,0x43670001, -0xc78,0x42680001, -0xc78,0x41690001, -0xc78,0x406a0001, -0xc78,0x266b0001, -0xc78,0x256c0001, -0xc78,0x246d0001, -0xc78,0x236e0001, -0xc78,0x226f0001, -0xc78,0x21700001, -0xc78,0x20710001, -0xc78,0x06720001, -0xc78,0x05730001, -0xc78,0x04740001, -0xc78,0x03750001, -0xc78,0x02760001, -0xc78,0x01770001, -0xc78,0x00780001, -0xc78,0x00790001, -0xc78,0x007a0001, -0xc78,0x007b0001, -0xc78,0x007c0001, -0xc78,0x007d0001, -0xc78,0x007e0001, -0xc78,0x007f0001, -0xc78,0x3800001e, -0xc78,0x3801001e, -0xc78,0x3802001e, -0xc78,0x3803001e, -0xc78,0x3804001e, -0xc78,0x3805001e, -0xc78,0x3806001e, -0xc78,0x3807001e, -0xc78,0x3808001e, -0xc78,0x3c09001e, -0xc78,0x3e0a001e, -0xc78,0x400b001e, -0xc78,0x440c001e, -0xc78,0x480d001e, -0xc78,0x4c0e001e, -0xc78,0x500f001e, -0xc78,0x5210001e, -0xc78,0x5611001e, -0xc78,0x5a12001e, -0xc78,0x5e13001e, -0xc78,0x6014001e, -0xc78,0x6015001e, -0xc78,0x6016001e, -0xc78,0x6217001e, -0xc78,0x6218001e, -0xc78,0x6219001e, -0xc78,0x621a001e, -0xc78,0x621b001e, -0xc78,0x621c001e, -0xc78,0x621d001e, -0xc78,0x621e001e, -0xc78,0x621f001e, -}; - -#endif//endif CONFIG_PHY_SETTING_ODM - -const u32 Rtl8723SPHY_REG_Array_PG[Rtl8723SPHY_REG_Array_PGLength] = { -0xe00,0xffffffff,0x0a0c0c0c, -0xe04,0xffffffff,0x02040608, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x0a0c0d0e, -0xe14,0xffffffff,0x02040608, -0xe18,0xffffffff,0x0a0c0d0e, -0xe1c,0xffffffff,0x02040608, -0x830,0xffffffff,0x0a0c0c0c, -0x834,0xffffffff,0x02040608, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x0a0c0d0e, -0x848,0xffffffff,0x02040608, -0x84c,0xffffffff,0x0a0c0d0e, -0x868,0xffffffff,0x02040608, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x06060606, -0xe14,0xffffffff,0x00020406, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x06060606, -0x848,0xffffffff,0x00020406, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -}; - -const u32 Rtl8723SMACPHY_Array_PG[Rtl8723SMACPHY_Array_PGLength] = { -0x0, }; -#if MP_DRIVER == 1 -const u32 Rtl8723SPHY_REG_Array_MP[Rtl8723SPHY_REG_Array_MPLength] = { -0xc30,0x69e9ac4a, -0xc3c,0x0a979718, -}; -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +/*Created on 2013/02/26, 18:59*/ +#include "../odm_precomp.h" + +const u8 Rtl8723SFwImgArray[Rtl8723SImgArrayLength] = { +0x01,0x23,0x02,0x00,0x0e,0x00,0x00,0x00,0x11,0x16,0x12,0x05,0x5e,0x50,0x01,0x00, +0x31,0x84,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x58,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x60,0xbf,0x00,0x00,0x00,0x00,0x00,0x02,0x53,0x36,0x00,0x00, +0x00,0x00,0x00,0x02,0x51,0x6b,0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03, +0x00,0x04,0x06,0x05,0x04,0x02,0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09, +0x08,0x06,0x00,0x08,0x0a,0x09,0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08, +0x0a,0x09,0x08,0x00,0x00,0x08,0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10, +0x00,0x18,0x22,0x21,0x20,0x18,0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21, +0x20,0x08,0x00,0x20,0x22,0x21,0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20, +0x22,0x20,0x18,0x08,0x00,0x20,0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00, +0x00,0x30,0x31,0x2f,0x10,0x10,0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28, +0x10,0x00,0x00,0x30,0x31,0x20,0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30, +0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05, +0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05, +0x05,0x05,0x06,0x07,0x0a,0x0b,0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11, +0x08,0x08,0x09,0x09,0x0a,0x0c,0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07, +0x07,0x07,0x08,0x0a,0x04,0x04,0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07, +0x08,0x0b,0x0d,0x0f,0x04,0x04,0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12, +0x04,0x04,0x05,0x05,0x06,0x0a,0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f, +0x21,0x27,0x29,0x2a,0x00,0x00,0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04, +0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90, +0x00,0xc0,0x00,0xd8,0x00,0x50,0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90, +0x01,0xe0,0x02,0x30,0x01,0x2c,0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0, +0x06,0x40,0x07,0xd0,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12, +0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c, +0x00,0x50,0x00,0x64,0x00,0xa0,0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0, +0x00,0xf0,0x01,0x68,0x01,0xf4,0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02, +0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12, +0x05,0x07,0x07,0x08,0x0b,0x12,0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04, +0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08, +0x09,0x0a,0x0b,0x0c,0x20,0x1e,0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0xbb,0x01,0x06,0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01, +0xf3,0x22,0xf8,0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83, +0xe8,0xf0,0x22,0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25, +0x82,0xc8,0xf2,0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82, +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, +0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb, +0xfe,0x07,0xe3,0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5, +0xf0,0x74,0x01,0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, +0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0, +0x08,0xe6,0x22,0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22, +0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a, +0x89,0x82,0x8a,0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0, +0x19,0x22,0xbb,0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11, +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0, +0x22,0x50,0x09,0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9, +0x25,0x82,0xc8,0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed, +0x49,0xfd,0xec,0x48,0xfc,0x22,0xbb,0x01,0x07,0x89,0x82,0x8a,0x83,0x02,0x43,0x46, +0x50,0x05,0xe9,0xf8,0x02,0x43,0xda,0xbb,0xfe,0x05,0xe9,0xf8,0x02,0x43,0xe6,0x89, +0x82,0x8a,0x83,0x02,0x43,0xf2,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb, +0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0, +0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0, +0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12, +0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83, +0xe4,0x73,0x74,0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0xd0,0x83,0xd0, +0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74, +0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0xb5,0xf0,0x06,0x74,0x03, +0x93,0x68,0x60,0xe9,0xa3,0xa3,0xa3,0xa3,0x80,0xd8,0xe6,0xfc,0x08,0xe6,0xfd,0x08, +0xe6,0xfe,0x08,0xe6,0xff,0x22,0xe2,0xfc,0x08,0xe2,0xfd,0x08,0xe2,0xfe,0x08,0xe2, +0xff,0x22,0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0x74,0x02,0x93,0xfe,0x74,0x03,0x93, +0xff,0x22,0x02,0x44,0x40,0x02,0x4b,0x85,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40, +0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07, +0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56, +0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, +0x90,0x44,0x85,0xe4,0x7e,0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09, +0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8, +0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82, +0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf, +0xe9,0xde,0xe7,0x80,0xbe,0x48,0x9e,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x48,0x9e,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x9e,0x8c,0x00,0x41, +0x9f,0x14,0x00,0x41,0x9e,0x9e,0x80,0x41,0x9e,0x9f,0x80,0x41,0x9d,0xa8,0x00,0x41, +0x9d,0xa9,0x00,0x41,0x9d,0xa7,0x00,0x41,0x9e,0xb3,0x00,0x00,0x90,0x9e,0x69,0xe0, +0xfe,0xa3,0xe0,0xff,0x90,0x02,0x84,0xef,0xf0,0xa3,0xee,0xf0,0xa3,0x74,0x05,0xf0, +0x22,0xe5,0x68,0x30,0xe3,0x04,0xe4,0xff,0x80,0x02,0x7f,0x01,0xe1,0xd6,0x8f,0x82, +0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x05,0xaf, +0x69,0x02,0x56,0x5f,0x02,0x4c,0x80,0x22,0x7f,0x00,0x22,0x90,0x01,0x64,0x74,0x20, +0xf0,0x22,0x22,0x02,0x61,0x15,0x02,0x61,0x1c,0xef,0x8e,0xf0,0x71,0xad,0x45,0x26, +0x00,0x40,0x45,0x4e,0x00,0x80,0x45,0x79,0x01,0x00,0x45,0x8d,0x02,0x00,0x45,0xa5, +0x04,0x00,0x00,0x00,0x45,0xc2,0xed,0x54,0x3f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e, +0x00,0x7f,0x40,0xef,0x2d,0xff,0xee,0x3c,0xfe,0xef,0x78,0x06,0xce,0xc3,0x13,0xce, +0x13,0xd8,0xf9,0x78,0x06,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x80,0x26,0xed,0x54, +0x7f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x00,0x7f,0x80,0xef,0x2d,0xff,0xee,0x3c, +0xfe,0xef,0x78,0x07,0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x78,0x07,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xfd,0xac,0x06,0x80,0x49,0xed,0x70,0x04,0xfe,0xff,0x80,0x04, +0x7e,0x01,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x7d,0x00,0xfc,0x80,0x35,0xec,0x54,0x01, +0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x02,0x7f,0x00,0xef,0x2d,0xee,0x3c,0xc3, +0x13,0x7d,0x00,0x80,0x1a,0xec,0x54,0x03,0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e, +0x04,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x13,0x13,0x54,0x3f,0x7d,0x00,0x25,0xe0,0x25, +0xe0,0xfc,0xae,0x04,0xaf,0x05,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0x90, +0x9e,0x6f,0xf0,0xa3,0x74,0x08,0xf0,0xa3,0xf0,0x90,0x01,0x1f,0xe0,0xfe,0x90,0x01, +0x1e,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x9e,0x69,0xf0,0xa3,0xef,0xf0, +0x90,0x02,0x87,0xe0,0x90,0x9e,0x6e,0xf0,0x90,0x9e,0xbc,0xe0,0x20,0xe0,0x02,0xe1, +0x49,0xe4,0x90,0x9e,0x6d,0xf0,0x90,0x9e,0x6e,0xe0,0xff,0x90,0x9e,0x6d,0xe0,0xc3, +0x9f,0x40,0x02,0xe1,0x49,0x90,0x9e,0x69,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0x90,0xfd, +0x11,0xf0,0x74,0x02,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0x0f,0xfc, +0x33,0x33,0x33,0x54,0xf8,0xff,0xed,0x24,0x18,0x2f,0x90,0x9e,0x6b,0xf0,0xe0,0x24, +0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0xfc,0x90,0x9e,0x6c,0xf0,0x74, +0x01,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0xfe,0x74,0x00,0x2d,0xf5,0x82, +0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x7a,0x00,0x24,0x00,0xff,0xea,0x3e,0x54,0x3f,0xab, +0x07,0xfa,0xaf,0x04,0xef,0x75,0xf0,0x08,0xa4,0x24,0x18,0xff,0xe4,0x35,0xf0,0xfe, +0xef,0x2b,0xfb,0xee,0x3a,0xfa,0x90,0x9e,0xc2,0xe0,0xfe,0xa3,0xe0,0xff,0xad,0x03, +0xac,0x02,0xb1,0x09,0xaa,0x06,0xab,0x07,0x90,0x9e,0x69,0xee,0x8f,0xf0,0x51,0x54, +0x90,0x9e,0xc0,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x9e,0x69,0xe0,0xfc,0xa3,0xe0,0xfd, +0xd3,0x9f,0xec,0x9e,0x40,0x1b,0x90,0x9e,0xc1,0xe0,0x24,0x01,0xff,0x90,0x9e,0xc0, +0xe0,0x34,0x00,0xfe,0xc3,0xed,0x9f,0xff,0xec,0x9e,0x90,0x9e,0x69,0xf0,0xa3,0xef, +0xf0,0x90,0x9e,0x6c,0xe0,0xff,0x24,0x40,0x60,0x04,0x24,0x20,0x70,0x24,0x90,0x9e, +0xbc,0xe0,0xfe,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x29,0xef,0x90,0x00,0x81, +0xb4,0xa0,0x06,0xe0,0x44,0x04,0xf0,0x80,0x04,0xe0,0x44,0x08,0xf0,0x90,0x9e,0xbf, +0x80,0x0f,0x90,0x9e,0xbc,0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x06,0x80, +0x04,0xe0,0x44,0x01,0xf0,0x90,0x9e,0xbf,0xe0,0x20,0xe0,0x07,0x90,0x01,0x3f,0xe0, +0x30,0xe2,0x10,0xf1,0x4e,0x90,0x9e,0xbc,0xe0,0xc4,0x54,0x0f,0x30,0xe0,0x12,0x91, +0xbc,0x80,0x0e,0x91,0xbc,0x90,0x01,0xbf,0xe0,0x04,0xf0,0x90,0x00,0xe2,0xe0,0x04, +0xf0,0x90,0x9e,0x6d,0xe0,0x04,0xf0,0xc1,0x06,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e, +0x9b,0xe0,0x64,0x02,0x70,0x33,0x90,0x9e,0xbd,0xe0,0xff,0x90,0x9e,0xbc,0xe0,0xfe, +0xc4,0x13,0x54,0x01,0xfd,0x12,0x4e,0xa4,0x90,0x9e,0xbe,0xe0,0x75,0xf0,0x20,0xa4, +0xff,0xae,0xf0,0x12,0x3b,0x3b,0x90,0x9e,0xbd,0xe0,0xff,0x90,0x9e,0xbc,0xe0,0xfe, +0xc4,0x13,0x54,0x01,0xf4,0xfd,0x02,0x4e,0xa4,0x90,0x06,0x90,0xe0,0x44,0x01,0xf0, +0x22,0x90,0x9e,0xb4,0xe0,0x30,0xe0,0x3d,0xe5,0x67,0x64,0x01,0x70,0x37,0x90,0x9e, +0xb8,0xe0,0x60,0x31,0x90,0x9e,0x8e,0xe0,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x02, +0x80,0x15,0x90,0x9e,0xb8,0xe0,0xff,0x90,0x9e,0xb6,0xe0,0xb5,0x07,0x0f,0xf1,0x4e, +0x90,0x00,0x81,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x9e,0xb8,0xf0,0x22,0x91,0xd1,0x90, +0x9e,0xb8,0xe0,0x04,0xf0,0x22,0x8f,0x27,0x12,0x4f,0xf8,0xef,0x64,0x01,0x70,0x2e, +0x90,0x9e,0x97,0x12,0x50,0x26,0xe5,0x27,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xd3, +0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x9e,0xe6,0x12, +0x43,0x7e,0xab,0x63,0xaa,0x64,0xa9,0x65,0x90,0x9e,0xe9,0x12,0x43,0x7e,0xaf,0x66, +0x15,0x66,0xef,0x60,0x1e,0x90,0x9e,0xe9,0xe4,0x75,0xf0,0x01,0x12,0x43,0x67,0x12, +0x1f,0x04,0xff,0x90,0x9e,0xe6,0xe4,0x75,0xf0,0x01,0x12,0x43,0x67,0xef,0x12,0x42, +0x20,0x80,0xdb,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10, +0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xec,0x12,0x43,0x7e,0x90,0x9e,0x9b,0xe0,0x64, +0x01,0x60,0x66,0x90,0x9e,0x9b,0xe0,0x70,0x60,0x90,0x9d,0xa7,0xe0,0xff,0x04,0xf0, +0x90,0x9e,0xec,0x12,0x43,0x5e,0x90,0x00,0x01,0xef,0x12,0x42,0x32,0x31,0x8f,0xef, +0x60,0x47,0x90,0x9e,0xec,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66, +0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0x11,0x0f,0x90,0x9e,0xef,0x12,0x43,0x5e,0x8b, +0x63,0x8a,0x64,0x89,0x65,0x90,0x9e,0xec,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0xc4, +0x54,0x0f,0xf5,0x66,0x7b,0x01,0x7a,0x01,0x79,0xa2,0x11,0x0f,0x90,0x01,0xaf,0x74, +0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10, +0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xf2,0x12,0x43,0x7e,0x90,0x9d,0xa9,0xe0,0xff, +0x90,0x9d,0xa8,0xe0,0xb5,0x07,0x07,0x7d,0x02,0x7f,0x03,0x12,0x3a,0xdf,0x90,0x9d, +0xa8,0xe0,0x70,0x06,0xa3,0xe0,0x64,0x09,0x60,0x0b,0x90,0x9d,0xa8,0xe0,0x14,0xff, +0xa3,0xe0,0xb5,0x07,0x0d,0x31,0x8f,0xef,0x60,0x70,0x31,0xe9,0x90,0x01,0x3f,0x74, +0x02,0xf0,0x90,0x9d,0xa9,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xad,0xf9,0x74,0x9d,0x35, +0xf0,0xa8,0x01,0xfc,0x7d,0x01,0x90,0x9e,0xf2,0x12,0x43,0x5e,0x7e,0x00,0x7f,0x02, +0x12,0x1e,0xde,0x90,0x9d,0xa9,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xaf,0xf9,0x74,0x9d, +0x35,0xf0,0xfa,0x7b,0x01,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x90,0x9e,0xf5,0x12,0x43, +0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x90,0x9e,0xf2,0x12,0x43,0x5e,0x12,0x1f,0x04, +0xff,0xc4,0x54,0x0f,0xf5,0x66,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x11,0x0f,0x90,0x9d, +0xa9,0xe0,0x04,0xf0,0xe0,0xb4,0x0a,0x02,0xe4,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0x7f, +0xaf,0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xfd,0xee,0xf0,0xa3, +0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90,0x9e,0xfd,0xe0,0xfe,0xa3,0xe0,0xf5,0x82, +0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x9f,0x00,0xe0,0x94,0xe8,0x90,0x9e,0xff,0xe0, +0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0,0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90, +0x9e,0xff,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x0a,0x7e,0x00,0x12,0x3b,0x3b, +0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x90,0x9d,0xa8,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xad,0xf9,0x74,0x9d,0x35,0xf0,0xfa, +0x7b,0x01,0xc0,0x02,0xc0,0x01,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xaf,0xf9,0x74,0x9d, +0x35,0xf0,0xfa,0x90,0x9e,0xef,0x12,0x43,0x7e,0xd0,0x01,0xd0,0x02,0x11,0x5e,0x90, +0x9d,0xa8,0xe0,0x04,0xf0,0xe0,0xb4,0x0a,0x02,0xe4,0xf0,0x90,0x9d,0xa9,0xe0,0xff, +0x90,0x9d,0xa8,0xe0,0xb5,0x07,0x07,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x71,0xd0,0xd0, +0x92,0xaf,0x22,0x90,0x01,0xcc,0xe0,0x54,0x0f,0x90,0x9e,0x69,0xf0,0x90,0x9e,0x69, +0xe0,0xfd,0x70,0x02,0x61,0x84,0x90,0x9f,0x14,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8, +0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02, +0x61,0x7d,0x90,0x9f,0x14,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x52,0xe0, +0x90,0x9e,0x6a,0xf0,0x75,0x63,0x01,0x75,0x64,0x9e,0x75,0x65,0x6a,0x75,0x66,0x01, +0x7b,0x01,0x7a,0x9e,0x79,0x6b,0x11,0x0f,0x90,0x9e,0x6b,0xe0,0xff,0xc4,0x13,0x13, +0x13,0x54,0x01,0x90,0x9f,0x14,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88, +0x12,0x43,0x52,0xe0,0x90,0x9e,0x6c,0xf0,0x90,0x9f,0x14,0xe0,0x75,0xf0,0x02,0x90, +0x00,0x89,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6d,0xf0,0x90,0x9f,0x14,0xe0,0x75,0xf0, +0x04,0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6e,0xf0,0x90,0x9f,0x14,0xe0, +0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6f,0xf0,0x90,0x9f, +0x14,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52,0xe0,0x90,0x9e,0x70,0xf0, +0x80,0x33,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6c, +0xf0,0x90,0x9f,0x14,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90, +0x9e,0x6d,0xf0,0x90,0x9f,0x14,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52, +0xe0,0x90,0x9e,0x6e,0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x9e,0x79,0x6c,0x12, +0x80,0x07,0x90,0x9e,0x69,0xe0,0xff,0x90,0x9f,0x14,0xe0,0xfe,0x74,0x01,0xa8,0x06, +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x90,0x9e,0x69,0xf0,0x90,0x9f,0x14, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc, +0xf0,0x90,0x9f,0x14,0xe0,0x04,0xf0,0xe0,0x54,0x03,0xf0,0x41,0x4d,0x90,0x01,0xc6, +0xe0,0x44,0x02,0xf0,0x22,0xe4,0x90,0x9e,0x66,0xf0,0xa3,0xf0,0x12,0x60,0x87,0x75, +0x8e,0x02,0xf1,0xe8,0x12,0x44,0xf8,0x90,0x9e,0x9b,0xef,0xf0,0x12,0x60,0x24,0x90, +0x9e,0x9d,0xef,0xf0,0xe4,0xf5,0x57,0x12,0x78,0x90,0x12,0x61,0x60,0x12,0x37,0x4e, +0x12,0x67,0x5a,0x12,0x57,0xfe,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41, +0x74,0x10,0xf0,0x90,0x05,0x5a,0xf0,0xa3,0xe4,0xf0,0x12,0x44,0xfb,0x12,0x58,0x1c, +0x12,0x44,0xf7,0x12,0x60,0x8f,0x12,0x8d,0xfb,0x12,0x8d,0xf2,0x12,0x8d,0xca,0x90, +0x9e,0x68,0xe5,0xd9,0xf0,0x12,0x5f,0xf5,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,0x40, +0xf0,0xd1,0x94,0x75,0xe8,0x03,0x43,0xa8,0x85,0x12,0x8e,0x69,0xd2,0xaf,0x12,0x87, +0xdd,0x12,0x60,0x31,0x90,0x9e,0x66,0xe0,0x64,0x01,0xf0,0x24,0x85,0x90,0x01,0xc4, +0xf0,0x74,0x4b,0xa3,0xf0,0xe5,0x57,0x30,0xe0,0x0a,0xc2,0xaf,0x53,0x57,0xfe,0x12, +0x8e,0xca,0xd2,0xaf,0xe5,0x57,0x30,0xe2,0x10,0x12,0x61,0x23,0xbf,0x01,0x0a,0xc2, +0xaf,0x53,0x57,0xfb,0xd2,0xaf,0x12,0x45,0xc7,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf, +0x53,0x57,0xef,0xd2,0xaf,0x51,0x43,0xe5,0x57,0x30,0xe6,0x0a,0xc2,0xaf,0x53,0x57, +0xbf,0xd2,0xaf,0x12,0x72,0x3b,0xe5,0x57,0x30,0xe7,0x09,0xc2,0xaf,0x53,0x57,0x7f, +0xd2,0xaf,0x31,0xe9,0xc2,0xaf,0xe5,0x69,0x54,0x0f,0xff,0xbf,0x01,0x0e,0x90,0x9e, +0xa5,0x74,0x01,0xf0,0x12,0x44,0xe8,0xe4,0x90,0x9e,0xa5,0xf0,0xd2,0xaf,0x80,0x84, +0x7d,0x01,0xaf,0x69,0x90,0x9f,0x09,0xed,0xf0,0x90,0x9f,0x08,0xef,0xf0,0x54,0x0f, +0xff,0xe5,0x68,0x54,0x0f,0x6f,0x60,0x73,0x90,0x9f,0x08,0xe0,0x30,0xe2,0x2b,0xe5, +0x68,0x20,0xe2,0x05,0x7f,0x01,0x12,0x67,0x85,0xe5,0x68,0x30,0xe3,0x0a,0x90,0x9f, +0x08,0xe0,0x20,0xe3,0x03,0x02,0x68,0x03,0xe5,0x68,0x20,0xe3,0x4e,0x90,0x9f,0x08, +0xe0,0x30,0xe3,0x47,0xa3,0xe0,0xff,0x02,0x62,0x72,0xe5,0x68,0x54,0x0f,0xff,0xbf, +0x0c,0x10,0x90,0x9f,0x08,0xe0,0x20,0xe3,0x09,0x12,0x5e,0xac,0xef,0x60,0x2c,0x12, +0x68,0x03,0xe5,0x68,0x54,0x0f,0xff,0xbf,0x04,0x10,0x90,0x9f,0x08,0xe0,0x20,0xe2, +0x09,0x12,0x5f,0x93,0xef,0x60,0x14,0x12,0x68,0x29,0xe5,0x68,0x54,0x0f,0xff,0xbf, +0x02,0x09,0x12,0x61,0xfc,0xef,0x60,0x03,0x12,0x6b,0x0b,0x22,0xef,0x64,0x01,0x70, +0x38,0x7d,0x7c,0x7f,0x02,0x12,0x3a,0x54,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x54,0x90, +0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x7d,0x01,0x7f,0x0c,0x91,0x84, +0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x03,0x12,0x56,0x83,0x90,0x06,0x04,0xe0,0x54,0x7f, +0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0,0xa3, +0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x3a,0xc5,0x7d,0x02,0x7f,0x03,0x12,0x3a,0xc5, +0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90,0x9e, +0xa9,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x67,0x30,0xe0,0x22,0x90,0x9e,0xa3, +0xe0,0x70,0x21,0xe0,0x04,0xf0,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d, +0x01,0x7f,0x04,0x91,0x84,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x08,0x02,0x56,0x83,0xe4, +0x90,0x9e,0xa3,0xf0,0x22,0x8b,0x13,0x8a,0x14,0x89,0x15,0x12,0x61,0xc6,0xab,0x13, +0xaa,0x14,0xa9,0x15,0x12,0x1f,0x04,0xf5,0x6a,0x12,0x43,0x87,0x4d,0xd5,0x00,0x4d, +0xdd,0x01,0x4d,0xf0,0x02,0x4e,0x04,0x03,0x4e,0x0a,0x04,0x4e,0x21,0x05,0x4e,0x39, +0x06,0x00,0x00,0x4e,0x44,0x7f,0x01,0xb1,0x0c,0x7f,0x01,0x80,0x64,0xab,0x13,0xaa, +0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0xe4,0xff,0xd1,0x54,0x80,0x18, +0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0x7f,0x01,0xd1, +0x54,0x1f,0x80,0x04,0xd1,0x45,0xe4,0xff,0xa1,0x0c,0xab,0x13,0xaa,0x14,0xa9,0x15, +0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0xe4,0xff,0xd1,0x54,0xb1,0x0c,0xe4,0xff,0x80, +0x20,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0x7f,0x01, +0xd1,0x54,0x1f,0xb1,0x0c,0xe4,0xff,0x80,0x08,0xd1,0x45,0xe4,0xff,0xb1,0x0c,0xe4, +0xff,0x12,0x61,0xd2,0x22,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f, +0x1d,0xfd,0x7f,0x02,0xef,0x24,0xfe,0x60,0x12,0x04,0x70,0x2f,0x90,0x9e,0xaf,0x74, +0x01,0xf0,0x90,0x9e,0xa1,0xf0,0x90,0x9e,0xb2,0xf0,0x22,0xed,0x70,0x0a,0x90,0x9e, +0xac,0xe0,0x90,0x9e,0xaf,0xf0,0x80,0x05,0x90,0x9e,0xaf,0xed,0xf0,0x90,0x9e,0xaf, +0xe0,0x90,0x9e,0xa1,0xf0,0x90,0x9e,0xb2,0x74,0x01,0xf0,0x22,0xf4,0xff,0x90,0x00, +0x63,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe,0xd0, +0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9f,0x13,0xed,0xf0, +0x90,0x9f,0x12,0xef,0xf0,0xd3,0x94,0x07,0x50,0x63,0xe0,0xff,0x74,0x01,0xa8,0x07, +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0xd1, +0x94,0x90,0x9f,0x12,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0xd1,0x94,0x90,0x9f,0x13,0xe0,0x60,0x16, +0x90,0x9f,0x12,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, +0xff,0x90,0x00,0x45,0x80,0x60,0x90,0x9f,0x12,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x62,0x90,0x9f,0x12, +0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xd1,0x8c,0x90,0x9f,0x12,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xff,0x90,0x00,0x62,0xe0,0x4f,0xf0,0xd1,0x94,0x90,0x9f,0x13,0xe0, +0x60,0x18,0x90,0x9f,0x12,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xff,0x90,0x00,0x61,0xe0,0x4f,0x80,0x17,0x90,0x9f,0x12,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x61,0xe0, +0x5f,0xf0,0xd1,0x94,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x8f,0x82,0x75,0x83,0x00,0xed,0xf0,0xd1,0x94,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x00, +0x20,0xe0,0x44,0x01,0xfd,0x7f,0x20,0xf1,0x89,0x7f,0xf4,0x7e,0x01,0x12,0x3b,0x3b, +0x90,0x00,0x00,0xe0,0x54,0xdf,0xfd,0xe4,0xff,0xf1,0x89,0x90,0x00,0x28,0xe0,0x44, +0x03,0xfd,0x7f,0x28,0xf1,0x89,0x90,0x00,0x08,0xe0,0x54,0xef,0xfd,0x7f,0x08,0xf1, +0x89,0xe4,0xff,0x12,0x6a,0x44,0x7f,0x64,0x7e,0x00,0x12,0x3b,0x3b,0x90,0x00,0x29, +0xe0,0x44,0xc0,0xfd,0x7f,0x29,0x80,0xa1,0xe4,0x90,0x9e,0x9a,0xf0,0x90,0x00,0x80, +0xe0,0x44,0x80,0xfd,0x7f,0x80,0x80,0x91,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90, +0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6, +0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f, +0x01,0xd0,0xd0,0x92,0xaf,0x22,0xe0,0xff,0x7d,0x01,0xe4,0xfb,0xfa,0xef,0x30,0xe0, +0x02,0x7b,0x80,0xef,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0xed, +0x60,0x0e,0x74,0x0f,0x2b,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0, +0xaf,0x03,0x74,0x08,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09, +0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2b,0xf5, +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf7,0xf0,0xae,0x02,0xaf,0x03,0x22,0xe0, +0x54,0xef,0xf0,0x90,0xfd,0x63,0xe0,0x54,0x3f,0x25,0xe0,0x25,0xe0,0xff,0x90,0xfd, +0x62,0xe0,0x54,0x03,0x4f,0x90,0x9e,0x5d,0xf0,0x90,0xfd,0x64,0xe0,0x54,0x3f,0x25, +0xe0,0x25,0xe0,0xff,0x90,0xfd,0x63,0xe0,0x54,0x03,0x4f,0x90,0x9e,0x5e,0xf0,0x90, +0x9e,0x5d,0xe0,0xfd,0xa3,0xe0,0xfb,0xe4,0xff,0x90,0x9e,0x62,0xef,0xf0,0xa3,0xed, +0xf0,0xa3,0xeb,0xf0,0x12,0x4f,0xf8,0xef,0x64,0x01,0x60,0x02,0x21,0x6a,0x90,0x9e, +0x99,0x11,0x26,0x90,0x9e,0x62,0xe0,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0xad,0x07,0x74,0x06,0x2d,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x74,0x11,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x54,0xef,0xf0,0xad,0x07,0x74,0x16,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x44,0x02,0xf0,0x74,0x16,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0, +0x54,0x03,0xf0,0x90,0x9e,0x63,0xe0,0xfd,0xac,0x07,0x74,0x22,0x2c,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xed,0xf0,0x90,0x9e,0x64,0xe0,0xfd,0x74,0x23,0x2c,0xf5,0x82, +0xe4,0x34,0xfc,0xf5,0x83,0xed,0xf0,0x74,0x24,0x2c,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x04,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xc0,0xe0,0xc0,0xf0,0xc0, +0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03, +0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x53,0x91,0xbf,0x90,0xfd,0x68,0xe0,0x20, +0xe0,0x02,0x41,0xfb,0x90,0xfd,0x60,0xe0,0x64,0x0e,0x60,0x02,0x41,0x3f,0x90,0x9e, +0x43,0xe0,0xff,0x13,0x13,0x13,0x54,0x1f,0x20,0xe0,0x02,0x41,0x3f,0x90,0xfd,0x62, +0xe0,0x54,0xc0,0xfe,0x90,0x07,0x90,0xe0,0x54,0x3f,0x4e,0xf0,0x90,0xfd,0x63,0xe0, +0x90,0x07,0x91,0xf0,0x90,0xfd,0x64,0xe0,0x90,0x07,0x92,0xf0,0x90,0xfd,0x65,0xe0, +0x90,0x07,0x93,0xf0,0x90,0x07,0x95,0x74,0x01,0xf0,0xef,0x20,0xe0,0x42,0x90,0x9e, +0x43,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x18,0x90,0x07,0x78,0x11,0x7f,0x90,0x9e, +0x43,0xe0,0xff,0xc3,0x13,0x30,0xe0,0x47,0x90,0x07,0x83,0xe0,0x44,0x40,0xf0,0x80, +0x3e,0x90,0x9e,0x43,0xe0,0xff,0xc3,0x13,0x30,0xe0,0x10,0xe4,0xff,0x71,0x16,0x90, +0x07,0x95,0xe0,0x44,0x01,0xf0,0xa3,0xe0,0x44,0x01,0xf0,0x90,0x07,0x78,0x80,0x13, +0x90,0x9e,0x43,0xe0,0xff,0x13,0x13,0x54,0x3f,0x90,0x07,0x78,0x30,0xe0,0x04,0x11, +0x7f,0x80,0x0c,0xe0,0x44,0x10,0xf0,0xe0,0x44,0x20,0xf0,0xe0,0x54,0xdf,0xf0,0x90, +0xfd,0x60,0xe0,0xb4,0x0f,0x0b,0x90,0xfd,0x62,0xe0,0xff,0xa3,0xe0,0xfd,0x12,0x8f, +0x02,0x90,0xfd,0x60,0xe0,0x64,0x15,0x70,0x64,0x90,0xfd,0x62,0xe0,0x90,0x9e,0x60, +0xf0,0x90,0xfd,0x62,0xe0,0x30,0xe0,0x15,0x90,0x9e,0x60,0xe0,0xf4,0x54,0x3f,0x04, +0xff,0x90,0x9e,0x4e,0xe0,0x13,0x13,0x54,0x3f,0xc3,0x9f,0x80,0x10,0x90,0x9e,0x4e, +0xe0,0x13,0x13,0x54,0x3f,0xff,0x90,0x9e,0x60,0xe0,0x54,0x3f,0x2f,0x90,0x9e,0x5f, +0xf0,0x90,0x9e,0x5f,0xe0,0xff,0x54,0x30,0xc4,0x54,0x0f,0xfe,0xef,0x25,0xe0,0x25, +0xe0,0x4e,0x90,0x9e,0x61,0xf0,0x90,0x00,0x2e,0xf0,0x90,0x9e,0x5f,0xe0,0xc4,0x54, +0xf0,0xff,0x90,0x9e,0x4f,0xe0,0x54,0x0f,0x4f,0x90,0x00,0x2d,0xf0,0x90,0xfd,0x60, +0xe0,0xb4,0x16,0x08,0x90,0xfd,0x62,0xe0,0xff,0x12,0x8f,0x55,0x90,0xfd,0x60,0xe0, +0xb4,0x21,0x08,0x90,0xfd,0x62,0xe0,0xff,0x12,0x8f,0x7d,0x90,0xfd,0x60,0xe0,0xb4, +0x22,0x03,0x12,0x90,0x34,0x90,0xfd,0x60,0xe0,0xb4,0x23,0x08,0x90,0xfd,0x62,0xe0, +0xff,0x12,0x90,0x11,0x90,0xfd,0x68,0xe0,0x44,0x01,0xf0,0xd0,0x07,0xd0,0x06,0xd0, +0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, +0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0x9e,0x43,0xe0,0xc3,0x13,0x30,0xe0,0x16,0xef, +0x7b,0x01,0xb4,0x01,0x06,0x7a,0x9e,0x79,0x4a,0x80,0x04,0x7a,0x9e,0x79,0x46,0x7f, +0x80,0x7e,0x08,0xf1,0x70,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0, +0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0, +0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0x36,0xf0,0x74,0x53,0xa3,0xf0,0x53,0x91,0xdf, +0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0, +0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90, +0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34,0x30,0xe1,0x0b,0x90,0x01,0x3c,0x74,0x02,0xf0, +0x12,0x6c,0xb1,0xf1,0xb7,0xe5,0x34,0x30,0xe2,0x36,0x90,0x01,0x3c,0x74,0x04,0xf0, +0x90,0x06,0x92,0xe0,0x30,0xe0,0x21,0x75,0x48,0x00,0x90,0x9e,0xa6,0xe0,0xf5,0x49, +0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x5b,0x74,0x05,0xf0, +0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x08,0x90,0x9e,0xae,0xe4,0xf0,0x12,0x44,0xe8, +0xe5,0x34,0x30,0xe3,0x36,0x90,0x01,0x3c,0x74,0x08,0xf0,0x90,0x06,0x92,0xe0,0x30, +0xe1,0x21,0x75,0x48,0x00,0x90,0x9e,0xa6,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x5c, +0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02, +0xf0,0x80,0x08,0x90,0x9e,0xad,0xe4,0xf0,0x12,0x44,0xe8,0xe5,0x34,0x30,0xe4,0x06, +0x90,0x01,0x3c,0x74,0x10,0xf0,0xe5,0x34,0x30,0xe5,0x06,0x90,0x01,0x3c,0x74,0x20, +0xf0,0xe5,0x35,0x30,0xe0,0x19,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x01,0x2f,0xe0, +0x44,0x7f,0xf0,0x90,0x00,0x83,0xe0,0xf5,0x69,0x12,0x6b,0x1d,0x12,0x44,0xe8,0xe5, +0x35,0x30,0xe2,0x0c,0x90,0x01,0x3d,0x74,0x04,0xf0,0x53,0x6b,0xfb,0x12,0x44,0xe8, +0xe5,0x36,0x30,0xe0,0x69,0x90,0x01,0x3e,0x74,0x01,0xf0,0x90,0x9e,0xd7,0xe0,0x30, +0xe0,0x12,0xa3,0xe0,0x64,0x03,0x60,0x0c,0x7f,0x01,0xd1,0x0b,0xef,0x60,0x05,0x7f, +0x01,0x12,0x68,0x90,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x43,0xe4,0xff,0xd1,0x0b,0xef, +0x60,0x3c,0xd1,0x2f,0x90,0x9e,0xd2,0xe0,0xff,0x64,0x06,0x60,0x31,0xef,0xb4,0x04, +0x02,0x80,0x07,0x90,0x9e,0xd2,0xe0,0xb4,0x05,0x04,0xe4,0xff,0x80,0x14,0x90,0x9e, +0xd2,0xe0,0xb4,0x03,0x04,0x7f,0x01,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x02,0x05, +0x7f,0x01,0x12,0x62,0xa5,0x7d,0x01,0xaf,0x69,0x12,0x4c,0x84,0xd1,0x83,0xe5,0x36, +0x30,0xe1,0x3b,0x90,0x01,0x3e,0x74,0x02,0xf0,0x90,0x9e,0xd7,0xe0,0x30,0xe0,0x12, +0xa3,0xe0,0x64,0x03,0x60,0x0c,0x7f,0x01,0xd1,0x0b,0xef,0x70,0x05,0x7f,0x02,0x12, +0x68,0x90,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x15,0x12,0x8b,0xdb,0x90,0x9e,0xd2,0xe0, +0x64,0x06,0x60,0x0a,0xe4,0xff,0xd1,0x0b,0xef,0x70,0x03,0x12,0x67,0xbb,0xe5,0x36, +0x30,0xe3,0x09,0x90,0x01,0x3e,0x74,0x08,0xf0,0x43,0x6b,0x04,0xe5,0x36,0x30,0xe4, +0x06,0x90,0x01,0x3e,0x74,0x10,0xf0,0xe5,0x36,0x30,0xe2,0x72,0x90,0x01,0x3e,0x74, +0x04,0xf0,0x90,0x07,0x8f,0xe0,0x30,0xe7,0x12,0x74,0x80,0xf0,0x90,0x07,0x95,0x74, +0x04,0xf0,0xa3,0xe0,0x44,0x04,0xf0,0xe4,0xff,0x71,0x16,0x90,0x07,0x8f,0xe0,0x30, +0xe6,0x12,0x74,0x40,0xf0,0x90,0x07,0x7c,0xe0,0xb4,0x06,0x08,0x90,0x07,0x80,0xe0, +0xff,0x12,0x8f,0x2d,0x90,0x07,0x8f,0xe0,0x30,0xe5,0x13,0x74,0x20,0xf0,0xe4,0xff, +0x71,0x16,0x90,0x07,0x95,0xe0,0x44,0x01,0xf0,0xa3,0xe0,0x44,0x01,0xf0,0x90,0x07, +0x95,0xe0,0x30,0xe2,0x0c,0x74,0x04,0xf0,0xa3,0xe0,0x54,0xfb,0xf0,0x7f,0x01,0x71, +0x16,0x90,0x07,0x95,0xe0,0x30,0xe0,0x06,0x74,0x01,0xf0,0xff,0x71,0x16,0xe5,0x36, +0x30,0xe5,0x06,0x90,0x01,0x3e,0x74,0x20,0xf0,0xe5,0x36,0x30,0xe6,0x08,0x90,0x01, +0x3e,0x74,0x40,0xf0,0xd1,0x19,0xe5,0x36,0x30,0xe7,0x0c,0x90,0x01,0x3e,0x74,0x80, +0xf0,0x53,0x6b,0xfe,0x12,0x44,0xe8,0xe5,0x37,0x30,0xe1,0x09,0x90,0x01,0x3f,0x74, +0x02,0xf0,0x43,0x57,0x80,0xe5,0x37,0x30,0xe4,0x1b,0x90,0x01,0x3f,0x74,0x10,0xf0, +0xd1,0xc8,0x90,0x9e,0xaf,0xe0,0x90,0x05,0x73,0xf0,0x90,0x01,0x36,0x74,0x02,0xf0, +0xfd,0xff,0x12,0x3a,0xc5,0x74,0x36,0x04,0x90,0x01,0xc4,0xf0,0x74,0x53,0xa3,0xf0, +0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00, +0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x6c,0x90,0x05,0x43, +0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0x22,0x12,0x4f,0xf8,0xbf,0x01,0x0f,0x90, +0x9e,0x96,0xe0,0xff,0xe4,0xfd,0x11,0x2a,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90, +0x9e,0xd1,0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x0b,0xa3,0xe0,0x64,0x06, +0x60,0x05,0x7f,0x06,0x12,0x62,0xa5,0x90,0x9e,0xd2,0xe0,0x64,0x06,0x60,0x02,0xd1, +0x52,0x22,0x90,0x9e,0xd6,0xe0,0xb4,0x01,0x05,0xe4,0xf0,0x12,0x5d,0x03,0x22,0xae, +0x07,0xe4,0xff,0xd1,0x0b,0xef,0x60,0x18,0x90,0x9e,0xd1,0xe0,0xc4,0x13,0x13,0x54, +0x03,0x20,0xe0,0x0c,0xaf,0x06,0x7d,0x01,0x12,0x4c,0x84,0xd1,0x83,0x7f,0x01,0x22, +0x7f,0x00,0x22,0x90,0x9e,0xd2,0xe0,0x64,0x06,0x60,0x3c,0xe5,0x68,0x54,0x0f,0x14, +0x60,0x2e,0x14,0x60,0x1e,0x24,0xfe,0x60,0x0e,0x24,0xf8,0x70,0x2a,0xe4,0x90,0x9e, +0xd2,0xf0,0x90,0x05,0x22,0xf0,0x22,0x90,0x9e,0xd2,0x74,0x01,0xf0,0x90,0x05,0x22, +0xe4,0xf0,0x22,0x90,0x9e,0xd2,0x74,0x03,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x22, +0x90,0x01,0xc6,0xe0,0x44,0x08,0xf0,0x22,0xe4,0x90,0x9f,0x16,0xf0,0xe5,0x6a,0x70, +0x02,0xe1,0x6b,0xe5,0x67,0x64,0x01,0x60,0x02,0xe1,0x6b,0xe5,0x6a,0x14,0x60,0x28, +0x24,0xfd,0x60,0x24,0x24,0x02,0x24,0xfb,0x50,0x02,0x80,0x22,0xe4,0x90,0x9e,0xa1, +0xf0,0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x9e,0xa1,0xe0,0x70,0x0a,0x90,0x9e, +0xaf,0xe0,0x90,0x9e,0xa1,0xf0,0x80,0x00,0x90,0x9f,0x16,0x74,0x01,0xf0,0x90,0x9e, +0xd1,0xe0,0x30,0xe0,0x15,0xa3,0xe0,0xb4,0x06,0x05,0xe4,0x90,0x9f,0x16,0xf0,0xe4, +0xff,0xd1,0x0b,0xef,0x70,0x04,0x90,0x9f,0x16,0xf0,0x90,0x9f,0x16,0xe0,0x60,0x3b, +0x43,0x6b,0x10,0xe4,0xf5,0x48,0x90,0x9e,0xab,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f, +0x54,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x68,0x54,0x0f, +0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x4c,0x84,0x90,0x9e,0xd1,0xe0, +0x30,0xe0,0x08,0xd1,0x83,0x90,0x05,0x22,0x74,0xff,0xf0,0x22,0x7f,0x70,0x7e,0x08, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xef,0x54,0xfc,0xff,0x90,0x01,0xe8,0xf0,0xee, +0x44,0xf0,0xa3,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0x01,0xec,0xf0,0x90,0x00, +0x02,0x12,0x1f,0x1d,0x90,0x01,0xed,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x01, +0xee,0xf0,0x12,0x1f,0x04,0x90,0x01,0xef,0xf0,0x90,0x01,0xeb,0x74,0x40,0xf0,0x12, +0x5f,0x3e,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e,0x51,0xe0,0xff,0x90,0x9e,0x50,0xe0, +0x5f,0x60,0x24,0x12,0x5d,0x8a,0xef,0x54,0x9f,0xff,0xec,0x90,0x9f,0x01,0x12,0x1f, +0xd7,0x7b,0x01,0x7a,0x9f,0x79,0x01,0xf1,0x6c,0x90,0x00,0x40,0x74,0x24,0xf0,0xe5, +0x6a,0x70,0x04,0x90,0x01,0x57,0xf0,0x22,0x12,0x4f,0xf8,0xbf,0x01,0x0f,0x90,0x02, +0x09,0xe0,0xff,0x7d,0x01,0x11,0x2a,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x75,0x28, +0x33,0xe4,0xf5,0x29,0x75,0x2a,0x07,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3, +0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0x75,0x30,0x1f,0x75, +0x31,0x01,0xe4,0xf5,0x32,0x43,0x32,0x20,0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5, +0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x01,0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0x12, +0x4f,0x89,0xe4,0xfd,0x7f,0x51,0x12,0x4f,0x89,0xe4,0xfd,0x7f,0x52,0x12,0x4f,0x89, +0xe4,0xfd,0x7f,0x53,0x02,0x4f,0x89,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0, +0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05, +0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0x67,0xf0,0x74,0x58,0xa3,0xf0,0x90,0x01, +0x34,0xe0,0x55,0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0, +0x55,0x2b,0xf5,0x2f,0xe5,0x2c,0x20,0xe0,0x02,0x41,0x20,0x90,0x01,0x34,0x74,0x01, +0xf0,0x85,0xd1,0x4d,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, +0x85,0xd7,0x53,0x85,0xd9,0x54,0x85,0xd2,0x4e,0x78,0x8d,0x7c,0x9e,0xfd,0x7b,0x00, +0x7a,0x00,0x79,0x4d,0x7e,0x00,0x7f,0x08,0x12,0x1e,0xde,0x90,0x9e,0x8e,0xe0,0xff, +0xc4,0x13,0x54,0x01,0xfe,0xef,0xc4,0x13,0x13,0x54,0x01,0x6e,0x70,0x02,0x21,0xcf, +0x90,0x9e,0x8e,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x02,0x21,0xcf, +0xef,0x54,0x1f,0xf5,0x08,0x90,0x9e,0x8f,0xe0,0x54,0x3f,0xf5,0x09,0x90,0x9e,0x91, +0xe0,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5, +0x83,0xe4,0x8f,0xf0,0x12,0x42,0x54,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03,0x75,0x09, +0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75,0xf0,0x02,0xe5, +0x09,0x12,0x43,0x52,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x9e,0x91,0xe0,0x54,0x1f,0x2f, +0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75, +0xf0,0x02,0xe5,0x09,0x12,0x43,0x52,0xee,0xf0,0xa3,0xef,0xf0,0x90,0x9e,0x8e,0xe0, +0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x28,0x90,0x9e,0x91,0xe0,0x54,0x1f,0xff,0xe5, +0x08,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0x8f,0xf0,0x12, +0x42,0x54,0x90,0x9e,0x90,0xe0,0x30,0xe7,0x36,0xaf,0x08,0x12,0x6d,0xe9,0x80,0x2f, +0x90,0x9e,0x91,0xe0,0x54,0x1f,0xff,0xfd,0xe5,0x08,0x25,0xe0,0x24,0x44,0xf5,0x82, +0xe4,0x34,0x99,0xf5,0x83,0xe4,0x8d,0xf0,0x12,0x42,0x54,0x90,0x9e,0x90,0xe0,0xfe, +0x30,0xe7,0x0c,0x54,0x7f,0xfd,0x8f,0x0d,0xab,0x09,0xaf,0x08,0x12,0x6d,0x86,0xe5, +0x6a,0x14,0x24,0xfd,0x50,0x02,0x80,0x45,0x90,0x9e,0xb0,0xe0,0x60,0x37,0x90,0x01, +0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x91,0xea,0xef,0x64,0x01,0x70,0x2d, +0x90,0x9e,0xa6,0xe0,0xf5,0x48,0x75,0x49,0x00,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01, +0x12,0x39,0xa9,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, +0x9e,0xae,0xf0,0x80,0x08,0x91,0xea,0xbf,0x01,0x03,0x12,0x44,0xe8,0x12,0x47,0x91, +0xe5,0x2c,0x30,0xe1,0x7b,0x90,0x01,0x34,0x74,0x02,0xf0,0x90,0xfd,0x10,0x74,0x7f, +0xf0,0x90,0x04,0x7f,0xe0,0x54,0x07,0xf5,0x55,0x90,0x04,0x7e,0xe0,0x54,0x07,0xf5, +0x56,0x65,0x55,0x60,0x5b,0xe4,0xff,0x75,0xf0,0x08,0xe5,0x55,0xa4,0x2f,0xf5,0x82, +0xe4,0x35,0xf0,0xf5,0x83,0xe5,0x82,0x24,0xc0,0xf5,0x82,0xe5,0x83,0x34,0xfc,0xf5, +0x83,0xe0,0xfe,0x74,0x58,0x2f,0xf8,0xa6,0x06,0x0f,0xbf,0x08,0xda,0x78,0x84,0x7c, +0x9e,0x7d,0x01,0x7b,0x00,0x7a,0x00,0x79,0x58,0x7e,0x00,0x7f,0x08,0x12,0x1e,0xde, +0x90,0x9e,0x84,0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x02,0xb1,0xe3,0xe5, +0x55,0x24,0x01,0xff,0xef,0x54,0x07,0xf5,0x55,0x90,0x04,0x7f,0xf0,0xb5,0x56,0xa5, +0xe5,0x2c,0x30,0xe3,0x10,0x90,0x01,0x34,0x74,0x08,0xf0,0x90,0x9e,0xbc,0xe0,0x30, +0xe0,0x03,0x43,0x57,0x04,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0, +0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5,0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0, +0x54,0xdf,0xf0,0x90,0x01,0x34,0x74,0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x11, +0x37,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0,0x12,0x4e,0x94,0x80,0xfe,0xe5,0x2c,0x30, +0xe6,0x06,0x90,0x01,0x34,0x74,0x40,0xf0,0xe5,0x2e,0x30,0xe0,0x41,0x90,0x9e,0x9c, +0x74,0x01,0xf0,0x90,0x01,0x36,0xf0,0xb1,0x43,0xd1,0x05,0x90,0x9e,0xd7,0xe0,0x30, +0xe0,0x0d,0x13,0x13,0x54,0x3f,0x30,0xe0,0x06,0x90,0x9e,0xd9,0x74,0x01,0xf0,0x90, +0x9e,0xd1,0xe0,0xff,0x30,0xe0,0x0d,0x13,0x13,0x54,0x3f,0x30,0xe0,0x06,0x90,0x9e, +0xd3,0x74,0x01,0xf0,0x12,0x56,0xc8,0xd1,0x36,0x90,0x9e,0x9c,0xe4,0xf0,0xe5,0x2e, +0x30,0xe1,0x5f,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90,0x01,0x02,0xe0, +0x54,0x03,0x64,0x01,0x70,0x29,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a,0x74,0x01,0xf0, +0x90,0x9e,0x8c,0xe4,0xf0,0x80,0x18,0x90,0x9e,0x8c,0xe0,0x04,0xf0,0xe0,0xc3,0x94, +0x0a,0x40,0x0c,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x57,0xe8,0x90, +0x9e,0xd1,0xe0,0x30,0xe0,0x0d,0xe4,0xff,0x12,0x56,0x0b,0xef,0x60,0x05,0x90,0x05, +0x22,0xe4,0xf0,0xd1,0x6c,0x90,0x9e,0xb2,0xe0,0x60,0x07,0x7d,0x02,0x7f,0x02,0x12, +0x3a,0x54,0xe5,0x2e,0x30,0xe2,0x46,0x90,0x01,0x36,0x74,0x04,0xf0,0x90,0x9e,0xd1, +0xe0,0x30,0xe0,0x06,0xa3,0xe0,0x64,0x06,0x60,0x30,0x12,0x6b,0xe1,0x90,0x9e,0xb2, +0xe0,0x60,0x27,0x90,0x9e,0xaf,0xe0,0xff,0x90,0x9e,0xa1,0xe0,0xb5,0x07,0x1b,0x90, +0x9e,0xaf,0xe0,0x90,0x05,0x73,0xf0,0x90,0x01,0x3f,0x74,0x10,0xf0,0xfd,0x7f,0x03, +0x12,0x3a,0xdf,0x7d,0x01,0x7f,0x02,0x12,0x3a,0x54,0x12,0x57,0xb7,0xe5,0x2e,0x30, +0xe3,0x34,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x67,0x64,0x01,0x70,0x28,0xe5,0x6a, +0x60,0x24,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x75,0x48,0x00, +0x90,0x9e,0xa8,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9, +0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4,0x2b,0x90,0x01,0x36,0x74,0x10, +0xf0,0xe5,0x67,0xb4,0x01,0x20,0xe5,0x6a,0x60,0x1c,0x90,0x01,0x57,0xe4,0xf0,0x90, +0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0xb1,0xe4,0xf0,0x53,0x6b,0xfd,0xe5,0x6b,0x54, +0x07,0x70,0x03,0x12,0x44,0xe8,0xe5,0x2e,0x30,0xe5,0x1e,0x90,0x01,0x36,0x74,0x20, +0xf0,0xe5,0x67,0xb4,0x01,0x13,0xe5,0x6a,0x60,0x0f,0x90,0x9e,0xb0,0xe0,0x64,0x02, +0x60,0x05,0x12,0x56,0x19,0x80,0x02,0xd1,0xf4,0xe5,0x2e,0x30,0xe6,0x1b,0x90,0x01, +0x36,0x74,0x40,0xf0,0xe5,0x67,0xb4,0x01,0x10,0xe5,0x6a,0x60,0x0c,0x53,0x6b,0xfe, +0xe5,0x6b,0x54,0x07,0x70,0x03,0x12,0x44,0xe8,0xe5,0x2f,0x30,0xe1,0x26,0x90,0x01, +0x37,0x74,0x02,0xf0,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x17,0xe4,0xff,0x12,0x56,0x0b, +0xef,0x60,0x07,0xb1,0x03,0x12,0x56,0x83,0x80,0x0a,0x90,0x9e,0xd6,0x74,0x01,0xf0, +0x80,0x02,0xb1,0x03,0x74,0x67,0x04,0x90,0x01,0xc4,0xf0,0x74,0x58,0xa3,0xf0,0xd0, +0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, +0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0x04,0x1a,0xe0,0xf4,0x60, +0x03,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x07,0x64,0x07,0x7f,0x01,0x60,0x02, +0x7f,0x00,0x22,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x54,0xe5,0x6a,0x14,0x24,0xfd,0x50, +0x06,0x24,0xfd,0x50,0x1d,0x80,0x2b,0x90,0x9e,0xb0,0xe0,0x60,0x06,0x7d,0x01,0x7f, +0x0c,0x80,0x1c,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50,0x16,0x7d,0x01,0x7f,0x04, +0x80,0x0d,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12, +0x4c,0x84,0x22,0x90,0x9e,0x51,0xe0,0xff,0x90,0x9e,0x50,0xe0,0x5f,0x60,0x3a,0x90, +0x00,0x40,0x74,0x04,0xf0,0xb1,0x8a,0xef,0x44,0x60,0xff,0xec,0x90,0x9e,0x52,0x12, +0x1f,0xd7,0x7f,0x60,0x7e,0x08,0xb1,0x8e,0xef,0x44,0x20,0xff,0xec,0x90,0x9e,0x56, +0x12,0x1f,0xd7,0x7b,0x01,0x7a,0x9e,0x79,0x52,0x12,0x57,0x6c,0x7b,0x01,0x7a,0x9e, +0x79,0x56,0x7f,0x60,0x7e,0x08,0x12,0x57,0x70,0x22,0x7f,0x70,0x7e,0x08,0xd3,0x10, +0xaf,0x01,0xc3,0xc0,0xd0,0xef,0x54,0xfc,0xff,0x90,0x01,0xe8,0xf0,0xee,0xa3,0xf0, +0x90,0x01,0xeb,0x74,0x80,0xf0,0xf1,0x3e,0x90,0x01,0xec,0xe0,0xff,0x90,0x9f,0x05, +0x12,0x43,0x5e,0x90,0x00,0x03,0xef,0x12,0x42,0x32,0x90,0x01,0xed,0xe0,0x90,0x00, +0x02,0x12,0x42,0x32,0x90,0x01,0xee,0xe0,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x01, +0xef,0xe0,0x12,0x42,0x20,0x90,0x9f,0x05,0x12,0x43,0x5e,0x12,0x43,0x26,0xd0,0xd0, +0x92,0xaf,0x22,0x90,0x9e,0x52,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44,0x80, +0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x0b,0x7a,0x9e, +0x79,0x52,0x02,0x48,0xde,0x90,0x9e,0x51,0xe0,0xff,0x90,0x9e,0x50,0xe0,0x5f,0xff, +0xe5,0x6a,0x7e,0x00,0x70,0x02,0x7e,0x01,0xee,0x5f,0x60,0x19,0xe4,0xf5,0x48,0x90, +0x9e,0xab,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9,0x90, +0x01,0x57,0x74,0x05,0xf0,0x22,0x90,0x9e,0xb9,0xe0,0x30,0xe0,0x2e,0xe5,0x67,0xb4, +0x01,0x29,0x90,0x9e,0xb3,0xe0,0x04,0xf0,0xe0,0xb4,0x0a,0x0b,0x90,0x9e,0xbb,0xe0, +0x04,0xf0,0xe4,0x90,0x9e,0xb3,0xf0,0x90,0x9e,0xbb,0xe0,0xff,0x90,0x9e,0xba,0xe0, +0xb5,0x07,0x08,0x12,0x44,0xd1,0xe4,0x90,0x9e,0xbb,0xf0,0x22,0x90,0x9e,0xb4,0xe0, +0x30,0xe0,0x38,0xe5,0x67,0x64,0x01,0x70,0x32,0x90,0x9e,0xb7,0xe0,0x04,0xf0,0xe0, +0xff,0x90,0x9e,0xb5,0xe0,0xb5,0x07,0x23,0x90,0x06,0x92,0xe0,0x54,0x1c,0x70,0x0b, +0x12,0x44,0xd1,0x90,0x9e,0xb8,0xe0,0x04,0xf0,0x80,0x0b,0x90,0x06,0x92,0x74,0x1c, +0xf0,0xe4,0x90,0x9e,0xb8,0xf0,0xe4,0x90,0x9e,0xb7,0xf0,0x22,0x91,0xea,0xef,0x64, +0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x30,0x90,0x9e,0xae,0xe0,0x60, +0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x22,0x90,0x9e,0xad,0xe0,0x60,0x08,0x90, +0x01,0xb9,0x74,0x04,0xf0,0x80,0x14,0xe5,0x69,0x54,0x0f,0xd3,0x94,0x04,0x40,0x08, +0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x08, +0xf0,0x7f,0x00,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4, +0xf5,0x48,0x90,0x9e,0xa6,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x12, +0x39,0xa9,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x9e, +0xad,0x14,0xf0,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x0c,0x50,0x11,0x7d,0x01,0x7f,0x0c, +0x12,0x4c,0x84,0x90,0x9e,0xd1,0xe0,0x30,0xe0,0x03,0x12,0x56,0x83,0x22,0xe4,0x90, +0x9f,0x0c,0xf0,0xa3,0xf0,0x90,0x01,0xeb,0xe0,0x54,0xc0,0x60,0x43,0xc3,0x90,0x9f, +0x0d,0xe0,0x94,0x88,0x90,0x9f,0x0c,0xe0,0x94,0x13,0x40,0x0a,0x90,0x01,0xc6,0xe0, +0x44,0x04,0xf0,0x7f,0x00,0x22,0x90,0x9f,0x0c,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54, +0x7f,0x14,0x7e,0x00,0x12,0x3b,0x3b,0xd3,0x90,0x9f,0x0d,0xe0,0x94,0x64,0x90,0x9f, +0x0c,0xe0,0x94,0x00,0x40,0xbf,0x90,0x01,0xc7,0xe0,0x30,0xe2,0xb8,0x7f,0x00,0x22, +0x7f,0x01,0x22,0x91,0xea,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0, +0x80,0x4a,0xe5,0x6b,0x54,0x03,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x3c, +0xe5,0x69,0x54,0x0f,0xd3,0x94,0x02,0x40,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80, +0x2b,0xe5,0x6b,0x30,0xe2,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x1e,0xe5,0x6b, +0x30,0xe4,0x08,0x90,0x01,0xb9,0x74,0x10,0xf0,0x80,0x11,0x90,0x9e,0xa3,0xe0,0x60, +0x08,0x90,0x01,0xb9,0x74,0x20,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74, +0x04,0xf0,0x7f,0x00,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90, +0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0x12,0x4f,0x89,0x7d, +0xff,0x7f,0x55,0x12,0x4f,0x89,0x7d,0xff,0x7f,0x56,0x12,0x4f,0x89,0x7d,0xff,0x7f, +0x57,0x02,0x4f,0x89,0x90,0x00,0xf3,0xe0,0x7f,0x00,0x30,0xe3,0x03,0x7f,0x01,0x22, +0x22,0xe4,0x90,0x9e,0x69,0xf0,0xa3,0xf0,0x90,0x01,0x98,0xe0,0x7f,0x00,0x30,0xe4, +0x02,0x7f,0x01,0xef,0x64,0x01,0x60,0x3e,0xc3,0x90,0x9e,0x6a,0xe0,0x94,0x88,0x90, +0x9e,0x69,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44,0x80,0xf0,0x22,0x90, +0x9e,0x69,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x14,0x7e,0x00,0x12,0x3b,0x3b, +0xd3,0x90,0x9e,0x6a,0xe0,0x94,0x32,0x90,0x9e,0x69,0xe0,0x94,0x00,0x40,0xb9,0x90, +0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x90,0x01,0x94,0xe0,0x44,0x01,0xf0,0x22,0x90, +0x01,0x01,0xe0,0x44,0x04,0xf0,0x90,0x01,0x9c,0x74,0x7e,0xf0,0xa3,0x74,0x92,0xf0, +0xa3,0x74,0xa0,0xf0,0xa3,0x74,0x24,0xf0,0x90,0x01,0x9b,0x74,0x49,0xf0,0x90,0x01, +0x9a,0x74,0xe0,0xf0,0x90,0x01,0x99,0xe4,0xf0,0x90,0x01,0x98,0x04,0xf0,0x22,0xc0, +0xe0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x05,0xc0,0x06,0xc0,0x07, +0x7d,0xbf,0x90,0x01,0xc4,0xed,0xf0,0x74,0x60,0xff,0xa3,0xf0,0x53,0x91,0xef,0x90, +0x00,0x51,0xe0,0xfe,0x90,0x00,0x55,0xe0,0x5e,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x03, +0x74,0x40,0xf0,0xe5,0x3d,0x30,0xe7,0x06,0x90,0x00,0x55,0x74,0x80,0xf0,0x90,0x01, +0xc4,0xed,0xf0,0xa3,0xef,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0xd0,0xd0,0x82, +0xd0,0x83,0xd0,0xe0,0x32,0x8f,0x1f,0x8c,0x20,0x8d,0x21,0x22,0x8f,0x22,0x8c,0x23, +0x8d,0x24,0x22,0xe4,0x90,0x9e,0x69,0xf0,0xa3,0xf0,0x90,0x02,0x86,0xe0,0x20,0xe1, +0x2c,0xc3,0x90,0x9e,0x6a,0xe0,0x94,0xd0,0x90,0x9e,0x69,0xe0,0x94,0x07,0x40,0x0a, +0x90,0x01,0xc6,0xe0,0x44,0x20,0xf0,0x7f,0x00,0x22,0x90,0x9e,0x69,0xe4,0x75,0xf0, +0x01,0x12,0x42,0x54,0x7f,0x0a,0x7e,0x00,0x12,0x3b,0x3b,0x80,0xcd,0x7f,0x01,0x22, +0xe4,0xf5,0x67,0xf5,0x6b,0xf5,0x6a,0x75,0x69,0x0c,0x75,0x68,0x0c,0x90,0x9e,0xb0, +0xf0,0x90,0x9e,0xae,0xf0,0x90,0x9e,0xad,0xf0,0x90,0x9e,0xaf,0x04,0xf0,0x90,0x9e, +0xa1,0xf0,0xe4,0x90,0x9e,0xb1,0xf0,0x90,0x9e,0xa3,0xf0,0x90,0x9e,0xab,0x74,0x07, +0xf0,0xe4,0x90,0x9e,0xa2,0xf0,0x90,0x9e,0xa9,0xf0,0xa3,0x74,0x0b,0xf0,0x90,0x9e, +0xa7,0x74,0x01,0xf0,0xa3,0x74,0x03,0xf0,0x90,0x9e,0xa6,0x74,0x14,0xf0,0x90,0x9e, +0xac,0x74,0x05,0xf0,0xe4,0x90,0x9e,0xa5,0xf0,0x90,0x9e,0xa0,0xf0,0x90,0x9e,0x9c, +0xf0,0x90,0x9e,0xb2,0xf0,0x22,0xe4,0x90,0x9e,0xb1,0xf0,0x90,0x9e,0xa2,0xf0,0xf5, +0x6b,0x22,0xef,0xb4,0x01,0x07,0x7d,0xc8,0x7f,0x02,0x02,0x3a,0x71,0x7d,0x60,0x7f, +0x02,0x12,0x3a,0x54,0x90,0x01,0x3d,0x74,0x04,0xf0,0xa3,0x74,0xc8,0xf0,0x7d,0x04, +0x7f,0x01,0x12,0x3a,0xdf,0x7d,0xc8,0x7f,0x02,0x02,0x3a,0xdf,0xe5,0x57,0x60,0x08, +0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x61,0xe5,0x69,0x54,0x0f,0xd3,0x94,0x01,0x40, +0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x50,0x90,0x02,0x87,0xe0,0x60,0x08,0x90, +0x01,0xb9,0x74,0x04,0xf0,0x80,0x42,0x90,0x9e,0x9b,0xe0,0xb4,0x01,0x10,0x90,0x9e, +0x82,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x1c,0x80,0x2b,0x90,0x9e, +0x9b,0xe0,0x70,0x14,0x90,0x9d,0xa9,0xe0,0xff,0x90,0x9d,0xa8,0xe0,0x6f,0x60,0x08, +0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x11,0x90,0x9e,0xa5,0xe0,0x70,0x08,0x90,0x01, +0xb9,0x74,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x02,0xf0,0x7f, +0x00,0x22,0x90,0x06,0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x0a,0xe5,0x67,0xb4,0x01, +0x05,0xe4,0xff,0x12,0x47,0xd6,0x53,0x68,0xf0,0x43,0x68,0x0c,0x90,0x9e,0xd1,0xe0, +0x30,0xe0,0x07,0x90,0x05,0x27,0xe0,0x54,0x7f,0xf0,0x22,0x7f,0x01,0x51,0x72,0xe4, +0x90,0x9e,0xd2,0xf0,0x22,0x90,0x9e,0xd2,0xe0,0xfe,0x6f,0x70,0x02,0x81,0x59,0xef, +0x12,0x43,0x87,0x62,0xcc,0x00,0x63,0x00,0x01,0x63,0x3e,0x02,0x63,0x77,0x03,0x63, +0xae,0x04,0x63,0xe6,0x05,0x64,0x20,0x06,0x00,0x00,0x64,0x59,0xee,0xb4,0x04,0x04, +0x7f,0x01,0x81,0x8e,0x90,0x9e,0xd2,0xe0,0xff,0xb4,0x05,0x02,0x81,0x63,0xef,0xb4, +0x06,0x06,0x7f,0x01,0x91,0x78,0x80,0x16,0x90,0x9e,0xd2,0xe0,0xb4,0x03,0x06,0x7f, +0x01,0x91,0x5a,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x02,0x02,0x91,0x6d,0x80,0x9b, +0x90,0x9e,0xd2,0xe0,0xb4,0x04,0x06,0x7f,0x01,0x91,0x8e,0x80,0x09,0x90,0x9e,0xd2, +0xe0,0xb4,0x05,0x02,0x91,0x63,0x90,0x9e,0xd2,0xe0,0x70,0x02,0x81,0xa6,0x90,0x9e, +0xd2,0xe0,0xfe,0xb4,0x06,0x04,0x7f,0x01,0x81,0x78,0xee,0xb4,0x03,0x04,0x7f,0x01, +0x81,0x5a,0x90,0x9e,0xd2,0xe0,0x64,0x02,0x60,0x02,0x81,0x59,0x81,0x6d,0x90,0x9e, +0xd2,0xe0,0xb4,0x04,0x06,0x7f,0x01,0x91,0x8e,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4, +0x05,0x02,0x91,0x63,0x90,0x9e,0xd2,0xe0,0x70,0x04,0x91,0xa6,0x80,0x16,0x90,0x9e, +0xd2,0xe0,0xfe,0xb4,0x06,0x06,0x7f,0x01,0x91,0x78,0x80,0x08,0xee,0xb4,0x03,0x04, +0x7f,0x01,0x91,0x5a,0x02,0x8b,0xba,0x90,0x9e,0xd2,0xe0,0xb4,0x04,0x06,0x7f,0x01, +0x91,0x8e,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x05,0x02,0x91,0x63,0x90,0x9e,0xd2, +0xe0,0x70,0x04,0x91,0xa6,0x80,0x14,0x90,0x9e,0xd2,0xe0,0xfe,0xb4,0x06,0x06,0xe4, +0xff,0x91,0x78,0x80,0x06,0xee,0xb4,0x02,0x02,0x91,0x6d,0x02,0x68,0x4a,0x90,0x9e, +0xd2,0xe0,0xfe,0xb4,0x06,0x06,0xe4,0xff,0x91,0x78,0x80,0x13,0xee,0xb4,0x03,0x06, +0x7f,0x01,0x91,0x5a,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x02,0x02,0x91,0x6d,0x90, +0x9e,0xd2,0xe0,0xb4,0x01,0x04,0x51,0x9b,0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x05, +0x02,0x91,0x63,0x02,0x6a,0x3b,0x90,0x9e,0xd2,0xe0,0xfe,0xb4,0x06,0x06,0xe4,0xff, +0x91,0x78,0x80,0x13,0xee,0xb4,0x03,0x06,0x7f,0x01,0x91,0x5a,0x80,0x09,0x90,0x9e, +0xd2,0xe0,0xb4,0x02,0x02,0x91,0x6d,0x90,0x9e,0xd2,0xe0,0xb4,0x01,0x04,0x51,0x9b, +0x80,0x0b,0x90,0x9e,0xd2,0xe0,0xb4,0x04,0x04,0x7f,0x01,0x91,0x8e,0x02,0x8b,0xad, +0x90,0x9e,0xd2,0xe0,0xb4,0x04,0x06,0x7f,0x01,0x91,0x8e,0x80,0x09,0x90,0x9e,0xd2, +0xe0,0xb4,0x05,0x02,0x91,0x63,0x90,0x9e,0xd2,0xe0,0x70,0x04,0x91,0xa6,0x80,0x16, +0x90,0x9e,0xd2,0xe0,0xb4,0x03,0x06,0xe4,0xff,0x91,0x5a,0x80,0x09,0x90,0x9e,0xd2, +0xe0,0xb4,0x02,0x02,0x91,0x6d,0x12,0x8b,0xc7,0x22,0xf1,0x85,0x90,0x9e,0xd2,0x74, +0x01,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xd2,0xf0,0x22,0x90,0x05,0x22, +0xe4,0xf0,0x90,0x9e,0xd2,0x04,0xf0,0x22,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0xef, +0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xd2,0x74,0x01,0xf0,0x22,0x90,0x9f, +0x18,0xef,0xf0,0xf1,0x9e,0x90,0x9f,0x18,0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0, +0xe4,0x90,0x9e,0xd2,0xf0,0x22,0x12,0x68,0x03,0x90,0x9e,0xd2,0x74,0x01,0xf0,0x22, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0x74,0x12,0x43,0x7e,0xe4,0x90,0x9e, +0x77,0xf0,0x12,0x1f,0x04,0xc3,0x13,0x20,0xe0,0x02,0xc1,0x06,0x90,0x9e,0x74,0x12, +0x43,0x5e,0x12,0x1f,0x04,0xff,0x54,0x02,0xfe,0x90,0x9e,0xd7,0xe0,0x54,0xfd,0x4e, +0xfe,0xf0,0xef,0x54,0x01,0xff,0xee,0x54,0xfe,0x4f,0xff,0xf0,0x12,0x1f,0x04,0xfe, +0x54,0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff,0x90,0x9e,0xd7,0xf0,0xee,0x54,0x10,0xfe, +0xef,0x54,0xef,0x4e,0xff,0xf0,0x12,0x1f,0x04,0xfe,0x54,0x20,0xfd,0xef,0x54,0xdf, +0x4d,0xff,0x90,0x9e,0xd7,0xf0,0xee,0x54,0x40,0xfe,0xef,0x54,0xbf,0x4e,0xf0,0x20, +0xe0,0x02,0xa1,0xf5,0xf1,0x5a,0x90,0x9e,0x77,0x74,0x21,0xf0,0x90,0x9e,0x74,0x12, +0x43,0x5e,0x12,0x1f,0x04,0xff,0x13,0x13,0x54,0x01,0xfe,0x90,0x9e,0xd7,0xe0,0xfd, +0x13,0x13,0x54,0x01,0x6e,0x60,0x31,0xef,0x54,0x04,0xff,0xed,0x54,0xfb,0x4f,0xf0, +0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x15,0x90,0x01,0x34,0x74,0x40,0xf0,0xfd,0xe4, +0xff,0x12,0x3a,0xc5,0x90,0x9e,0x77,0xe0,0x44,0x08,0xf0,0x80,0x0b,0xe4,0x90,0x9e, +0xd9,0xf0,0x7d,0x40,0xff,0x12,0x3a,0x54,0x90,0x9e,0xd7,0xe0,0xfd,0x13,0x13,0x13, +0x54,0x1f,0x30,0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x12,0xf0,0xed,0xc4,0x54,0x0f, +0x30,0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x14,0xf0,0x90,0x9e,0xd7,0xe0,0xc4,0x13, +0x54,0x07,0x30,0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x80,0xf0,0x90,0x9e,0xd7,0xe0, +0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x40,0xf0,0x90, +0x9e,0x77,0xe0,0x90,0x05,0x27,0xf0,0x90,0x9e,0xd8,0xe0,0x70,0x05,0x7f,0x01,0x12, +0x68,0x90,0x90,0x9e,0xd7,0xe0,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x04,0x7f,0x03, +0x80,0x0e,0x7f,0x01,0x12,0x56,0x0b,0xef,0x60,0x04,0x7f,0x01,0x80,0x02,0x7f,0x02, +0x12,0x68,0x90,0xe1,0x55,0x90,0x9e,0x77,0x74,0x01,0xf0,0x90,0x05,0x27,0xf0,0xe4, +0xff,0x12,0x68,0x90,0xe1,0x53,0x90,0x9e,0x74,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff, +0x54,0x02,0xfe,0x90,0x9e,0xd1,0xe0,0x54,0xfd,0x4e,0xfe,0xf0,0xef,0x54,0x01,0xff, +0xee,0x54,0xfe,0x4f,0xff,0xf0,0x12,0x1f,0x04,0xfe,0x54,0x08,0xfd,0xef,0x54,0xf7, +0x4d,0xff,0x90,0x9e,0xd1,0xf0,0xee,0x54,0x10,0xfe,0xef,0x54,0xef,0x4e,0xff,0xf0, +0x12,0x1f,0x04,0x54,0x40,0xfe,0xef,0x54,0xbf,0x4e,0x90,0x9e,0xd1,0xf0,0x20,0xe0, +0x02,0xe1,0x26,0xf1,0x5a,0x90,0x9e,0x77,0x74,0x31,0xf0,0x90,0x9e,0x74,0x12,0x43, +0x5e,0x12,0x1f,0x04,0xff,0x13,0x13,0x54,0x01,0xfe,0x90,0x9e,0xd1,0xe0,0xfd,0x13, +0x13,0x54,0x01,0x6e,0x60,0x31,0xef,0x54,0x04,0xff,0xed,0x54,0xfb,0x4f,0xf0,0xe0, +0x13,0x13,0x54,0x3f,0x30,0xe0,0x15,0x90,0x01,0x34,0x74,0x40,0xf0,0xfd,0xe4,0xff, +0x12,0x3a,0xc5,0x90,0x9e,0x77,0xe0,0x44,0x08,0xf0,0x80,0x0b,0xe4,0x90,0x9e,0xd3, +0xf0,0x7d,0x40,0xff,0x12,0x3a,0x54,0x90,0x9e,0xd1,0xe0,0xfd,0x13,0x13,0x13,0x54, +0x1f,0x30,0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x02,0xf0,0xed,0xc4,0x54,0x0f,0x30, +0xe0,0x07,0x90,0x9e,0x77,0xe0,0x44,0x04,0xf0,0x90,0x9e,0x77,0xe0,0x54,0x0e,0x60, +0x0c,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x3a,0xdf,0x90,0x9e,0x77, +0xe0,0x90,0x05,0x27,0xf0,0x90,0x9e,0xd1,0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30, +0xe0,0x0c,0xa3,0xe0,0x64,0x06,0x60,0x5d,0x7f,0x06,0x51,0xa5,0x80,0x57,0x90,0x05, +0x27,0xe0,0x44,0x40,0xf0,0x90,0x9e,0xd2,0xe0,0xb4,0x06,0x15,0x7f,0x01,0x51,0xa5, +0xe4,0xff,0x12,0x56,0x0b,0xef,0x60,0x05,0x12,0x4c,0x80,0x80,0x04,0xf1,0xbb,0x80, +0x34,0x12,0x56,0x83,0x80,0x2f,0x90,0x9e,0x77,0x74,0x01,0xf0,0x90,0x05,0x27,0xf0, +0x7d,0x03,0x7f,0x02,0x12,0x3a,0x71,0x90,0x9e,0xd2,0xe0,0xb4,0x06,0x04,0x7f,0x01, +0x80,0x09,0x90,0x9e,0xd2,0xe0,0xb4,0x04,0x04,0xe4,0xff,0x51,0xa5,0x12,0x56,0x52, +0x12,0x44,0xe8,0xf1,0x5a,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e,0xd7,0xe0,0x54,0xfe, +0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90, +0x9e,0xd1,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0xa3,0xf0,0x22,0x90,0x9f,0x15,0xef,0xf0,0xf1,0x9e,0x90,0x9f,0x15,0xe0, +0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x53,0x68,0xf0,0x43,0x68,0x04,0x22,0x90,0x01, +0x01,0xe0,0x44,0x02,0xf0,0x90,0x01,0x00,0x74,0xff,0xf0,0x90,0x00,0x02,0xe0,0x44, +0x01,0xf0,0x12,0x4e,0x94,0x90,0x01,0xba,0xe4,0xf0,0x22,0x90,0x9e,0xa3,0xe0,0x60, +0x16,0x90,0x9e,0xd2,0xe0,0x70,0x04,0x7f,0x05,0x80,0x1f,0x90,0x9e,0xd2,0xe0,0x64, +0x01,0x70,0x19,0x7f,0x02,0x80,0x13,0x90,0x9e,0xd2,0xe0,0xb4,0x01,0x04,0x7f,0x03, +0x80,0x08,0x90,0x9e,0xd2,0xe0,0x70,0x04,0x7f,0x04,0x51,0xa5,0x22,0xf1,0x9e,0x90, +0x05,0x22,0x74,0x6f,0xf0,0x90,0x05,0x27,0xe0,0x54,0xbf,0xf0,0x90,0x9e,0xd8,0x74, +0x03,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x67,0xb4,0x01,0x05,0x7f, +0x01,0x12,0x47,0xd6,0x53,0x68,0xf0,0x43,0x68,0x04,0x90,0x9e,0xd1,0xe0,0x30,0xe0, +0x07,0x90,0x05,0x27,0xe0,0x44,0x80,0xf0,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x31, +0xe2,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x3a, +0xc5,0x11,0x59,0x53,0x68,0xf0,0x43,0x68,0x02,0x22,0x11,0x29,0x90,0x9e,0xd2,0x74, +0x03,0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0x90,0x00,0x02,0xe0,0x54,0xfe,0xf0, +0x12,0x4e,0x94,0x90,0x01,0x00,0x74,0x3f,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0x90,0x05, +0x53,0xe0,0x44,0x20,0xf0,0x90,0x01,0xba,0x74,0xcc,0xf0,0x22,0x31,0xe2,0xef,0x70, +0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x11,0x59,0x90,0x9e,0xd8,0x74,0x02,0xf0,0x22, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xd8,0xe0,0x90,0x9f,0x17,0xf0,0x6f, +0x70,0x02,0x21,0x5c,0xef,0x14,0x60,0x3b,0x14,0x60,0x5f,0x14,0x70,0x02,0x21,0x35, +0x24,0x03,0x60,0x02,0x21,0x5c,0x90,0x9f,0x17,0xe0,0xb4,0x03,0x04,0x31,0x7d,0x21, +0x5c,0x90,0x9f,0x17,0xe0,0xb4,0x02,0x04,0x31,0x95,0x21,0x5c,0x90,0x9f,0x17,0xe0, +0xb4,0x04,0x04,0x31,0x99,0x21,0x5c,0x90,0x9f,0x17,0xe0,0x64,0x01,0x70,0x7d,0x31, +0x7f,0x80,0x79,0x90,0x9f,0x17,0xe0,0xff,0xb4,0x03,0x04,0x31,0xcf,0x80,0x6d,0xef, +0xb4,0x02,0x04,0x31,0xb1,0x80,0x65,0x90,0x9f,0x17,0xe0,0xff,0xb4,0x04,0x04,0x31, +0xa6,0x80,0x59,0xef,0x70,0x56,0x31,0x6a,0x80,0x52,0x90,0x9f,0x17,0xe0,0xb4,0x03, +0x04,0x31,0xbf,0x80,0x47,0x90,0x9f,0x17,0xe0,0xb4,0x01,0x04,0x11,0x7c,0x80,0x3c, +0x90,0x9f,0x17,0xe0,0xb4,0x04,0x04,0x31,0x9d,0x80,0x31,0x90,0x9f,0x17,0xe0,0x70, +0x2b,0x31,0x61,0x80,0x27,0x90,0x9f,0x17,0xe0,0xff,0xb4,0x01,0x05,0x12,0x67,0xef, +0x80,0x1a,0xef,0xb4,0x02,0x05,0x12,0x67,0xed,0x80,0x11,0x90,0x9f,0x17,0xe0,0xff, +0xb4,0x04,0x04,0x51,0x29,0x80,0x05,0xef,0x70,0x02,0x31,0x65,0xd0,0xd0,0x92,0xaf, +0x22,0x31,0x6a,0x01,0x7c,0x31,0x6a,0x02,0x67,0xef,0x90,0x01,0x3e,0x74,0x03,0xf0, +0xfd,0x7f,0x02,0x12,0x3a,0xdf,0x90,0x9e,0xd8,0x74,0x01,0xf0,0x22,0x31,0xcf,0x7d, +0x03,0x7f,0x02,0x12,0x3a,0x71,0x90,0x05,0x27,0xe4,0xf0,0xe0,0x54,0xbf,0xf0,0xe4, +0x90,0x9e,0xd8,0xf0,0x22,0x31,0xb1,0x80,0xe6,0x31,0xa6,0x80,0xe2,0x11,0x59,0x90, +0x9e,0xd8,0x74,0x02,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xd8,0x04,0xf0, +0x22,0x12,0x67,0x9e,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xd8,0x04,0xf0,0x22,0x90, +0x05,0x27,0xe0,0x44,0x40,0xf0,0x11,0x53,0x90,0x9e,0xd8,0x74,0x02,0xf0,0x22,0x90, +0x05,0x22,0xe4,0xf0,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0x90,0x9e,0xd8,0x74,0x01, +0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0xe4,0x90,0x9f,0x0e,0xf0,0xa3,0xf0,0x90, +0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70, +0x03,0x7f,0x01,0x22,0xd3,0x90,0x9f,0x0f,0xe0,0x94,0xe8,0x90,0x9f,0x0e,0xe0,0x94, +0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x3b,0x3b,0x90,0x9f,0x0e, +0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x80,0xc6,0x02,0x67,0xef,0x31,0x6a,0x90,0x05, +0x22,0x74,0xff,0xf0,0x90,0x9e,0xd8,0x74,0x04,0xf0,0x22,0x11,0x53,0x90,0x9e,0xd2, +0x74,0x04,0xf0,0x22,0x8f,0x25,0xe4,0x90,0x9f,0x0a,0xf0,0xa3,0xf0,0x90,0x01,0x09, +0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x25,0x60,0x3e,0xc3,0x90,0x9f, +0x0b,0xe0,0x94,0x88,0x90,0x9f,0x0a,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0, +0x44,0x80,0xf0,0x22,0x90,0x9f,0x0a,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x14, +0x7e,0x00,0x12,0x3b,0x3b,0xd3,0x90,0x9f,0x0b,0xe0,0x94,0x32,0x90,0x9f,0x0a,0xe0, +0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x90,0x9e,0x9b,0xe0, +0xb4,0x01,0x04,0x7d,0x91,0x80,0x0c,0x90,0x9e,0x9b,0xe0,0x70,0x04,0x7d,0x90,0x80, +0x02,0xe4,0xfd,0x7f,0x93,0x12,0x4f,0x89,0x90,0x00,0x29,0xe0,0x54,0x3f,0xfd,0x7f, +0x29,0x12,0x4f,0x89,0x90,0x00,0x28,0xe0,0x54,0xfc,0xfd,0x7f,0x28,0x12,0x4f,0x89, +0x90,0x00,0x08,0xe0,0x44,0x10,0xfd,0x7f,0x08,0x12,0x4f,0x89,0x7f,0x01,0x51,0x44, +0x90,0x00,0x00,0xe0,0x44,0x20,0xfd,0xe4,0xff,0x12,0x4f,0x89,0x90,0x00,0x20,0xe0, +0x54,0xfe,0xfd,0x7f,0x20,0x12,0x4f,0x89,0x90,0x00,0x90,0xe0,0x44,0x01,0xfd,0x7f, +0x90,0x12,0x4f,0x89,0x7f,0x14,0x7e,0x00,0x02,0x3b,0x3b,0x53,0x68,0xf0,0x43,0x68, +0x01,0x51,0x9c,0x12,0x4f,0x9e,0x53,0x68,0xf0,0x43,0x68,0x02,0x22,0xe5,0x69,0x30, +0xe6,0x19,0xe5,0x69,0x54,0x0f,0xff,0x90,0x9e,0x9f,0xe0,0xfe,0x4f,0x90,0x01,0x2f, +0xf0,0xee,0x64,0x80,0x90,0x9e,0x9f,0xf0,0x53,0x69,0xbf,0x22,0x8f,0x26,0x12,0x4f, +0xf8,0xef,0x64,0x01,0x70,0x2e,0x90,0x9e,0x98,0x12,0x50,0x26,0xe5,0x26,0x60,0x10, +0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e, +0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04, +0x1f,0x74,0x20,0xf0,0x22,0x90,0x06,0xa9,0xe0,0x90,0x9e,0x52,0xf0,0xe0,0x54,0xc0, +0x70,0x09,0x53,0x6b,0xfe,0x53,0x6b,0xfd,0x02,0x44,0xe8,0x90,0x9e,0x52,0xe0,0x30, +0xe6,0x1e,0x90,0x9e,0xa0,0xe0,0x70,0x08,0x43,0x6b,0x01,0x12,0x56,0x19,0x80,0x13, +0x90,0x9e,0xb0,0xe0,0xb4,0x01,0x0c,0x43,0x6b,0x04,0x7f,0x01,0x71,0x3c,0x80,0x03, +0x53,0x6b,0xfe,0x90,0x9e,0x52,0xe0,0x30,0xe7,0x23,0x43,0x6b,0x02,0xe4,0xf5,0x48, +0x90,0x9e,0xa8,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9, +0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0xb1,0x74,0x01,0xf0,0x22,0x53,0x6b,0xfd, +0x22,0xe5,0x67,0x64,0x01,0x70,0x66,0xe5,0x6a,0x60,0x62,0xe5,0x6a,0x64,0x02,0x60, +0x06,0xe5,0x6a,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x9e,0xa1,0xf0,0x90, +0x06,0xaa,0xe0,0x90,0x9e,0xaf,0xf0,0x90,0x9e,0xa1,0xe0,0x70,0x07,0x90,0x9e,0xaf, +0xe0,0xff,0x80,0x05,0x90,0x9e,0xa1,0xe0,0xff,0x90,0x9e,0xa1,0xef,0xf0,0x90,0x9e, +0xa3,0xe0,0x60,0x03,0xe0,0x14,0xf0,0xe4,0x90,0x9e,0xa2,0xf0,0x90,0x01,0x57,0xf0, +0x90,0x01,0x3c,0x74,0x02,0xf0,0x53,0x6b,0xfd,0x53,0x6b,0xef,0xe5,0x6a,0x14,0x24, +0xfd,0x50,0x06,0x24,0xfd,0x50,0x04,0x80,0x04,0x80,0x03,0x71,0x75,0x22,0x90,0x06, +0xa9,0xe0,0x90,0x9e,0x52,0xf0,0xe0,0x54,0xc0,0x70,0x09,0x53,0x6b,0xfe,0x53,0x6b, +0xfd,0x12,0x44,0xe8,0x90,0x9e,0x52,0xe0,0x30,0xe6,0x15,0x43,0x6b,0x01,0x90,0x9e, +0xb0,0xe0,0x64,0x02,0x60,0x05,0x12,0x56,0x19,0x80,0x08,0x12,0x5e,0xf4,0x80,0x03, +0x53,0x6b,0xfe,0x90,0x9e,0x52,0xe0,0x30,0xe7,0x23,0x43,0x6b,0x02,0xe4,0xf5,0x48, +0x90,0x9e,0xa8,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9, +0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0xb1,0x74,0x01,0xf0,0x22,0x53,0x6b,0xfd, +0x22,0xe5,0x6a,0x60,0x39,0x90,0x9e,0xb1,0xe0,0x60,0x0d,0xe4,0xf0,0x53,0x6b,0xfd, +0xe5,0x6b,0x54,0x07,0x70,0x28,0x80,0x23,0x90,0x9e,0xa2,0xe0,0x04,0xf0,0x53,0x6b, +0xef,0x90,0x9e,0xa7,0xe0,0xff,0x90,0x9e,0xa2,0xe0,0xd3,0x9f,0x40,0x0d,0xe5,0x67, +0xb4,0x01,0x0b,0xa3,0xe0,0x70,0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xe8,0x22,0xd3, +0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xf8,0x12,0x43,0x7e,0x90,0x9e,0xfb,0xe0, +0x54,0xf0,0x44,0x06,0xff,0xf0,0xed,0x54,0x0f,0xc4,0x54,0xf0,0xfe,0xef,0x54,0x0f, +0x4e,0xf0,0x90,0x9e,0xf8,0x12,0x43,0x5e,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7b,0x01, +0x7a,0x9e,0x79,0xfb,0x12,0x48,0xde,0xd0,0xd0,0x92,0xaf,0x22,0xe0,0xfd,0x74,0x26, +0x25,0x13,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xed,0xf0,0xaf,0x13,0xd3,0x10,0xaf, +0x01,0xc3,0xc0,0xd0,0xef,0xc3,0x94,0x20,0x50,0x0e,0x74,0x84,0x2f,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xed,0xf0,0x80,0x29,0x74,0xa6,0x2f,0xf5,0x82,0xe4,0x34,0x9c, +0xf5,0x83,0xed,0xf0,0x90,0x9e,0xc4,0xef,0xf0,0x24,0xa6,0xf5,0x82,0xe4,0x34,0x9c, +0xf5,0x83,0xe0,0x90,0x9e,0xc5,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0xc4,0x7d,0x02,0x91, +0xef,0xd0,0xd0,0x92,0xaf,0x22,0x8f,0x0a,0x8d,0x0b,0xe5,0x0b,0x54,0x1f,0xf5,0x10, +0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x0e,0x90,0x04,0xfd, +0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, +0x40,0x04,0xaf,0x0a,0x80,0x33,0xe5,0x0e,0x25,0x0d,0xf5,0x0f,0xe5,0x10,0x90,0x41, +0xdc,0x93,0xff,0xe5,0x0f,0xd3,0x9f,0x74,0x01,0x40,0x11,0x25,0x0a,0xf5,0x82,0xe4, +0x34,0x94,0xf5,0x83,0xe4,0xf0,0xad,0x0b,0xaf,0x0a,0xa1,0x3d,0x25,0x0a,0xf5,0x82, +0xe4,0x34,0x94,0xf5,0x83,0xe5,0x0f,0xf0,0x22,0xad,0x07,0x75,0xf0,0x09,0xed,0x90, +0x96,0x48,0x12,0x43,0x52,0xe0,0xff,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5, +0x83,0xe0,0x54,0x1f,0xf5,0x12,0xd3,0x9f,0x40,0x02,0x8f,0x12,0xe5,0x12,0x25,0xe0, +0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff, +0xe5,0x12,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x05,0xad,0x12, +0xb1,0x3d,0xaf,0x12,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef,0x30,0xe0,0x17,0xed, +0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5, +0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34, +0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82,0xe4,0x34,0x04,0xf5, +0x83,0xe0,0x4d,0xf0,0x22,0xad,0x07,0xed,0xc3,0x94,0x20,0x50,0x0d,0x74,0x84,0x2d, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x80,0x0b,0x74,0xa6,0x2d,0xf5,0x82,0xe4, +0x34,0x9c,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1e,0xe5,0x1e,0x54,0x1f,0xfc,0x75,0xf0, +0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x52,0xe0,0xff,0x90,0x9e,0x73,0xf0,0xed,0x25, +0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e, +0x74,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b, +0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x76,0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25, +0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01,0x93, +0xfb,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xea,0xf0,0xa3, +0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xe1,0xb3,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34, +0x9d,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x9e,0x73,0xe0,0xff,0xeb,0xd3,0x9f,0x40, +0x02,0xe1,0xe4,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01,0x7e, +0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e, +0x74,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50,0x40, +0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, +0xff,0x90,0x9e,0x76,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x23,0xbb,0x11,0x09, +0x90,0x9e,0x75,0xe0,0x30,0xe7,0x02,0x7b,0x17,0xeb,0x64,0x13,0x60,0x03,0xbb,0x12, +0x09,0x90,0x9e,0x74,0xe0,0x30,0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1e,0x80,0x34, +0x0b,0x80,0x84,0x90,0x9e,0x73,0xe0,0xfb,0x6c,0x70,0x69,0x74,0x67,0x2d,0xf5,0x82, +0xe4,0x34,0x9d,0xf5,0x83,0xec,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4a,0x12,0x43, +0x52,0xe0,0xb4,0x01,0x0c,0xe5,0x1e,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1e,0x80, +0x03,0xaf,0x1e,0x22,0xec,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3, +0xef,0xf0,0x80,0x5b,0xec,0xd3,0x9b,0x40,0x56,0x90,0x9e,0x73,0xe0,0xff,0x74,0x67, +0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1e,0xec,0x25, +0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, +0xff,0xec,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1e,0x22,0x74, +0x01,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1e,0x44, +0x80,0xfd,0x12,0x6d,0x3d,0xe5,0x1e,0x44,0x80,0xff,0x22,0xac,0x07,0xec,0xc3,0x94, +0x20,0x50,0x0d,0x74,0x84,0x2c,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x80,0x0b, +0x74,0xa6,0x2c,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1e,0xe5, +0x1e,0x54,0x1f,0xff,0x90,0x9e,0x75,0xf0,0x75,0xf0,0x09,0xec,0x90,0x96,0x49,0x12, +0x43,0x52,0xe0,0x90,0x9e,0x77,0xf0,0x75,0xf0,0x09,0xec,0x90,0x96,0x48,0x12,0x43, +0x52,0xe0,0xfe,0x90,0x9e,0x78,0xf0,0xec,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34, +0x9b,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x79,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, +0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, +0x9e,0x7b,0xcb,0xf0,0xa3,0xeb,0xf0,0xef,0xd3,0x9e,0x40,0x0a,0x90,0x9e,0x78,0xe0, +0x90,0x9e,0x75,0xf0,0xf5,0x1e,0xed,0x70,0x02,0x21,0xf1,0x90,0x9e,0x76,0xed,0xf0, +0xe5,0x1e,0x30,0xe6,0x0a,0x90,0x9e,0x75,0xe0,0xf5,0x1e,0xa3,0xe0,0x14,0xf0,0x90, +0x9e,0x76,0xe0,0x70,0x02,0x21,0xf1,0x90,0x9e,0x75,0xe0,0xff,0xd3,0x94,0x00,0x50, +0x02,0x21,0xf1,0xe4,0x90,0x9e,0x74,0xf0,0xef,0x14,0x90,0x9e,0x73,0xf0,0x90,0x9e, +0x77,0xe0,0xfd,0x90,0x9e,0x73,0xe0,0xff,0xd3,0x9d,0x40,0x6b,0xef,0x94,0x10,0x40, +0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x7b,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e, +0x70,0x27,0x90,0x9e,0x73,0xe0,0xff,0xc3,0x94,0x10,0x50,0x33,0x74,0x01,0x7e,0x00, +0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x79, +0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x16,0x90,0x9e,0x73,0xe0,0xf5,0x1e,0xa3, +0xe0,0x04,0xf0,0x90,0x9e,0x76,0xe0,0xff,0x90,0x9e,0x74,0xe0,0x6f,0x60,0x08,0x90, +0x9e,0x73,0xe0,0x14,0xf0,0x80,0x87,0x90,0x9e,0x76,0xe0,0xff,0x90,0x9e,0x74,0xe0, +0xc3,0x9f,0x50,0x0d,0x90,0x9e,0x73,0xe0,0xb5,0x05,0x06,0x90,0x9e,0x77,0xe0,0xf5, +0x1e,0xe5,0x1e,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93, +0xfe,0x74,0x01,0x93,0xff,0xe5,0x1e,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41, +0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff, +0xec,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef, +0xf0,0xaf,0x04,0xad,0x1e,0x12,0x6d,0x3d,0xaf,0x1e,0x22,0xe4,0xf5,0x13,0xe5,0x13, +0xb4,0x20,0x14,0x90,0x9a,0xc5,0xe0,0x04,0xf0,0x90,0x95,0x01,0xe0,0xff,0x90,0x9a, +0xc5,0xe0,0xb5,0x07,0x02,0xe4,0xf0,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x4b,0x12, +0x43,0x52,0xe0,0x64,0x01,0x60,0x03,0x02,0x78,0x83,0xe5,0x13,0x25,0xe0,0x24,0x80, +0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3,0x94,0x00,0xee,0x94, +0x00,0x50,0x03,0x02,0x78,0x83,0xe5,0x13,0x94,0x20,0x40,0x09,0x90,0x9a,0xc5,0xe0, +0x60,0x03,0x02,0x78,0x8f,0xe5,0x13,0x75,0xf0,0x0a,0xa4,0x24,0x00,0xf9,0x74,0x90, +0x35,0xf0,0x75,0x18,0x01,0xf5,0x19,0x89,0x1a,0xe5,0x13,0x25,0xe0,0x24,0x80,0xf5, +0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x9e,0x6d,0xcf,0xf0,0xa3, +0xef,0xf0,0xe5,0x13,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0, +0xff,0xa3,0xe0,0x90,0x9e,0x6f,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x13,0xc3,0x94,0x20, +0x50,0x14,0x74,0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f, +0x90,0x9e,0x69,0xf0,0x80,0x12,0x74,0xa6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5, +0x83,0xe0,0x54,0x3f,0x90,0x9e,0x69,0xf0,0x90,0x9e,0x69,0xe0,0xfe,0x54,0x1f,0xa3, +0xf0,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x48,0x12,0x43,0x52,0xe0,0x90,0x9e,0x72, +0xf0,0x74,0xe6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xc3,0x94,0x05, +0x40,0x02,0xa1,0x5c,0x90,0x9e,0x72,0xe0,0xff,0x90,0x9e,0x6a,0xe0,0x9f,0x40,0x13, +0x90,0x9e,0x72,0xe0,0x90,0x9e,0x6a,0xf0,0xee,0x54,0x40,0xfe,0x90,0x9e,0x69,0xf0, +0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x54,0x05,0x64,0x01,0x70,0x29,0x90,0x9e,0x6a, +0xe0,0xff,0x90,0x41,0x50,0x93,0xfe,0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a, +0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xe0,0x80,0x30,0x90,0x9e,0x6a, +0xe0,0x90,0x40,0xfc,0x80,0x27,0x90,0x9e,0x6a,0xe0,0xff,0x90,0x41,0x50,0x93,0xfe, +0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06, +0xef,0x90,0x41,0x18,0x80,0x07,0x90,0x9e,0x6a,0xe0,0x90,0x41,0x34,0x93,0x90,0x9e, +0x71,0xf0,0x90,0x9e,0x71,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x56,0xf9,0x74,0x40,0x35, +0xf0,0x75,0x15,0xff,0xf5,0x16,0x89,0x17,0x90,0x9e,0x69,0xe0,0x90,0x41,0xf8,0x93, +0xff,0xd3,0x90,0x9e,0x70,0xe0,0x9f,0x90,0x9e,0x6f,0xe0,0x94,0x00,0x40,0x09,0xe4, +0xfd,0xaf,0x13,0x11,0x9b,0x02,0x78,0x1a,0xe5,0x13,0x25,0xe0,0x24,0xc2,0xf5,0x82, +0xe4,0x34,0x95,0xf5,0x83,0xe0,0xf5,0x1b,0xa3,0xe0,0xf5,0x1c,0xab,0x15,0xaa,0x16, +0xa9,0x17,0x12,0x1f,0x04,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,0x42, +0x6a,0xfd,0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5, +0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0x7e,0x00, +0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x02,0x12,0x42,0x95,0xfd,0xac,0xf0,0x12, +0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16, +0xa9,0x17,0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9, +0x1a,0x90,0x00,0x04,0x12,0x42,0x95,0xfd,0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c, +0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x03, +0x12,0x1f,0x1d,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x06,0x12, +0x42,0x95,0xfd,0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b, +0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0x7e, +0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x08,0x12,0x42,0x95,0xfd,0xac,0xf0, +0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa, +0x16,0xa9,0x17,0x90,0x00,0x05,0x12,0x1f,0x1d,0xff,0x7e,0x00,0x90,0x9e,0x6d,0xe0, +0xfc,0xa3,0xe0,0xfd,0x12,0x1f,0x4a,0xd3,0xe5,0x1c,0x9f,0xe5,0x1b,0x9e,0x40,0x0c, +0xe5,0x1c,0x9f,0xf5,0x1c,0xe5,0x1b,0x9e,0xf5,0x1b,0x80,0x05,0xe4,0xf5,0x1b,0xf5, +0x1c,0xe5,0x13,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe5,0x1b, +0xf0,0xa3,0xe5,0x1c,0xf0,0x90,0x9e,0x69,0xe0,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4, +0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,0x95,0x1b,0x50,0x07, +0xaf,0x13,0x12,0x6e,0x95,0xe1,0xee,0x90,0x9e,0x69,0xe0,0x25,0xe0,0x24,0xa4,0xf5, +0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,0x95,0x1b, +0x50,0x02,0xe1,0xee,0x7d,0x01,0xaf,0x13,0x11,0x9b,0xe1,0xee,0x74,0xe6,0x25,0x13, +0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02,0xc1,0xf7,0x90, +0x96,0x43,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x9e,0x6a,0xe0,0xc3,0x94,0x19,0x40,0x3d, +0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x9e,0x6a,0xe0,0xc3,0x94,0x11,0x40,0x2e,0x80, +0x1f,0x90,0x96,0x43,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x9e,0x6a,0xe0,0xc3,0x94,0x0a, +0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x9e,0x6a,0xe0,0xc3,0x94,0x03,0x40,0x0d, +0x90,0x9a,0x84,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x9a,0x84,0xf0,0x74,0x84,0x25, +0x13,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1d,0x74,0x44,0x25,0x13,0xf5, +0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02,0xc1,0xa4,0x90, +0x9a,0x84,0xe0,0x64,0x01,0x60,0x02,0xc1,0xa4,0x74,0x85,0x25,0x13,0xf5,0x82,0xe4, +0x34,0x9a,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff,0xe4,0x33,0xfe, +0x74,0x41,0x25,0x13,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xfd,0xd3,0x9f,0xee, +0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4,0x33,0xfe,0x74, +0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xd3,0x9f,0xee,0x64,0x80, +0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x26,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9d,0xf5, +0x83,0xe0,0xff,0x90,0x9e,0x6a,0xe0,0x6f,0x60,0x3d,0x74,0x44,0x25,0x13,0xf5,0x82, +0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75,0x1d,0x05,0x80, +0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1d,0x03,0x80,0x03,0x75,0x1d,0x01,0x74, +0x41,0x25,0x13,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xef,0xf0,0x74,0x85,0x25,0x13, +0xf5,0x82,0xe4,0x34,0x9a,0x80,0x29,0x74,0xe6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c, +0xf5,0x83,0xe4,0xf0,0x74,0x85,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0, +0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1d,0x74,0xe6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c, +0xf5,0x83,0xe4,0xf0,0x90,0x9e,0x6a,0xe0,0xff,0x74,0x26,0x25,0x13,0xf5,0x82,0xe4, +0x34,0x9d,0xf5,0x83,0xef,0xf0,0x74,0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x98,0xf5, +0x83,0xe5,0x1d,0xf0,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x4c,0x12,0x43,0x52,0xe0, +0xb4,0x01,0x10,0xe4,0xf5,0x1d,0x74,0xe6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5, +0x83,0xe4,0xf0,0xad,0x1d,0xe1,0xe9,0xec,0x64,0x06,0x60,0x02,0xe1,0xee,0xf5,0x1b, +0xf5,0x1c,0x90,0x42,0x19,0x93,0xff,0x7e,0x00,0x90,0x9e,0x6d,0xe0,0xfc,0xa3,0xe0, +0xfd,0x12,0x1f,0x4a,0x90,0x9e,0x6b,0xee,0xf0,0xa3,0xef,0xf0,0x74,0x84,0x25,0x13, +0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1d,0xe4,0xf5,0x14,0xab,0x18,0xaa, +0x19,0xa9,0x1a,0x75,0xf0,0x02,0xe5,0x14,0xa4,0xf5,0x82,0x85,0xf0,0x83,0x12,0x42, +0x95,0xfd,0xac,0xf0,0xe5,0x14,0x90,0x42,0x14,0x93,0xff,0x7e,0x00,0x12,0x1f,0x4a, +0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xc3,0x90,0x9e,0x6c,0xe0,0x95, +0x1c,0x90,0x9e,0x6b,0xe0,0x95,0x1b,0x40,0x07,0x05,0x14,0xe5,0x14,0xb4,0x05,0xbd, +0xe5,0x14,0xc3,0x13,0xf5,0x14,0xe5,0x1d,0xb4,0x01,0x06,0xe5,0x14,0x70,0x46,0x80, +0x13,0xe5,0x1d,0xb4,0x03,0x15,0xe5,0x14,0x70,0x05,0x75,0x1d,0x03,0x80,0x39,0xe5, +0x14,0xb4,0x01,0x05,0x75,0x1d,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1d,0xb4,0x05,0x28, +0xe5,0x14,0x70,0x05,0x75,0x1d,0x05,0x80,0x0d,0xe5,0x14,0xb4,0x01,0x05,0x75,0x1d, +0x03,0x80,0x03,0x75,0x1d,0x01,0xd3,0x90,0x9e,0x70,0xe0,0x94,0x03,0x90,0x9e,0x6f, +0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1d,0xd3,0x90,0x9e,0x70,0xe0,0x94,0x03,0x90, +0x9e,0x6f,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1d,0x74,0x84,0x25,0x13,0xf5,0x82, +0xe4,0x34,0x98,0xf5,0x83,0xe5,0x1d,0xf0,0xfd,0xaf,0x13,0x12,0x6e,0x55,0x74,0xe6, +0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74,0xe6,0x50, +0x0e,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x04,0xf0,0x80,0x0b,0x25, +0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0xab,0x18,0xaa,0x19,0xa9,0x1a, +0xe4,0xf5,0xf0,0x12,0x42,0xcd,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x02,0xe4, +0xf5,0xf0,0x12,0x42,0xec,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x42,0xec,0x90,0x00, +0x06,0xe4,0xf5,0xf0,0x12,0x42,0xec,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12,0x42,0xec, +0xe5,0x13,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xe5,0x13,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0, +0xa3,0xf0,0xe5,0x13,0x25,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4, +0xf0,0xa3,0xf0,0x05,0x13,0xe5,0x13,0xc3,0x94,0x40,0x50,0x03,0x02,0x72,0x3e,0x22, +0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0,0xa3,0xe4, +0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0,0x0d,0xbd, +0x10,0xf0,0xe4,0x90,0x9a,0xc5,0xf0,0x90,0x95,0x01,0x04,0xf0,0xe4,0xfd,0x75,0xf0, +0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed, +0x90,0x90,0x02,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90, +0x04,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12, +0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x52, +0xe4,0xf0,0xa3,0xf0,0x74,0x26,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0x74,0x13, +0xf0,0x74,0x85,0x2d,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,0x74,0x84,0x2d, +0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xed,0x25,0xe0,0x24,0x80,0xf5,0x82, +0xe4,0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0xc4,0xf5,0x82, +0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0xc4,0xf5,0x82, +0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0x44,0xf5,0x82, +0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82, +0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0,0x24,0x46,0xf5,0x82, +0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x86,0x2d,0xf5,0x82,0xe4,0x34, +0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x46,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4, +0xf0,0x74,0xe6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xca, +0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x92,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93, +0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4b,0x12, +0x43,0x52,0x74,0x01,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4a,0x12,0x43,0x52,0x74, +0x01,0xf0,0x74,0x82,0x2d,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0c,0xf0,0x75, +0xf0,0x09,0xed,0x90,0x96,0x46,0x12,0x43,0x52,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0, +0x09,0xed,0x90,0x96,0x44,0x12,0x43,0x52,0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0, +0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x52,0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90, +0x96,0x49,0x12,0x43,0x52,0xe4,0xf0,0xed,0xc3,0x94,0x20,0x50,0x0f,0x74,0x84,0x2d, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x80,0x0d,0x74,0xa6,0x2d,0xf5, +0x82,0xe4,0x34,0x9c,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x40,0x60,0x02,0x01, +0xbe,0x22,0x8f,0x13,0xef,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xaf,0x82, +0xf5,0x15,0x8f,0x16,0xe5,0x13,0x75,0xf0,0x02,0xa4,0x24,0x02,0xf9,0x74,0x95,0x35, +0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x46, +0x12,0x43,0x52,0xaf,0x82,0x85,0x83,0x1a,0x8f,0x1b,0xe5,0x13,0x75,0xf0,0x09,0xa4, +0x24,0x44,0xf9,0x74,0x96,0x35,0xf0,0x75,0x1c,0x01,0xf5,0x1d,0x89,0x1e,0x74,0x82, +0x25,0x13,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x12,0x43,0x87,0x7a,0xe2,0x00, +0x7a,0xf7,0x01,0x7b,0x0c,0x02,0x7b,0x21,0x03,0x7b,0x4a,0x04,0x7b,0x5f,0x05,0x7b, +0x74,0x06,0x7b,0x9a,0x0c,0x7b,0xc7,0x0d,0x7b,0xf4,0x0e,0x7c,0x21,0x0f,0x00,0x00, +0x7c,0x55,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74, +0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4, +0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x13,0x25,0xe0, +0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, +0x12,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0, +0xf0,0xa3,0xe4,0xf0,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x81,0x55,0xe5,0x13,0x25,0xe0,0x24,0xc6, +0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27,0xe5, +0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0x0f,0xf0,0xa3, +0x74,0xf0,0x80,0x12,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5, +0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x81,0x55,0x90,0x04,0x47,0xe0,0xab,0x17, +0xaa,0x18,0xa9,0x19,0x12,0x42,0x20,0x90,0x04,0x46,0xe0,0xab,0x17,0xaa,0x18,0xa9, +0x19,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x04,0x45,0xe0,0x85,0x16,0x82,0x85,0x15, +0x83,0xf0,0x90,0x04,0x44,0x81,0x4c,0x90,0x04,0x4b,0xe0,0xab,0x17,0xaa,0x18,0xa9, +0x19,0x12,0x42,0x20,0x90,0x04,0x4a,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, +0x01,0x12,0x42,0x32,0x90,0x04,0x49,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xf0,0x90, +0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x12,0x42, +0x20,0x90,0x04,0x4e,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x01,0x12,0x42, +0x32,0x90,0x04,0x4d,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xf0,0x90,0x04,0x4c,0x80, +0x2b,0x90,0x04,0x53,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x12,0x42,0x20,0x90,0x04, +0x52,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x04, +0x51,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xf0,0x90,0x04,0x50,0xe0,0x85,0x16,0x82, +0x85,0x15,0x83,0xa3,0xf0,0xab,0x17,0xaa,0x18,0xa9,0x19,0xc0,0x03,0xc0,0x02,0xc0, +0x01,0x12,0x1f,0x04,0xff,0xab,0x1c,0xaa,0x1d,0xa9,0x1e,0x12,0x1f,0x04,0x5f,0xd0, +0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x20,0xab,0x17,0xe5,0x19,0x24,0x01,0xf9,0xe4, +0x35,0x18,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x1f,0x04,0xff,0xab,0x1c,0xaa, +0x1d,0xa9,0x1e,0x90,0x00,0x01,0x12,0x1f,0x1d,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03, +0x12,0x42,0x20,0x85,0x16,0x82,0x85,0x15,0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85, +0x1b,0x82,0x85,0x1a,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0x85,0x16, +0x82,0x85,0x15,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1b,0x82,0x85,0x1a, +0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x13,0x25,0xe0,0x24, +0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0x75, +0x14,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce, +0xd8,0xf9,0xff,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x14,0x24,0x10,0x80,0x5d,0x15, +0x14,0xe5,0x14,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x13,0x25,0xe0,0x24,0xc6, +0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3d,0x75,0x14, +0x0f,0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0, +0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x9e,0x80,0xe5,0x14,0xf0,0x80,0x10, +0x15,0x14,0xe5,0x14,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90,0x9e,0x80,0xf0, +0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfe,0xa3, +0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x14,0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82, +0xe4,0x34,0x9b,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x9e, +0x81,0xe5,0x14,0xf0,0x80,0x5b,0x05,0x14,0xe5,0x14,0xb4,0x10,0xca,0x80,0x52,0xe5, +0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0, +0x4e,0x60,0x39,0xe4,0xf5,0x14,0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05,0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x14,0x24, +0x10,0x80,0x0a,0x05,0x14,0xe5,0x14,0xb4,0x0c,0xcc,0x80,0x05,0xe4,0x90,0x9e,0x81, +0xf0,0x90,0x9e,0x80,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x48,0x12,0x43, +0x52,0xef,0xf0,0x90,0x9e,0x81,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x49, +0x12,0x43,0x52,0xee,0xf0,0x74,0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, +0xe0,0xd3,0x9f,0x40,0x06,0x90,0x9e,0x80,0x12,0x6d,0x2c,0x74,0x84,0x25,0x13,0xf5, +0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x9e,0x81,0xe0,0xfe,0xef,0xc3,0x9e, +0x50,0x03,0x12,0x6d,0x2c,0x90,0x9e,0x80,0xe0,0xff,0xd3,0x94,0x13,0x40,0x07,0x90, +0x96,0x43,0x74,0x03,0xf0,0x22,0xef,0xd3,0x94,0x0b,0x40,0x07,0x90,0x96,0x43,0x74, +0x02,0xf0,0x22,0xef,0xd3,0x94,0x03,0x40,0x07,0x90,0x96,0x43,0x74,0x01,0xf0,0x22, +0xe4,0x90,0x96,0x43,0xf0,0x22,0x90,0x9e,0x74,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0x12, +0x43,0x7e,0x90,0x9e,0x76,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x1f,0x1d,0x54,0xf0, +0xc4,0x54,0x0f,0x90,0x9e,0x79,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x54,0x40,0xc4, +0x13,0x13,0x54,0x03,0x90,0x9e,0x7a,0xf0,0x90,0x9e,0x74,0xe0,0xff,0x75,0xf0,0x09, +0x90,0x96,0x46,0x12,0x43,0x52,0xad,0x82,0xac,0x83,0x90,0x9e,0x7b,0xec,0xf0,0xa3, +0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,0x35,0xf0,0xfa,0x7b, +0x01,0xa3,0x12,0x43,0x7e,0x90,0x9e,0x76,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x1f, +0x1d,0x54,0x0f,0xff,0x90,0x9e,0x7d,0x12,0x43,0x5e,0xef,0x12,0x42,0x20,0x90,0x9e, +0x76,0x12,0x43,0x5e,0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x90,0x9e,0x7d,0x12,0x43, +0x5e,0x90,0x00,0x01,0xef,0x12,0x42,0x32,0x90,0x9e,0x76,0x12,0x43,0x5e,0x90,0x00, +0x01,0x12,0x1f,0x1d,0xff,0x90,0x9e,0x7b,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5,0x82,0x8c, +0x83,0xef,0xf0,0x12,0x1f,0x04,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x9e,0x79,0xe0, +0xfe,0x90,0x9e,0x74,0xe0,0xff,0x24,0x82,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee, +0xf0,0x90,0x9e,0x75,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4a,0x12,0x43,0x52, +0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x96,0x4b,0x12,0x43,0x52,0x74,0x01,0xf0,0x90, +0x9e,0x7a,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4c,0x12,0x43,0x52,0xee,0xf0, +0x41,0x62,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0x54,0x1f,0xfe,0xef,0x54,0x20,0xc4, +0x13,0x54,0x07,0xfd,0xaf,0x06,0xc1,0xa6,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0x54, +0x3f,0xfe,0xef,0x54,0x80,0xc4,0x13,0x13,0x13,0x54,0x01,0xfd,0xaf,0x06,0xc1,0xa6, +0x12,0x1f,0x04,0xf5,0x13,0xc3,0x94,0x40,0x50,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d, +0xff,0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xef,0xf0,0x22,0xe5, +0x13,0xb4,0x40,0x0a,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x96,0x42,0xf0,0x22,0x12, +0x1f,0x04,0x90,0x95,0x01,0xf0,0x22,0x90,0x9e,0x71,0x12,0x43,0x7e,0xef,0x12,0x43, +0x87,0x80,0x93,0x01,0x80,0x9b,0x02,0x80,0xbb,0x03,0x80,0xc4,0x05,0x80,0xcd,0x06, +0x81,0xf7,0x07,0x80,0xd6,0x08,0x80,0xdf,0x10,0x80,0xe8,0x11,0x80,0xf0,0x12,0x80, +0xf8,0x13,0x81,0x00,0x14,0x81,0x09,0x15,0x81,0x12,0x16,0x81,0x1c,0x17,0x81,0x26, +0x18,0x81,0x30,0x19,0x81,0xc6,0x1a,0x81,0xce,0x1b,0x81,0xd7,0x1c,0x81,0x39,0x1d, +0x81,0x43,0x1e,0x81,0x4e,0x21,0x81,0x56,0x22,0x81,0x5e,0x23,0x81,0x66,0x24,0x81, +0x6e,0x25,0x81,0x76,0x26,0x81,0x7e,0x27,0x81,0x86,0x28,0x81,0x8e,0x29,0x80,0xa3, +0x2d,0x80,0xab,0x2e,0x81,0x96,0x2f,0x81,0xe0,0x30,0x81,0xe8,0x31,0x81,0xa6,0x32, +0x81,0x9e,0x33,0x80,0xb3,0x34,0x81,0xae,0x36,0x81,0xb6,0x37,0x81,0xbe,0x38,0x00, +0x00,0x81,0xf0,0x90,0x9e,0x71,0x12,0x43,0x5e,0xc1,0xe1,0x90,0x9e,0x71,0x12,0x43, +0x5e,0x81,0x7c,0x90,0x9e,0x71,0x12,0x43,0x5e,0xe1,0xe9,0x90,0x9e,0x71,0x12,0x43, +0x5e,0xe1,0x35,0x90,0x9e,0x71,0x12,0x43,0x5e,0x81,0xae,0x90,0x9e,0x71,0x12,0x43, +0x5e,0x02,0x88,0x31,0x90,0x9e,0x71,0x12,0x43,0x5e,0x02,0x7f,0xd0,0x90,0x9e,0x71, +0x12,0x43,0x5e,0x02,0x7f,0xa2,0x90,0x9e,0x71,0x12,0x43,0x5e,0x02,0x64,0xb0,0x90, +0x9e,0x71,0x12,0x43,0x5e,0x02,0x88,0x79,0x90,0x9e,0x71,0x12,0x43,0x5e,0xa1,0x08, +0x90,0x9e,0x71,0x12,0x43,0x5e,0x81,0xc9,0x90,0x9e,0x71,0x12,0x43,0x5e,0x81,0x94, +0x90,0x9e,0x71,0x12,0x43,0x5e,0x02,0x88,0xc0,0x90,0x9e,0x71,0x12,0x43,0x5e,0x02, +0x89,0x98,0x90,0x9e,0x71,0x12,0x43,0x5e,0x7f,0x01,0x80,0x2f,0x90,0x9e,0x71,0x12, +0x43,0x5e,0x7f,0x02,0x80,0x25,0x90,0x9e,0x71,0x12,0x43,0x5e,0x7f,0x03,0x80,0x1b, +0x90,0x9e,0x71,0x12,0x43,0x5e,0x02,0x8b,0x1d,0x90,0x9e,0x71,0x12,0x43,0x5e,0xe4, +0xff,0x80,0x08,0x90,0x9e,0x71,0x12,0x43,0x5e,0x7f,0x04,0x02,0x8a,0x3b,0x90,0x9e, +0x71,0x12,0x43,0x5e,0xa1,0x2f,0x90,0x9e,0x71,0x12,0x43,0x5e,0xa1,0x56,0x90,0x9e, +0x71,0x12,0x43,0x5e,0xa1,0x7d,0x90,0x9e,0x71,0x12,0x43,0x5e,0xa1,0xa4,0x90,0x9e, +0x71,0x12,0x43,0x5e,0xa1,0xcb,0x90,0x9e,0x71,0x12,0x43,0x5e,0xa1,0xf2,0x90,0x9e, +0x71,0x12,0x43,0x5e,0xe1,0x63,0x90,0x9e,0x71,0x12,0x43,0x5e,0xc1,0x19,0x90,0x9e, +0x71,0x12,0x43,0x5e,0xc1,0x67,0x90,0x9e,0x71,0x12,0x43,0x5e,0xe1,0x9a,0x90,0x9e, +0x71,0x12,0x43,0x5e,0xc1,0x8f,0x90,0x9e,0x71,0x12,0x43,0x5e,0xc1,0xb8,0x90,0x9e, +0x71,0x12,0x43,0x5e,0x80,0x42,0x90,0x9e,0x71,0x12,0x43,0x5e,0x81,0x82,0x90,0x9e, +0x71,0x12,0x43,0x5e,0xc1,0x40,0x90,0x9e,0x71,0x12,0x43,0x5e,0x61,0x77,0x90,0x9e, +0x71,0x12,0x43,0x5e,0x02,0x7f,0xff,0x90,0x9e,0x71,0x12,0x43,0x5e,0x02,0x7f,0xb8, +0x90,0x9e,0x71,0x12,0x43,0x5e,0x81,0xe8,0x90,0x9e,0x71,0x12,0x43,0x5e,0xe1,0x0b, +0x90,0x01,0xc6,0xe0,0x44,0x01,0xf0,0x22,0x12,0x1f,0x04,0x60,0x44,0x90,0xfd,0x58, +0xe0,0x20,0xe0,0x3d,0x90,0xfd,0x50,0x74,0x0a,0xf0,0xa3,0x74,0x06,0xf0,0x90,0x00, +0x01,0x12,0x1f,0x1d,0x90,0xfd,0x52,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0xfd, +0x53,0xf0,0xa3,0xe4,0xf0,0xa3,0x74,0xc0,0xf0,0xa3,0x74,0x10,0xf0,0xa3,0x74,0x80, +0xf0,0x90,0xfd,0x50,0x74,0x0a,0xf0,0xa3,0x74,0x06,0xf0,0x90,0xfd,0x58,0x74,0x01, +0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfe,0x90,0x00,0x01,0x12,0x1f,0x1d,0x7c,0x00, +0x24,0x00,0xff,0xec,0x3e,0xfe,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0xfc,0x74, +0x20,0x2f,0xff,0xe4,0x3e,0xfe,0x90,0x9e,0x74,0xef,0xf0,0xee,0xf9,0x90,0x02,0x09, +0xe0,0xc3,0x13,0x90,0xfd,0x10,0xf0,0xec,0xc3,0x99,0x50,0x43,0xec,0x70,0x04,0x7d, +0x04,0x80,0x02,0xe4,0xfd,0xed,0xc3,0x94,0x20,0x50,0x07,0xaf,0x05,0x51,0xcb,0x0d, +0x80,0xf3,0x0c,0x90,0xfd,0x10,0xe0,0x04,0xf0,0xec,0xb5,0x01,0xda,0xe4,0xfd,0xed, +0x75,0xf0,0x08,0xa4,0xff,0x90,0x9e,0x74,0xe0,0xfb,0xc3,0xef,0x9b,0x74,0x80,0xf8, +0x65,0xf0,0x98,0x50,0x07,0xaf,0x05,0x51,0xcb,0x0d,0x80,0xe3,0x0c,0x80,0xb8,0x90, +0x00,0x81,0xe0,0x44,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0x90,0xfd,0x58,0xe0,0x30, +0xe0,0x08,0x90,0x01,0xb8,0xe0,0x04,0xf0,0x80,0xf1,0xef,0x75,0xf0,0x08,0xa4,0x24, +0x00,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x50,0xf0,0xef,0x75,0xf0, +0x08,0xa4,0x24,0x01,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x51,0xf0, +0xef,0x75,0xf0,0x08,0xa4,0x24,0x02,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90, +0xfd,0x52,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x03,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x90,0xfd,0x53,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x04,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x54,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x05, +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x55,0xf0,0xef,0x75,0xf0,0x08, +0xa4,0x24,0x06,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x56,0xf0,0xef, +0x75,0xf0,0x08,0xa4,0x24,0x07,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd, +0x57,0xf0,0xa3,0x74,0x01,0xf0,0x22,0x90,0x9e,0x74,0x12,0x43,0x7e,0x12,0x1f,0x04, +0x20,0xe0,0x1d,0x7d,0x08,0xe4,0xff,0x12,0x3a,0x54,0x90,0x06,0x90,0xe4,0xf0,0x12, +0x8d,0xfb,0x90,0x01,0x3f,0x74,0x04,0xf0,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x22, +0x90,0x9e,0x74,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x54,0x01,0xfe,0x90,0x9e,0xbc, +0xe0,0x54,0xfe,0x4e,0xf0,0xef,0x54,0x04,0xff,0xe0,0x54,0xfb,0x4f,0xf0,0x12,0x1f, +0x04,0xff,0x54,0x02,0xfe,0x90,0x9e,0xbc,0xe0,0x54,0xfd,0x4e,0xf0,0xef,0x54,0x08, +0xff,0xe0,0x54,0xf7,0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54,0x10,0xfe,0x90,0x9e,0xbc, +0xe0,0x54,0xef,0x4e,0xf0,0xef,0x54,0x20,0xff,0xe0,0x54,0xdf,0x4f,0xf0,0x12,0x1f, +0x04,0xff,0x54,0x40,0xfe,0x90,0x9e,0xbc,0xe0,0x54,0xbf,0x4e,0xf0,0xef,0x54,0x80, +0xff,0xe0,0x54,0x7f,0x4f,0xf0,0x90,0x00,0x81,0xe4,0xf0,0x90,0x9e,0xbf,0xe0,0x54, +0xfe,0xf0,0x90,0x06,0x09,0xe0,0x54,0xfe,0xf0,0x12,0x1f,0x04,0xc3,0x13,0x30,0xe0, +0x07,0x90,0x06,0x90,0xe0,0x44,0x02,0xf0,0x90,0x9e,0x74,0x12,0x43,0x5e,0x12,0x1f, +0x04,0xff,0x13,0x13,0x54,0x3f,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x04,0xf0, +0xef,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44,0x08,0xf0, +0x90,0x9e,0x9b,0xe0,0xb4,0x02,0x14,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e,0xbd, +0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x9e,0xbe,0xf0,0x90,0x02,0x86,0xe0,0x44, +0x04,0xf0,0x43,0x57,0x04,0x7d,0x08,0xe4,0xff,0x02,0x3a,0xc5,0x12,0x1f,0x04,0xf5, +0x67,0x22,0x12,0x1f,0x04,0x90,0xfe,0x10,0x60,0x05,0xe0,0x44,0x01,0xf0,0x22,0xe0, +0x54,0xfe,0xf0,0x22,0x12,0x1f,0x04,0x30,0xe0,0x0e,0x90,0x07,0x78,0xe0,0x54,0xfd, +0xf0,0x90,0x9e,0x50,0x74,0x01,0xf0,0x22,0xe4,0x90,0x9e,0x50,0xf0,0x22,0x12,0x1f, +0x04,0x30,0xe0,0x07,0x54,0x01,0x90,0x9e,0xb2,0xf0,0x22,0x7d,0x10,0x7f,0x03,0x12, +0x3a,0x71,0x7d,0x01,0x7f,0x02,0x02,0x3a,0xc5,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x17, +0x90,0xfd,0x50,0x74,0x0d,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52, +0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x22,0x12,0x1f,0x04,0xff,0x54,0x01,0xfe,0x90, +0x9e,0xb9,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x0a,0x90,0x00,0x01, +0x12,0x1f,0x1d,0x90,0x9e,0xba,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90, +0xfd,0x50,0x74,0x0c,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0, +0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0xfd,0x58,0x04,0xf0,0x22,0x90, +0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x17,0xf0,0xa3,0x74,0x01,0xf0, +0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50, +0x74,0x18,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4, +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58, +0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x19,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f, +0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1a, +0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3, +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20, +0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1b,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90, +0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04, +0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1c,0xf0,0xa3, +0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3, +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f, +0x90,0xfd,0x50,0x74,0x1e,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52, +0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22, +0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x23,0xf0,0xa3,0x74,0x01, +0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, +0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x12,0x1f,0x04,0xff,0xe4,0xfc,0xfd,0xfe,0x78, +0x18,0x12,0x1f,0xc4,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x9e,0x4a,0x12, +0x43,0x46,0xec,0x54,0x03,0xfc,0x12,0x43,0x19,0x90,0x9e,0x46,0x02,0x1f,0xd7,0x90, +0xfd,0x58,0xe0,0x20,0xe0,0x21,0x90,0xfd,0x50,0x74,0x1f,0xf0,0xa3,0x74,0x01,0xf0, +0x12,0x1f,0x04,0x54,0x01,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x21,0x90, +0xfd,0x50,0x74,0x20,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x54,0x01,0x90,0xfd, +0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e, +0xb0,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0x9e,0xa0,0xf0,0x12,0x1f,0x04,0x65, +0x6a,0x60,0x03,0x12,0x4d,0xa5,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x1f,0x04,0xff,0x54, +0x01,0xfe,0x90,0x9e,0xb4,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x14, +0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e,0xb5,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, +0x90,0x9e,0xb6,0xf0,0x22,0x12,0x1f,0x04,0x30,0xe0,0x18,0xc3,0x13,0x54,0x7f,0x90, +0x9e,0xab,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0x90,0x9e,0xa9,0xe4,0xf0,0xa3, +0xef,0xf0,0x22,0x90,0x9e,0xab,0x74,0x07,0xf0,0x90,0x9e,0xa9,0xe4,0xf0,0xa3,0x74, +0x0b,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x2f,0x90,0xfd,0x50,0x74,0x1d,0xf0, +0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0x90,0x00,0x01,0x12,0x1f, +0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0xfd,0x54,0xf0,0xa3, +0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0, +0x3b,0x12,0x1f,0x04,0x90,0xfd,0x50,0xf0,0xa3,0x74,0x04,0xf0,0x90,0x00,0x01,0x12, +0x1f,0x1d,0x90,0xfd,0x52,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0, +0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0xfd,0x54,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d, +0x90,0xfd,0x55,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0xe4,0x90,0x9d, +0xa8,0xf0,0xa3,0xf0,0x90,0x01,0xaf,0xf0,0x22,0x90,0x00,0x02,0x12,0x1f,0x1d,0xff, +0x30,0xe0,0x25,0x12,0x1f,0x04,0x90,0x9e,0xa7,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d, +0x90,0x9e,0xa8,0xf0,0xef,0xc3,0x13,0x54,0x7f,0x90,0x9e,0xa6,0xf0,0x90,0x00,0x03, +0x12,0x1f,0x1d,0x90,0x9e,0xac,0xf0,0x22,0x90,0x9e,0xa7,0x74,0x01,0xf0,0x90,0x9e, +0xa8,0x74,0x03,0xf0,0x90,0x9e,0xa6,0x74,0x14,0xf0,0x90,0x9e,0xac,0x74,0x05,0xf0, +0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x1f,0x04,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x9e, +0x95,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0xed,0x2f,0x90,0x9e,0x96,0xf0,0x90, +0x00,0x02,0x12,0x1f,0x1d,0xff,0xed,0x2f,0x90,0x9e,0x97,0xf0,0x90,0x00,0x03,0x12, +0x1f,0x1d,0xff,0xed,0x2f,0x90,0x9e,0x98,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff, +0xae,0x05,0xed,0x2f,0x90,0x9e,0x99,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x3f, +0x90,0xfd,0x50,0x74,0x0b,0xf0,0xa3,0x74,0x05,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52, +0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f, +0x1d,0x90,0xfd,0x54,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0xfd,0x55,0xf0,0x90, +0x00,0x04,0x12,0x1f,0x1d,0x90,0xfd,0x56,0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x22, +0x90,0x07,0x78,0xe0,0x44,0x0c,0xf0,0x12,0x1f,0x04,0xff,0x30,0xe0,0x75,0x90,0xfd, +0x58,0xe0,0x20,0xe0,0x10,0x90,0xfd,0x50,0x74,0x14,0xf0,0xa3,0x74,0x01,0xf0,0xa3, +0xf0,0x90,0xfd,0x58,0xf0,0x90,0x9e,0x43,0xe0,0x44,0x08,0xf0,0xef,0x30,0xe1,0x0d, +0xe0,0x44,0x01,0xf0,0x90,0x07,0x78,0xe0,0x54,0xfd,0xf0,0x80,0x07,0x90,0x07,0x78, +0xe0,0x44,0x02,0xf0,0x12,0x1f,0x04,0xff,0x30,0xe2,0x1e,0x90,0x9e,0x43,0xe0,0x44, +0x04,0xf0,0x90,0x04,0x26,0xe0,0x44,0x40,0xf0,0x90,0x07,0x78,0xe0,0x54,0xef,0xf0, +0x90,0x07,0x83,0xe0,0x44,0x40,0xf0,0x80,0x07,0x90,0x07,0x78,0xe0,0x44,0x10,0xf0, +0xef,0x30,0xe4,0x63,0x90,0x9e,0x43,0xe0,0x44,0x02,0xf0,0x90,0x04,0x26,0xe0,0x44, +0x80,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x12,0x90,0xfd,0x50,0x74,0x14,0xf0, +0xa3,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0x90,0xfd,0x58,0x04,0xf0,0x90,0x9e,0x43,0xe0, +0x54,0xfe,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xf7,0xf0,0x90, +0x07,0x78,0xe0,0x54,0xe3,0xf0,0x90,0x07,0x83,0xe0,0x54,0x3f,0xf0,0x90,0x04,0x26, +0xe0,0x54,0x3f,0xf0,0x90,0x9e,0x4a,0x12,0x43,0x46,0x90,0x81,0x57,0x12,0x1f,0xd7, +0x7f,0x80,0x7e,0x08,0x12,0x34,0x55,0x22,0x12,0x1f,0x04,0xff,0x30,0xe0,0x4b,0x90, +0x07,0x78,0xe0,0x44,0x02,0xf0,0x90,0x07,0x83,0xe0,0x44,0x02,0xf0,0x90,0x07,0x78, +0xe0,0x44,0x80,0x54,0xbf,0xf0,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1a,0x90,0xfd,0x50, +0x74,0x1a,0xf0,0xa3,0x74,0x01,0xf0,0xa3,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0xef,0x30,0xe1,0x5f,0x90,0x9e,0x43,0xe0,0x44, +0x02,0xf0,0x90,0x07,0x95,0xe0,0x44,0x06,0xf0,0x22,0x90,0x9e,0x43,0xe0,0x54,0xfd, +0xf0,0x90,0x07,0x78,0xe0,0x54,0x3f,0xf0,0x90,0x07,0x83,0xe0,0x54,0xfd,0xf0,0x90, +0x07,0x95,0xe0,0x54,0xf9,0xf0,0x90,0x9e,0x4a,0x12,0x43,0x46,0x90,0x81,0x57,0x12, +0x1f,0xd7,0x7f,0x80,0x7e,0x08,0x12,0x34,0x55,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1a, +0x90,0xfd,0x50,0x74,0x1a,0xf0,0xa3,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3, +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0xef,0x70,0x21,0x12,0x1f, +0x04,0x30,0xe0,0x14,0x90,0x00,0x40,0xe0,0x44,0x20,0xf0,0xe0,0x54,0x3f,0xf0,0x90, +0x07,0x78,0xe0,0x44,0x01,0xf0,0x80,0x07,0x90,0x07,0x78,0xe0,0x54,0xfe,0xf0,0xef, +0x64,0x01,0x70,0x6a,0x12,0x1f,0x04,0x90,0x00,0x01,0x30,0xe0,0x2e,0x12,0x1f,0x1d, +0x90,0x06,0xc0,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x06,0xc1,0xf0,0x90,0x00, +0x03,0x12,0x1f,0x1d,0x90,0x06,0xc2,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x90,0x06, +0xc3,0xf0,0x90,0x06,0xcc,0xe0,0x54,0xfe,0xf0,0x80,0x2c,0x12,0x1f,0x1d,0x90,0x06, +0xc4,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x06,0xc5,0xf0,0x90,0x00,0x03,0x12, +0x1f,0x1d,0x90,0x06,0xc6,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x90,0x06,0xc7,0xf0, +0x90,0x06,0xcc,0xe0,0x44,0x01,0xf0,0x90,0x06,0xcc,0xe0,0x44,0x02,0xf0,0xef,0xb4, +0x02,0x11,0x12,0x1f,0x04,0x90,0x06,0xc8,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90, +0x06,0xc9,0xf0,0xef,0xb4,0x03,0x11,0x12,0x1f,0x04,0x90,0x06,0xca,0xf0,0x90,0x00, +0x01,0x12,0x1f,0x1d,0x90,0x06,0xcb,0xf0,0xef,0x64,0x04,0x70,0x1f,0x12,0x1f,0x04, +0xff,0x90,0x07,0x83,0x30,0xe0,0x06,0xe0,0x44,0x10,0xf0,0x80,0x04,0xe0,0x54,0x6f, +0xf0,0xef,0x30,0xe1,0x07,0x90,0x07,0x83,0xe0,0x44,0x80,0xf0,0x22,0x90,0x9e,0x74, +0x12,0x43,0x7e,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x37,0x90,0xfd,0x50,0x74,0x11,0xf0, +0xa3,0x74,0x03,0xf0,0x90,0x9e,0x74,0x12,0x43,0x5e,0x12,0x1f,0x04,0x90,0xfd,0x52, +0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f, +0x1d,0x90,0xfd,0x54,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x80, +0x16,0x43,0x57,0x01,0x78,0xaa,0x7c,0x9d,0x7d,0x01,0x90,0x9e,0x74,0x12,0x43,0x5e, +0x7e,0x00,0x7f,0x03,0x12,0x1e,0xde,0x90,0x9e,0x74,0x12,0x43,0x5e,0x12,0x1f,0x04, +0x60,0x07,0x90,0x9e,0x51,0x74,0x01,0xf0,0x22,0xe4,0x90,0x9e,0x51,0xf0,0x22,0x90, +0x05,0x22,0x74,0xff,0xf0,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0x90,0x9e,0xd8,0x74, +0x04,0xf0,0x22,0x12,0x67,0x9e,0x90,0x9e,0xd8,0x74,0x04,0xf0,0x22,0x90,0x05,0x22, +0x74,0xff,0xf0,0x90,0x9e,0xd2,0x74,0x05,0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0, +0x90,0x9e,0xd2,0x74,0x02,0xf0,0x22,0x90,0x05,0x27,0xe0,0x54,0xbf,0xf0,0x90,0x05, +0x22,0x74,0x6f,0xf0,0x90,0x9e,0xd2,0x74,0x06,0xf0,0x22,0x90,0x01,0x57,0xe0,0x60, +0x3c,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0xb1,0xe0, +0x60,0x07,0xe4,0xf0,0x53,0x6b,0xfd,0x80,0x24,0x90,0x9e,0xa2,0xe0,0x04,0xf0,0x53, +0x6b,0xef,0x90,0x9e,0xa7,0xe0,0xff,0x90,0x9e,0xa2,0xe0,0xd3,0x9f,0x40,0x0e,0xe5, +0x67,0xb4,0x01,0x09,0x90,0x9e,0xa3,0xe0,0x70,0x03,0xe0,0x04,0xf0,0x90,0x01,0x5b, +0xe0,0x60,0x10,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0xe4,0x90, +0x9e,0xae,0xf0,0x90,0x01,0x5f,0xe0,0x60,0x10,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01, +0x3c,0x74,0x08,0xf0,0xe4,0x90,0x9e,0xad,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, +0xd0,0x90,0x9f,0x19,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, +0x12,0x4e,0x94,0x90,0x9f,0x19,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, +0x80,0x4c,0x90,0x9f,0x19,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x62,0xe0,0x5f,0xf0,0x12,0x4e, +0x94,0x90,0x9f,0x19,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x60,0xe0,0xfb,0xe4,0xfe,0xef,0x5b, +0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0, +0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9f,0x11,0xed,0xf0,0x90, +0x9f,0x10,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x9f,0x10, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90, +0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x9f,0x10,0xe0,0xff,0x74,0x01,0xa8,0x07, +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12,0x4e, +0x94,0x90,0x9f,0x10,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x67,0x90,0x9f,0x10,0xe0,0x24,0xf8,0xf0,0xa3, +0xe0,0x70,0x1a,0x90,0x9f,0x10,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x63,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x9f,0x10, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, +0x63,0xe0,0x4f,0xf0,0x12,0x4e,0x94,0x90,0x9f,0x10,0xe0,0xff,0x74,0x01,0xa8,0x07, +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4e,0x8c,0x90,0x9f,0x10,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x62,0xe0, +0x5f,0xf0,0x12,0x4e,0x94,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e,0xb4,0xe0,0x54,0xfe, +0xf0,0xe4,0x90,0x9e,0xb7,0xf0,0xa3,0xf0,0x90,0x9e,0xb5,0x74,0x03,0xf0,0xa3,0xf0, +0x22,0xe4,0x90,0x9e,0xbb,0xf0,0x90,0x9e,0xb9,0xe0,0x54,0x7f,0xf0,0xa3,0x74,0x0a, +0xf0,0x22,0x90,0x9e,0xb9,0xe0,0x54,0xfe,0xf0,0x80,0xe6,0x90,0x9e,0xbc,0xe0,0x54, +0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xf7,0xf0,0xe0,0x54, +0xef,0xf0,0xe0,0x54,0xdf,0xf0,0xe0,0x54,0xbf,0xf0,0xe0,0x54,0x7f,0xf0,0xe4,0xa3, +0xf0,0xa3,0xf0,0xa3,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x90,0x01,0x17,0xe0, +0xfe,0x90,0x01,0x16,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x9e,0xc0,0xf0, +0xa3,0xef,0xf0,0x90,0x01,0x04,0xe0,0x54,0x0f,0x90,0x9e,0x77,0xf0,0xe0,0xff,0x74, +0x40,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x90, +0x9e,0xc3,0xf0,0xee,0x90,0x9e,0xc2,0xf0,0x22,0x75,0xe8,0x07,0x90,0xfd,0x68,0x74, +0x02,0xf0,0x90,0x9e,0x43,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0x54,0xfd,0xf0,0x54, +0xf7,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0x12,0x1f,0xe3,0x00,0x00,0x00,0x00,0x7f, +0x80,0x7e,0x08,0x12,0x2c,0x87,0x90,0x9e,0x4a,0x12,0x1f,0xd7,0x90,0x00,0x2e,0xe0, +0x90,0x9e,0x4e,0xf0,0x90,0x00,0x2d,0xe0,0x90,0x9e,0x4f,0xf0,0xe4,0xa3,0xf0,0xa3, +0xf0,0x90,0x04,0x26,0xe0,0x44,0x10,0xf0,0x90,0x07,0x83,0xe4,0xf0,0x90,0x07,0x78, +0x74,0x03,0xf0,0x7d,0x04,0x7f,0x02,0x02,0x3a,0xdf,0x90,0xfd,0x58,0xe0,0x20,0xe0, +0x2d,0x90,0xfd,0x50,0x74,0x11,0xf0,0xa3,0x74,0x04,0xf0,0x90,0x9d,0xaa,0xe0,0x90, +0xfd,0x52,0xf0,0x90,0x9d,0xab,0xe0,0x90,0xfd,0x53,0xf0,0x90,0x9d,0xac,0xe0,0x90, +0xfd,0x54,0xf0,0xa3,0x74,0x28,0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x22,0x43,0x57, +0x01,0x22,0xae,0x07,0x90,0x9e,0x62,0xe0,0x54,0xf0,0x44,0x04,0xf0,0x54,0x0f,0x44, +0x20,0xf0,0x90,0x9e,0x64,0xee,0xf0,0xa3,0xed,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x64, +0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x62,0x02,0x48,0xde,0xad,0x07,0x90, +0x9e,0x5a,0xe0,0x54,0xf0,0x44,0x05,0xf0,0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e,0x5c, +0xef,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x5c,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e, +0x79,0x5a,0x02,0x48,0xde,0xad,0x07,0x90,0x9e,0x62,0xe0,0x54,0xf0,0x44,0x07,0xf0, +0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e,0x64,0xef,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x64, +0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x62,0x02,0x48,0xde,0xad,0x07,0x90, +0x9e,0x62,0xe0,0x54,0xf0,0x44,0x09,0xf0,0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e,0x64, +0xef,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x64,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e, +0x79,0x62,0x02,0x48,0xde,0x90,0x9e,0xdd,0xe0,0x54,0xf0,0x44,0x0a,0xf0,0x90,0xfd, +0x60,0xe0,0x90,0x9e,0xdf,0xf0,0x90,0xfd,0x62,0xe0,0x90,0x9e,0xe0,0xf0,0x90,0xfd, +0x63,0xe0,0x90,0x9e,0xe1,0xf0,0x90,0xfd,0x64,0xe0,0x90,0x9e,0xe2,0xf0,0x90,0xfd, +0x65,0xe0,0x90,0x9e,0xe3,0xf0,0x90,0xfd,0x60,0xe0,0x90,0x9e,0xdd,0x30,0xe6,0x08, +0xe0,0x54,0x0f,0x44,0x50,0xf0,0x80,0x16,0xe0,0x54,0x0f,0x44,0x70,0xf0,0x90,0xfd, +0x66,0xe0,0x90,0x9e,0xe4,0xf0,0x90,0xfd,0x67,0xe0,0x90,0x9e,0xe5,0xf0,0x7b,0x01, +0x7a,0x9e,0x79,0xdf,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e,0x79,0xdd,0x02,0x48, +0xde,0x90,0x9e,0x62,0xef,0xf0,0xa3,0xe0,0x54,0xf0,0x44,0x0c,0xf0,0x54,0x0f,0x44, +0x10,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x62,0x90,0x9e,0xf5,0x12,0x43,0x7e,0x7a,0x9e, +0x09,0x02,0x48,0xde,0x90,0x00,0x75,0xe0,0x44,0x01,0xf0,0x7f,0x01,0x7e,0x00,0x12, +0x3a,0xaa,0x90,0xfe,0x13,0x74,0x03,0xf0,0x7f,0x02,0x7e,0x00,0x12,0x3a,0xaa,0x90, +0xfe,0x13,0xe4,0xf0,0x90,0x00,0x75,0xe0,0x54,0xfe,0xf0,0x22,0x1b,0x4f,}; + + + //WiFi for BT MP New FW 0326 +const u8 Rtl8723SFwUMCBCutMPImgArray[Rtl8723SUMCBCutMPImgArrayLength] = { +0x02, 0x23, 0x02, 0x00, 0x22, 0x00, 0x00, 0x00, 0x05, 0x15, 0x14, 0x10, 0x14, 0x47, 0x01, 0x00, +0x74, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4A, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x61, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x67, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0x55, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x6F, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xE4, 0xFB, 0x90, 0x85, 0x76, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x50, 0x70, 0x03, +0x02, 0x43, 0x8F, 0xE5, 0x4D, 0x64, 0x01, 0x60, 0x03, 0x02, 0x43, 0x8F, 0xE5, 0x50, 0x14, 0x60, +0x2B, 0x24, 0xFD, 0x60, 0x27, 0x24, 0x02, 0x24, 0xFB, 0x50, 0x02, 0x80, 0x21, 0x90, 0x85, 0x59, +0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, 0xE0, 0x60, 0x14, 0x90, 0x85, 0x59, 0xE0, 0x70, 0x08, +0x90, 0x85, 0x70, 0xE0, 0x90, 0x85, 0x59, 0xF0, 0x7B, 0x01, 0x80, 0x02, 0x7B, 0x01, 0xEB, 0x70, +0x03, 0x02, 0x43, 0x8F, 0x43, 0x51, 0x10, 0x90, 0x85, 0x4F, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x44, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x85, 0x71, 0xE0, 0xC3, 0x9F, 0x50, 0x08, +0xE4, 0xF5, 0x48, 0x90, 0x85, 0x50, 0x80, 0x2D, 0x90, 0x85, 0x4F, 0xE0, 0xC4, 0x54, 0x07, 0xFF, +0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x85, 0x71, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, +0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x53, 0x80, 0x06, 0xE4, +0xF5, 0x48, 0x90, 0x85, 0x50, 0xE0, 0x80, 0x2D, 0x90, 0x85, 0x71, 0xE0, 0x64, 0x01, 0x60, 0x03, +0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x71, 0xE0, 0xFF, 0x90, 0x85, 0x68, 0xE0, 0x2F, +0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x71, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, +0x85, 0x68, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, +0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x4E, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, +0x7D, 0x01, 0x7F, 0x04, 0x12, 0x49, 0xC6, 0xE5, 0x4E, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x85, 0x2B, +0xE0, 0xFF, 0x90, 0x85, 0x71, 0xE0, 0xD3, 0x9F, 0x40, 0x08, 0x90, 0x85, 0x2C, 0xE0, 0x04, 0xF0, +0x80, 0x05, 0xE4, 0x90, 0x85, 0x2C, 0xF0, 0x90, 0x85, 0x71, 0xE0, 0x90, 0x85, 0x2B, 0xF0, 0xA3, +0xE0, 0xC3, 0x94, 0x05, 0x40, 0x46, 0xE4, 0xF0, 0x90, 0x85, 0x56, 0xE0, 0x60, 0x09, 0x90, 0x85, +0x6F, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x15, 0x90, 0x85, 0x72, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, +0x49, 0xC2, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x5E, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x6E, 0x80, 0x09, +0x43, 0x51, 0x01, 0x12, 0x50, 0xA5, 0x90, 0x85, 0x6A, 0x74, 0x01, 0xF0, 0x12, 0x84, 0xC4, 0x22, +0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, +0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, +0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, +0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, +0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, +0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, +0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, +0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xEF, 0x5B, 0xFF, +0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, +0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, +0xCC, 0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, +0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, +0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, +0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, +0xF9, 0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, +0x70, 0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, +0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, +0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, +0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, +0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, +0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, +0xA3, 0xA3, 0xA3, 0x80, 0xD8, 0x90, 0x85, 0x60, 0xE0, 0x60, 0x16, 0x90, 0x85, 0x63, 0xE0, 0x70, +0x10, 0x90, 0x85, 0x5D, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, +0xF0, 0x22, 0x22, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0xFB, 0x90, 0x85, 0x7A, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x50, 0x70, 0x03, 0x02, 0x45, 0xD5, 0xE5, 0x4D, 0x64, 0x01, +0x60, 0x03, 0x02, 0x45, 0xD5, 0x0B, 0x90, 0x85, 0x59, 0xF0, 0x04, 0x70, 0x03, 0x02, 0x45, 0xD5, +0x43, 0x51, 0x10, 0x90, 0x85, 0x4F, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, +0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x85, 0x71, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0xE4, 0xF5, 0x48, 0x90, +0x85, 0x50, 0xE0, 0xF5, 0x49, 0xE4, 0x1B, 0x80, 0x56, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x4F, 0xE0, +0x54, 0x0F, 0xFF, 0x90, 0x85, 0x71, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x85, +0x50, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0x80, 0x35, 0x90, 0x85, 0x71, 0xE0, 0x64, 0x01, +0x60, 0x03, 0xE0, 0x70, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x71, 0xE0, 0xFF, 0x90, 0x85, 0x68, +0xE0, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0x80, 0x17, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x71, 0xE0, 0x14, +0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x85, 0x68, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, +0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x4E, 0x54, +0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x49, 0xC6, 0x12, 0x84, 0xC4, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x85, 0x7A, 0xF0, 0xE5, 0x50, 0x70, 0x03, 0x02, +0x46, 0x8F, 0x90, 0x85, 0x73, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x51, 0xFD, 0xE5, 0x51, 0x54, +0x07, 0x60, 0x03, 0x02, 0x46, 0x8F, 0x02, 0x46, 0x8C, 0x90, 0x85, 0x5A, 0xE0, 0x04, 0xF0, 0x53, +0x51, 0xEF, 0x90, 0x85, 0x71, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0x4F, 0xE0, 0xC4, 0x13, 0x13, 0x13, +0x54, 0x01, 0x30, 0xE0, 0x3A, 0x90, 0x85, 0x71, 0xE0, 0xFF, 0x90, 0x85, 0x4F, 0xE0, 0x54, 0x0F, +0xB5, 0x07, 0x0A, 0x90, 0x85, 0x52, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, 0x90, 0x85, 0x4F, +0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x85, 0x71, +0xE0, 0xB5, 0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, +0x85, 0x4F, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, 0x85, 0x7A, 0x74, +0x5A, 0xF0, 0x90, 0x85, 0x7A, 0xE0, 0xFF, 0x90, 0x85, 0x61, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, +0x90, 0x85, 0x5A, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x0D, 0xE5, +0x4D, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x51, 0x63, 0x22, +0xE4, 0xF5, 0x51, 0xF5, 0x50, 0x75, 0x4F, 0x0C, 0x75, 0x4E, 0x0C, 0x90, 0x85, 0x72, 0xF0, 0x90, +0x85, 0x6E, 0xF0, 0x90, 0x85, 0x6B, 0xF0, 0x90, 0x85, 0x70, 0x04, 0xF0, 0x90, 0x85, 0x59, 0xF0, +0xE4, 0x90, 0x85, 0x73, 0xF0, 0x90, 0x85, 0x5B, 0xF0, 0x90, 0x85, 0x68, 0x74, 0x05, 0xF0, 0xE4, +0x90, 0x85, 0x5A, 0xF0, 0x90, 0x85, 0x66, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x85, 0x61, 0xF0, +0x90, 0x85, 0x64, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x5E, 0x74, 0x14, 0xF0, 0x90, 0x85, 0x69, 0x74, +0x05, 0xF0, 0xE4, 0x90, 0x85, 0x5C, 0xF0, 0x90, 0x85, 0x55, 0xF0, 0x90, 0x85, 0xC4, 0xF0, 0x90, +0x85, 0x65, 0xF0, 0x90, 0x85, 0x75, 0xF0, 0x90, 0x85, 0x71, 0xF0, 0x90, 0x85, 0x56, 0xF0, 0x90, +0x85, 0x6F, 0xF0, 0x90, 0x85, 0x60, 0xF0, 0x90, 0x85, 0x5D, 0xF0, 0x90, 0x85, 0x6A, 0xF0, 0x90, +0x85, 0x63, 0xF0, 0x90, 0x85, 0x5F, 0xF0, 0x90, 0x85, 0x74, 0xF0, 0x90, 0x85, 0x62, 0xF0, 0x90, +0x85, 0xC3, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x85, 0x4F, 0xE0, 0x54, +0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, +0x85, 0x53, 0xF0, 0x90, 0x85, 0x52, 0xF0, 0x22, 0xEF, 0x60, 0x5F, 0xAF, 0x05, 0x74, 0x21, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6B, +0x90, 0x85, 0x43, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, +0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x23, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xAF, 0x05, 0x74, 0x21, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, +0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0x74, +0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x22, 0x90, 0x85, 0x2D, 0xE0, +0x30, 0xE0, 0x22, 0x90, 0x85, 0x3E, 0xE0, 0x60, 0x09, 0x90, 0x01, 0xB9, 0x74, 0x40, 0xF0, 0x02, +0x48, 0x86, 0xE5, 0x4F, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x02, 0x80, 0x2F, 0x90, 0x85, 0x65, +0xE0, 0x60, 0x67, 0x80, 0x5D, 0x12, 0x50, 0xFB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, +0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x51, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, +0xF0, 0x80, 0x53, 0xE5, 0x4F, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, +0x04, 0xF0, 0x80, 0x42, 0xE5, 0x51, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, +0x35, 0xE5, 0x51, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x28, 0x90, 0x85, +0x5B, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, 0x85, 0x65, 0xE0, +0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, +0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0xE4, +0x90, 0x85, 0x76, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x85, 0x76, 0xF0, 0xE0, 0x54, 0xC0, 0x70, +0x18, 0x90, 0x85, 0x6A, 0xE0, 0x70, 0x03, 0x53, 0x51, 0xFE, 0x53, 0x51, 0xFD, 0x90, 0x85, 0x2D, +0xE0, 0x20, 0xE0, 0x14, 0x12, 0x51, 0x63, 0x80, 0x0F, 0x90, 0x85, 0x56, 0xE0, 0x60, 0x09, 0x90, +0x85, 0x6F, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x15, 0x90, 0x85, 0x76, 0xE0, 0x30, 0xE6, 0x1B, 0x43, +0x51, 0x01, 0x90, 0x85, 0x72, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x4E, 0x64, 0x0C, 0x60, 0x13, +0x12, 0x50, 0xA5, 0x80, 0x0E, 0x12, 0x4F, 0xD4, 0x80, 0x09, 0x90, 0x85, 0x6A, 0xE0, 0x70, 0x03, +0x53, 0x51, 0xFE, 0xE4, 0x90, 0x85, 0x6A, 0xF0, 0x90, 0x85, 0x76, 0xE0, 0x30, 0xE7, 0x2A, 0x43, +0x51, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x64, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x73, 0x74, 0x01, +0xF0, 0x90, 0x85, 0x32, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x53, 0x51, 0xFD, 0x22, 0x8E, 0x25, 0x8F, +0x26, 0xAD, 0x26, 0xAC, 0x25, 0xAF, 0x24, 0x12, 0x47, 0x48, 0xAF, 0x26, 0xAE, 0x25, 0x90, 0x04, +0x80, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, +0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, +0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, +0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, +0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x5C, 0x8D, +0x5D, 0xE5, 0x5C, 0x54, 0x0F, 0xFF, 0xE5, 0x4E, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x5C, 0x30, +0xE2, 0x30, 0xE5, 0x4E, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x50, 0xE1, 0xE5, 0x4E, 0x30, 0xE3, +0x10, 0xE5, 0x5C, 0x20, 0xE3, 0x0B, 0x12, 0x4C, 0xB2, 0xEF, 0x60, 0x53, 0x12, 0x51, 0x14, 0x80, +0x4E, 0xE5, 0x4E, 0x20, 0xE3, 0x49, 0xE5, 0x5C, 0x30, 0xE3, 0x44, 0xAF, 0x5D, 0x12, 0x50, 0xC6, +0x80, 0x3D, 0xE5, 0x4E, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x5C, 0x20, 0xE3, 0x09, 0x12, +0x4C, 0xB2, 0xEF, 0x60, 0x2A, 0x12, 0x51, 0x14, 0xE5, 0x4E, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, +0xE5, 0x5C, 0x20, 0xE2, 0x09, 0x12, 0x47, 0xEC, 0xEF, 0x60, 0x14, 0x12, 0x50, 0x7C, 0xE5, 0x4E, +0x54, 0x0F, 0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4B, 0x54, 0xEF, 0x60, 0x03, 0x12, 0x51, 0x44, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x02, 0x4A, 0x92, 0x02, 0x52, 0x40, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, +0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, +0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, +0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, +0x40, 0x80, 0x90, 0x4E, 0xD2, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, +0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, +0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, +0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, +0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x7D, 0x78, 0x7F, 0x02, +0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, 0x01, 0x36, 0x74, 0x03, 0xF0, +0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x01, 0x57, +0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x49, 0xC2, 0x90, 0x06, 0x04, 0xE0, 0x54, +0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B, 0xF0, +0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, +0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, +0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4E, 0x85, 0xE5, 0x4D, 0x20, 0xE0, 0x05, 0xE4, 0x90, +0x85, 0x5B, 0xF0, 0x22, 0x90, 0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x10, 0x12, 0x50, 0xFB, 0xEF, 0x64, +0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x5C, 0xE5, 0x14, 0x60, 0x08, 0x90, +0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x50, 0xE5, 0x4F, 0x54, 0x0F, 0xD3, 0x94, 0x01, 0x40, 0x08, +0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x3F, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x08, 0x90, 0x01, +0xB9, 0x74, 0x04, 0xF0, 0x80, 0x31, 0x90, 0x01, 0xAF, 0xE0, 0x60, 0x02, 0x80, 0x07, 0x90, 0x02, +0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, 0x90, 0x85, 0x5C, +0xE0, 0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, +0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, +0xE5, 0x4D, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x50, 0x60, 0x67, 0xE5, 0x50, 0x64, 0x02, 0x60, 0x06, +0xE5, 0x50, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x85, 0x59, 0xF0, 0x90, 0x06, +0xAA, 0xE0, 0x90, 0x85, 0x70, 0xF0, 0x90, 0x85, 0x59, 0xE0, 0x70, 0x07, 0x90, 0x85, 0x70, 0xE0, +0xFF, 0x80, 0x05, 0x90, 0x85, 0x59, 0xE0, 0xFF, 0x90, 0x85, 0x59, 0xEF, 0xF0, 0x90, 0x85, 0x5B, +0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x85, 0x5A, 0xF0, 0x90, 0x85, 0x71, 0xF0, 0x90, 0x05, +0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x53, +0x51, 0xFD, 0x53, 0x51, 0xEF, 0xE5, 0x50, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x48, +0x8F, 0x22, 0x90, 0x85, 0xC3, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, 0x90, 0x85, 0xC3, +0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0xE4, 0xFD, 0x7F, 0x93, 0x12, 0x53, 0x26, 0x90, 0x00, +0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x53, 0x26, 0x90, 0x00, 0x28, 0xE0, 0x54, 0xFC, +0xFD, 0x7F, 0x28, 0x12, 0x53, 0x26, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, +0x53, 0x26, 0x7F, 0x01, 0x12, 0x4D, 0xDE, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, 0xFD, 0xE4, 0xFF, +0x12, 0x53, 0x26, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, 0x53, 0x26, 0x90, +0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x53, 0x26, 0x7F, 0x14, 0x7E, 0x00, 0x02, +0x3B, 0x09, 0x90, 0x85, 0x2D, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x85, 0x32, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x49, 0x12, 0x50, 0xFB, 0xEF, +0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, 0x85, 0x6E, 0xE0, +0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x85, 0x6B, 0xE0, 0x60, 0x08, +0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x4F, 0x54, 0x0F, 0xD3, 0x94, 0x04, 0x40, +0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, +0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x85, +0xA1, 0x12, 0x44, 0x89, 0x12, 0x51, 0x57, 0x90, 0x85, 0xA1, 0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, +0xF5, 0x50, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, 0x70, 0x44, 0x7F, +0x01, 0x80, 0x3D, 0x90, 0x85, 0xA1, 0x12, 0x44, 0x69, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, +0xE4, 0xFF, 0x12, 0x4F, 0x96, 0x80, 0x29, 0x90, 0x85, 0xA1, 0x12, 0x44, 0x69, 0x90, 0x00, 0x02, +0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x4F, 0x96, 0x1F, 0x80, 0x14, 0x90, 0x85, 0xA1, 0x12, +0x44, 0x69, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x4F, 0x96, 0xE4, 0xFF, +0x12, 0x4A, 0xD7, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x24, 0x90, 0x85, 0x56, +0xE0, 0x60, 0x09, 0x90, 0x85, 0x6F, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x15, 0x90, 0x04, 0x1D, 0xE0, +0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x27, 0x74, 0xFF, 0xF0, 0x12, 0x5E, 0x51, 0xBF, 0x01, +0x0D, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x2E, 0x12, 0x49, 0x2D, 0x90, 0x05, +0x22, 0xE5, 0x27, 0xF0, 0x80, 0x0D, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x2E, +0x12, 0x49, 0x2D, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x60, +0xE4, 0x90, 0x86, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, +0x7F, 0x01, 0xEF, 0x65, 0x60, 0x60, 0x3E, 0xC3, 0x90, 0x86, 0x45, 0xE0, 0x94, 0x88, 0x90, 0x86, +0x44, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x86, +0x44, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xF7, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, +0x90, 0x86, 0x45, 0xE0, 0x94, 0x32, 0x90, 0x86, 0x44, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, +0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, 0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x20, 0x12, +0x53, 0x26, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, 0x54, 0xDF, 0xFD, +0xE4, 0xFF, 0x12, 0x53, 0x26, 0x90, 0x00, 0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, 0x28, 0x12, 0x53, +0x26, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x53, 0x26, 0xE4, 0xFF, 0x12, +0x4D, 0xDE, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, 0x44, 0xC0, 0xFD, +0x7F, 0x29, 0x02, 0x53, 0x26, 0xE4, 0xFF, 0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, 0x22, 0xE0, 0x30, +0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, 0xE3, 0x13, 0x7F, +0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, 0x02, 0x80, 0x02, +0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x85, 0x67, 0xE0, 0x9D, 0x90, 0x85, 0x66, 0xE0, 0x94, 0x00, +0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x85, 0x66, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, +0xF0, 0x22, 0x48, 0x85, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xA9, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x85, 0xB1, 0x00, 0x41, 0x85, 0xC0, 0x00, +0x41, 0x85, 0xA6, 0x00, 0x41, 0x86, 0x4C, 0x00, 0x41, 0x85, 0x2B, 0x00, 0x41, 0x85, 0x2C, 0x00, +0x41, 0x84, 0x01, 0x00, 0x41, 0x84, 0x02, 0x00, 0x41, 0x84, 0x00, 0x00, 0x41, 0x86, 0x3D, 0x00, +0x41, 0x86, 0x4A, 0x00, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x6F, 0x74, +0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x86, 0x31, 0x12, 0x1F, 0xC9, 0x90, +0x86, 0x31, 0x12, 0x44, 0x45, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x86, 0x31, 0x12, 0x1F, 0xC9, 0x90, +0x86, 0x31, 0x12, 0x44, 0x45, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, +0x34, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x50, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x35, +0x90, 0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x2E, 0x90, 0x85, 0x56, 0xE0, 0x60, 0x09, 0x90, 0x85, 0x6F, +0xE0, 0x70, 0x03, 0x12, 0x4F, 0x15, 0x12, 0x84, 0xC4, 0x90, 0x85, 0x72, 0xE0, 0x60, 0x06, 0x7D, +0x01, 0x7F, 0x0C, 0x80, 0x0D, 0xE5, 0x4E, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, +0x7F, 0x04, 0x12, 0x49, 0xC6, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, 0x24, 0x02, 0x70, +0x32, 0x80, 0x0A, 0x90, 0x85, 0x70, 0x74, 0x01, 0xF0, 0x90, 0x85, 0x59, 0xF0, 0xE4, 0x90, 0x85, +0x75, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x85, 0x69, 0xE0, 0x90, 0x85, 0x70, 0xF0, 0x80, 0x05, +0x90, 0x85, 0x70, 0xED, 0xF0, 0x90, 0x85, 0x70, 0xE0, 0x90, 0x85, 0x59, 0xF0, 0x90, 0x85, 0x75, +0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, +0xF5, 0x48, 0x90, 0x85, 0x5E, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, +0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x85, +0x6B, 0x14, 0xF0, 0xE5, 0x4E, 0x54, 0x0F, 0xC3, 0x94, 0x0C, 0x50, 0x03, 0x12, 0x49, 0xC2, 0x22, +0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, +0x90, 0x85, 0x57, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, 0xFF, 0x74, 0x40, +0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x90, 0x85, +0x6D, 0xF0, 0xEE, 0x90, 0x85, 0x6C, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x85, 0xC2, 0xE0, 0x90, +0x86, 0x35, 0x60, 0x0B, 0x80, 0x12, 0x90, 0x85, 0xC2, 0xE0, 0x90, 0x86, 0x35, 0x60, 0x09, 0x12, +0x1F, 0xD5, 0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x01, 0x10, 0x7B, +0x01, 0x7A, 0x86, 0x79, 0x35, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x55, 0x11, 0x90, 0x01, 0x37, 0x74, +0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x5E, 0x51, 0xEF, 0x70, 0x06, 0x90, 0x01, +0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x12, 0x54, 0x08, 0x53, 0x4E, +0xF0, 0x43, 0x4E, 0x02, 0x22, 0x90, 0x85, 0x5F, 0xE0, 0x70, 0x1A, 0x90, 0x04, 0x1D, 0xE0, 0x70, +0x14, 0x90, 0x85, 0xBB, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, 0x2E, 0x8E, 0x5E, 0x8F, 0x5F, 0x90, +0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, +0xE5, 0x4D, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4D, 0x84, 0x53, 0x4E, 0xF0, 0x43, 0x4E, 0x0C, +0x22, 0x90, 0x86, 0x4D, 0xEF, 0xF0, 0x12, 0x66, 0x8A, 0x90, 0x86, 0x4D, 0xE0, 0x60, 0x05, 0x90, +0x05, 0x22, 0xE4, 0xF0, 0x53, 0x4E, 0xF0, 0x43, 0x4E, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, +0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, +0x02, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x4D, 0xB4, 0x01, 0x05, +0x7F, 0x01, 0x12, 0x4D, 0x84, 0x53, 0x4E, 0xF0, 0x43, 0x4E, 0x04, 0x22, 0xE5, 0x4F, 0x30, 0xE6, +0x12, 0xE5, 0x4F, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, +0x53, 0x4F, 0xBF, 0x22, 0x53, 0x4E, 0xF0, 0x43, 0x4E, 0x01, 0x12, 0x4C, 0x42, 0x12, 0x4E, 0x36, +0x53, 0x4E, 0xF0, 0x43, 0x4E, 0x02, 0x22, 0xE4, 0x90, 0x85, 0x73, 0xF0, 0x90, 0x85, 0x5A, 0xF0, +0xF5, 0x51, 0x22, 0x7D, 0x01, 0xAF, 0x4F, 0x02, 0x49, 0xC6, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xA3, +0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, 0x44, 0xB8, 0x51, 0x95, 0x00, +0x40, 0x51, 0xBD, 0x00, 0x80, 0x51, 0xE8, 0x01, 0x00, 0x51, 0xFC, 0x02, 0x00, 0x52, 0x14, 0x04, +0x00, 0x00, 0x00, 0x52, 0x31, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, +0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, 0xCE, 0xC3, 0x13, 0xCE, 0x13, +0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x80, 0x26, 0xED, 0x54, 0x7F, +0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, +0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x07, 0xC3, 0x33, 0xCE, 0x33, +0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, +0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, 0x35, 0xEC, 0x54, 0x01, 0x4D, +0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0xC3, 0x13, +0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x04, +0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, 0x00, 0x25, 0xE0, 0x25, 0xE0, +0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x22, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, +0xE4, 0x90, 0x85, 0x8C, 0xF0, 0xA3, 0xF0, 0x12, 0x60, 0xEF, 0x75, 0x8E, 0x02, 0x91, 0xDA, 0x12, +0x60, 0x4D, 0x90, 0x85, 0xC3, 0xEF, 0xF0, 0x12, 0x60, 0x60, 0x90, 0x85, 0xC5, 0xEF, 0xF0, 0x12, +0x60, 0x6C, 0x90, 0x85, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x14, 0xF5, 0x09, 0xF5, +0x4D, 0x90, 0x85, 0xC2, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x46, 0x90, 0x12, +0x37, 0x1C, 0x12, 0x77, 0x6C, 0x71, 0x3B, 0x12, 0x60, 0x11, 0x12, 0x60, 0x84, 0xF1, 0xEF, 0x12, +0x60, 0x2F, 0x12, 0x45, 0x02, 0x12, 0x60, 0xF7, 0x91, 0xC2, 0x90, 0x85, 0x8E, 0xE5, 0xD9, 0xF0, +0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x71, 0x99, 0x75, 0xE8, 0x03, 0x43, 0xA8, +0x85, 0x12, 0x83, 0x81, 0xD2, 0xAF, 0x51, 0x36, 0x12, 0x60, 0x99, 0x7D, 0xDD, 0x7F, 0x8F, 0x71, +0x26, 0x90, 0x85, 0x8C, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x40, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, +0xA3, 0xF0, 0xE5, 0x14, 0x30, 0xE0, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0xFE, 0x91, 0xEA, 0xD2, 0xAF, +0xE5, 0x14, 0x30, 0xE4, 0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xEF, 0xD2, 0xAF, 0x12, 0x76, 0x1E, 0xE5, +0x14, 0x30, 0xE7, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0x7F, 0xD2, 0xAF, 0xB1, 0x78, 0xC2, 0xAF, 0xE5, +0x4F, 0x54, 0x0F, 0xFF, 0xBF, 0x01, 0x0D, 0x90, 0x85, 0x5C, 0x74, 0x01, 0xF0, 0x31, 0x63, 0xE4, +0x90, 0x85, 0x5C, 0xF0, 0xD2, 0xAF, 0x90, 0x01, 0xBD, 0xE5, 0x4E, 0xF0, 0x90, 0x85, 0x72, 0xE0, +0x90, 0x01, 0xBC, 0xF0, 0x80, 0x9B, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, +0x83, 0x00, 0xED, 0xF0, 0x71, 0x99, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x3C, 0x74, 0xFF, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, +0x7F, 0x54, 0x71, 0x26, 0x7D, 0xFF, 0x7F, 0x55, 0x71, 0x26, 0x7D, 0xFF, 0x7F, 0x56, 0x71, 0x26, +0x7D, 0xFF, 0x7F, 0x57, 0x80, 0xC0, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x71, 0x26, +0xE4, 0xFD, 0x7F, 0x51, 0x71, 0x26, 0xE4, 0xFD, 0x7F, 0x52, 0x71, 0x26, 0xE4, 0xFD, 0x7F, 0x53, +0x80, 0x94, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8E, 0x53, 0x8F, 0x54, 0x8B, 0x55, 0x8A, +0x56, 0x89, 0x57, 0xE4, 0x90, 0x86, 0x4E, 0xF0, 0xEF, 0x90, 0x00, 0x31, 0xF0, 0x71, 0x99, 0xE5, +0x53, 0x54, 0x03, 0xFF, 0x90, 0x00, 0x32, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0x71, 0x99, 0x90, 0x00, +0x33, 0xE0, 0x54, 0x7F, 0xF0, 0x71, 0x99, 0x90, 0x00, 0x33, 0xE0, 0x20, 0xE7, 0x0E, 0x90, 0x86, +0x4E, 0xE0, 0xC3, 0x94, 0x64, 0x50, 0x05, 0xE0, 0x04, 0xF0, 0x80, 0xEB, 0x90, 0x86, 0x4E, 0xE0, +0xC3, 0x94, 0x64, 0x50, 0x10, 0x90, 0x00, 0x30, 0xE0, 0xAB, 0x55, 0xAA, 0x56, 0xA9, 0x57, 0x12, +0x43, 0xC3, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x85, 0xF7, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x85, 0xFB, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x00, 0x00, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x71, 0x99, 0x71, 0x92, 0x90, 0x00, +0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, +0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x85, 0x63, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, +0x74, 0x01, 0xF0, 0x90, 0x85, 0x56, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x85, 0x6F, 0xF0, 0xFF, 0x7E, +0x08, 0x12, 0x2C, 0x6E, 0x90, 0x85, 0xF7, 0x12, 0x1F, 0xC9, 0x90, 0x85, 0xF7, 0x12, 0x44, 0x45, +0xEC, 0x54, 0xFD, 0xFC, 0x90, 0x85, 0xF7, 0x12, 0x1F, 0xC9, 0x90, 0x85, 0xF7, 0x12, 0x44, 0x45, +0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x85, 0x60, +0xE0, 0x60, 0x22, 0xE4, 0xFF, 0x11, 0x48, 0x90, 0x85, 0x74, 0xE0, 0x60, 0x12, 0x90, 0x85, 0xFB, +0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xFB, 0xB1, 0x0D, 0x90, +0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x85, 0x6A, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0x86, 0x3E, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x86, 0x40, 0xF0, 0x90, 0x86, +0x3E, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x85, 0xBF, 0xF0, 0x90, +0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x61, 0x26, 0xE4, 0x7B, 0x01, 0x7A, 0x84, 0x79, +0x03, 0x12, 0x6D, 0x3F, 0xEF, 0xB4, 0x02, 0x14, 0x90, 0x86, 0x4A, 0xE0, 0x64, 0x04, 0x60, 0x07, +0x43, 0x14, 0x01, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x86, 0x4A, 0xF0, 0x22, 0x7F, 0x70, 0x7E, +0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, +0xEE, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, +0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, +0x01, 0xEE, 0xF0, 0x12, 0x1E, 0xF6, 0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, +0x12, 0x81, 0x7E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x84, 0x9C, 0xE0, 0xC3, 0x13, 0x30, 0xE0, +0x16, 0xEF, 0x7B, 0x01, 0xB4, 0x01, 0x06, 0x7A, 0x84, 0x79, 0xA3, 0x80, 0x04, 0x7A, 0x84, 0x79, +0x9F, 0x7F, 0x80, 0x7E, 0x08, 0xB1, 0x11, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, +0x97, 0xEF, 0x60, 0x4E, 0x90, 0x84, 0x01, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x06, 0xF9, 0x74, +0x84, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, +0x08, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xFA, 0x90, 0x86, 0x18, 0x12, 0x44, 0x89, 0xD0, 0x01, 0xD0, +0x02, 0xB1, 0xD7, 0x90, 0x84, 0x01, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0x90, +0x84, 0x02, 0xE0, 0xFF, 0x90, 0x84, 0x01, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, +0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x86, +0x15, 0x12, 0x44, 0x89, 0x90, 0x84, 0x00, 0xE0, 0x90, 0x00, 0x01, 0x12, 0x43, 0xD5, 0xF1, 0x97, +0xEF, 0x70, 0x02, 0xC1, 0x92, 0x90, 0x86, 0x15, 0x12, 0x44, 0x69, 0x8B, 0x20, 0x8A, 0x21, 0x89, +0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0xD1, 0x97, 0x90, 0x86, 0x18, 0x12, +0x44, 0x69, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x86, 0x15, 0x12, 0x44, 0x69, 0x12, 0x1E, +0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0xD1, 0x97, 0x90, +0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, 0x85, 0xC3, 0xE0, 0x64, 0x01, 0x70, 0x48, 0x90, 0x86, 0x15, +0x12, 0x44, 0x69, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0xFD, +0x79, 0x20, 0xD1, 0x97, 0x90, 0x86, 0x18, 0x12, 0x44, 0x69, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, +0x90, 0x86, 0x15, 0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, +0x01, 0x7A, 0xFD, 0x79, 0x22, 0xD1, 0x97, 0x90, 0x85, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, +0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x84, 0x00, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, +0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1D, +0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x86, 0x0F, 0x12, 0x44, 0x89, 0xAB, 0x20, 0xAA, 0x21, 0xA9, 0x22, +0x90, 0x86, 0x12, 0x12, 0x44, 0x89, 0xAF, 0x23, 0x15, 0x23, 0xEF, 0x60, 0x1E, 0x90, 0x86, 0x12, +0xE4, 0x75, 0xF0, 0x01, 0x12, 0x44, 0x72, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x86, 0x0F, 0xE4, 0x75, +0xF0, 0x01, 0x12, 0x44, 0x72, 0xEF, 0x12, 0x43, 0xC3, 0x80, 0xDB, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, +0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x86, 0x1B, +0x12, 0x44, 0x89, 0x90, 0x84, 0x02, 0xE0, 0xFF, 0x90, 0x84, 0x01, 0xE0, 0xB5, 0x07, 0x07, 0x7D, +0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x84, 0x01, 0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, +0x60, 0x0B, 0x90, 0x84, 0x01, 0xE0, 0x14, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x0D, 0xF1, 0x97, 0xEF, +0x60, 0x70, 0xB1, 0x78, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x90, 0x84, 0x02, 0xE0, 0x75, 0xF0, +0x0F, 0xA4, 0x24, 0x06, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0x90, 0x86, +0x1B, 0x12, 0x44, 0x69, 0x7E, 0x00, 0x7F, 0x02, 0x12, 0x1E, 0xD0, 0x90, 0x84, 0x02, 0xE0, 0x75, +0xF0, 0x0F, 0xA4, 0x24, 0x08, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, +0x02, 0xC0, 0x01, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x69, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, +0x86, 0x1B, 0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0xD0, 0x01, +0xD0, 0x02, 0xD0, 0x03, 0xD1, 0x97, 0x90, 0x84, 0x02, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, +0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x86, 0x39, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x86, 0x39, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, +0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, 0x90, 0x86, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x86, 0x3B, +0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, +0x86, 0x3B, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xF7, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, +0x80, 0xC6, 0x7F, 0x01, 0x22, 0x8F, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, +0x01, 0x64, 0x74, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xC4, +0x74, 0xF6, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, +0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, 0xE0, +0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3, +0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, 0x2B, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0x54, +0xEF, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x62, +0xE0, 0x54, 0x03, 0x4F, 0x90, 0x85, 0x7E, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x54, 0x3F, 0x25, 0xE0, +0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x85, 0x7F, 0xF0, 0x90, 0x85, +0x7E, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xE4, 0xFF, 0x90, 0x86, 0x21, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, +0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x86, 0x26, +0xF0, 0xD1, 0x4B, 0xBF, 0x01, 0x02, 0x11, 0xFB, 0x90, 0x86, 0x26, 0xE0, 0x90, 0x05, 0x22, 0xF0, +0x80, 0x02, 0x11, 0xFB, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x85, 0xBE, 0xE0, 0xFF, +0x7D, 0x01, 0x11, 0x2E, 0x90, 0x86, 0x24, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x86, +0x21, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x86, 0x2B, 0xF0, 0xEF, 0x60, 0x10, 0x74, +0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0E, 0x74, +0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, +0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x11, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, 0x16, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0xAE, 0x05, 0x74, 0x22, 0x2E, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEB, 0xF0, 0x90, 0x86, 0x2B, 0xE0, 0xFF, 0x74, 0x23, 0x2E, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x85, 0x7A, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, +0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x4A, 0x12, 0x85, 0x10, 0x90, 0x85, 0x3F, 0xE0, 0x64, +0x01, 0x60, 0x02, 0x41, 0xBD, 0x90, 0x85, 0x32, 0xE0, 0x30, 0xE0, 0x18, 0xE0, 0xC3, 0x13, 0x30, +0xE0, 0x02, 0x80, 0x0A, 0x90, 0x85, 0x32, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0xA3, 0xE0, +0x90, 0x85, 0x7A, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x7A, 0xE0, 0x24, 0x03, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, +0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x85, 0x3F, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, +0x03, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, +0x85, 0x2E, 0xE0, 0xFF, 0x90, 0x85, 0x3D, 0xE0, 0xC3, 0x9F, 0x90, 0x85, 0x43, 0xF0, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x30, 0xE0, 0x6E, 0x90, 0x85, 0x43, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, +0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xC8, 0x80, +0x51, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x85, 0x32, 0xE0, 0x54, +0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x49, 0xC6, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x85, 0x34, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, +0xE4, 0x90, 0x85, 0x42, 0xF0, 0x90, 0x85, 0x3F, 0xF0, 0x90, 0x85, 0x35, 0x74, 0x06, 0xF0, 0x90, +0x85, 0x65, 0xE0, 0x60, 0x07, 0x90, 0x85, 0x34, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, +0x6F, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x4A, 0xA1, 0xBB, 0x90, 0x85, 0x3F, +0xE0, 0x64, 0x02, 0x60, 0x02, 0x61, 0x9C, 0x90, 0x85, 0x31, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, +0x30, 0xE0, 0x08, 0xD1, 0x4B, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x08, 0xE4, 0xFF, 0xD1, 0xF5, 0x90, +0x85, 0x32, 0xE0, 0x30, 0xE0, 0x1F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x85, +0x32, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x90, 0x85, 0x7A, 0xF0, 0x90, 0x85, +0x32, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x2E, 0xE0, 0x24, 0x03, 0xFF, 0x90, +0x85, 0x7A, 0xE0, 0x2F, 0xFF, 0x90, 0x85, 0x3D, 0xE0, 0xC3, 0x9F, 0xFF, 0x90, 0x85, 0x7B, 0xE0, +0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, +0x74, 0x05, 0xF0, 0xE4, 0xFF, 0xD1, 0x92, 0x90, 0x85, 0x3F, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0x2D, +0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, +0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x20, 0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x4F, 0x12, 0x49, 0xC6, 0x80, 0x0B, 0xE5, 0x50, +0x60, 0x0D, 0xE4, 0xFD, 0xAF, 0x4F, 0x12, 0x49, 0xC6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, +0x85, 0x30, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, +0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x4A, 0xC1, 0x45, 0x90, 0x85, 0x3F, 0xE0, +0x64, 0x03, 0x60, 0x02, 0x81, 0xF0, 0x7F, 0x01, 0xD1, 0xF5, 0x90, 0x85, 0x31, 0xE0, 0xFF, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x66, 0x8A, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x20, 0xE0, 0x02, 0x81, 0x4C, 0x90, 0x85, 0x37, 0xE0, 0xFF, 0x90, 0x85, 0x41, 0xE0, +0xD3, 0x9F, 0x40, 0x4D, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x85, 0x39, 0xE0, 0xFE, 0xC3, +0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x85, 0x2F, 0xE0, 0xD3, 0x9D, 0xEC, +0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0x85, 0x7D, 0xF0, 0x80, 0x06, +0x90, 0x85, 0x7D, 0x74, 0x03, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x7D, 0xE0, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x85, 0x3F, 0xE0, 0x04, 0xF0, 0x80, +0x24, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x3A, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x85, 0x35, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x85, 0x3F, 0xF0, 0x90, +0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x85, 0x41, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, +0x85, 0x7C, 0xE0, 0xFF, 0x90, 0x85, 0x2F, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, +0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x85, 0x3F, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x63, 0x74, +0x05, 0xF0, 0x7F, 0x01, 0xD1, 0x92, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, +0x2F, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0x85, 0x32, 0xE0, 0x44, +0x20, 0xF0, 0x90, 0x85, 0x65, 0xE0, 0x60, 0x02, 0x80, 0x0F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, +0x01, 0x7F, 0x0C, 0x80, 0x08, 0xE5, 0x50, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x49, 0xC6, +0x90, 0x85, 0x65, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x85, 0x2D, 0xE0, 0xFF, 0x13, 0x13, +0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x50, 0xA5, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x85, 0x30, +0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x4A, 0x7F, 0x01, 0xC1, 0x47, +0x90, 0x85, 0x3F, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xA1, 0xC1, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, +0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x85, +0x3F, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, +0x85, 0x2F, 0xE0, 0xFF, 0x90, 0x85, 0x3D, 0xE0, 0xC3, 0x9F, 0x90, 0x85, 0x43, 0xF0, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x30, 0xE0, 0x6E, 0x90, 0x85, 0x43, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, +0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xC8, 0x80, +0x51, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x85, 0x32, 0xE0, 0x54, +0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x49, 0xC6, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x85, 0x34, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, +0xE4, 0x90, 0x85, 0x42, 0xF0, 0x90, 0x85, 0x3F, 0xF0, 0x90, 0x85, 0x35, 0x74, 0x07, 0xF0, 0x90, +0x85, 0x65, 0xE0, 0x60, 0x07, 0x90, 0x85, 0x34, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, +0x6F, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x4A, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x22, 0x90, 0x85, 0x3F, 0xE0, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x4A, 0x90, 0x85, 0x31, 0xE0, 0xFF, +0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xD1, 0x4B, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x08, 0xE4, +0xFF, 0xD1, 0xF5, 0xD1, 0x92, 0xE4, 0x90, 0x85, 0x3F, 0xF0, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x85, 0x2D, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, +0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x4F, 0x12, 0x49, 0xC6, 0x80, 0x0B, 0xE5, 0x50, 0x60, 0x0D, 0xE4, +0xFD, 0xAF, 0x4F, 0x12, 0x49, 0xC6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x85, 0x30, 0xE0, +0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x13, 0x13, 0x13, +0x54, 0x01, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x55, 0x58, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, +0xF0, 0xE4, 0x90, 0x86, 0x48, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, +0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x86, +0x49, 0xE0, 0x94, 0xE8, 0x90, 0x86, 0x48, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, 0x7F, +0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x86, 0x48, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xF7, +0x80, 0xC6, 0x90, 0x86, 0x2C, 0xEF, 0xF0, 0x12, 0x86, 0xB9, 0x90, 0x85, 0x30, 0xE0, 0xFF, 0xC4, +0x13, 0x54, 0x07, 0x20, 0xE0, 0x08, 0x90, 0x86, 0x2C, 0xE0, 0xFF, 0x12, 0x50, 0x48, 0x90, 0x86, +0x2D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x90, 0x86, 0x2C, 0xE0, 0xB4, 0x01, 0x10, 0x90, +0x85, 0x2D, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x80, 0x0A, 0x90, +0x85, 0x2D, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x86, 0x2D, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x86, 0x79, 0x2D, 0x12, 0x55, 0x0D, 0x90, 0x86, 0x2C, 0xE0, +0x90, 0x85, 0x3E, 0xF0, 0x22, 0xEF, 0x64, 0x03, 0x60, 0x02, 0xE1, 0xC3, 0x90, 0x86, 0x07, 0x74, +0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0x13, 0x13, 0x13, 0x54, +0x1F, 0x30, 0xE0, 0x30, 0x90, 0x86, 0x0B, 0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0xA3, 0x74, +0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, +0x90, 0x86, 0x07, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, +0x55, 0xF0, 0x80, 0x2D, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x17, 0x90, 0x86, +0x07, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, +0xA3, 0x74, 0x5A, 0x80, 0x05, 0x90, 0x86, 0x0B, 0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0x90, 0x86, 0x07, 0xE0, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x86, 0x08, 0xE0, 0x90, 0x06, 0xC1, +0xF0, 0x90, 0x86, 0x09, 0xE0, 0x90, 0x06, 0xC2, 0xF0, 0x90, 0x86, 0x0A, 0xE0, 0x90, 0x06, 0xC3, +0xF0, 0x90, 0x86, 0x0B, 0xE0, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x86, 0x0C, 0xE0, 0x90, 0x06, 0xC5, +0xF0, 0x90, 0x86, 0x0D, 0xE0, 0x90, 0x06, 0xC6, 0xF0, 0x90, 0x86, 0x0E, 0xE0, 0x90, 0x06, 0xC7, +0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x17, +0xE4, 0xF0, 0x22, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEF, 0x90, 0x06, +0xCC, 0xB4, 0x01, 0x03, 0xE4, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x57, 0xF6, 0xBF, 0x01, +0x0F, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x2E, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, 0xE0, 0x02, 0x7D, +0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90, 0x01, 0x30, 0xE5, +0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B, 0xF0, 0x22, 0x75, +0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x43, 0x32, 0x20, 0x90, 0x01, +0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, 0x22, 0x90, 0x00, 0xF4, +0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x00, 0x22, +0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x85, 0xC5, 0xE0, +0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, 0x22, 0x7E, +0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, +0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x85, 0x8F, 0xF0, 0xA3, 0xF0, +0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, +0xC3, 0x90, 0x85, 0x90, 0xE0, 0x94, 0x88, 0x90, 0x85, 0x8F, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, +0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x85, 0x8F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, +0xF7, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x85, 0x90, 0xE0, 0x94, 0x32, 0x90, +0x85, 0x8F, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, +0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, +0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, +0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, +0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, +0x0C, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, +0x85, 0x76, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, +0x60, 0x07, 0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3C, 0x90, 0x85, 0x76, 0x74, 0x01, 0xF0, 0xA3, +0x74, 0x3D, 0xF0, 0x79, 0x40, 0x90, 0x85, 0x76, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, +0x83, 0xE0, 0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x85, 0xB1, 0xF0, 0x22, 0x90, 0x85, 0xB1, +0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0C, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, +0xE0, 0x03, 0x12, 0x5F, 0xDB, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, +0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x96, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x90, 0x01, 0x34, +0xE0, 0x55, 0x28, 0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, +0x2E, 0xA3, 0xE0, 0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x41, 0x65, 0x90, 0x01, +0x34, 0x74, 0x01, 0xF0, 0x85, 0xD1, 0x0A, 0x85, 0xD3, 0x0C, 0x85, 0xD4, 0x0D, 0x85, 0xD5, 0x0E, +0x85, 0xD6, 0x0F, 0x85, 0xD7, 0x10, 0x85, 0xD9, 0x11, 0x85, 0xD2, 0x0B, 0x75, 0x20, 0x00, 0x75, +0x21, 0x00, 0x75, 0x22, 0x0A, 0x75, 0x23, 0x08, 0xFB, 0x7A, 0x85, 0x79, 0xB2, 0x12, 0x56, 0x97, +0xE5, 0x50, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x46, 0x90, 0x85, 0x72, 0xE0, 0x60, 0x37, 0x90, +0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x12, 0x50, 0xFB, 0xEF, 0x64, 0x01, +0x70, 0x2D, 0xF5, 0x48, 0x90, 0x85, 0x5E, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, +0x90, 0x85, 0x6E, 0xF0, 0x80, 0x09, 0x12, 0x50, 0xFB, 0xBF, 0x01, 0x03, 0x12, 0x51, 0x63, 0x90, +0x86, 0x4B, 0xE0, 0x04, 0xF0, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0x07, 0x90, 0x01, 0x34, 0x74, +0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, 0x0B, 0x75, +0x58, 0x88, 0x75, 0x59, 0x0F, 0x75, 0x5A, 0x0F, 0x80, 0x09, 0x75, 0x58, 0xC0, 0x75, 0x59, 0x08, +0x75, 0x5A, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x5A, 0xF5, 0x12, 0x90, 0x04, 0x7E, 0xE0, 0x55, +0x5A, 0xF5, 0x13, 0x65, 0x12, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x12, 0x75, 0xF0, 0x08, 0xA4, 0x25, +0x58, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x15, 0x2F, +0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x15, +0x75, 0x23, 0x08, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xA9, 0x12, 0x56, 0x97, 0x90, 0x85, 0xA9, 0xE0, +0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xB1, 0xBF, 0xE5, 0x12, 0x24, 0x01, +0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x59, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, 0x12, 0x90, +0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x13, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, +0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x14, 0x10, +0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, +0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x53, 0x66, 0x90, +0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x53, 0x99, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x06, +0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x81, 0x0F, 0x90, 0x85, 0xC4, +0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, +0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x12, 0x42, 0x20, 0x90, +0x85, 0x45, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0x06, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, +0x12, 0x50, 0x48, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x85, 0x45, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0xFF, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9F, 0x40, 0x30, 0xE0, 0x54, 0xFE, +0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x90, 0x85, 0x4A, 0x12, 0x44, 0x45, 0x90, 0x81, 0x57, 0x12, 0x1F, +0xC9, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x85, 0x46, 0x12, 0x44, 0x45, 0x90, 0x81, +0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x80, 0x1B, 0x90, 0x85, 0x45, +0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0xFE, +0x25, 0xE0, 0x4F, 0xF0, 0x80, 0x02, 0xD1, 0x14, 0xB1, 0x84, 0x90, 0x85, 0xC4, 0xE4, 0xF0, 0xE5, +0x2E, 0x30, 0xE1, 0x41, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0xF1, 0x0B, 0x31, 0x27, 0x90, 0x85, +0x75, 0xE0, 0x60, 0x1D, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, +0x3A, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x85, 0x70, 0xE0, 0x90, 0x05, 0x73, +0xF0, 0x05, 0x08, 0xE5, 0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, +0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x43, 0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, +0x12, 0x4B, 0xD0, 0x90, 0x85, 0x75, 0xE0, 0x60, 0x34, 0x90, 0x85, 0x70, 0xE0, 0xFF, 0x90, 0x85, +0x59, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x85, 0x70, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, +0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, +0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x85, 0x59, 0xE0, 0x14, 0xF0, 0xE5, 0x2E, 0x30, +0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x4D, 0x64, 0x01, 0x70, 0x28, 0xE5, 0x50, +0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x75, 0x48, 0x00, +0x90, 0x85, 0x64, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, +0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, +0xF0, 0xE5, 0x4D, 0xB4, 0x01, 0x20, 0xE5, 0x50, 0x60, 0x1C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, +0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x85, 0x73, 0xE4, 0xF0, 0x53, 0x51, 0xFD, 0xE5, 0x51, 0x54, +0x07, 0x70, 0x03, 0x12, 0x51, 0x63, 0xE5, 0x2E, 0x30, 0xE5, 0x25, 0x90, 0x01, 0x36, 0x74, 0x20, +0xF0, 0xE5, 0x4D, 0xB4, 0x01, 0x1A, 0xE5, 0x50, 0x60, 0x16, 0x90, 0x85, 0x72, 0xE0, 0x64, 0x02, +0x60, 0x0B, 0xE5, 0x4E, 0x64, 0x0C, 0x60, 0x08, 0x12, 0x50, 0xA5, 0x80, 0x03, 0x12, 0x4F, 0xD4, +0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, 0xF0, 0xE5, 0x4D, 0xB4, 0x01, 0x10, +0xE5, 0x50, 0x60, 0x0C, 0x53, 0x51, 0xFE, 0xE5, 0x51, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x63, +0xE5, 0x2F, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x12, 0x4F, 0x57, 0x74, 0x96, +0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, +0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x86, 0x3E, 0xE0, 0x30, 0xE0, 0x2E, 0xE5, 0x4D, 0xB4, 0x01, 0x29, +0x90, 0x86, 0x3D, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x86, 0x40, 0xE0, 0x04, 0xF0, +0xE4, 0x90, 0x86, 0x3D, 0xF0, 0x90, 0x86, 0x40, 0xE0, 0xFF, 0x90, 0x86, 0x3F, 0xE0, 0xD3, 0x9F, +0x50, 0x07, 0xB1, 0xBA, 0xE4, 0x90, 0x86, 0x40, 0xF0, 0x22, 0xE4, 0xFF, 0x02, 0x4D, 0x84, 0x90, +0x85, 0x76, 0xE0, 0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, +0x00, 0x79, 0x15, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x0B, 0x7A, 0x85, 0x79, 0x76, 0x02, 0x56, +0xE6, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x12, 0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x86, 0x3E, +0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xE0, 0x30, 0xE0, 0x02, 0xB1, 0xBA, 0x90, 0x85, 0x9A, 0x12, 0x44, +0x69, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, +0x86, 0x3F, 0xF0, 0x22, 0x90, 0x85, 0x2D, 0xE0, 0x30, 0xE0, 0x6E, 0x7F, 0x01, 0x12, 0x5E, 0xF5, +0x90, 0x85, 0x31, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xD1, 0x8A, 0x7F, 0x01, +0x12, 0x5E, 0x92, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x29, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0x85, 0x32, 0xE0, 0x44, 0x20, 0xF0, 0x90, +0x85, 0x65, 0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x49, 0xC6, 0x90, 0x85, 0x65, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, +0x74, 0x6F, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x58, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x85, 0xEF, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x85, 0xF3, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, +0xFF, 0xF0, 0x90, 0x85, 0x63, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x85, +0x56, 0xE0, 0x60, 0x14, 0x12, 0x50, 0xFB, 0xBF, 0x01, 0x0B, 0x90, 0x85, 0x2D, 0xE0, 0xFF, 0xC4, +0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0x4F, 0x15, 0x90, 0x85, 0x45, 0xE0, 0x20, 0xE0, 0x24, 0x90, +0x85, 0x60, 0xE0, 0x60, 0x1E, 0x7F, 0x01, 0x12, 0x50, 0x48, 0x90, 0x85, 0x74, 0xE0, 0x60, 0x13, +0x90, 0x85, 0xF3, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xF3, +0x12, 0x55, 0x0D, 0x12, 0x53, 0x92, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x85, 0x76, 0xF0, +0x90, 0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0xE1, 0xAD, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x2A, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x39, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, +0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x85, +0x35, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x85, 0x41, 0xF0, 0x90, 0x85, 0x3F, 0xF0, 0x80, 0x20, 0xE4, +0xF5, 0x48, 0x90, 0x85, 0x76, 0xE0, 0xFF, 0x90, 0x85, 0x2E, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x85, 0x3F, 0x74, 0x01, 0xF0, 0x90, +0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x3E, 0x74, 0x01, 0xF0, 0x90, 0x85, 0x65, 0xE0, 0x60, +0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x85, 0x2D, 0xE0, 0xFF, 0x13, 0x13, +0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x50, 0xA5, 0xE4, 0x90, 0x86, 0x4B, 0xF0, 0x22, 0xC0, 0xE0, +0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x7D, +0xAE, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0x53, 0x91, 0xEF, 0x90, 0x00, +0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, 0x52, 0xE0, 0xFE, 0x90, +0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, 0x00, 0x55, 0x74, 0x10, +0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, 0xE5, 0x3D, 0x30, 0xE6, +0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, 0x90, 0x00, 0x55, 0x74, +0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, 0xF0, 0xE5, 0x3E, 0x30, +0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, 0x06, 0x90, 0x00, 0x56, +0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, 0x08, 0xF0, 0x90, 0x01, +0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, +0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, +0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, +0xC0, 0x07, 0x75, 0x5B, 0x00, 0x90, 0x01, 0xC4, 0x74, 0x55, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x53, +0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31, 0xF5, 0x35, +0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34, 0x30, 0xE0, +0x06, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0xE5, 0x34, 0x30, 0xE1, 0x10, 0x90, 0x01, 0x3C, 0x74, +0x02, 0xF0, 0x90, 0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x45, 0xD6, 0xE5, 0x34, 0x30, 0xE2, +0x36, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, 0x75, 0x48, +0x00, 0x90, 0x85, 0x5E, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, +0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, +0x85, 0x6E, 0xE4, 0xF0, 0x12, 0x51, 0x63, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, 0x3C, 0x74, +0x08, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x85, 0x5E, 0xE0, +0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, +0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x85, 0x6B, 0xE4, 0xF0, 0x12, +0x51, 0x63, 0xE5, 0x34, 0x30, 0xE4, 0x3C, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x90, 0x85, 0x45, +0xE0, 0x30, 0xE0, 0x24, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0x48, 0x90, +0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, +0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x80, 0x03, 0x12, 0x59, 0xA6, 0x90, 0x85, 0x4E, 0xE0, 0x60, +0x02, 0x51, 0xE8, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, +0x30, 0xE0, 0x18, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xF5, 0x4F, 0x90, +0x01, 0xBB, 0xE5, 0x4F, 0xF0, 0x12, 0x51, 0x2C, 0x12, 0x51, 0x63, 0xE5, 0x35, 0x30, 0xE2, 0x06, +0x90, 0x01, 0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, +0xF0, 0x90, 0x85, 0xC0, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, +0x90, 0x05, 0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x01, +0xF0, 0xE5, 0x36, 0x30, 0xE1, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0xE5, 0x36, 0x30, 0xE3, +0x09, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0x12, 0x84, 0xF2, 0xE5, 0x36, 0x30, 0xE4, 0x06, 0x90, +0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x76, 0x90, 0x01, 0x3E, 0x74, 0x04, 0xF0, +0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE7, 0x13, 0x74, 0x80, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x04, 0xF0, +0xA3, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0xFF, 0x12, 0x55, 0x58, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE6, +0x12, 0x74, 0x40, 0xF0, 0x90, 0x07, 0x7C, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x07, 0x80, 0xE0, 0xFF, +0x12, 0x84, 0x9C, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE5, 0x14, 0x74, 0x20, 0xF0, 0xE4, 0xFF, 0x12, +0x55, 0x58, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, +0x95, 0xE0, 0x30, 0xE2, 0x0D, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0x7F, 0x01, 0x12, +0x55, 0x58, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE0, 0x07, 0x74, 0x01, 0xF0, 0xFF, 0x12, 0x55, 0x58, +0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, 0x30, 0xE6, 0x06, +0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x80, +0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, 0x14, 0x80, 0xE5, +0x37, 0x30, 0xE4, 0x1E, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x45, 0x09, 0x90, 0x85, 0x70, +0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x12, 0x66, 0x14, 0x12, +0x65, 0x84, 0x74, 0x55, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, +0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, +0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x01, 0x63, 0xE4, 0xF0, 0x90, 0x81, 0x57, +0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x7F, 0x01, +0x02, 0x55, 0x58, 0x12, 0x1E, 0xF6, 0x90, 0x85, 0x4E, 0xF0, 0x70, 0x02, 0x51, 0xE8, 0x22, 0x90, +0x85, 0x97, 0x12, 0x44, 0x89, 0xEF, 0x12, 0x44, 0x92, 0x6B, 0xAC, 0x01, 0x6B, 0xA4, 0x02, 0x6B, +0xF3, 0x03, 0x6B, 0xFC, 0x10, 0x6C, 0x04, 0x11, 0x6C, 0x0C, 0x12, 0x6C, 0x14, 0x16, 0x6C, 0x1E, +0x17, 0x6C, 0x28, 0x18, 0x6C, 0x32, 0x19, 0x6C, 0x3B, 0x1D, 0x6C, 0x45, 0x1E, 0x6C, 0x50, 0x21, +0x6C, 0x58, 0x22, 0x6C, 0x60, 0x23, 0x6C, 0x68, 0x24, 0x6C, 0x70, 0x25, 0x6C, 0x78, 0x26, 0x6C, +0x80, 0x27, 0x6C, 0x88, 0x28, 0x6C, 0x90, 0x29, 0x6B, 0xB5, 0x2D, 0x6B, 0xBE, 0x2E, 0x6C, 0x99, +0x2F, 0x6C, 0xF9, 0x30, 0x6C, 0xA9, 0x32, 0x6C, 0xA1, 0x33, 0x6B, 0xD0, 0x34, 0x6C, 0xB1, 0x36, +0x6C, 0xBA, 0x37, 0x6C, 0xC3, 0x38, 0x6C, 0xCB, 0x3A, 0x6B, 0xC7, 0x3B, 0x6C, 0xD4, 0x3E, 0x6C, +0xDC, 0x3F, 0x6C, 0xE5, 0x41, 0x6D, 0x02, 0x46, 0x6B, 0xD8, 0x47, 0x6B, 0xEA, 0x48, 0x6B, 0xE1, +0x49, 0x6D, 0x1C, 0x4B, 0x6D, 0x0B, 0x4E, 0x6C, 0xEE, 0x52, 0x6C, 0xF1, 0x53, 0x6D, 0x13, 0x54, +0x00, 0x00, 0x6D, 0x25, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0xED, 0x90, 0x85, 0x97, 0x12, +0x44, 0x69, 0x02, 0x77, 0x78, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x78, 0x59, 0x90, 0x85, +0x97, 0x12, 0x44, 0x69, 0x02, 0x78, 0xA1, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x78, 0xDA, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0xF3, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x79, +0x0C, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x79, 0xCC, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, +0x02, 0x80, 0xE2, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x79, 0xDD, 0x90, 0x85, 0x97, 0x12, +0x44, 0x69, 0xA1, 0x2D, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xA1, 0x33, 0x90, 0x85, 0x97, 0x12, +0x44, 0x69, 0xA1, 0x39, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x7F, 0x01, 0x80, 0x2F, 0x90, 0x85, +0x97, 0x12, 0x44, 0x69, 0x7F, 0x02, 0x80, 0x25, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x7F, 0x03, +0x80, 0x1B, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x7B, 0x07, 0x90, 0x85, 0x97, 0x12, 0x44, +0x69, 0xE4, 0xFF, 0x80, 0x08, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x7F, 0x04, 0x02, 0x7A, 0x25, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xC1, 0xE5, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xC1, 0xFD, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x15, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x2D, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x45, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x5D, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x75, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x8D, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x7B, 0x3F, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xC1, +0xD6, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0xA5, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, +0xBD, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x7B, 0x67, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, +0x02, 0x7D, 0x1A, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xA1, 0xCC, 0x90, 0x85, 0x97, 0x12, 0x44, +0x69, 0x02, 0x7D, 0x2C, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0xD5, 0x90, 0x85, 0x97, 0x12, +0x44, 0x69, 0x02, 0x80, 0x43, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x80, 0x7E, 0x02, 0x80, +0x97, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x61, 0x03, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, +0x65, 0xE1, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x73, 0xE3, 0x90, 0x85, 0x97, 0x12, 0x44, +0x69, 0xA1, 0xEE, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x80, 0xEA, 0x90, 0x85, 0x97, 0x12, +0x44, 0x69, 0x02, 0x81, 0x6C, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x05, 0x7F, +0x0B, 0x80, 0x10, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0A, 0x7D, 0x01, 0x7F, 0x0D, 0x80, 0x04, 0x7D, +0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x86, 0x41, 0x12, 0x44, 0x89, +0xE4, 0xFE, 0x90, 0x00, 0xA3, 0xE0, 0x54, 0xF8, 0x44, 0x05, 0xF0, 0x90, 0x00, 0xA0, 0xE0, 0x54, +0x0F, 0x64, 0x04, 0x70, 0x5A, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x49, 0x90, 0xFD, 0x50, 0xEF, +0xF0, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0x86, 0x41, 0x12, 0x44, 0x69, 0x8E, +0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, +0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0F, 0x74, 0x52, 0x2E, +0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0x90, 0xFD, 0x58, 0x74, +0x01, 0xF0, 0xFF, 0x80, 0x12, 0x90, 0x01, 0x43, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, 0x08, 0x90, +0x01, 0x42, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x85, 0x9A, 0x12, +0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, +0x7F, 0x23, 0xB1, 0x43, 0xEF, 0xB4, 0x03, 0x05, 0x7F, 0xFF, 0x12, 0x75, 0x82, 0x22, 0x90, 0x85, +0x9A, 0x12, 0x44, 0x89, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x9D, 0x74, 0x0A, +0xF0, 0x90, 0x85, 0x9D, 0xE0, 0xFF, 0x70, 0x02, 0xC1, 0xD1, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, +0x02, 0xC1, 0xC8, 0x90, 0xFD, 0x50, 0x74, 0x86, 0xF0, 0xA3, 0xE4, 0xF0, 0xEF, 0xB4, 0x0A, 0x05, +0xA3, 0x74, 0x10, 0x80, 0x75, 0x90, 0x85, 0x9D, 0xE0, 0xFF, 0xB4, 0x09, 0x0E, 0x90, 0xFD, 0x52, +0x74, 0x0C, 0xF0, 0x90, 0xFD, 0x54, 0x74, 0x83, 0xF0, 0x80, 0x77, 0xEF, 0xB4, 0x08, 0x0D, 0x90, +0xFD, 0x52, 0xE4, 0xF0, 0x90, 0xFD, 0x54, 0x74, 0x1D, 0xF0, 0x80, 0x66, 0xEF, 0xB4, 0x07, 0x07, +0x90, 0xFD, 0x52, 0x74, 0x04, 0x80, 0x43, 0xEF, 0xB4, 0x06, 0x0E, 0x90, 0xFD, 0x52, 0x74, 0x20, +0xF0, 0x90, 0xFD, 0x54, 0x74, 0x70, 0xF0, 0x80, 0x49, 0xEF, 0xB4, 0x05, 0x0E, 0x90, 0xFD, 0x52, +0x74, 0x0C, 0xF0, 0x90, 0xFD, 0x54, 0x74, 0x03, 0xF0, 0x80, 0x37, 0xEF, 0xB4, 0x04, 0x07, 0x90, +0xFD, 0x52, 0x74, 0x24, 0x80, 0x14, 0xEF, 0xB4, 0x03, 0x07, 0x90, 0xFD, 0x52, 0x74, 0x30, 0x80, +0x09, 0xEF, 0xB4, 0x02, 0x0D, 0x90, 0xFD, 0x52, 0x74, 0x28, 0xF0, 0x90, 0xFD, 0x54, 0xE4, 0xF0, +0x80, 0x10, 0xEF, 0xB4, 0x01, 0x0C, 0x90, 0xFD, 0x52, 0x74, 0x10, 0xF0, 0x90, 0xFD, 0x54, 0x74, +0x80, 0xF0, 0x90, 0xFD, 0x53, 0xE4, 0xF0, 0x90, 0xFD, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0x04, 0xF0, 0x90, 0x85, 0x9D, 0xE0, 0x14, 0xF0, 0x7F, 0x46, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xC1, +0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xE9, 0x24, 0x01, 0xF9, 0xE4, 0x3A, +0xFA, 0x7D, 0x04, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, 0x7F, 0x17, 0xA1, 0x43, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, +0x01, 0x7F, 0x18, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, 0x7F, 0x19, 0xA1, 0x43, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, +0x01, 0x7F, 0x1A, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, 0x7F, 0x1B, 0xA1, 0x43, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, +0x01, 0x7F, 0x1C, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x03, 0x7F, 0x1D, 0xA1, 0x43, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, +0x01, 0x7F, 0x1E, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, 0x7F, 0x1F, 0xA1, 0x43, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, +0x01, 0x7F, 0x20, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, 0x7F, 0x24, 0xA1, 0x43, 0x12, 0x1E, 0xF6, +0xF5, 0x4D, 0x22, 0x90, 0x85, 0x9A, 0x02, 0x44, 0x89, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x53, 0x91, 0xBF, 0x90, 0xFD, 0x68, 0xE0, 0x20, 0xE0, 0x02, +0x41, 0xB9, 0x90, 0x85, 0xA6, 0xE0, 0x70, 0x16, 0x90, 0x00, 0x2E, 0xE0, 0x90, 0x84, 0xA7, 0xF0, +0x90, 0x00, 0x2D, 0xE0, 0x90, 0x84, 0xA8, 0xF0, 0x90, 0x85, 0xA6, 0x74, 0x01, 0xF0, 0x90, 0xFD, +0x60, 0xE0, 0x54, 0x3F, 0xD3, 0x94, 0x09, 0x50, 0x02, 0x91, 0x92, 0x90, 0xFD, 0x60, 0xE0, 0x64, +0x0E, 0x60, 0x02, 0x01, 0xF9, 0x90, 0x84, 0x9C, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, +0xE0, 0x02, 0x01, 0xF9, 0x90, 0xFD, 0x62, 0xE0, 0x54, 0xC0, 0xFE, 0x90, 0x07, 0x90, 0xE0, 0x54, +0x3F, 0x4E, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x07, 0x91, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, +0x07, 0x92, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x07, 0x93, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x01, +0xF0, 0xEF, 0x20, 0xE0, 0x44, 0x90, 0x84, 0x9C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x19, +0x90, 0x07, 0x78, 0x12, 0x58, 0x8E, 0x90, 0x84, 0x9C, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x49, +0x90, 0x07, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x80, 0x40, 0x90, 0x84, 0x9C, 0xE0, 0xFF, 0xC3, 0x13, +0x30, 0xE0, 0x11, 0xE4, 0xFF, 0x12, 0x55, 0x58, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, +0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, 0x78, 0x80, 0x14, 0x90, 0x84, 0x9C, 0xE0, 0xFF, 0x13, 0x13, +0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x12, 0x58, 0x8E, 0x80, 0x0C, 0xE0, 0x44, 0x10, +0xF0, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x0F, 0x0A, +0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x71, 0x4D, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x15, +0x70, 0x76, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x85, 0x81, 0xF0, 0xE0, 0x30, 0xE6, 0x1C, 0xF4, 0x54, +0x3F, 0x04, 0xFF, 0x90, 0x84, 0xA7, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9F, 0x90, 0x85, 0x80, +0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x20, 0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x84, 0xA7, 0xE0, 0x13, 0x13, +0x54, 0x3F, 0xFF, 0x90, 0x85, 0x81, 0xE0, 0x54, 0x3F, 0x2F, 0x90, 0x85, 0x80, 0xF0, 0xD3, 0x94, +0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0x85, 0x80, 0xE0, 0xFF, 0x90, 0x01, 0xE7, 0xF0, 0xEF, +0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFF, 0x90, 0x85, 0x80, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, +0x90, 0x85, 0x82, 0xF0, 0x90, 0x00, 0x2E, 0xF0, 0xEE, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x84, 0xA8, +0xE0, 0x54, 0x0F, 0x4F, 0x90, 0x00, 0x2D, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x21, 0x07, 0x90, +0xFD, 0x62, 0xE0, 0xFF, 0x51, 0xD4, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x22, 0x02, 0x51, 0xFC, 0x90, +0xFD, 0x60, 0xE0, 0x64, 0x23, 0x70, 0x7A, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x85, 0x44, 0x30, 0xE0, +0x05, 0x74, 0x01, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE1, 0x5B, 0x90, +0x85, 0x45, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x60, 0x7E, 0x08, +0x12, 0x2C, 0x6E, 0x90, 0x85, 0x4A, 0x12, 0x1F, 0xC9, 0xE4, 0xFF, 0x12, 0x50, 0x48, 0x7F, 0x70, +0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x85, 0x46, 0x12, 0x1F, 0xC9, 0x90, 0x81, 0x57, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x01, 0xBE, 0xE0, +0x04, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x85, 0x45, 0x30, 0xE2, 0x08, 0xE0, 0x54, 0x1F, 0x44, +0x20, 0xF0, 0x80, 0x06, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0xFF, 0xB1, +0x82, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x24, 0x02, 0x71, 0x24, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x25, +0x13, 0x90, 0xFD, 0x62, 0xE0, 0x60, 0x0D, 0x90, 0x85, 0x34, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x85, +0x3C, 0x74, 0x04, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x26, 0x04, 0x7F, 0x01, 0x91, 0xFE, 0x90, +0xFD, 0x60, 0xE0, 0xB4, 0x30, 0x07, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0x71, 0x78, 0x90, 0x85, 0x4E, +0xE0, 0x60, 0x4F, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x31, 0x70, 0x47, 0x90, 0xFD, 0x62, 0xE0, 0x30, +0xE0, 0x36, 0x90, 0x01, 0x63, 0xE4, 0xF0, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0xE4, 0xFF, 0x12, 0x50, 0x48, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, +0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0xE4, 0xFF, 0x12, 0x55, 0x58, +0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x80, 0x0A, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE1, 0x03, 0x12, +0x6A, 0xE8, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, +0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xF0, 0xD0, 0xE0, 0x32, 0xAD, 0x07, 0x90, 0x85, 0x83, 0xE0, 0x54, 0xF0, 0x44, 0x09, 0xF0, 0x54, +0x0F, 0x44, 0x10, 0xF0, 0x90, 0x85, 0x85, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x85, 0x90, +0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0x83, 0x02, 0x56, 0xE6, 0x90, 0x00, 0x75, 0xE0, +0x44, 0x01, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0x74, 0x03, 0xF0, +0x7F, 0x02, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0xE4, 0xF0, 0x90, 0x00, 0x75, 0xE0, +0x54, 0xFE, 0xF0, 0x22, 0x90, 0x85, 0x83, 0xE0, 0x54, 0xF0, 0x44, 0x0D, 0xF0, 0x54, 0x0F, 0x44, +0x10, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x85, 0x85, 0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x85, +0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0x83, 0x02, 0x56, 0xE6, 0xAE, 0x07, 0x90, +0x85, 0x83, 0xE0, 0x54, 0xF0, 0x44, 0x04, 0xF0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x85, 0x85, +0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x85, 0x90, 0x86, 0x1E, 0x12, 0x44, +0x89, 0x7A, 0x85, 0x79, 0x83, 0x02, 0x56, 0xE6, 0xAC, 0x07, 0x90, 0x85, 0xDE, 0xE0, 0x44, 0x0F, +0xF0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x85, 0xE0, 0xEC, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, +0xE0, 0x90, 0x85, 0xE1, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0x85, 0xE2, 0xF0, 0x90, 0xFD, 0x64, +0xE0, 0x90, 0x85, 0xE3, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x85, 0xE4, 0xF0, 0x90, 0xFD, 0x66, +0xE0, 0x90, 0x85, 0xE5, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x85, 0xE6, 0xF0, 0x80, 0x11, 0x90, +0x85, 0xE1, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0x7B, 0x01, 0x7A, 0x85, 0x79, 0xE0, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0xDE, +0x02, 0x56, 0xE6, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1E, 0xF6, 0x90, 0x85, 0x9A, +0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x9B, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0x90, 0x85, 0x9C, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x9D, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x9E, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, +0x58, 0xE0, 0x20, 0xE0, 0x14, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x9A, 0x7F, 0x30, 0x91, 0x48, 0x90, +0x85, 0x9A, 0xE0, 0xFB, 0x7D, 0x01, 0xE4, 0x80, 0x07, 0x90, 0x85, 0x9A, 0xE0, 0xFB, 0xE4, 0xFD, +0xFF, 0x71, 0x78, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x85, 0xA1, 0x12, 0x44, 0x89, 0xE4, 0xFE, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x2F, 0x90, 0xFD, +0x50, 0xEF, 0xF0, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0x85, 0xA1, 0x12, 0x44, 0x69, 0x8E, +0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, +0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0x85, 0x83, 0xE0, 0x54, 0xF0, 0x44, 0x0A, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, +0x85, 0x85, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x85, 0x86, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, +0x85, 0x87, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x85, 0x88, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, +0x85, 0x89, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x85, 0x83, 0x30, 0xE6, 0x08, 0xE0, 0x54, 0x0F, +0x44, 0x50, 0xF0, 0x80, 0x16, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, +0x85, 0x8A, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x85, 0x8B, 0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, +0x85, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0x83, 0x02, 0x56, 0xE6, 0xAD, 0x07, +0x90, 0x85, 0x83, 0xE0, 0x54, 0xF0, 0x44, 0x0E, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, +0x90, 0x85, 0x86, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x85, 0x87, 0xF0, 0x90, 0xFD, 0x64, 0xE0, +0x90, 0x85, 0x88, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x85, 0x89, 0xF0, 0x90, 0xFD, 0x66, 0xE0, +0x90, 0x85, 0x8A, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x85, 0x8B, 0xF0, 0xED, 0xB4, 0x01, 0x11, +0x90, 0x85, 0x83, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x85, 0x85, 0x74, 0x01, 0xF0, 0x80, +0x13, 0xED, 0xB4, 0x02, 0x0F, 0x90, 0x85, 0x83, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x85, +0x85, 0x74, 0x02, 0xF0, 0x90, 0x85, 0x83, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x13, 0x7B, 0x01, +0x7A, 0x85, 0x79, 0x85, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0x83, 0x12, 0x56, +0xE6, 0x22, 0xAD, 0x07, 0x90, 0x85, 0xFF, 0xE0, 0x54, 0xF0, 0x44, 0x0C, 0xF0, 0x54, 0x0F, 0xF0, +0x90, 0xFD, 0x62, 0xE0, 0x90, 0x86, 0x01, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x86, 0x02, 0xF0, +0x90, 0xFD, 0x64, 0xE0, 0x90, 0x86, 0x03, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x86, 0x04, 0xF0, +0x90, 0xFD, 0x66, 0xE0, 0x90, 0x86, 0x05, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x86, 0x06, 0xF0, +0xED, 0xB4, 0x02, 0x0B, 0x90, 0x85, 0xFF, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x80, 0x3C, 0xED, +0xB4, 0x04, 0x0B, 0x90, 0x85, 0xFF, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x80, 0x2D, 0xED, 0xF4, +0x70, 0x29, 0x90, 0x85, 0xFF, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x90, 0x85, 0x44, 0xE0, 0x60, +0x08, 0x90, 0x86, 0x01, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x86, 0x01, 0xF0, 0xE4, 0x90, +0x86, 0x02, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x86, 0x79, +0x01, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0xFF, 0x02, 0x56, 0xE6, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x85, 0x8F, 0xF0, 0x90, +0x85, 0x8F, 0xE0, 0xFD, 0x70, 0x02, 0xE1, 0x67, 0x90, 0x86, 0x4C, 0xE0, 0xFF, 0x74, 0x01, 0x7E, +0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, +0x70, 0x02, 0xE1, 0x60, 0x90, 0x86, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x44, +0x5D, 0xE0, 0x90, 0x85, 0x90, 0xF0, 0x75, 0x20, 0x01, 0x75, 0x21, 0x85, 0x75, 0x22, 0x90, 0x75, +0x23, 0x01, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x91, 0x12, 0x56, 0x97, 0x90, 0x85, 0x91, 0xE0, 0xFF, +0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x86, 0x4C, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, 0x02, +0x90, 0x00, 0x88, 0x12, 0x44, 0x5D, 0xE0, 0x90, 0x85, 0x92, 0xF0, 0x90, 0x86, 0x4C, 0xE0, 0x75, +0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x44, 0x5D, 0xE0, 0x90, 0x85, 0x93, 0xF0, 0x90, 0x86, 0x4C, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x44, 0x5D, 0xE0, 0x90, 0x85, 0x94, 0xF0, 0x90, +0x86, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x44, 0x5D, 0xE0, 0x90, 0x85, 0x95, +0xF0, 0x90, 0x86, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x44, 0x5D, 0xE0, 0x90, +0x85, 0x96, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x44, 0x5D, 0xE0, +0x90, 0x85, 0x92, 0xF0, 0x90, 0x86, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x44, +0x5D, 0xE0, 0x90, 0x85, 0x93, 0xF0, 0x90, 0x86, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, +0x12, 0x44, 0x5D, 0xE0, 0x90, 0x85, 0x94, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, 0x85, +0x79, 0x92, 0x12, 0x6B, 0x0F, 0x90, 0x85, 0x8F, 0xE0, 0xFF, 0x90, 0x86, 0x4C, 0xE0, 0xFE, 0x74, +0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x85, 0x8F, 0xF0, +0x90, 0x86, 0x4C, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, +0x90, 0x01, 0xCC, 0xF0, 0x90, 0x86, 0x4C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0xC1, 0x2F, +0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x84, 0x01, +0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, +0x85, 0x9A, 0x12, 0x44, 0x69, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x72, 0xF0, 0x90, +0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x55, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, +0x54, 0x01, 0x90, 0x85, 0x56, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x85, 0x60, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x85, 0x5D, 0xF0, 0xEF, 0x13, +0x13, 0x13, 0x54, 0x01, 0x90, 0x85, 0x63, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, +0x54, 0x01, 0x90, 0x85, 0x5F, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x85, 0x74, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x85, 0x62, 0xF0, 0xE0, +0x70, 0x38, 0x90, 0x85, 0x60, 0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0x48, 0x90, 0x85, 0x9D, 0x12, +0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0x48, 0x90, 0x85, 0x9D, +0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x45, 0x90, 0x81, 0x57, +0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x85, 0x56, 0xE0, 0x70, 0x03, +0x12, 0x4F, 0x15, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x12, 0x4D, 0x1E, 0x90, 0x85, 0x72, 0xE0, +0x90, 0x01, 0xE6, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, +0x30, 0xE0, 0x25, 0x12, 0x1E, 0xF6, 0x90, 0x85, 0x61, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, +0x90, 0x85, 0x64, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x85, 0x5E, 0xF0, 0x90, 0x00, 0x03, +0x12, 0x1F, 0x0F, 0x90, 0x85, 0x69, 0xF0, 0x22, 0x90, 0x85, 0x61, 0x74, 0x03, 0xF0, 0x90, 0x85, +0x64, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x5E, 0x74, 0x14, 0xF0, 0x90, 0x85, 0x69, 0x74, 0x05, 0xF0, +0x22, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x85, 0x68, 0xF0, 0x90, +0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x85, 0x66, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, +0x90, 0x85, 0x68, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x66, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, +0x85, 0x66, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x85, 0x65, +0xF0, 0x60, 0x20, 0x90, 0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x49, +0xC6, 0x90, 0x85, 0x56, 0xE0, 0x60, 0x09, 0x90, 0x85, 0x6F, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x15, +0x12, 0x44, 0xE5, 0x90, 0x85, 0x65, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0xFF, +0x54, 0x80, 0xFE, 0x90, 0x85, 0x4F, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xFF, 0xE0, +0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x70, 0xFF, 0x90, 0x85, 0x4F, 0xE0, 0x54, 0x8F, +0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x51, 0xF0, 0x90, 0x00, 0x03, 0x12, +0x1F, 0x0F, 0x90, 0x85, 0x52, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x53, 0xF0, +0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x43, 0x90, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xD3, +0x94, 0x20, 0x50, 0x08, 0x90, 0x85, 0x50, 0x74, 0x01, 0xF0, 0x80, 0x57, 0xEF, 0xD3, 0x94, 0x40, +0x50, 0x08, 0x90, 0x85, 0x50, 0x74, 0x02, 0xF0, 0x80, 0x49, 0xEF, 0xD3, 0x94, 0x60, 0x50, 0x08, +0x90, 0x85, 0x50, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0x85, +0x50, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, 0x94, 0xA0, 0x50, 0x08, 0x90, 0x85, 0x50, 0x74, +0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, 0x50, 0x08, 0x90, 0x85, 0x50, 0x74, 0x06, 0xF0, +0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x85, 0x50, 0x50, 0x05, 0x74, 0x07, 0xF0, 0x80, 0x03, +0x74, 0x08, 0xF0, 0x90, 0x85, 0x50, 0xE0, 0x90, 0x85, 0x54, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x60, +0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x02, 0x09, +0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x85, 0xBA, 0xF0, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x85, 0xBB, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x85, 0xBC, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0xED, +0x2F, 0x90, 0x85, 0xBD, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xAE, 0x05, 0xED, 0x2F, +0x90, 0x85, 0xBE, 0xF0, 0x22, 0xEF, 0x70, 0x21, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x14, 0x90, 0x00, +0x40, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x01, 0xF0, +0x80, 0x07, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x6A, 0x12, 0x1E, +0xF6, 0x90, 0x00, 0x01, 0x30, 0xE0, 0x2E, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x00, +0x02, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, +0xC2, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC3, 0xF0, 0x90, 0x06, 0xCC, 0xE0, +0x54, 0xFE, 0xF0, 0x80, 0x2C, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x00, 0x02, 0x12, +0x1F, 0x0F, 0x90, 0x06, 0xC5, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC6, 0xF0, +0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x01, +0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x02, 0xF0, 0xEF, 0xB4, 0x02, 0x11, 0x12, 0x1E, 0xF6, 0x90, +0x06, 0xC8, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC9, 0xF0, 0xEF, 0xB4, 0x03, +0x11, 0x12, 0x1E, 0xF6, 0x90, 0x06, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, +0xCB, 0xF0, 0xEF, 0x64, 0x04, 0x70, 0x1F, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x07, 0x83, 0x30, 0xE0, +0x06, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0x6F, 0xF0, 0xEF, 0x30, 0xE1, 0x07, 0x90, +0x07, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, 0x90, 0x84, 0x03, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, +0x90, 0x84, 0x04, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x84, 0x05, 0xF0, 0x90, 0x85, +0x9A, 0x12, 0x44, 0x69, 0x12, 0x6D, 0x3F, 0xEF, 0xB4, 0x02, 0x03, 0x43, 0x14, 0x01, 0x22, 0x12, +0x1E, 0xF6, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x1F, 0xB6, 0xA8, 0x04, 0xA9, 0x05, +0xAA, 0x06, 0xAB, 0x07, 0x90, 0x84, 0xA3, 0x12, 0x44, 0x45, 0xEC, 0x54, 0x03, 0xFC, 0x12, 0x44, +0x1A, 0x90, 0x84, 0x9F, 0x02, 0x1F, 0xC9, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xBC, +0xF0, 0xEF, 0x30, 0xE0, 0x5C, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x4E, 0x90, 0xFD, 0x50, 0x74, +0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x52, 0xF0, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x53, 0xF0, 0xA3, 0xE4, 0xF0, 0x12, 0x1E, 0xF6, +0xC3, 0x13, 0x90, 0xFD, 0x55, 0x30, 0xE0, 0x05, 0x74, 0xA0, 0xF0, 0x80, 0x03, 0x74, 0xC0, 0xF0, +0x90, 0xFD, 0x56, 0x74, 0x10, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, +0xA3, 0x74, 0x06, 0xF0, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x01, +0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x7C, 0x00, +0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFC, 0x74, +0x20, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x85, 0x9A, 0xEF, 0xF0, 0xEE, 0xF9, 0x90, 0x01, 0xBD, +0xE0, 0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xEC, 0xC3, +0x99, 0x50, 0x43, 0xEC, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x02, 0xE4, 0xFD, 0xED, 0xC3, 0x94, 0x20, +0x50, 0x07, 0xAF, 0x05, 0x91, 0x6E, 0x0D, 0x80, 0xF3, 0x0C, 0x90, 0xFD, 0x10, 0xE0, 0x04, 0xF0, +0xEC, 0xB5, 0x01, 0xDA, 0xE4, 0xFD, 0xED, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0x85, 0x9A, 0xE0, +0xFB, 0xC3, 0xEF, 0x9B, 0x74, 0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x07, 0xAF, 0x05, 0x91, 0x6E, +0x0D, 0x80, 0xE3, 0x0C, 0x80, 0xB8, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x81, 0x12, +0x53, 0x26, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, +0x58, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0xF1, 0xEF, 0x75, 0xF0, +0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, +0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, +0xFD, 0x51, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x90, 0xFD, 0x52, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x53, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x54, 0xF0, 0xEF, 0x75, 0xF0, 0x08, +0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x55, 0xF0, 0xEF, +0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, +0x56, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x90, 0xFD, 0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0xFE, 0x10, +0x60, 0x05, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x9E, 0x12, 0x44, 0x89, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, +0x90, 0x85, 0x2D, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, +0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x85, 0x2D, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, +0xEF, 0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x20, 0xFE, +0x90, 0x85, 0x2D, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, +0xF0, 0x12, 0x1E, 0xF6, 0xFC, 0x54, 0x80, 0xFF, 0x90, 0x85, 0x2D, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, +0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFD, 0x54, 0x01, 0xFF, 0x90, 0x85, 0x30, 0xE0, 0x54, 0xFE, +0x4F, 0xF0, 0xED, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0xFD, 0x54, 0x04, 0xFF, 0x90, 0x85, 0x30, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x10, +0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, +0x90, 0x85, 0x30, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, +0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x80, 0xFF, 0x90, 0x85, 0x30, 0xE0, 0x54, 0x7F, +0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x85, 0x31, 0xE0, +0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x85, 0x31, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, +0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, +0x04, 0xFE, 0x90, 0x85, 0x31, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, +0xF7, 0x4F, 0xF0, 0xEC, 0x20, 0xE0, 0x02, 0xE1, 0xA6, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x13, 0x90, +0x85, 0x3D, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0x85, 0x9E, +0x12, 0x44, 0x69, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x2E, 0xF0, 0x90, 0x00, 0x02, +0x12, 0x1F, 0x0F, 0x90, 0x85, 0x2F, 0xF0, 0x80, 0x4E, 0x90, 0x85, 0x9E, 0x12, 0x44, 0x69, 0x90, +0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, +0x85, 0x2E, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x85, 0x2E, +0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, +0xC3, 0x94, 0x03, 0x90, 0x85, 0x2F, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, +0x06, 0x90, 0x85, 0x2F, 0x74, 0x2A, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x30, 0xE0, 0x3D, 0x90, 0x85, 0x2E, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x85, 0x36, 0xF0, 0xE0, +0xC3, 0x13, 0xA3, 0xF0, 0x90, 0x85, 0x2F, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x85, 0x38, 0xF0, +0x90, 0x85, 0x2E, 0xE0, 0xC3, 0x13, 0x90, 0x85, 0x39, 0xF0, 0x90, 0x85, 0x2F, 0xE0, 0xC3, 0x13, +0x90, 0x85, 0x3A, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, +0xE4, 0x90, 0x84, 0xA9, 0xF0, 0x90, 0x85, 0x9E, 0x12, 0x44, 0x69, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x14, 0x12, 0x1E, 0xF6, 0x13, 0x13, 0x13, 0x54, +0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x80, 0x02, 0xE4, 0xFF, 0x12, 0x50, 0x48, 0x90, 0x85, 0x2D, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x18, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, +0xE0, 0x03, 0x75, 0x4F, 0x04, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, +0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x85, 0x35, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x85, 0x3F, 0x74, +0x01, 0xF0, 0x80, 0x2B, 0x90, 0x85, 0x35, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x85, 0x3F, 0x74, 0x04, +0xF0, 0x80, 0x1C, 0x90, 0x85, 0x35, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x85, 0x3F, 0x74, 0x02, 0xF0, +0x80, 0x0D, 0x90, 0x85, 0x35, 0xE0, 0xB4, 0x07, 0x06, 0x90, 0x85, 0x3F, 0x74, 0x05, 0xF0, 0xE4, +0x90, 0x85, 0x35, 0xF0, 0x80, 0x65, 0x90, 0x85, 0x9E, 0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, 0xFF, +0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x85, 0x9A, 0x30, 0xE0, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, +0x03, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x12, 0x83, 0xE4, 0x90, 0x00, +0x40, 0x74, 0x20, 0xF0, 0x90, 0x85, 0x9E, 0x12, 0x44, 0x69, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, +0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, +0x74, 0x01, 0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x9A, 0x12, 0x55, 0x0D, 0x90, 0x05, 0x22, 0xE4, +0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x85, 0x32, 0xE0, 0x54, +0xDF, 0xF0, 0xE4, 0x90, 0x85, 0x3E, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x09, 0x90, 0x84, 0x9C, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, +0x55, 0x58, 0x90, 0x84, 0x9C, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x5E, 0xF5, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x85, 0x32, 0xE0, 0x54, 0xFE, +0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, +0x04, 0xFE, 0x90, 0x85, 0x32, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, +0xF7, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x33, 0xF0, 0x22, 0x90, 0x85, +0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, +0x7D, 0x03, 0x7F, 0x26, 0x02, 0x6D, 0x43, 0x90, 0x00, 0xCC, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x00, +0x6A, 0xE4, 0xF0, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x44, +0x04, 0xF0, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x10, 0xF0, +0x90, 0x00, 0x32, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x05, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0x00, +0x6A, 0x74, 0x15, 0xF0, 0x90, 0x00, 0xFA, 0xE0, 0x44, 0x04, 0xF0, 0x7D, 0xDD, 0x7F, 0x81, 0x02, +0x53, 0x26, 0x12, 0x1E, 0xF6, 0x90, 0x85, 0xC2, 0xF0, 0x22, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, +0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0xE4, 0x90, 0x85, 0xA1, +0xF0, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0xA2, +0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0xA3, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0x90, 0x85, 0xA4, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0xA5, 0xF0, 0x90, +0x85, 0x9D, 0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, 0x70, 0x12, 0x90, 0x85, 0xA0, 0x74, 0x3C, 0xF0, +0x7B, 0x01, 0x7A, 0x85, 0x79, 0xA0, 0x7D, 0x06, 0x7F, 0x87, 0x80, 0x1C, 0x90, 0x85, 0x9D, 0x12, +0x44, 0x69, 0x12, 0x1E, 0xF6, 0xB4, 0x01, 0x13, 0x90, 0x85, 0xA0, 0x74, 0x40, 0xF0, 0x7B, 0x01, +0x7A, 0x85, 0x79, 0xA0, 0x7D, 0x04, 0x7F, 0xC7, 0x12, 0x6D, 0x43, 0x22, 0x12, 0x1E, 0xF6, 0x90, +0x85, 0xC0, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0xC1, 0xF0, 0x22, 0xE4, 0x90, +0x86, 0x46, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, 0x60, 0x43, 0xC3, 0x90, 0x86, +0x47, 0xE0, 0x94, 0x88, 0x90, 0x86, 0x46, 0xE0, 0x94, 0x13, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, +0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x86, 0x46, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xF7, +0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x86, 0x47, 0xE0, 0x94, 0x64, 0x90, 0x86, +0x46, 0xE0, 0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, +0x7F, 0x01, 0x22, 0x90, 0x85, 0xE7, 0x12, 0x1F, 0xC9, 0x90, 0x85, 0xEB, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x00, 0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x85, 0xEB, 0x12, 0x44, 0x51, 0xD3, +0x12, 0x44, 0x34, 0x50, 0x41, 0x90, 0x85, 0xEB, 0x12, 0x44, 0x45, 0xA9, 0x07, 0x90, 0x85, 0xE7, +0x12, 0x44, 0x45, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, +0x7B, 0x01, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x44, 0x34, 0x60, 0x1B, 0x90, 0x85, 0xEB, 0x12, 0x44, +0x45, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x85, +0xEB, 0x12, 0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x85, 0xEB, 0x02, 0x44, 0x45, 0x90, 0x85, 0xC6, 0x12, +0x1F, 0xC9, 0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x85, 0xCA, 0x12, 0x44, 0x51, 0xC3, 0x12, +0x44, 0x34, 0x90, 0x85, 0xC6, 0x60, 0x67, 0x12, 0x44, 0x45, 0x12, 0x2C, 0x6E, 0x90, 0x85, 0xD2, +0x12, 0x1F, 0xC9, 0x90, 0x85, 0xCA, 0x12, 0x44, 0x45, 0x31, 0xD3, 0x90, 0x85, 0xD6, 0x12, 0x1F, +0xC9, 0x90, 0x85, 0xCA, 0x12, 0x44, 0x45, 0x12, 0x44, 0x27, 0x90, 0x85, 0xD2, 0x12, 0x44, 0x51, +0x12, 0x44, 0x0D, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x85, 0xD6, 0x12, 0x44, +0x45, 0xA9, 0x07, 0x90, 0x85, 0xCE, 0x12, 0x44, 0x45, 0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, +0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0x1A, 0x90, 0x85, 0xDA, 0x12, 0x1F, 0xC9, 0x90, +0x85, 0xC6, 0x12, 0x44, 0x45, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x85, 0xDA, 0x80, 0x0A, 0x12, 0x44, +0x45, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x85, 0xCE, 0x12, 0x44, 0x45, 0x90, 0x81, 0x57, 0x12, 0x1F, +0xC9, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x86, 0x4F, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x47, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, +0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x12, 0x53, +0x99, 0x90, 0x86, 0x4F, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, +0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, +0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4C, +0x90, 0x86, 0x4F, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, +0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, 0xF0, 0x12, 0x53, 0x99, 0x90, +0x86, 0x4F, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, +0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x90, 0x84, 0x9C, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, +0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, 0x1F, 0xD5, 0x20, 0x08, 0x30, 0x70, 0x90, 0x84, +0xA3, 0x12, 0x1F, 0xD5, 0xC0, 0x08, 0x30, 0x70, 0xE4, 0x90, 0x84, 0xA9, 0xF0, 0xA3, 0xF0, 0x43, +0xE8, 0x04, 0x90, 0xFD, 0x68, 0x74, 0x02, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x44, 0x10, 0xF0, 0x90, +0x07, 0x83, 0xE4, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x04, 0x64, 0xE4, 0xF0, 0x90, +0x00, 0x40, 0x74, 0x20, 0xF0, 0x71, 0xE4, 0x90, 0x85, 0x44, 0x74, 0x01, 0xF0, 0x7D, 0x04, 0x7F, +0x02, 0x02, 0x3A, 0xAD, 0x90, 0x85, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, +0x74, 0x08, 0xF0, 0xE4, 0x90, 0x85, 0x3E, 0xF0, 0xA3, 0xF0, 0x90, 0x85, 0x2D, 0xE0, 0x54, 0xFD, +0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, +0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, +0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, +0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, +0xF0, 0x90, 0x85, 0x40, 0x74, 0x02, 0xF0, 0x90, 0x85, 0x32, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, +0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x85, 0x3D, 0xF0, 0x90, 0x85, 0x34, +0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x85, 0x3B, 0xF0, 0xA3, 0xF0, 0x90, 0x85, 0x41, 0xF0, 0xA3, +0xF0, 0x90, 0x85, 0x34, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x85, 0x31, 0xE0, +0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x85, 0x45, 0xE0, 0x54, +0xFE, 0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0xE4, 0x90, 0x85, 0x4E, 0xF0, 0x22, 0xAD, 0x07, 0x90, 0x85, +0x7A, 0xE0, 0x54, 0xF0, 0x44, 0x05, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, 0x85, 0x7C, 0xEF, +0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x7C, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, +0x7A, 0x02, 0x56, 0xE6, 0x90, 0x85, 0x60, 0xE0, 0x60, 0x27, 0x90, 0x85, 0x63, 0xE0, 0x70, 0x21, +0x90, 0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, +0x22, 0x90, 0x85, 0x5D, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, +0xF0, 0x22, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, 0x85, +0x34, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0x22, +0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xC1, 0xB8, 0x90, 0x85, +0x35, 0xE0, 0x64, 0x01, 0x70, 0x39, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x86, 0x4B, +0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x85, 0x41, 0xE0, 0x04, 0xF0, 0xE4, +0x90, 0x86, 0x4B, 0xF0, 0x90, 0x85, 0x36, 0xE0, 0xFF, 0x90, 0x85, 0x41, 0xE0, 0xB5, 0x07, 0x02, +0x80, 0x02, 0xC1, 0xA3, 0xE4, 0x90, 0x85, 0x35, 0xF0, 0x90, 0x85, 0x3F, 0x04, 0xF0, 0x22, 0x90, +0x85, 0x35, 0xE0, 0x64, 0x04, 0x70, 0x3A, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x86, +0x4B, 0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x85, 0x41, 0xE0, 0x04, 0xF0, +0xE4, 0x90, 0x86, 0x4B, 0xF0, 0x90, 0x85, 0x38, 0xE0, 0xFF, 0x90, 0x85, 0x41, 0xE0, 0xB5, 0x07, +0x02, 0x80, 0x02, 0xC1, 0xA3, 0xE4, 0x90, 0x85, 0x35, 0xF0, 0x90, 0x85, 0x3F, 0x74, 0x04, 0xF0, +0x22, 0x90, 0x85, 0x35, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xC1, 0x67, 0x90, 0x85, 0x42, 0xE0, 0xB4, +0x04, 0x0F, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x85, 0x3F, 0x30, 0xE0, 0x4E, 0xC1, +0xB5, 0x90, 0x85, 0x34, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, 0xE0, 0x54, 0xFB, 0xF0, +0xE4, 0xA3, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xC1, 0x76, 0x90, +0x85, 0x42, 0xE0, 0xFF, 0x90, 0x85, 0x41, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, +0x03, 0x12, 0x1F, 0x3C, 0x90, 0x85, 0x39, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, +0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x90, 0x85, 0x3F, 0x40, 0x02, 0xC1, 0xB5, 0x74, 0x02, 0xF0, +0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4D, 0x84, 0x90, 0x85, 0x42, 0xE0, +0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, +0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x42, 0xE0, 0xFF, 0x90, 0x85, 0x41, 0xE0, +0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, 0x90, 0x85, 0x39, 0xE0, +0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x58, +0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x85, 0x35, 0xE0, 0x64, 0x07, 0x70, 0x49, 0x90, +0x85, 0x42, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0x85, 0x3F, 0x80, 0x3A, 0x90, 0x85, 0x34, 0xE0, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x85, 0x3F, +0x80, 0x23, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4D, 0x84, 0x90, 0x85, 0x42, +0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, +0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x3C, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, +0x22, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xE0, 0x13, 0x13, 0x54, 0x3F, +0x90, 0x07, 0x78, 0x30, 0xE0, 0x24, 0x80, 0x0E, 0x90, 0x85, 0x30, 0xE0, 0xC3, 0x13, 0x90, 0x07, +0x78, 0x30, 0xE0, 0x02, 0x80, 0x14, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, +0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x03, 0xF0, 0x22, 0x74, 0x01, +0xF0, 0x22, 0xBB, 0x72, +}; + +const u8 Rtl8723SFwUMCBCutImgArrayWithBT[Rtl8723SUMCBCutImgArrayWithBTLength] = { +0x02, 0x23, 0x02, 0x00, 0x25, 0x00, 0x00, 0x00, 0x06, 0x27, 0x22, 0x20, 0xFC, 0x5E, 0x01, 0x00, +0x17, 0x25, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4A, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x61, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x67, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x67, 0xA9, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x6A, 0x89, 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, +0x00, 0x04, 0x06, 0x05, 0x04, 0x02, 0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, +0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, +0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, 0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, +0x00, 0x18, 0x22, 0x21, 0x20, 0x18, 0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, +0x20, 0x08, 0x00, 0x20, 0x22, 0x21, 0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, +0x22, 0x20, 0x18, 0x08, 0x00, 0x20, 0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, +0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, +0x10, 0x00, 0x00, 0x30, 0x31, 0x20, 0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, +0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, +0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, +0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, +0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, 0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, +0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, +0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, +0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, +0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, +0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, +0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, +0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, +0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, +0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, +0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, +0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, +0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, +0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, +0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, +0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, +0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, +0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, +0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, +0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, +0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, +0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, +0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, +0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, +0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, +0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, +0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, +0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, +0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, +0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, +0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, +0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, +0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, +0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, +0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, +0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, +0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, +0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, +0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, +0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, +0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, +0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, +0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, +0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, +0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0xFB, 0x90, 0x93, 0x64, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, +0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xF0, 0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0xF0, +0x0B, 0x90, 0x93, 0x41, 0xF0, 0x04, 0x70, 0x03, 0x02, 0x44, 0xF0, 0x43, 0x66, 0x10, 0x90, 0x93, +0x37, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0xE0, 0x54, 0x0F, 0xFF, 0x90, +0x93, 0x59, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x38, 0xE0, 0xF5, 0x49, +0xE4, 0x1B, 0x80, 0x56, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, +0x59, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x38, 0xE0, 0x04, 0x2F, 0xF5, +0x49, 0xE4, 0xFB, 0x80, 0x35, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x13, +0xE4, 0xF5, 0x48, 0x90, 0x93, 0x59, 0xE0, 0xFF, 0x90, 0x93, 0x50, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, +0xFB, 0x80, 0x17, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x59, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, +0x90, 0x93, 0x50, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, +0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, +0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x12, 0x9C, 0x26, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x22, 0xE4, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x93, 0x42, 0xF0, 0xF5, 0x66, 0x22, 0x22, 0xE4, 0xFF, +0x02, 0x4E, 0x27, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0xFB, 0x90, 0x93, 0x5E, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x62, 0x64, 0x01, +0x60, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x65, 0x14, 0x60, 0x2B, 0x24, 0xFD, 0x60, 0x27, 0x24, 0x02, +0x24, 0xFB, 0x50, 0x02, 0x80, 0x21, 0x90, 0x93, 0x41, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, +0xE0, 0x60, 0x14, 0x90, 0x93, 0x41, 0xE0, 0x70, 0x08, 0x90, 0x93, 0x58, 0xE0, 0x90, 0x93, 0x41, +0xF0, 0x7B, 0x01, 0x80, 0x02, 0x7B, 0x01, 0xEB, 0x70, 0x03, 0x02, 0x46, 0x78, 0x43, 0x66, 0x10, +0x90, 0x93, 0x37, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, 0xE0, 0x54, 0x0F, +0xFF, 0x90, 0x93, 0x59, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x38, 0x80, +0x2D, 0x90, 0x93, 0x37, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, +0xFE, 0x90, 0x93, 0x59, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x08, +0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3B, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x38, 0xE0, 0x80, +0x2D, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, +0x93, 0x59, 0xE0, 0xFF, 0x90, 0x93, 0x50, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, +0x59, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x50, 0xE0, 0x04, 0x2F, 0xF5, 0x49, +0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, +0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, +0xE5, 0x63, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x93, 0x13, 0xE0, 0xFF, 0x90, 0x93, 0x59, 0xE0, 0xD3, +0x9F, 0x40, 0x08, 0x90, 0x93, 0x14, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0x14, 0xF0, +0x90, 0x93, 0x59, 0xE0, 0x90, 0x93, 0x13, 0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x46, 0xE4, +0xF0, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x57, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, +0x90, 0x93, 0x5A, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, 0x4A, 0x65, 0xE4, 0xF5, 0x48, 0x90, 0x93, +0x46, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, +0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x56, 0x80, 0x09, 0x43, 0x66, 0x01, 0x12, 0x51, 0x48, 0x90, +0x93, 0x52, 0x74, 0x01, 0xF0, 0x12, 0x9C, 0x26, 0x22, 0xE4, 0x90, 0x93, 0x64, 0xF0, 0xE5, 0x65, +0x70, 0x03, 0x02, 0x47, 0x32, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, +0xE5, 0x66, 0x54, 0x07, 0x60, 0x03, 0x02, 0x47, 0x32, 0x02, 0x47, 0x2F, 0x90, 0x93, 0x42, 0xE0, +0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, 0x59, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0xC4, +0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0x90, 0x93, 0x59, 0xE0, 0xFF, 0x90, 0x93, 0x37, +0xE0, 0x54, 0x0F, 0xB5, 0x07, 0x0A, 0x90, 0x93, 0x3A, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, +0x90, 0x93, 0x37, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, +0x90, 0x93, 0x59, 0xE0, 0xB5, 0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, +0x03, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, +0x93, 0x64, 0x74, 0x5A, 0xF0, 0x90, 0x93, 0x64, 0xE0, 0xFF, 0x90, 0x93, 0x49, 0xE0, 0x2F, 0xFF, +0xE4, 0x33, 0xFE, 0x90, 0x93, 0x42, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, +0x40, 0x0D, 0xE5, 0x62, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, +0x52, 0x17, 0x22, 0xE4, 0xF5, 0x66, 0xF5, 0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, +0x5A, 0xF0, 0x90, 0x93, 0x56, 0xF0, 0x90, 0x93, 0x53, 0xF0, 0x90, 0x93, 0x58, 0x04, 0xF0, 0x90, +0x93, 0x41, 0xF0, 0xE4, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x93, 0x43, 0xF0, 0x90, 0x93, 0x50, 0x74, +0x05, 0xF0, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x93, 0x4E, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, +0x93, 0x49, 0xF0, 0x90, 0x93, 0x4C, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x46, 0x74, 0x14, 0xF0, 0x90, +0x93, 0x51, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x44, 0xF0, 0x90, 0x93, 0x3D, 0xF0, 0x90, 0x93, +0xB4, 0xF0, 0x90, 0x93, 0x4D, 0xF0, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x59, 0xF0, 0x90, 0x93, +0x3E, 0xF0, 0x90, 0x93, 0x57, 0xF0, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x93, 0x45, 0xF0, 0x90, 0x93, +0x52, 0xF0, 0x90, 0x93, 0x4B, 0xF0, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x93, 0x5C, 0xF0, 0x90, 0x93, +0x4A, 0xF0, 0x90, 0x93, 0xB3, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, +0x37, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0x93, 0x3B, 0xF0, 0x90, 0x93, 0x3A, 0xF0, 0x22, 0xEF, 0x60, 0x5F, 0xAF, 0x05, +0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x93, +0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, +0x30, 0xE0, 0x6B, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xE0, 0x25, 0xE0, 0x25, +0xE0, 0xFF, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, +0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xAF, 0x05, 0x74, +0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x19, +0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, +0xE0, 0x0C, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x22, 0x90, +0x93, 0x15, 0xE0, 0x30, 0xE0, 0x22, 0x90, 0x93, 0x26, 0xE0, 0x60, 0x09, 0x90, 0x01, 0xB9, 0x74, +0x40, 0xF0, 0x02, 0x49, 0x29, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x02, 0x80, 0x2F, +0x90, 0x93, 0x4D, 0xE0, 0x60, 0x67, 0x80, 0x5D, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, +0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, +0xB9, 0x74, 0x02, 0xF0, 0x80, 0x53, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, +0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x42, 0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, +0x08, 0xF0, 0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, +0x28, 0x90, 0x93, 0x43, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, +0x93, 0x4D, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, +0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, +0x00, 0x22, 0xE4, 0x90, 0x93, 0x5E, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x5E, 0xF0, 0xE0, +0x54, 0xC0, 0x70, 0x18, 0x90, 0x93, 0x52, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, +0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x14, 0x12, 0x52, 0x17, 0x80, 0x0F, 0x90, 0x93, 0x3E, 0xE0, +0x60, 0x09, 0x90, 0x93, 0x57, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x5E, 0xE0, 0x30, +0xE6, 0x1B, 0x43, 0x66, 0x01, 0x90, 0x93, 0x5A, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, +0x0C, 0x60, 0x13, 0x12, 0x51, 0x48, 0x80, 0x0E, 0x12, 0x50, 0x77, 0x80, 0x09, 0x90, 0x93, 0x52, +0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x93, 0x5E, 0xE0, 0x30, +0xE7, 0x2A, 0x43, 0x66, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, +0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x93, +0x5B, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, +0x8E, 0x25, 0x8F, 0x26, 0xAD, 0x26, 0xAC, 0x25, 0xAF, 0x24, 0x12, 0x47, 0xEB, 0xAF, 0x26, 0xAE, +0x25, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, +0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x8F, 0x68, 0x8D, 0x69, 0xE5, 0x68, 0x54, 0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, +0xE5, 0x68, 0x30, 0xE2, 0x30, 0xE5, 0x63, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0xA1, 0xE5, +0x63, 0x30, 0xE3, 0x10, 0xE5, 0x68, 0x20, 0xE3, 0x0B, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x53, 0x12, +0x51, 0xD4, 0x80, 0x4E, 0xE5, 0x63, 0x20, 0xE3, 0x49, 0xE5, 0x68, 0x30, 0xE3, 0x44, 0xAF, 0x69, +0x12, 0x51, 0x86, 0x80, 0x3D, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x68, 0x20, +0xE3, 0x09, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x2A, 0x12, 0x51, 0xD4, 0xE5, 0x63, 0x54, 0x0F, 0xFF, +0xBF, 0x04, 0x0E, 0xE5, 0x68, 0x20, 0xE2, 0x09, 0x12, 0x48, 0x8F, 0xEF, 0x60, 0x14, 0x12, 0x51, +0x1F, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4B, 0xF7, 0xEF, 0x60, 0x03, 0x12, +0x52, 0x04, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x02, 0x4B, 0x35, 0x02, 0x52, 0xF4, 0xE4, 0x93, 0xA3, +0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, +0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, +0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, +0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4F, 0x75, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, +0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, +0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, +0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, +0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x7D, +0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, 0x01, 0x36, +0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, +0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x4A, 0x65, 0x90, 0x06, +0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, +0x74, 0x7B, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, +0x03, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, +0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4F, 0x28, 0xE5, 0x62, 0x20, 0xE0, +0x05, 0xE4, 0x90, 0x93, 0x43, 0xF0, 0x22, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x10, 0x12, 0x51, +0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x5C, 0xE5, 0x14, +0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x50, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, +0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x3F, 0x90, 0x02, 0x87, 0xE0, 0x60, +0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x31, 0x90, 0x01, 0xAF, 0xE0, 0x60, 0x02, 0x80, +0x07, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, +0x90, 0x93, 0x44, 0xE0, 0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, +0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, +0x7F, 0x00, 0x22, 0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, 0x64, +0x02, 0x60, 0x06, 0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, 0x41, +0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x93, 0x58, 0xF0, 0x90, 0x93, 0x41, 0xE0, 0x70, 0x07, 0x90, +0x93, 0x58, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x93, 0x41, 0xE0, 0xFF, 0x90, 0x93, 0x41, 0xEF, 0xF0, +0x90, 0x93, 0x43, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x93, 0x59, +0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, +0x02, 0xF0, 0x53, 0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, +0x03, 0x12, 0x49, 0x32, 0x22, 0x90, 0x93, 0xB3, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, +0x90, 0x93, 0xB3, 0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0xE4, 0xFD, 0x7F, 0x93, 0x12, 0x54, +0x1B, 0x90, 0x00, 0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x54, 0x1B, 0x90, 0x00, 0x28, +0xE0, 0x54, 0xFC, 0xFD, 0x7F, 0x28, 0x12, 0x54, 0x1B, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, +0x7F, 0x08, 0x12, 0x54, 0x1B, 0x7F, 0x01, 0x12, 0x4E, 0x81, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, +0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x1B, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, +0x54, 0x1B, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x54, 0x1B, 0x7F, 0x14, +0x7E, 0x00, 0x02, 0x3B, 0x09, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x93, 0x1A, 0xE0, +0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x49, 0x12, +0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, +0x93, 0x56, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x53, +0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, 0xD3, +0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, +0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, +0x22, 0x90, 0x93, 0x8B, 0x12, 0x43, 0xC8, 0x12, 0x44, 0xF1, 0x90, 0x93, 0x8B, 0x12, 0x43, 0xA8, +0x12, 0x1E, 0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, +0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x8B, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, +0x1F, 0x0F, 0xFD, 0xE4, 0xFF, 0x12, 0x50, 0x39, 0x80, 0x29, 0x90, 0x93, 0x8B, 0x12, 0x43, 0xA8, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x50, 0x39, 0x1F, 0x80, 0x14, 0x90, +0x93, 0x8B, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x50, +0x39, 0xE4, 0xFF, 0x12, 0x4B, 0x7A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x24, +0x90, 0x93, 0x3E, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x57, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, +0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x27, 0x74, 0xFF, 0xF0, 0x12, 0x5E, +0x9B, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0xAC, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x2A, 0x12, 0x49, +0xD0, 0x90, 0x05, 0x22, 0xE5, 0x27, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0xAC, 0xE0, 0xFF, 0x7D, 0x01, +0x12, 0x58, 0x2A, 0x12, 0x49, 0xD0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x8F, 0x6C, 0xE4, 0x90, 0x94, 0x3E, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, +0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6C, 0x60, 0x3E, 0xC3, 0x90, 0x94, 0x3F, 0xE0, 0x94, +0x88, 0x90, 0x94, 0x3E, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, +0x22, 0x90, 0x94, 0x3E, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, +0x3B, 0x09, 0xD3, 0x90, 0x94, 0x3F, 0xE0, 0x94, 0x32, 0x90, 0x94, 0x3E, 0xE0, 0x94, 0x00, 0x40, +0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, 0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, +0x7F, 0x20, 0x12, 0x54, 0x1B, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, +0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x1B, 0x90, 0x00, 0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, +0x28, 0x12, 0x54, 0x1B, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x54, 0x1B, +0xE4, 0xFF, 0x12, 0x4E, 0x81, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, +0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x54, 0x1B, 0xE4, 0xFF, 0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, +0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, +0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, +0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, 0x4F, 0xE0, 0x9D, 0x90, 0x93, 0x4E, +0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x4E, 0xE0, 0xA3, 0xE0, +0x90, 0x05, 0x58, 0xF0, 0x22, 0x48, 0x93, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x48, 0x93, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0xA0, 0x00, 0x41, +0x93, 0xB0, 0x00, 0x41, 0x93, 0x95, 0x00, 0x41, 0x94, 0x46, 0x00, 0x41, 0x93, 0x13, 0x00, 0x41, +0x93, 0x14, 0x00, 0x41, 0x92, 0x69, 0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, 0x41, +0x94, 0x37, 0x00, 0x41, 0x94, 0x44, 0x00, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x93, 0x57, 0x74, 0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x94, 0x2B, 0x12, +0x1F, 0xC9, 0x90, 0x94, 0x2B, 0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x94, 0x2B, 0x12, +0x1F, 0xC9, 0x90, 0x94, 0x2B, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, +0x7E, 0x08, 0x12, 0x34, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, +0x02, 0x80, 0x35, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x2E, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x09, +0x90, 0x93, 0x57, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x9C, 0x26, 0x90, 0x93, 0x5A, 0xE0, +0x60, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0D, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, +0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, +0x24, 0x02, 0x70, 0x32, 0x80, 0x0A, 0x90, 0x93, 0x58, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x41, 0xF0, +0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x51, 0xE0, 0x90, 0x93, 0x58, +0xF0, 0x80, 0x05, 0x90, 0x93, 0x58, 0xED, 0xF0, 0x90, 0x93, 0x58, 0xE0, 0x90, 0x93, 0x41, 0xF0, +0x90, 0x93, 0x5D, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, +0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x46, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, +0xF0, 0x90, 0x93, 0x53, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x0C, 0x50, 0x03, 0x12, +0x4A, 0x65, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, +0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x3F, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, +0xFF, 0x74, 0x40, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, +0xF9, 0x90, 0x93, 0x55, 0xF0, 0xEE, 0x90, 0x93, 0x54, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x93, +0xB2, 0xE0, 0x90, 0x94, 0x2F, 0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0xB2, 0xE0, 0x90, 0x94, 0x2F, +0x60, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, +0x01, 0x10, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x2F, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x95, 0x86, 0x90, +0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x5E, 0x9B, 0xEF, 0x70, +0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x12, 0x99, +0x48, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x90, 0x93, 0x47, 0xE0, 0x70, 0x1A, 0x90, 0x04, +0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0xAB, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, 0x2A, 0x8E, 0x6A, +0x8F, 0x6B, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x48, 0xE0, 0x60, 0x16, 0x90, +0x93, 0x4B, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x45, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, +0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, +0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x0C, +0x22, 0x90, 0x94, 0x47, 0xEF, 0xF0, 0x12, 0x95, 0xCC, 0x90, 0x94, 0x47, 0xE0, 0x60, 0x05, 0x90, +0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, +0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, +0x02, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x05, +0x7F, 0x01, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0xE5, 0x64, 0x30, 0xE6, +0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, +0x53, 0x64, 0xBF, 0x22, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0xE5, 0x12, 0x4E, 0xD9, +0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x7D, 0x01, 0xAF, 0x64, 0x02, 0x4A, 0x69, 0x90, 0x02, +0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, 0x43, +0xF7, 0x52, 0x49, 0x00, 0x40, 0x52, 0x71, 0x00, 0x80, 0x52, 0x9C, 0x01, 0x00, 0x52, 0xB0, 0x02, +0x00, 0x52, 0xC8, 0x04, 0x00, 0x00, 0x00, 0x52, 0xE5, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, 0xFF, +0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, 0xCE, +0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x80, +0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, 0x2D, +0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x07, +0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, 0xFE, +0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, 0x35, +0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, 0x2D, +0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, 0xFF, +0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, 0x00, +0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x25, 0xF0, +0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x76, 0xF0, 0xA3, 0xF0, 0xF1, 0xBA, 0x75, 0x8E, 0x02, +0xF1, 0x99, 0x12, 0x60, 0x51, 0x90, 0x93, 0xB3, 0xEF, 0xF0, 0xF1, 0xDA, 0x90, 0x93, 0xB5, 0xEF, +0xF0, 0x12, 0x60, 0x64, 0x90, 0x93, 0x96, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x14, 0xF5, +0x09, 0xF5, 0x62, 0x90, 0x93, 0xB2, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x88, +0x60, 0x12, 0x47, 0x33, 0x12, 0x37, 0x1C, 0xF1, 0xE6, 0x71, 0xF2, 0x12, 0x60, 0x15, 0x12, 0x60, +0x7C, 0xF1, 0xB3, 0x12, 0x60, 0x33, 0x12, 0x44, 0xFD, 0x12, 0x60, 0xE7, 0xF1, 0xC2, 0x90, 0x93, +0x78, 0xE5, 0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x63, 0x75, +0xE8, 0x03, 0x43, 0xA8, 0x85, 0x12, 0x97, 0x59, 0xD2, 0xAF, 0x51, 0xEA, 0x12, 0x60, 0x91, 0x90, +0x93, 0x76, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xF4, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, 0xA3, 0xF0, +0xE5, 0x14, 0x30, 0xE0, 0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xFE, 0x12, 0x9A, 0xE3, 0xD2, 0xAF, 0x90, +0x93, 0xA9, 0xE0, 0xB4, 0x01, 0x07, 0x91, 0xD2, 0xE4, 0x90, 0x93, 0xA9, 0xF0, 0xE5, 0x14, 0x30, +0xE4, 0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xEF, 0xD2, 0xAF, 0x12, 0x6F, 0x9E, 0xE5, 0x14, 0x30, 0xE6, +0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xBF, 0xD2, 0xAF, 0x12, 0x80, 0x5D, 0xE5, 0x14, 0x30, 0xE7, 0x09, +0xC2, 0xAF, 0x53, 0x14, 0x7F, 0xD2, 0xAF, 0xD1, 0xEC, 0xC2, 0xAF, 0xE5, 0x64, 0x54, 0x0F, 0xFF, +0xBF, 0x01, 0x0D, 0x90, 0x93, 0x44, 0x74, 0x01, 0xF0, 0x51, 0x17, 0xE4, 0x90, 0x93, 0x44, 0xF0, +0xD2, 0xAF, 0x90, 0x01, 0xBD, 0xE5, 0x63, 0xF0, 0x90, 0x93, 0x5A, 0xE0, 0x90, 0x01, 0xBC, 0xF0, +0x61, 0x6F, 0x90, 0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x91, 0x1B, 0x7D, 0xFF, 0x7F, 0x55, 0x91, +0x1B, 0x7D, 0xFF, 0x7F, 0x56, 0x91, 0x1B, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x91, 0x63, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x91, 0x1B, 0xE4, 0xFD, 0x7F, 0x51, 0x91, 0x1B, +0xE4, 0xFD, 0x7F, 0x52, 0x91, 0x1B, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0x90, 0x00, 0x02, 0xE0, +0x44, 0x01, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x8E, 0x57, 0x8F, 0x58, 0x8B, 0x59, 0x8A, 0x5A, 0x89, 0x5B, 0xE4, 0x90, 0x93, +0x7C, 0xF0, 0xEF, 0x90, 0x00, 0x31, 0xF0, 0x91, 0x63, 0xE5, 0x57, 0x54, 0x03, 0xFF, 0x90, 0x00, +0x32, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0x91, 0x63, 0x90, 0x00, 0x33, 0xE0, 0x54, 0x7F, 0xF0, 0x91, +0x63, 0x90, 0x00, 0x33, 0xE0, 0x20, 0xE7, 0x0E, 0x90, 0x93, 0x7C, 0xE0, 0xC3, 0x94, 0x64, 0x50, +0x05, 0xE0, 0x04, 0xF0, 0x80, 0xEB, 0x90, 0x93, 0x7C, 0xE0, 0xC3, 0x94, 0x64, 0x50, 0x10, 0x90, +0x00, 0x30, 0xE0, 0xAB, 0x59, 0xAA, 0x5A, 0xA9, 0x5B, 0x12, 0x42, 0x53, 0x7F, 0x01, 0x22, 0x7F, +0x00, 0x22, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x79, 0x7F, 0xF5, 0x7E, 0x01, 0x91, 0x73, 0xBF, 0x01, +0x06, 0x90, 0x93, 0x79, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x79, 0x7F, 0xF6, 0x7E, +0x01, 0x91, 0x73, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x79, 0xE0, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x93, +0x7A, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xAE, 0x07, 0x90, 0x93, 0x7C, 0xE0, 0x54, 0xF0, 0xF0, 0x54, +0x0F, 0x44, 0x50, 0xF0, 0x90, 0x93, 0x7E, 0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x7B, 0x01, 0x7A, 0x93, +0x79, 0x7E, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x7C, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x10, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, +0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x92, 0x69, 0xE0, +0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, 0xFF, 0xA3, 0xE0, +0xB5, 0x07, 0x0D, 0xF1, 0x4B, 0xEF, 0x60, 0x70, 0xD1, 0xEC, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, +0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xA8, +0x01, 0xFC, 0x7D, 0x01, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x7E, 0x00, 0x7F, 0x02, 0x12, 0x1E, +0xD0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, +0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0x13, 0x12, 0x43, 0xA8, 0x8B, +0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, +0x54, 0x0F, 0xF5, 0x23, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xB1, 0xDD, 0x90, 0x92, 0x6A, 0xE0, +0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x94, 0x04, 0x12, 0x43, 0xC8, +0xAB, 0x20, 0xAA, 0x21, 0xA9, 0x22, 0x90, 0x94, 0x07, 0x12, 0x43, 0xC8, 0xAF, 0x23, 0x15, 0x23, +0xEF, 0x60, 0x1E, 0x90, 0x94, 0x07, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0x12, 0x1E, 0xF6, +0xFF, 0x90, 0x94, 0x04, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, 0x12, 0x42, 0x53, 0x80, +0xDB, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x0A, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x68, 0xE0, 0x90, 0x00, 0x01, +0x12, 0x42, 0x65, 0xF1, 0x4B, 0xEF, 0x70, 0x02, 0xC1, 0xE7, 0x90, 0x94, 0x0A, 0x12, 0x43, 0xA8, +0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0xB1, +0xDD, 0x90, 0x94, 0x0D, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x0A, +0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0x01, +0x79, 0xA2, 0xB1, 0xDD, 0x90, 0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0xB3, 0xE0, 0x64, 0x01, +0x70, 0x48, 0x90, 0x94, 0x0A, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, +0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x20, 0xB1, 0xDD, 0x90, 0x94, 0x0D, 0x12, 0x43, 0xA8, 0x8B, +0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x0A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, +0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x22, 0xB1, 0xDD, 0x90, 0x93, 0x96, 0xE0, +0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x92, 0x68, 0xE0, 0x04, 0xF0, +0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0xF1, 0x4B, 0xEF, 0x60, 0x4E, 0x90, 0x92, 0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, +0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, +0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x90, 0x94, 0x0D, 0x12, 0x43, +0xC8, 0xD0, 0x01, 0xD0, 0x02, 0xD1, 0x2C, 0x90, 0x92, 0x69, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, +0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, +0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xAF, 0x7E, 0x01, 0x90, +0x94, 0x33, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0x33, 0xE0, +0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, 0x90, 0x94, 0x36, 0xE0, 0x94, +0xE8, 0x90, 0x94, 0x35, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, +0x7F, 0x00, 0x22, 0x90, 0x94, 0x35, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x0A, 0x7E, +0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x93, 0xAF, 0xF0, 0x90, 0x00, +0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x81, 0x1B, 0x8F, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, +0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, +0xF0, 0x22, 0x90, 0x94, 0x38, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x94, 0x3A, 0xF0, 0x90, 0x94, +0x38, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, +0x30, 0xE3, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xAF, +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xC4, 0x74, 0xF2, 0xF0, 0x74, +0x57, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, +0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, +0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, +0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, 0x2B, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, +0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xFD, +0x63, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x62, 0xE0, 0x54, 0x03, 0x4F, +0x90, 0x93, 0x68, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, +0xFD, 0x63, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x69, 0xF0, 0x90, 0x93, 0x68, 0xE0, 0xFD, 0xA3, +0xE0, 0xFB, 0xE4, 0xFF, 0x90, 0x94, 0x16, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, +0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, 0x1B, 0xF0, 0xD1, 0x95, 0xBF, +0x01, 0x02, 0x11, 0xF7, 0x90, 0x94, 0x1B, 0xE0, 0x90, 0x05, 0x22, 0xF0, 0x80, 0x02, 0x11, 0xF7, +0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0xAE, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x2A, +0x90, 0x94, 0x19, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x94, 0x16, 0xE0, 0xFF, 0xA3, +0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x94, 0x25, 0xF0, 0xEF, 0x60, 0x10, 0x74, 0x21, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0E, 0x74, 0x21, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, 0x06, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x54, 0x03, 0xF0, 0xAE, 0x05, 0x74, 0x22, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xEB, 0xF0, 0x90, 0x94, 0x25, 0xE0, 0xFF, 0x74, 0x23, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x04, +0xF0, 0x22, 0xE4, 0x90, 0x93, 0x64, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x20, +0xE0, 0x02, 0xC1, 0x45, 0x12, 0x9C, 0x54, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, +0xB9, 0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x18, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, +0x90, 0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0xA3, 0xE0, 0x90, 0x93, 0x64, 0xF0, +0xE4, 0xF5, 0x48, 0x90, 0x93, 0x64, 0xE0, 0x24, 0x03, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, +0x54, 0x0F, 0x90, 0x93, 0x27, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, +0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0x93, 0x16, 0xE0, 0xFF, +0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6E, +0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, +0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xC4, 0x80, 0x51, 0x90, 0x93, 0x15, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, +0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, +0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x2A, +0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x06, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0x60, +0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x93, +0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x45, 0xA1, 0xB7, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x02, 0x60, +0x02, 0x61, 0x98, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xD1, +0x95, 0xBF, 0x01, 0x03, 0x12, 0x99, 0x48, 0xE4, 0xFF, 0xD1, 0x67, 0x90, 0x93, 0x1A, 0xE0, 0x30, +0xE0, 0x1F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x93, 0x1A, 0xE0, 0xC4, 0x54, +0x0F, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x90, 0x93, 0x64, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xEF, +0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x16, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0x93, 0x64, 0xE0, 0x2F, +0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0xFF, 0x90, 0x93, 0x65, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0xE4, +0xFF, 0xD1, 0xDC, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, 0x15, 0xE0, +0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, +0x14, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, 0xE4, 0xFD, +0xAF, 0x64, 0x12, 0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x30, +0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x20, 0xE0, 0x02, 0xC1, 0x45, 0xC1, 0x41, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x03, 0x60, 0x02, +0x81, 0xEC, 0x7F, 0x01, 0xD1, 0x67, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, +0xE0, 0x03, 0x12, 0x95, 0xCC, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, +0x02, 0x81, 0x48, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xD3, 0x9F, 0x40, 0x4D, +0xE0, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, +0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0x17, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, +0x80, 0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0x93, 0x67, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x67, 0x74, +0x03, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x67, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x80, 0x24, 0xE4, 0xF5, 0x48, +0x90, 0x93, 0x22, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, +0x90, 0x93, 0x1D, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, +0xF0, 0xE4, 0x90, 0x93, 0x29, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x66, 0xE0, 0xFF, +0x90, 0x93, 0x17, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, +0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x7F, 0x01, +0xD1, 0xDC, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x2F, 0x90, 0x93, 0x15, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, +0x4D, 0xE0, 0x60, 0x02, 0x80, 0x0F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x80, +0x08, 0xE5, 0x65, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x4D, 0xE0, +0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, +0x03, 0x12, 0x51, 0x48, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, +0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x45, 0x7F, 0x01, 0xC1, 0x43, 0x90, 0x93, 0x27, 0xE0, +0x64, 0x04, 0x60, 0x02, 0xA1, 0xBD, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, +0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0x93, 0x17, 0xE0, 0xFF, +0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6E, +0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, +0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xC4, 0x80, 0x51, 0x90, 0x93, 0x15, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, +0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, +0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x2A, +0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x07, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0x60, +0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x93, +0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x45, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x27, +0xE0, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x45, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, +0x30, 0xE0, 0x08, 0xD1, 0x95, 0xBF, 0x01, 0x03, 0x12, 0x99, 0x48, 0xE4, 0xFF, 0xD1, 0x67, 0xD1, +0xDC, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, +0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, +0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x14, 0xE4, 0xFD, +0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, 0xE4, 0xFD, 0xAF, 0x64, 0x12, +0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x30, 0xE0, 0x05, 0x90, +0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, +0x04, 0xE4, 0xFF, 0xD1, 0x46, 0x22, 0x90, 0x93, 0x04, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x17, 0xEF, +0x7B, 0x01, 0xB4, 0x01, 0x06, 0x7A, 0x93, 0x79, 0x0B, 0x80, 0x04, 0x7A, 0x93, 0x79, 0x07, 0x7F, +0x80, 0x7E, 0x08, 0x12, 0x95, 0x86, 0x22, 0xEF, 0xB4, 0x03, 0x12, 0x90, 0x93, 0x18, 0xE0, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x17, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x19, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEF, 0x90, 0x06, 0xCC, 0xB4, 0x01, 0x03, 0xE4, 0xF0, +0x22, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0x90, 0x94, 0x42, 0xF0, +0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, +0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x94, 0x43, 0xE0, 0x94, 0xE8, 0x90, 0x94, +0x42, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, +0x90, 0x94, 0x42, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x80, 0xC6, 0x90, 0x94, 0x26, 0xEF, +0xF0, 0x12, 0x9D, 0xFD, 0x90, 0x93, 0x18, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x08, +0x90, 0x94, 0x26, 0xE0, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x94, 0x27, 0x12, 0x1F, 0xD5, 0x00, 0x00, +0x03, 0x10, 0x90, 0x94, 0x26, 0xE0, 0xB4, 0x01, 0x10, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x13, +0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x80, 0x0A, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC3, 0x13, +0x30, 0xE0, 0x0A, 0x90, 0x94, 0x27, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, +0x94, 0x79, 0x27, 0x12, 0x95, 0x82, 0x90, 0x94, 0x26, 0xE0, 0x90, 0x93, 0x26, 0xF0, 0x22, 0x90, +0x93, 0x15, 0xE0, 0x30, 0xE0, 0x72, 0x7F, 0x01, 0xD1, 0x67, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x95, 0xCC, 0x7F, 0x01, 0xD1, 0xDC, 0x90, 0x93, 0x15, +0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x05, 0x12, 0x95, 0xCC, 0x80, 0x29, 0x90, 0x93, +0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x20, 0xF0, 0x90, +0x93, 0x4D, 0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x4D, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, +0x74, 0x6F, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0xD1, 0x46, 0x22, 0x12, 0x57, 0xF2, 0xBF, 0x01, 0x0F, 0x90, +0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x2A, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, +0x01, 0x63, 0xE4, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7F, 0x70, +0x7E, 0x08, 0x12, 0x34, 0x30, 0x7F, 0x01, 0xC1, 0x46, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x36, 0xF0, +0x70, 0x02, 0xF1, 0xCF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, +0x30, 0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, +0x90, 0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, +0x2B, 0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x43, +0x32, 0x20, 0x90, 0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, +0x22, 0x90, 0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, 0x02, +0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xB5, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, +0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, 0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, +0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, +0x22, 0xE4, 0x90, 0x93, 0x79, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, +0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, 0x7A, 0xE0, 0x94, 0x88, 0x90, +0x93, 0x79, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, +0x93, 0x79, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, +0xD3, 0x90, 0x93, 0x7A, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, +0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, +0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, +0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, +0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, +0x0C, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, +0x93, 0x5E, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, +0x60, 0x07, 0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3C, 0x90, 0x93, 0x5E, 0x74, 0x01, 0xF0, 0xA3, +0x74, 0x3D, 0xF0, 0x79, 0x40, 0x90, 0x93, 0x5E, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, +0x83, 0xE0, 0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0xA0, 0xF0, 0x22, 0x90, 0x93, 0xA0, +0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0C, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, +0xE0, 0x03, 0x12, 0x5F, 0xB9, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, +0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x86, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x90, 0x01, 0x34, +0xE0, 0x55, 0x28, 0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, +0x2E, 0xA3, 0xE0, 0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x61, 0x80, 0x90, 0x01, +0x34, 0x74, 0x01, 0xF0, 0x85, 0xD1, 0x0A, 0x85, 0xD3, 0x0C, 0x85, 0xD4, 0x0D, 0x85, 0xD5, 0x0E, +0x85, 0xD6, 0x0F, 0x85, 0xD7, 0x10, 0x85, 0xD9, 0x11, 0x85, 0xD2, 0x0B, 0x75, 0x20, 0x00, 0x75, +0x21, 0x00, 0x75, 0x22, 0x0A, 0x75, 0x23, 0x08, 0xFB, 0x7A, 0x93, 0x79, 0xA1, 0x12, 0x55, 0xDD, +0x90, 0x93, 0xA2, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x01, +0x6E, 0x70, 0x02, 0x61, 0x2B, 0x90, 0x93, 0xA2, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x02, 0x61, 0x2B, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, 0x93, 0xA3, 0xE0, 0x54, 0x3F, +0xF5, 0x4E, 0x90, 0x93, 0xA5, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x80, 0xF5, +0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xE5, 0x4E, 0xD3, 0x94, +0x04, 0x40, 0x03, 0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, +0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, +0xA5, 0xE0, 0x54, 0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, +0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0x90, 0x93, 0xA2, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2F, 0x90, 0x93, 0xA5, 0xE0, +0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, +0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA4, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x67, 0xAF, 0x4D, 0x12, 0x7A, 0x9C, 0x80, 0x60, 0x90, 0x93, 0xA2, 0xE0, 0xFF, +0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x53, 0x90, 0x93, 0xA5, 0xE0, 0x54, 0x1F, 0xFF, 0xFD, +0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8D, 0xF0, +0x12, 0x42, 0x87, 0x90, 0x93, 0xA4, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, +0x0F, 0xEE, 0x54, 0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, 0x12, 0x7A, 0x38, 0x80, 0x1B, +0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, +0x0A, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, 0xE5, 0x65, 0x14, 0x24, 0xFD, +0x50, 0x02, 0x80, 0x46, 0x90, 0x93, 0x5A, 0xE0, 0x60, 0x37, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, +0x01, 0x3C, 0x74, 0x04, 0xF0, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xF5, 0x48, 0x90, +0x93, 0x46, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, +0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x56, 0xF0, 0x80, +0x09, 0x12, 0x51, 0xBB, 0xBF, 0x01, 0x03, 0x12, 0x52, 0x17, 0x90, 0x94, 0x45, 0xE0, 0x04, 0xF0, +0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x81, 0x22, 0x90, 0x01, 0x34, 0x74, 0x02, 0xF0, 0x90, 0xFD, 0x10, +0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, 0x0B, 0x75, 0x4F, 0x88, 0x75, 0x50, 0x0F, +0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, 0x75, 0x50, 0x08, 0x75, 0x51, 0x07, 0x90, 0x04, +0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x12, 0x90, 0x04, 0x7E, 0xE0, 0x55, 0x51, 0xF5, 0x13, 0x65, 0x12, +0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x12, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x4F, 0x2F, 0x24, 0x00, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x15, 0x2F, 0xF8, 0xA6, 0x06, 0x0F, 0xBF, +0x08, 0xE2, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x15, 0x75, 0x23, 0x08, 0x7B, 0x01, +0x7A, 0x93, 0x79, 0x98, 0x12, 0x55, 0xDD, 0x90, 0x93, 0x98, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, +0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0xA9, 0xE5, 0x12, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0xAD, +0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, 0x12, 0x90, 0x04, 0x7F, 0xEF, 0xF0, 0xB5, +0x13, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, +0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x14, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, +0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, +0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x54, 0x30, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, +0xF0, 0x12, 0x54, 0x63, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x06, 0x90, 0x01, 0x34, 0x74, 0x40, +0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0xA1, 0x30, 0x90, 0x93, 0xB4, 0x74, 0x01, 0xF0, 0x90, 0x01, +0x36, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x02, +0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x12, 0x45, 0x09, 0x90, 0x93, 0x2D, 0xE0, 0x20, 0xE0, +0x02, 0xA1, 0x26, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x07, +0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, +0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0xE0, 0xFE, +0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9F, 0x40, 0x35, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xE1, 0xF0, +0x90, 0x93, 0x32, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x60, 0x7E, 0x08, +0x12, 0x34, 0x30, 0x90, 0x93, 0x2E, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, +0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x2D, +0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0xFE, +0x25, 0xE0, 0x4F, 0xF0, 0x80, 0x03, 0x12, 0x5F, 0x3F, 0xD1, 0xCB, 0x90, 0x93, 0xB4, 0xE4, 0xF0, +0xE5, 0x2E, 0x30, 0xE1, 0x45, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x43, 0x14, 0x40, 0x12, 0x9E, +0x56, 0x31, 0x17, 0x90, 0x93, 0x5D, 0xE0, 0x60, 0x1D, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x16, +0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, +0x58, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, 0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, 0x90, +0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x43, 0x90, +0x01, 0x36, 0x74, 0x04, 0xF0, 0x12, 0x4C, 0x73, 0x90, 0x93, 0x5D, 0xE0, 0x60, 0x34, 0x90, 0x93, +0x58, 0xE0, 0xFF, 0x90, 0x93, 0x41, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x58, 0xE0, 0x90, 0x05, +0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, 0x01, +0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x41, 0xE0, +0x14, 0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x62, 0x64, +0x01, 0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, +0x02, 0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x4C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, +0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, 0x60, 0x1C, 0x90, +0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x5B, 0xE4, 0xF0, 0x53, +0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2E, 0x30, 0xE5, 0x25, +0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x1A, 0xE5, 0x65, 0x60, 0x16, 0x90, +0x93, 0x5A, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x08, 0x12, 0x51, 0x48, +0x80, 0x03, 0x12, 0x50, 0x77, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, 0xF0, +0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, 0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, 0x66, 0x54, 0x07, +0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2F, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, +0x12, 0x4F, 0xFA, 0x74, 0x86, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, +0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, +0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x5E, 0xE0, 0x54, 0xF0, 0x44, +0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x15, 0x90, 0x94, 0x13, +0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x5E, 0x02, 0x55, 0x2C, 0x90, 0x94, 0x38, 0xE0, 0x30, +0xE0, 0x2F, 0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x94, 0x37, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, +0x0B, 0x90, 0x94, 0x3A, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x37, 0xF0, 0x90, 0x94, 0x3A, 0xE0, +0xFF, 0x90, 0x94, 0x39, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x44, 0xFE, 0xE4, 0x90, 0x94, 0x3A, +0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0x53, +0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, +0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, +0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, +0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, +0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, +0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, +0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, +0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, +0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, 0x56, 0x00, 0x90, 0x01, 0xC4, 0x74, 0xA9, 0xF0, 0x74, +0x67, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, +0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, +0xE5, 0x34, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0xE5, 0x34, 0x30, 0xE1, 0x10, +0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x46, 0x79, +0xE5, 0x34, 0x30, 0xE2, 0x3A, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE5, 0x65, 0x60, 0x30, 0x90, +0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x46, 0xE0, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, +0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x56, 0xE4, 0xF0, 0x12, 0x52, 0x17, 0xE5, +0x34, 0x30, 0xE3, 0x3A, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE5, 0x65, 0x60, 0x30, 0x90, 0x06, +0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x46, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, +0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, +0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x53, 0xE4, 0xF0, 0x12, 0x52, 0x17, 0xE5, 0x34, +0x30, 0xE4, 0x3D, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x30, 0xE0, 0x24, +0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x07, 0x78, 0x74, 0x01, +0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, +0x34, 0x30, 0x80, 0x03, 0x12, 0x59, 0xA2, 0x90, 0x93, 0x36, 0xE0, 0x60, 0x03, 0x12, 0x5F, 0xCF, +0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, +0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, +0x64, 0xF0, 0x12, 0x51, 0xEC, 0x12, 0x52, 0x17, 0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, +0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, +0xB0, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, +0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0xE5, 0x36, +0x30, 0xE1, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0xE5, 0x36, 0x30, 0xE3, 0x08, 0x90, 0x01, +0x3E, 0x74, 0x08, 0xF0, 0x51, 0x43, 0xE5, 0x36, 0x30, 0xE4, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x10, +0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x75, 0x90, 0x01, 0x3E, 0x74, 0x04, 0xF0, 0x90, 0x07, 0x8F, 0xE0, +0x30, 0xE7, 0x13, 0x74, 0x80, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x44, 0x04, +0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x46, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE6, 0x11, 0x74, 0x40, 0xF0, +0x90, 0x07, 0x7C, 0xE0, 0xB4, 0x06, 0x07, 0x90, 0x07, 0x80, 0xE0, 0xFF, 0x51, 0x61, 0x90, 0x07, +0x8F, 0xE0, 0x30, 0xE5, 0x14, 0x74, 0x20, 0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x46, 0x90, 0x07, 0x95, +0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE2, 0x0D, +0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0x7F, 0x01, 0x12, 0x5E, 0x46, 0x90, 0x07, 0x95, +0xE0, 0x30, 0xE0, 0x07, 0x74, 0x01, 0xF0, 0xFF, 0x12, 0x5E, 0x46, 0xE5, 0x36, 0x30, 0xE5, 0x06, +0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, 0x30, 0xE6, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, +0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, +0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, 0x14, 0x80, 0xE5, 0x37, 0x30, 0xE4, 0x1E, 0x90, +0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x44, 0x24, 0x90, 0x93, 0x58, 0xE0, 0x90, 0x05, 0x73, 0xF0, +0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x12, 0x5F, 0x3F, 0x12, 0x66, 0xCB, 0x74, 0xA9, 0x04, +0x90, 0x01, 0xC4, 0xF0, 0x74, 0x67, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, +0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, +0xD0, 0xE0, 0x32, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, +0x93, 0x1C, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, +0x22, 0xAD, 0x07, 0x90, 0x93, 0x64, 0xE0, 0x54, 0xF0, 0x44, 0x05, 0xF0, 0x54, 0x0F, 0x44, 0x10, +0xF0, 0x90, 0x93, 0x66, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x66, 0x90, 0x94, 0x13, 0x12, +0x43, 0xC8, 0x7A, 0x93, 0x79, 0x64, 0x02, 0x55, 0x2C, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x53, 0x91, 0xBF, 0x90, 0xFD, 0x68, 0xE0, 0x20, 0xE0, 0x02, +0xA1, 0x59, 0x90, 0x93, 0x95, 0xE0, 0x70, 0x16, 0x90, 0x00, 0x2E, 0xE0, 0x90, 0x93, 0x0F, 0xF0, +0x90, 0x00, 0x2D, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x95, 0x74, 0x01, 0xF0, 0x90, 0xFD, +0x60, 0xE0, 0x54, 0x3F, 0xD3, 0x94, 0x09, 0x50, 0x02, 0xF1, 0x32, 0x90, 0xFD, 0x60, 0xE0, 0x64, +0x0E, 0x60, 0x02, 0x61, 0x89, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, +0xE0, 0x02, 0x61, 0x89, 0x90, 0xFD, 0x62, 0xE0, 0x54, 0xC0, 0xFE, 0x90, 0x07, 0x90, 0xE0, 0x54, +0x3F, 0x4E, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x07, 0x91, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, +0x07, 0x92, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x07, 0x93, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x01, +0xF0, 0xEF, 0x20, 0xE0, 0x44, 0x90, 0x93, 0x04, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x19, +0x90, 0x07, 0x78, 0x12, 0x58, 0x8A, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x49, +0x90, 0x07, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x80, 0x40, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, +0x30, 0xE0, 0x11, 0xE4, 0xFF, 0x12, 0x5E, 0x46, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, +0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, 0x78, 0x80, 0x14, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, +0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x12, 0x58, 0x8A, 0x80, 0x0C, 0xE0, 0x44, 0x10, +0xF0, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x0F, 0x0A, +0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xB1, 0xED, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x15, +0x70, 0x76, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6B, 0xF0, 0xE0, 0x30, 0xE6, 0x1C, 0xF4, 0x54, +0x3F, 0x04, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9F, 0x90, 0x93, 0x6A, +0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x20, 0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, +0x54, 0x3F, 0xFF, 0x90, 0x93, 0x6B, 0xE0, 0x54, 0x3F, 0x2F, 0x90, 0x93, 0x6A, 0xF0, 0xD3, 0x94, +0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0x93, 0x6A, 0xE0, 0xFF, 0x90, 0x01, 0xE7, 0xF0, 0xEF, +0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x6A, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, +0x90, 0x93, 0x6C, 0xF0, 0x90, 0x00, 0x2E, 0xF0, 0xEE, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x93, 0x10, +0xE0, 0x54, 0x0F, 0x4F, 0x90, 0x00, 0x2D, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x21, 0x07, 0x90, +0xFD, 0x62, 0xE0, 0xFF, 0xB1, 0x74, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x22, 0x02, 0xB1, 0x9C, 0x90, +0xFD, 0x60, 0xE0, 0x64, 0x23, 0x60, 0x02, 0x81, 0xC0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x2C, +0x30, 0xE0, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, +0x13, 0x54, 0x03, 0x20, 0xE0, 0x62, 0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE1, 0x5B, 0x90, 0x93, 0x2D, +0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x2C, +0x6E, 0x90, 0x93, 0x32, 0x12, 0x1F, 0xC9, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x7F, 0x70, 0x7E, 0x08, +0x12, 0x2C, 0x6E, 0x90, 0x93, 0x2E, 0x12, 0x1F, 0xC9, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x01, 0xBE, 0xE0, 0x04, 0xF0, +0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x2D, 0x30, 0xE2, 0x08, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, +0x80, 0x06, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0xFF, 0x12, 0x9B, 0x06, +0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x24, 0x02, 0xB1, 0xC4, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x25, 0x13, +0x90, 0xFD, 0x62, 0xE0, 0x60, 0x0D, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0x24, +0x74, 0x04, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x26, 0x05, 0x7F, 0x01, 0x12, 0x9B, 0xA2, 0x90, +0xFD, 0x60, 0xE0, 0xB4, 0x30, 0x07, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0xD1, 0x18, 0x90, 0x93, 0x36, +0xE0, 0x60, 0x4F, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x31, 0x70, 0x47, 0x90, 0xFD, 0x62, 0xE0, 0x30, +0xE0, 0x36, 0x90, 0x01, 0x63, 0xE4, 0xF0, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, +0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0xE4, 0xFF, 0x12, 0x5E, 0x46, +0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x80, 0x0A, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE1, 0x03, 0x12, +0x5F, 0xCF, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, +0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xF0, 0xD0, 0xE0, 0x32, 0xAD, 0x07, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0xF0, 0x44, 0x09, 0xF0, 0x54, +0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x6F, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6F, 0x90, +0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6D, 0x02, 0x55, 0x2C, 0x90, 0x00, 0x75, 0xE0, +0x44, 0x01, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0x74, 0x03, 0xF0, +0x7F, 0x02, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0xE4, 0xF0, 0x90, 0x00, 0x75, 0xE0, +0x54, 0xFE, 0xF0, 0x22, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0xF0, 0x44, 0x0D, 0xF0, 0x54, 0x0F, 0x44, +0x10, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6F, +0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6D, 0x02, 0x55, 0x2C, 0xAE, 0x07, 0x90, +0x93, 0x6D, 0xE0, 0x54, 0xF0, 0x44, 0x04, 0xF0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x6F, +0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6F, 0x90, 0x94, 0x13, 0x12, 0x43, +0xC8, 0x7A, 0x93, 0x79, 0x6D, 0x02, 0x55, 0x2C, 0xAC, 0x07, 0x90, 0x93, 0xDB, 0xE0, 0x44, 0x0F, +0xF0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x93, 0xDD, 0xEC, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, +0xE0, 0x90, 0x93, 0xDE, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0x93, 0xDF, 0xF0, 0x90, 0xFD, 0x64, +0xE0, 0x90, 0x93, 0xE0, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xE1, 0xF0, 0x90, 0xFD, 0x66, +0xE0, 0x90, 0x93, 0xE2, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0xE3, 0xF0, 0x80, 0x11, 0x90, +0x93, 0xDE, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0x7B, 0x01, 0x7A, 0x93, 0x79, 0xDD, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0xDB, +0x02, 0x55, 0x2C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x84, +0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x85, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0x90, 0x93, 0x86, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x87, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x88, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, +0x58, 0xE0, 0x20, 0xE0, 0x14, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x84, 0x7F, 0x30, 0xD1, 0xE8, 0x90, +0x93, 0x84, 0xE0, 0xFB, 0x7D, 0x01, 0xE4, 0x80, 0x07, 0x90, 0x93, 0x84, 0xE0, 0xFB, 0xE4, 0xFD, +0xFF, 0xD1, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x93, 0x8B, 0x12, 0x43, 0xC8, 0xE4, 0xFE, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x2F, 0x90, 0xFD, +0x50, 0xEF, 0xF0, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0x93, 0x8B, 0x12, 0x43, 0xA8, 0x8E, +0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, +0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0xF0, 0x44, 0x0A, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, +0x93, 0x6F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, +0x93, 0x71, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, +0x93, 0x73, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x93, 0x6D, 0x30, 0xE6, 0x08, 0xE0, 0x54, 0x0F, +0x44, 0x50, 0xF0, 0x80, 0x16, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, +0x93, 0x74, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0x75, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, +0x6F, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6D, 0x02, 0x55, 0x2C, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x79, 0xF0, 0x90, +0x93, 0x79, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x70, 0xE9, 0x90, 0x94, 0x46, 0xE0, 0xFF, 0x74, 0x01, +0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, +0x5D, 0x70, 0x03, 0x02, 0x70, 0xE2, 0x90, 0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, +0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7A, 0xF0, 0x75, 0x20, 0x01, 0x75, 0x21, 0x93, 0x75, 0x22, +0x7A, 0x75, 0x23, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7B, 0x12, 0x55, 0xDD, 0x90, 0x93, 0x7B, +0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x94, 0x46, 0x30, 0xE0, 0x59, 0xE0, 0x75, +0xF0, 0x02, 0x90, 0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x46, +0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0x90, +0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7E, +0xF0, 0x90, 0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, +0x93, 0x7F, 0xF0, 0x90, 0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, +0xE0, 0x90, 0x93, 0x80, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, +0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, +0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0x90, 0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7E, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, +0x7A, 0x93, 0x79, 0x7C, 0x11, 0xEE, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x90, 0x94, 0x46, 0xE0, 0xFE, +0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, 0x79, +0xF0, 0x90, 0x94, 0x46, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x94, 0x46, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x02, +0x6F, 0xAF, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, +0x81, 0x12, 0x43, 0xC8, 0xEF, 0x12, 0x43, 0xD1, 0x71, 0x98, 0x01, 0x71, 0x8F, 0x02, 0x71, 0xE0, +0x03, 0x71, 0xE9, 0x05, 0x71, 0xF2, 0x06, 0x73, 0x46, 0x07, 0x71, 0xFA, 0x0B, 0x72, 0x03, 0x10, +0x72, 0x0B, 0x11, 0x72, 0x13, 0x12, 0x72, 0x1B, 0x16, 0x72, 0x25, 0x17, 0x72, 0x2F, 0x18, 0x72, +0x39, 0x19, 0x73, 0x09, 0x1B, 0x73, 0x12, 0x1C, 0x72, 0x42, 0x1D, 0x72, 0x4C, 0x1E, 0x72, 0x57, +0x21, 0x72, 0x60, 0x22, 0x72, 0x69, 0x23, 0x72, 0x72, 0x24, 0x72, 0x7B, 0x25, 0x72, 0x84, 0x26, +0x72, 0x8D, 0x27, 0x72, 0x96, 0x28, 0x72, 0x9F, 0x29, 0x71, 0xA1, 0x2D, 0x71, 0xAA, 0x2E, 0x72, +0xA8, 0x2F, 0x73, 0x1B, 0x30, 0x72, 0xB9, 0x32, 0x72, 0xB0, 0x33, 0x71, 0xBC, 0x34, 0x72, 0xC2, +0x36, 0x72, 0xCB, 0x37, 0x72, 0xD4, 0x38, 0x72, 0xDC, 0x3A, 0x71, 0xB3, 0x3B, 0x72, 0xE5, 0x3E, +0x72, 0xEE, 0x3F, 0x72, 0xF7, 0x41, 0x73, 0x24, 0x46, 0x71, 0xC5, 0x47, 0x71, 0xD7, 0x48, 0x71, +0xCE, 0x49, 0x73, 0x2D, 0x4B, 0x73, 0x36, 0x51, 0x73, 0x00, 0x53, 0x00, 0x00, 0x73, 0x3F, 0x90, +0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8B, 0xA0, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8B, +0xA6, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8C, 0x87, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, +0x02, 0x8C, 0xCF, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0x08, 0x90, 0x93, 0x81, 0x12, +0x43, 0xA8, 0x02, 0x8D, 0x3A, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0x40, 0x90, 0x93, +0x81, 0x12, 0x43, 0xA8, 0x02, 0x8E, 0x00, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x98, 0x29, +0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8E, 0x11, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, +0x8A, 0x5A, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x81, 0x17, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, +0x02, 0x8A, 0xD0, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x61, 0x47, 0x90, 0x93, 0x81, 0x12, 0x43, +0xA8, 0x61, 0x4D, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x61, 0x53, 0x90, 0x93, 0x81, 0x12, 0x43, +0xA8, 0x7F, 0x01, 0x80, 0x2F, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x7F, 0x02, 0x80, 0x25, 0x90, +0x93, 0x81, 0x12, 0x43, 0xA8, 0x7F, 0x03, 0x80, 0x1B, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, +0x8F, 0x43, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0xE4, 0xFF, 0x80, 0x08, 0x90, 0x93, 0x81, 0x12, +0x43, 0xA8, 0x7F, 0x04, 0x02, 0x8E, 0x61, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x7B, +0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x94, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, +0x8F, 0xAD, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xC6, 0x90, 0x93, 0x81, 0x12, 0x43, +0xA8, 0x02, 0x8F, 0xDF, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xF8, 0x90, 0x93, 0x81, +0x12, 0x43, 0xA8, 0x02, 0x90, 0x11, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x2A, 0x90, +0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x43, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x81, 0x08, +0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x6B, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, +0x90, 0x84, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x9D, 0x90, 0x93, 0x81, 0x12, 0x43, +0xA8, 0x02, 0x92, 0x50, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x61, 0xE6, 0x90, 0x93, 0x81, 0x12, +0x43, 0xA8, 0x02, 0x92, 0x62, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x97, 0xBC, 0x90, 0x93, +0x81, 0x12, 0x43, 0xA8, 0x02, 0x97, 0xD5, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x98, 0x10, +0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x5F, 0xE9, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, +0x8A, 0x9F, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0x86, 0x90, 0x93, 0x81, 0x12, 0x43, +0xA8, 0x02, 0x9A, 0xAF, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x6E, 0x83, 0x90, 0x93, 0x81, +0x12, 0x43, 0xA8, 0x02, 0x98, 0x31, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8E, 0x59, 0x90, +0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x05, 0x7F, 0x0B, 0x80, 0x10, 0x7D, 0x01, 0x7F, +0x0C, 0x80, 0x0A, 0x7D, 0x01, 0x7F, 0x0D, 0x80, 0x04, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x3B, 0x12, 0x43, 0xC8, 0xE4, 0xFE, 0x90, 0x00, 0xA3, 0xE0, +0x54, 0xF8, 0x44, 0x05, 0xF0, 0x90, 0x00, 0xA0, 0xE0, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x5A, 0x90, +0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x49, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, +0x9D, 0x50, 0x1E, 0x90, 0x94, 0x3B, 0x12, 0x43, 0xA8, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, +0x0F, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, +0xDD, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0F, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, +0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xFF, 0x80, 0x12, 0x90, +0x01, 0x43, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, 0x08, 0x90, 0x01, 0x42, 0xE0, 0x04, 0xF0, 0x7F, +0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, +0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x23, 0x71, 0x5D, 0xEF, 0xB4, +0x03, 0x05, 0x7F, 0xFF, 0x12, 0x9B, 0x06, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xE9, 0x24, 0x01, 0xF9, +0xE4, 0x3A, 0xFA, 0x7D, 0x04, 0x61, 0x5D, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x1F, +0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0x90, 0x93, 0x84, 0xEF, 0xF0, +0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, +0x12, 0x1F, 0x0F, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x00, 0x04, 0x12, +0x1F, 0x0F, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, 0x84, +0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAD, 0x82, 0xAC, 0x83, 0x90, +0x93, 0x8B, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, +0x8A, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xA8, +0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x8D, 0x12, 0x43, 0xA8, 0xEF, +0x12, 0x42, 0x53, 0x90, 0x93, 0x86, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, +0x90, 0x93, 0x8D, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x90, 0x93, 0x86, +0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x8B, 0xE0, 0xFC, 0xA3, +0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0x8D, 0x82, 0x8C, 0x83, 0xA3, +0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x24, 0xC2, 0xF5, 0x82, 0xE4, +0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x85, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, +0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8B, 0x12, 0x43, +0x9C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, +0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x8F, 0x57, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, +0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, 0x57, 0x75, 0xF0, 0x02, 0xA4, 0x24, 0x02, 0xF9, +0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0x75, 0xF0, 0x09, 0xE5, 0x57, +0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, 0x85, 0x83, 0x5D, 0x8F, 0x5E, 0xE5, 0x57, 0x75, +0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0x75, 0x5F, 0x01, 0xF5, 0x60, 0x89, +0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x12, 0x43, 0xD1, +0x75, 0xA5, 0x00, 0x75, 0xBA, 0x01, 0x75, 0xCF, 0x02, 0x75, 0xE4, 0x03, 0x76, 0x0D, 0x04, 0x76, +0x22, 0x05, 0x76, 0x37, 0x06, 0x76, 0x5D, 0x0C, 0x76, 0x8A, 0x0D, 0x76, 0xB7, 0x0E, 0x76, 0xE4, +0x0F, 0x00, 0x00, 0x77, 0x18, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, +0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, +0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80, 0x27, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, +0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, 0xE1, 0x18, 0xE5, 0x57, 0x25, +0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF5, +0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, +0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, +0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xE1, 0x18, 0x90, 0x04, 0x47, +0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x46, 0xE0, 0xAB, 0x5A, +0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x45, 0xE0, 0x85, 0x59, +0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, 0xE1, 0x0F, 0x90, 0x04, 0x4B, 0xE0, 0xAB, 0x5A, +0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4A, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, +0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x49, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, +0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, +0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, +0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, +0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, +0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, +0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x50, 0xE0, +0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xC0, 0x03, +0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x12, 0x1E, +0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0xAB, 0x5A, 0xE5, 0x5C, 0x24, +0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, +0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x5F, 0xD0, 0x01, 0xD0, +0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xC0, 0x83, 0xC0, 0x82, +0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, +0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, +0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x57, +0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, +0x60, 0x4C, 0x90, 0x93, 0x90, 0x74, 0x0B, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xC3, 0x94, 0x00, +0x50, 0x03, 0x02, 0x78, 0x5E, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, +0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, +0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x0A, 0x90, 0x93, 0x90, 0xE0, +0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x90, 0xE0, 0x14, 0xF0, 0x80, 0xBA, 0xE5, 0x57, +0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, +0x60, 0x47, 0x90, 0x93, 0x90, 0x74, 0x0F, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xC3, 0x94, 0x00, +0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, +0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x90, 0xE0, 0xA3, 0xF0, 0x80, +0x0D, 0x90, 0x93, 0x90, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0xE5, 0x57, +0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, +0x60, 0x46, 0xE4, 0x90, 0x93, 0x90, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, +0x02, 0x21, 0x17, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, +0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, 0x93, 0x90, 0xE0, 0x80, 0x63, +0x90, 0x93, 0x90, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, +0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x90, +0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, +0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, +0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, +0x60, 0x08, 0x90, 0x93, 0x90, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, 0x93, 0x90, 0xE0, 0x04, 0xF0, +0x80, 0xBF, 0xE4, 0x90, 0x93, 0x92, 0xF0, 0x90, 0x93, 0x91, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0xE5, +0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, 0x90, 0x93, 0x92, 0xE0, 0xFE, 0x75, 0xF0, +0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xE5, 0x57, 0xC3, 0x94, 0x20, +0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, +0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, +0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x92, 0xE0, 0xA3, 0xF0, 0x80, 0x37, 0x80, 0x2D, 0x74, 0x27, +0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x91, 0xE0, 0xFE, +0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x93, 0xEE, 0xF0, 0x80, 0x17, 0x90, 0x93, 0x92, 0xE0, +0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x91, 0xE0, 0x90, +0x93, 0x93, 0xF0, 0x90, 0x93, 0x93, 0xE0, 0xFD, 0xAF, 0x57, 0x31, 0xEF, 0x90, 0x93, 0x93, 0xE0, +0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, +0x91, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x03, 0xF0, 0x22, 0xEF, +0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x03, +0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x8A, 0x83, 0xF0, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x0E, 0x74, 0x84, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, 0x29, 0x74, 0x27, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0xCE, 0xEF, 0xF0, 0x24, 0x27, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0xCF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xCE, 0x7D, +0x02, 0x71, 0xB4, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0xE5, 0x53, 0x54, 0x1F, +0x90, 0x93, 0x60, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x90, +0x93, 0x5E, 0xF0, 0x90, 0x93, 0x61, 0x74, 0x01, 0xF0, 0xEB, 0xC3, 0x94, 0x01, 0x40, 0x02, 0x80, +0x3B, 0x90, 0x93, 0x5E, 0xE0, 0x25, 0x55, 0xFF, 0xA3, 0xF0, 0xA3, 0xE0, 0x90, 0x41, 0xA4, 0x93, +0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x13, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, +0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x21, 0xEF, 0x90, 0x93, 0x5F, 0xE0, 0xFF, 0x74, 0x01, +0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x75, 0xF0, +0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x63, 0xF0, 0x74, 0x28, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, 0x93, 0x62, 0xF0, 0x74, 0xE8, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x5D, 0x74, 0xE8, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, +0x83, 0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEF, 0xF0, 0x74, +0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, +0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xC6, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x0D, 0x74, 0xC6, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, 0x93, 0x63, 0xE0, 0xFF, 0x90, 0x93, 0x62, +0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, 0x62, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, +0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, +0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, +0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, 0x90, 0x93, 0x62, 0xE0, 0xFD, +0x31, 0xEF, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x12, 0x90, 0x04, 0x30, 0xE0, +0x70, 0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0x04, 0xCF, 0x04, 0xF0, 0x90, 0x93, +0x62, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x1C, 0x12, 0x43, +0xC8, 0x90, 0x94, 0x1F, 0xE0, 0x54, 0xF0, 0x44, 0x06, 0xFF, 0xF0, 0xED, 0x54, 0x0F, 0xC4, 0x54, +0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x94, 0x1C, 0x12, 0x43, 0xA8, 0x90, 0x94, 0x13, +0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x1F, 0x12, 0x55, 0x2C, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, +0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x89, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2C, 0xF5, +0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x89, +0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x8C, 0xF0, 0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x89, 0x12, +0x43, 0x9C, 0xE0, 0x90, 0x93, 0x8E, 0xF0, 0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x88, 0x12, 0x43, +0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x8F, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, +0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x90, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEC, +0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, +0x93, 0x92, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, 0xC6, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, +0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, 0x90, 0x93, 0x8F, 0xE0, 0x90, 0x93, 0x8C, 0xF0, +0x90, 0x93, 0x89, 0xF0, 0xED, 0x70, 0x02, 0xA1, 0x6B, 0x90, 0x93, 0x8D, 0xED, 0xF0, 0x90, 0x93, +0x89, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x8C, 0xE0, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x8D, +0xE0, 0x14, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0x70, 0x02, 0xA1, 0x6B, 0x90, 0x93, 0x8C, 0xE0, 0xFF, +0xD3, 0x94, 0x00, 0x50, 0x02, 0xA1, 0x6B, 0xE4, 0x90, 0x93, 0x8B, 0xF0, 0xEF, 0x14, 0x90, 0x93, +0x8A, 0xF0, 0x90, 0x93, 0x8E, 0xE0, 0xFD, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, +0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x92, 0xE0, 0x5E, 0xFE, +0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, +0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0xFF, 0x90, 0x93, 0x90, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x93, 0x8A, +0xE0, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x8B, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0xFF, +0x90, 0x93, 0x8B, 0xE0, 0x6F, 0x60, 0x08, 0x90, 0x93, 0x8A, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, +0x93, 0x8D, 0xE0, 0xFF, 0x90, 0x93, 0x8B, 0xE0, 0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x93, 0x8A, 0xE0, +0xB5, 0x05, 0x08, 0x90, 0x93, 0x8E, 0xE0, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFF, +0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, +0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, +0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, +0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, +0x93, 0x89, 0xE0, 0xFD, 0x31, 0xEF, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x22, 0xEF, 0xC3, 0x94, 0x20, +0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, 0xF0, 0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, +0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, +0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, +0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x4D, 0xF0, 0x22, 0xAD, 0x07, 0xED, 0xC3, +0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, +0x7F, 0x90, 0x93, 0x89, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, +0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xF9, 0x54, 0x1F, 0xA3, +0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFF, 0x90, 0x93, 0x8C, +0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, +0xE0, 0x90, 0x93, 0x8D, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, +0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8F, 0xCB, 0xF0, 0xA3, 0xEB, +0xF0, 0x90, 0x93, 0x8A, 0xE0, 0xFE, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, +0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xEE, 0xC3, 0x9F, 0x40, 0x02, 0xE1, 0x59, +0x90, 0x93, 0x8A, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, +0xF0, 0xEF, 0x04, 0x90, 0x93, 0x8B, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8B, 0xE0, +0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xE1, 0x93, 0xEE, 0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0, +0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, +0xF9, 0xFF, 0x90, 0x93, 0x8D, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, +0x8B, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8F, 0xE0, 0x5E, 0xFE, 0xA3, +0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x8B, 0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x93, 0x8E, 0xE0, +0x30, 0xE7, 0x06, 0x90, 0x93, 0x8B, 0x74, 0x17, 0xF0, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0x64, 0x13, +0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, 0x8D, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x8B, +0x74, 0x18, 0xF0, 0x90, 0x93, 0x8B, 0xE0, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, 0x89, 0xF0, 0x80, +0x42, 0x90, 0x93, 0x8B, 0xE0, 0x04, 0xF0, 0xC1, 0xB7, 0x90, 0x93, 0x8C, 0xE0, 0xFC, 0x90, 0x93, +0x8A, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, +0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x10, +0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x8A, 0xE0, 0x44, 0x40, 0x90, 0x93, 0x89, 0xF0, 0x80, 0x03, +0xAF, 0x01, 0x22, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, +0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, 0x93, 0x8A, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90, +0x93, 0x8C, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, +0x90, 0x93, 0x8A, 0xEF, 0xF0, 0x90, 0x93, 0x89, 0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24, +0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, +0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, +0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, +0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0x90, 0x93, 0x89, 0xE0, 0x44, +0x80, 0xFD, 0x12, 0x79, 0xEF, 0x90, 0x93, 0x89, 0xE0, 0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x93, +0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, 0x03, 0x02, 0x88, 0x5F, 0xEF, +0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, 0x90, 0x89, 0x01, 0xE0, 0xFF, 0x90, 0x8F, +0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, +0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x88, 0x56, 0xEF, 0x25, 0xE0, +0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, +0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x88, 0x56, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x20, 0x40, 0x09, +0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x88, 0x5F, 0x90, 0x93, 0x79, 0xE0, 0x75, 0xF0, 0x0A, +0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0xE0, +0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, 0xE0, +0x90, 0x93, 0x7E, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, +0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x80, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, +0x90, 0x93, 0x79, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x7A, 0xF0, 0x80, 0x14, 0x90, 0x93, 0x79, +0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x7A, +0xF0, 0x90, 0x93, 0x7A, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x75, +0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x83, 0xF0, 0x74, 0x67, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x61, 0xF4, 0x90, +0x93, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x7B, 0xE0, 0x9F, 0x40, 0x13, 0x90, 0x93, 0x83, 0xE0, 0x90, +0x93, 0x7B, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, 0x93, 0x7A, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0x93, +0x7B, 0xE0, 0xFF, 0x90, 0x41, 0x18, 0x93, 0xFE, 0x90, 0x93, 0x79, 0xE0, 0x24, 0x85, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, 0x90, 0x40, 0xE0, 0x80, 0x07, +0x90, 0x93, 0x7B, 0xE0, 0x90, 0x40, 0xFC, 0x93, 0x90, 0x93, 0x82, 0xF0, 0x90, 0x93, 0x82, 0xE0, +0x75, 0xF0, 0x06, 0xA4, 0x24, 0x56, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x8B, 0x57, +0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, +0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7C, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, +0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x9D, 0xFD, 0xAC, +0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7C, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, +0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, +0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, +0x7C, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x02, +0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x04, 0x12, +0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7C, 0xEE, 0x8F, 0xF0, 0x12, 0x42, +0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x06, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, +0x1F, 0x3C, 0x90, 0x93, 0x7C, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, +0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, +0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7C, 0xEE, +0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x05, 0x12, 0x1F, +0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7E, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0xD3, +0x90, 0x93, 0x7D, 0xE0, 0x9F, 0x90, 0x93, 0x7C, 0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, +0x90, 0x93, 0x7C, 0xE0, 0x9E, 0xF0, 0x80, 0x07, 0xE4, 0x90, 0x93, 0x7C, 0xF0, 0xA3, 0xF0, 0x90, +0x93, 0x7C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, +0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x7A, 0xE0, 0x25, +0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, +0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, 0x61, 0xC3, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, +0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, 0x40, 0x03, 0xEF, 0x80, 0x1C, 0x90, 0x93, 0x79, +0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x82, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x93, +0x84, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, 0x23, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, 0xC6, +0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x01, 0x40, 0x0F, 0x74, 0xC6, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x14, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x79, 0xE0, +0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, +0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x60, 0x02, 0xE1, 0x04, 0x12, 0x7D, +0xFC, 0xE1, 0x04, 0x90, 0x93, 0x7A, 0xE0, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, +0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC3, 0x90, 0x93, 0x7D, 0xE0, 0x9F, 0x90, +0x93, 0x7C, 0xE0, 0x9E, 0x40, 0x02, 0xE1, 0x04, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x7D, 0x01, 0x12, +0x7B, 0xF1, 0xE1, 0x04, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, +0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xA1, 0xD2, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, +0x03, 0x0B, 0x90, 0x93, 0x7B, 0xE0, 0xC3, 0x94, 0x19, 0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, +0x0B, 0x90, 0x93, 0x7B, 0xE0, 0xC3, 0x94, 0x11, 0x40, 0x2E, 0x80, 0x1F, 0x90, 0x8A, 0x83, 0xE0, +0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x7B, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, +0x70, 0x11, 0x90, 0x93, 0x7B, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x0D, 0x90, 0x8E, 0xC5, 0x74, 0x01, +0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFE, 0x24, 0xC4, 0xF5, +0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x74, 0x85, 0x2E, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30, 0x50, 0x0A, 0xE4, 0x90, 0x93, 0x88, +0xF0, 0x74, 0x67, 0x2F, 0xA1, 0x7D, 0x90, 0x8E, 0xC5, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x72, +0x90, 0x93, 0x79, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x0A, +0x60, 0x5B, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0xEE, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x41, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, +0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x79, 0xE0, 0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, +0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, +0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, 0x93, 0x79, 0xE0, 0x24, 0xA7, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x7B, 0xE0, 0x6F, 0x60, 0x56, 0x90, 0x93, 0x79, +0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, +0x08, 0x90, 0x93, 0x88, 0x74, 0x05, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0x39, 0x90, 0x93, 0x88, +0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, +0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, +0x8F, 0x80, 0x2F, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, +0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, +0x80, 0x14, 0xE4, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0xFE, 0x90, 0x93, 0x79, 0xE0, 0xFF, +0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFE, +0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, +0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x11, 0xE4, 0x90, 0x93, 0x88, 0xF0, 0x74, +0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFD, +0xE1, 0x01, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xE1, 0x04, 0x90, 0x93, 0x7C, 0xF0, 0xA3, 0xF0, 0x90, +0x41, 0xE1, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7E, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, +0x3C, 0x90, 0x93, 0x86, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x24, 0xC4, 0xF5, +0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0xE4, 0x90, 0x93, 0x85, 0xF0, +0x90, 0x93, 0x85, 0xE0, 0xFF, 0xD3, 0x94, 0x04, 0x50, 0x47, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, +0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, +0xEF, 0x90, 0x41, 0xDC, 0x93, 0xFF, 0x7E, 0x00, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7C, 0xEE, 0x8F, +0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x86, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x7D, +0xE0, 0x9F, 0x90, 0x93, 0x7C, 0xE0, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x85, 0xE0, 0x04, 0xF0, 0x80, +0xAF, 0x90, 0x93, 0x85, 0xE0, 0xC3, 0x13, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, +0x90, 0x93, 0x85, 0xE0, 0x70, 0x5D, 0x90, 0x93, 0x88, 0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, +0x1D, 0x90, 0x93, 0x85, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x88, 0x74, 0x03, 0xF0, 0x80, 0x48, +0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x88, 0x74, 0x01, 0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, 0x93, +0x88, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, 0x85, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x88, +0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, 0x88, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, +0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x81, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x80, 0xE0, 0x94, +0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x88, 0xF0, 0xD3, 0x90, 0x93, 0x81, 0xE0, 0x94, 0x03, 0x90, +0x93, 0x80, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x88, 0xE0, +0xFD, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xED, +0xF0, 0x12, 0x7D, 0xBC, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, +0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, +0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x79, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x80, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, +0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, 0x93, 0x79, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x47, +0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, 0x50, +0x1C, 0x90, 0x93, 0x80, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x80, 0x14, 0x90, 0x93, 0x79, +0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, +0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, +0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, 0xFF, 0x9D, 0xFB, 0x74, 0xFF, 0x9C, 0xFA, 0xEF, +0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, +0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x79, 0xE0, 0x50, 0x13, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, 0x42, 0x87, 0x80, 0x10, 0x25, 0xE0, 0x24, 0xC7, +0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, +0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, +0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, +0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, 0x12, +0x43, 0x1F, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x04, 0xF0, 0x02, 0x80, 0x62, 0x22, +0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE4, +0xF0, 0x90, 0x93, 0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x14, 0x74, +0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x04, +0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, 0x90, 0x89, 0x01, 0x04, 0xF0, 0xE4, 0x90, 0x93, +0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, 0x02, 0x41, 0x59, 0x75, 0xF0, +0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, +0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, +0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, +0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x9C, +0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, +0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC4, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, +0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, +0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x05, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, +0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, +0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8E, 0x04, +0xF0, 0x90, 0x41, 0x92, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x90, 0x41, 0x5A, 0x74, 0x01, 0x93, +0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0x90, 0x93, 0x79, 0xE0, 0xFD, +0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, +0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x75, 0xF0, 0x09, +0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x74, 0xC2, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x86, 0x12, 0x43, +0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x84, 0x12, 0x43, 0x9C, +0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, +0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xED, +0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0x74, +0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, +0xF0, 0x90, 0x93, 0x79, 0xE0, 0x04, 0xF0, 0x01, 0xA2, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xC3, 0x94, +0x40, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, 0x40, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x3F, 0xFE, +0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFD, 0xAF, 0x06, 0x02, 0x74, 0x2B, 0x12, +0x1E, 0xF6, 0x90, 0x89, 0x01, 0xF0, 0x22, 0x90, 0x93, 0x90, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x93, +0xE0, 0x54, 0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, 0x93, 0x90, 0x12, 0x43, +0xA8, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x93, 0x02, 0x55, 0x2C, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, +0x94, 0x40, 0x40, 0x02, 0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, +0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, +0x84, 0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, +0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x86, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, +0x74, 0xFF, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, +0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x8A, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, +0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x8C, 0xF0, 0xEE, 0xA3, +0xF0, 0xA3, 0xEC, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x84, 0x41, 0xA7, +0x12, 0x1E, 0xF6, 0xF5, 0x62, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x84, +0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x84, +0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x00, 0x03, +0x12, 0x1F, 0x0F, 0x90, 0x93, 0x3D, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x01, +0x90, 0x93, 0x3E, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x1F, 0x0F, 0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x45, 0xF0, 0xEF, 0x13, 0x13, 0x13, +0x54, 0x01, 0x90, 0x93, 0x4B, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, 0x01, +0x90, 0x93, 0x47, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x5C, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x4A, 0xF0, 0xE0, 0x70, 0x38, +0x90, 0x93, 0x48, 0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x87, 0x12, 0x1F, 0xD5, +0x00, 0x00, 0x03, 0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x87, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x03, 0x00, 0x90, 0x93, 0x87, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, +0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x3E, 0xE0, 0x70, 0x03, 0x12, 0x4F, +0xB8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x12, 0x4D, 0xC1, 0x90, 0x93, 0x5A, 0xE0, 0x90, 0x01, +0xE6, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, 0xE0, +0x25, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x49, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, +0x4C, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x46, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0x90, 0x93, 0x51, 0xF0, 0x22, 0x90, 0x93, 0x49, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4C, 0x74, +0x05, 0xF0, 0x90, 0x93, 0x46, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x51, 0x74, 0x05, 0xF0, 0x22, 0x12, +0x1E, 0xF6, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x50, 0xF0, 0x90, 0x00, 0x01, +0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x4E, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, 0x93, +0x50, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x4E, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4E, +0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x4D, 0xF0, 0x60, +0x20, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, +0x93, 0x3E, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x57, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x51, +0x69, 0x90, 0x93, 0x4D, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x93, 0x84, 0x02, 0x43, 0xC8, +0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x37, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, +0x54, 0x0F, 0xFF, 0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x70, 0xFF, 0x90, 0x93, +0x37, 0xE0, 0x54, 0x8F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x39, 0xF0, +0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, +0x90, 0x93, 0x3B, 0xF0, 0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, 0x90, 0x00, 0x01, 0x12, +0x1F, 0x0F, 0xFF, 0xD3, 0x94, 0x20, 0x50, 0x08, 0x90, 0x93, 0x38, 0x74, 0x01, 0xF0, 0x80, 0x57, +0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0x93, 0x38, 0x74, 0x02, 0xF0, 0x80, 0x49, 0xEF, 0xD3, +0x94, 0x60, 0x50, 0x08, 0x90, 0x93, 0x38, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0xEF, 0xD3, 0x94, 0x80, +0x50, 0x08, 0x90, 0x93, 0x38, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, 0x94, 0xA0, 0x50, 0x08, +0x90, 0x93, 0x38, 0x74, 0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, 0x50, 0x08, 0x90, 0x93, +0x38, 0x74, 0x06, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, 0x38, 0x50, 0x05, 0x74, +0x07, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x93, 0x38, 0xE0, 0x90, 0x93, 0x3C, 0xF0, 0x22, +0x12, 0x1E, 0xF6, 0x60, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, +0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, +0xAA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAB, 0xF0, 0x90, +0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAC, 0xF0, 0x90, 0x00, 0x03, 0x12, +0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, +0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0xAE, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xA9, 0xF0, +0x22, 0xEF, 0x70, 0x21, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x40, 0xE0, 0x44, 0x20, +0xF0, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x07, 0x90, 0x07, +0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x6A, 0x12, 0x1E, 0xF6, 0x90, 0x00, 0x01, +0x30, 0xE0, 0x2E, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, +0x90, 0x06, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC2, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC3, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x54, 0xFE, 0xF0, 0x80, +0x2C, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x06, +0xC5, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC6, 0xF0, 0x90, 0x00, 0x04, 0x12, +0x1F, 0x0F, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x06, 0xCC, +0xE0, 0x44, 0x02, 0xF0, 0xEF, 0xB4, 0x02, 0x11, 0x12, 0x1E, 0xF6, 0x90, 0x06, 0xC8, 0xF0, 0x90, +0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC9, 0xF0, 0xEF, 0xB4, 0x03, 0x11, 0x12, 0x1E, 0xF6, +0x90, 0x06, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xCB, 0xF0, 0xEF, 0x64, +0x04, 0x70, 0x1F, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x07, 0x83, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x10, +0xF0, 0x80, 0x04, 0xE0, 0x54, 0x6F, 0xF0, 0xEF, 0x30, 0xE1, 0x07, 0x90, 0x07, 0x83, 0xE0, 0x44, +0x80, 0xF0, 0x22, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x12, +0x1E, 0xF6, 0x90, 0x92, 0x6B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6C, 0xF0, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6D, 0xF0, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, +0x12, 0x73, 0x59, 0xEF, 0xB4, 0x02, 0x03, 0x43, 0x14, 0x01, 0x22, 0x90, 0x93, 0x84, 0x12, 0x43, +0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, +0x17, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, +0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x18, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, +0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, +0x01, 0x7F, 0x19, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, +0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1A, 0x02, 0x73, 0x5D, 0x90, +0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, +0xA8, 0x7D, 0x01, 0x7F, 0x1B, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, +0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1C, 0x02, 0x73, +0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, +0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x1D, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, +0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1E, +0x02, 0x73, 0x5D, 0x12, 0x1E, 0xF6, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x1F, 0xB6, +0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0x0B, 0x12, 0x43, 0x84, 0xEC, 0x54, +0x03, 0xFC, 0x12, 0x43, 0x59, 0x90, 0x93, 0x07, 0x02, 0x1F, 0xC9, 0x90, 0x93, 0x84, 0x12, 0x43, +0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, +0x1F, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, +0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x20, 0x02, 0x73, 0x5D, 0x12, 0x1E, 0xF6, +0xFF, 0x54, 0x01, 0x90, 0x01, 0xBC, 0xF0, 0xEF, 0x30, 0xE0, 0x5C, 0x90, 0xFD, 0x58, 0xE0, 0x20, +0xE0, 0x4E, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, 0x00, 0x01, 0x12, +0x1F, 0x0F, 0x90, 0xFD, 0x52, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x53, 0xF0, +0xA3, 0xE4, 0xF0, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x90, 0xFD, 0x55, 0x30, 0xE0, 0x05, 0x74, 0xA0, +0xF0, 0x80, 0x03, 0x74, 0xC0, 0xF0, 0x90, 0xFD, 0x56, 0x74, 0x10, 0xF0, 0xA3, 0x74, 0x80, 0xF0, +0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, +0x90, 0x01, 0xBD, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0xE4, 0xFC, 0x74, 0x20, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x93, 0x84, 0xEF, +0xF0, 0xEE, 0xF9, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, +0x90, 0xFD, 0x10, 0xF0, 0xEC, 0xC3, 0x99, 0x50, 0x43, 0xEC, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x02, +0xE4, 0xFD, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x07, 0xAF, 0x05, 0x31, 0xA4, 0x0D, 0x80, 0xF3, 0x0C, +0x90, 0xFD, 0x10, 0xE0, 0x04, 0xF0, 0xEC, 0xB5, 0x01, 0xDA, 0xE4, 0xFD, 0xED, 0x75, 0xF0, 0x08, +0xA4, 0xFF, 0x90, 0x93, 0x84, 0xE0, 0xFB, 0xC3, 0xEF, 0x9B, 0x74, 0x80, 0xF8, 0x65, 0xF0, 0x98, +0x50, 0x07, 0xAF, 0x05, 0x31, 0xA4, 0x0D, 0x80, 0xE3, 0x0C, 0x80, 0xB8, 0x90, 0x00, 0x81, 0xE0, +0x44, 0x80, 0xFD, 0x7F, 0x81, 0x12, 0x54, 0x1B, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0xE0, 0x04, +0xF0, 0x80, 0xF1, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x51, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x52, 0xF0, 0xEF, 0x75, 0xF0, 0x08, +0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x53, 0xF0, 0xEF, +0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, +0x54, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x90, 0xFD, 0x55, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x56, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, +0x12, 0x1E, 0xF6, 0x90, 0xFE, 0x10, 0x60, 0x05, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xE0, 0x54, 0xFE, +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x88, 0x12, 0x43, 0xC8, 0x12, +0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, +0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, +0x15, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x12, +0x1E, 0xF6, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, +0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x15, +0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x01, 0xFE, 0x90, +0x93, 0x18, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, +0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFB, +0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, +0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x80, 0xFF, 0x90, +0x93, 0x18, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, +0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, +0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x19, 0xE0, +0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, +0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, +0x07, 0xB1, 0xCC, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x88, 0x12, 0x43, 0xA8, 0x12, 0x1E, +0xF6, 0x20, 0xE0, 0x02, 0x81, 0xE7, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x25, 0xF0, +0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x16, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, +0x90, 0x93, 0x16, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x17, 0xF0, 0x80, 0x48, +0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, +0x90, 0x93, 0x16, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, +0x16, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, +0xEF, 0xC3, 0x94, 0x03, 0x90, 0x93, 0x17, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, +0x80, 0x06, 0x90, 0x93, 0x17, 0x74, 0x2A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, +0x03, 0x30, 0xE0, 0x3D, 0x90, 0x93, 0x16, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x1E, 0xF0, +0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x20, +0xF0, 0x90, 0x93, 0x16, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x21, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0xC3, +0x13, 0x90, 0x93, 0x22, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, +0xAD, 0xE4, 0x90, 0x93, 0x11, 0xF0, 0x90, 0x93, 0x88, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, +0x1F, 0x0F, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x14, 0x12, 0x1E, 0xF6, 0x13, 0x13, 0x13, +0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x80, 0x02, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, +0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x18, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, +0x30, 0xE0, 0x03, 0x75, 0x64, 0x04, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, +0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x27, +0x74, 0x01, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x93, 0x27, 0x74, +0x04, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x93, 0x27, 0x74, 0x02, +0xF0, 0x80, 0x0D, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x07, 0x06, 0x90, 0x93, 0x27, 0x74, 0x05, 0xF0, +0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x80, 0x63, 0x90, 0x93, 0x88, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, +0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x93, 0x84, 0x30, 0xE0, 0x09, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x03, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0xD1, 0xA1, 0x90, 0x00, +0x40, 0x74, 0x20, 0xF0, 0x90, 0x93, 0x88, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, +0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, +0x74, 0x01, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x84, 0xB1, 0x82, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, +0xF0, 0xE4, 0x90, 0x93, 0x26, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x09, 0x90, 0x93, 0x04, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x5E, +0x46, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x5E, 0x67, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x7F, 0x70, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x54, 0xFC, +0xFF, 0x90, 0x01, 0xE8, 0xF0, 0xEE, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, +0x90, 0x01, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xED, 0xF0, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEE, 0xF0, 0x12, 0x1E, 0xF6, 0x90, 0x01, 0xEF, 0xF0, 0x90, +0x01, 0xEB, 0x74, 0x40, 0xF0, 0xD1, 0x4C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xEC, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xF0, +0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, +0x00, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x4B, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, +0x90, 0x93, 0x3E, 0xE0, 0x60, 0x14, 0x12, 0x51, 0xBB, 0xBF, 0x01, 0x0B, 0x90, 0x93, 0x15, 0xE0, +0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x2D, 0xE0, 0x20, 0xE0, +0x23, 0x90, 0x93, 0x48, 0xE0, 0x60, 0x1D, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x5C, 0xE0, +0x60, 0x12, 0x90, 0x93, 0xF0, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7B, 0x01, 0x7A, 0x93, +0x79, 0xF0, 0xB1, 0x82, 0x12, 0x54, 0x5C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x94, 0x40, +0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, 0x60, 0x43, 0xC3, 0x90, 0x94, 0x41, 0xE0, +0x94, 0x88, 0x90, 0x94, 0x40, 0xE0, 0x94, 0x13, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, +0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x40, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, +0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x94, 0x41, 0xE0, 0x94, 0x64, 0x90, 0x94, 0x40, 0xE0, +0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, +0x22, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, +0xE4, 0x90, 0x93, 0x26, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, +0xFB, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, +0x7F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, +0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, +0xF0, 0xA3, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, +0x28, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, +0x54, 0xDF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFE, +0xF0, 0xE4, 0x90, 0x93, 0x23, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x29, 0xF0, 0xA3, 0xF0, 0x90, 0x93, +0x1C, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xEF, 0xF0, +0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, +0x54, 0xE1, 0xF0, 0xE4, 0x90, 0x93, 0x36, 0xF0, 0x22, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFE, 0xF0, +0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, +0x1F, 0xD5, 0x20, 0x08, 0x30, 0x70, 0x90, 0x93, 0x0B, 0x12, 0x1F, 0xD5, 0xC0, 0x08, 0x30, 0x70, +0xE4, 0x90, 0x93, 0x11, 0xF0, 0xA3, 0xF0, 0x43, 0xE8, 0x04, 0x90, 0xFD, 0x68, 0x74, 0x02, 0xF0, +0x90, 0x04, 0x26, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x07, 0x83, 0xE4, 0xF0, 0x90, 0x07, 0x78, 0x74, +0x03, 0xF0, 0x90, 0x04, 0x64, 0xE4, 0xF0, 0x90, 0x00, 0x40, 0x74, 0x20, 0xF0, 0xD1, 0xA1, 0x90, +0x93, 0x2C, 0x74, 0x01, 0xF0, 0x7D, 0x04, 0x7F, 0x02, 0x02, 0x3A, 0xAD, 0x90, 0x93, 0x84, 0x12, +0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, +0x7F, 0x24, 0x02, 0x73, 0x5D, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x1A, 0xE0, +0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, +0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, +0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x1B, 0xF0, 0x22, +0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, +0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x26, 0x02, 0x73, 0x5D, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xB2, 0xF0, +0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, +0xB1, 0xF0, 0x22, 0x90, 0x93, 0xE4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xE8, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x00, 0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xE8, 0x12, 0x43, 0x90, 0xD3, +0x12, 0x43, 0x73, 0x50, 0x41, 0x90, 0x93, 0xE8, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xE4, +0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, +0x7B, 0x01, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, 0x1B, 0x90, 0x93, 0xE8, 0x12, 0x43, +0x84, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, +0xE8, 0x12, 0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xE8, 0x02, 0x43, 0x84, 0x90, 0x93, 0xB6, 0x12, +0x1F, 0xC9, 0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xBA, 0x12, 0x43, 0x90, 0xC3, 0x12, +0x43, 0x73, 0x90, 0x93, 0xB6, 0x60, 0x67, 0x12, 0x43, 0x84, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xC2, +0x12, 0x1F, 0xC9, 0x90, 0x93, 0xBA, 0x12, 0x43, 0x84, 0x11, 0x43, 0x90, 0x93, 0xC6, 0x12, 0x1F, +0xC9, 0x90, 0x93, 0xBA, 0x12, 0x43, 0x84, 0x12, 0x43, 0x66, 0x90, 0x93, 0xC2, 0x12, 0x43, 0x90, +0x12, 0x43, 0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xC6, 0x12, 0x43, +0x84, 0xA9, 0x07, 0x90, 0x93, 0xBE, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, +0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, 0x90, 0x93, 0xCA, 0x12, 0x1F, 0xC9, 0x90, +0x93, 0xB6, 0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xCA, 0x80, 0x0A, 0x12, 0x43, +0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xBE, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, +0xC9, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x93, 0xF4, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xF8, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x00, 0x00, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x54, 0x63, 0x12, 0x54, 0x5C, +0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, +0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4B, 0xE0, 0x60, 0x06, 0x90, +0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x57, 0xF0, +0xFF, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xF4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF4, 0x12, +0x43, 0x84, 0xEC, 0x54, 0xFD, 0xFC, 0x90, 0x93, 0xF4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF4, 0x12, +0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, +0x93, 0x48, 0xE0, 0x60, 0x24, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x13, +0x90, 0x93, 0xF8, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xF8, +0x12, 0x95, 0x82, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x52, 0xE0, 0x60, 0x02, 0xE4, +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x48, +0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x47, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, +0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x63, 0x90, +0x94, 0x48, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, +0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4C, 0x90, 0x94, +0x48, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, +0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x63, 0x90, 0x94, 0x48, +0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, +0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, +0x93, 0x84, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x94, 0x38, 0xE0, 0x54, +0xFE, 0x4F, 0xF0, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x44, 0xFE, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, +0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x94, +0x39, 0xF0, 0x22, 0xE4, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x6B, 0x12, 0x73, 0x59, 0xEF, 0xB4, 0x02, +0x14, 0x90, 0x94, 0x44, 0xE0, 0x64, 0x04, 0x60, 0x07, 0x43, 0x14, 0x01, 0xE0, 0x04, 0xF0, 0x22, +0xE4, 0x90, 0x94, 0x44, 0xF0, 0x22, 0xAD, 0x07, 0x90, 0x93, 0xFC, 0xE0, 0x54, 0xF0, 0x44, 0x0C, +0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0xFE, 0xF0, 0x90, 0xFD, 0x63, 0xE0, +0x90, 0x93, 0xFF, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x94, 0x00, 0xF0, 0x90, 0xFD, 0x65, 0xE0, +0x90, 0x94, 0x01, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x94, 0x02, 0xF0, 0x90, 0xFD, 0x67, 0xE0, +0x90, 0x94, 0x03, 0xF0, 0xED, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0xFC, 0xE0, 0x54, 0x0F, 0x44, 0x20, +0xF0, 0x80, 0x3C, 0xED, 0xB4, 0x04, 0x0B, 0x90, 0x93, 0xFC, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, +0x80, 0x2D, 0xED, 0xF4, 0x70, 0x29, 0x90, 0x93, 0xFC, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x90, +0x93, 0x2C, 0xE0, 0x60, 0x08, 0x90, 0x93, 0xFE, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, +0xFE, 0xF0, 0xE4, 0x90, 0x93, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, +0x01, 0x7A, 0x93, 0x79, 0xFE, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0xFC, 0x02, +0x55, 0x2C, 0xAD, 0x07, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0xF0, 0x44, 0x0E, 0xF0, 0x54, 0x0F, 0xF0, +0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0x71, 0xF0, +0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x73, 0xF0, +0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0x75, 0xF0, +0xED, 0xB4, 0x01, 0x11, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x6F, +0x74, 0x01, 0xF0, 0x80, 0x13, 0xED, 0xB4, 0x02, 0x0F, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0x0F, 0x44, +0x70, 0xF0, 0x90, 0x93, 0x6F, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x6D, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, +0x60, 0x13, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6F, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, +0x79, 0x6D, 0x12, 0x55, 0x2C, 0x22, 0x90, 0x93, 0x48, 0xE0, 0x60, 0x27, 0x90, 0x93, 0x4B, 0xE0, +0x70, 0x21, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, +0x03, 0xF0, 0x22, 0x90, 0x93, 0x45, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, 0xF0, 0x22, +0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, +0xA1, 0xFC, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x01, 0x70, 0x39, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, +0x06, 0x90, 0x94, 0x45, 0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x29, +0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x45, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFF, 0x90, 0x93, 0x29, +0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0xE7, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, 0x27, +0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x04, 0x70, 0x3A, 0x90, 0x06, 0x92, 0xE0, 0x20, +0xE2, 0x06, 0x90, 0x94, 0x45, 0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, +0x29, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x45, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x90, 0x93, +0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0xE7, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, +0x27, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xA1, 0xAB, 0x90, +0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x27, +0x30, 0xE0, 0x4E, 0xA1, 0xF9, 0x90, 0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, +0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, +0x02, 0xA1, 0xBA, 0x90, 0x93, 0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, +0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, +0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x90, 0x93, 0x27, 0x40, 0x02, 0xA1, +0xF9, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x27, +0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x2A, 0xE0, 0xFF, +0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, +0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, +0x94, 0x80, 0x40, 0x58, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, +0x07, 0x70, 0x49, 0x90, 0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0x93, 0x27, 0x80, 0x3A, 0x90, +0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, +0xF0, 0x90, 0x93, 0x27, 0x80, 0x23, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, +0x27, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, +0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x64, 0x01, +0x70, 0x3C, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x90, 0x07, +0x78, 0x74, 0x0D, 0xF0, 0x22, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xE0, +0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x24, 0x80, 0x0E, 0x90, 0x93, 0x18, 0xE0, +0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x02, 0x80, 0x14, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, +0x19, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x03, +0xF0, 0x22, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x5E, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x20, +0xE0, 0x02, 0xC1, 0xF8, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2A, +0xE4, 0xF5, 0x48, 0x90, 0x93, 0x21, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, +0x12, 0x39, 0x77, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0xE4, +0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x5E, +0xE0, 0xFF, 0x90, 0x93, 0x16, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, +0x90, 0x93, 0x26, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, +0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, +0x12, 0x51, 0x48, 0xE4, 0x90, 0x94, 0x45, 0xF0, 0x22, 0x00, 0xAA, 0x13 +}; + + +const u8 Rtl8723SFwUMCBCutImgArrayWithoutBT[Rtl8723SUMCBCutImgArrayWithoutBTLength] = { +0x02, 0x23, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x02, 0x01, 0x10, 0x06, 0xE0, 0x4A, 0x01, 0x00, +0x03, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4A, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x59, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x61, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x61, 0xDA, 0x00, 0x00, +0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, 0x00, 0x04, 0x06, 0x05, 0x04, 0x02, +0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, 0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, +0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, +0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x18, 0x22, 0x21, 0x20, 0x18, +0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, 0x20, 0x08, 0x00, 0x20, 0x22, 0x21, +0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, 0x22, 0x20, 0x18, 0x08, 0x00, 0x20, +0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, 0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, +0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, 0x10, 0x00, 0x00, 0x30, 0x31, 0x20, +0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, +0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, +0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, +0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, +0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, +0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, +0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, +0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, +0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, +0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, +0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, +0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, +0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, +0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, 0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, +0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, +0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, +0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, 0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, +0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, +0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, +0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, +0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, +0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, +0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, +0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, +0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, +0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, +0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, +0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, +0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, +0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, +0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, +0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, +0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, +0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, +0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, +0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, +0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, +0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, +0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, +0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, +0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, +0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, +0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, +0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, +0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, +0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, +0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, +0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, +0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0x90, 0x93, 0x07, 0xF0, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xDD, +0x90, 0x93, 0x51, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x60, +0x03, 0x02, 0x44, 0xDD, 0x02, 0x44, 0xDA, 0x90, 0x93, 0x38, 0xE0, 0x04, 0xF0, 0x53, 0x66, 0xEF, +0x90, 0x93, 0x4F, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x3A, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x0F, 0xB5, 0x07, +0x0A, 0x90, 0x93, 0x30, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, 0x90, 0x93, 0x2D, 0xE0, 0xC4, +0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x4F, 0xE0, 0xB5, +0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x2D, +0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x07, 0x74, 0x5A, 0xF0, +0x90, 0x93, 0x07, 0xE0, 0xFF, 0x90, 0x93, 0x3F, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, +0x38, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x0D, 0xE5, 0x62, 0xB4, +0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x51, 0x9C, 0x22, 0xEF, 0x60, +0x0F, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, +0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x02, +0x55, 0xE5, 0x22, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0xA3, 0x12, +0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0xAB, 0xE5, 0x62, 0x64, +0x01, 0x60, 0x03, 0x02, 0x46, 0xAB, 0xE5, 0x65, 0x14, 0x60, 0x29, 0x24, 0xFD, 0x60, 0x25, 0x24, +0x02, 0x24, 0xFB, 0x50, 0x02, 0x80, 0x23, 0x90, 0x93, 0x37, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, +0xA3, 0xE0, 0x60, 0x16, 0x90, 0x93, 0x37, 0xE0, 0x70, 0x0A, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x93, +0x37, 0xF0, 0x80, 0x00, 0x90, 0x93, 0x01, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, +0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x91, +0xEF, 0x70, 0x04, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x93, 0x01, 0xE0, 0x70, 0x03, 0x02, 0x46, 0x9B, +0x43, 0x66, 0x10, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, +0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, +0x93, 0x2E, 0x80, 0x2D, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, +0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, +0x98, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x31, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, +0x2E, 0xE0, 0x80, 0x2D, 0x90, 0x93, 0x4F, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, +0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, +0x48, 0x90, 0x93, 0x4F, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x04, +0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, +0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, +0x12, 0x48, 0xF4, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x93, 0x2B, 0xE0, 0xFF, 0x90, 0x93, +0x4F, 0xE0, 0xD3, 0x9F, 0x40, 0x08, 0x90, 0x93, 0x2C, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, +0x93, 0x2C, 0xF0, 0x90, 0x93, 0x4F, 0xE0, 0x90, 0x93, 0x2B, 0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, +0x40, 0x46, 0xE4, 0xF0, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x4D, 0xE0, 0x70, 0x03, +0x12, 0x4F, 0x63, 0x90, 0x93, 0x50, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, 0x48, 0xF0, 0xE4, 0xF5, +0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, +0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x4C, 0x80, 0x09, 0x43, 0x66, 0x01, 0x12, +0x51, 0x2B, 0x90, 0x93, 0x48, 0x74, 0x01, 0xF0, 0x12, 0x51, 0x4C, 0x90, 0x93, 0x98, 0xE0, 0x30, +0xE0, 0x09, 0x12, 0x67, 0x4A, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x07, +0xF0, 0xA3, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x47, 0xA2, +0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x47, 0xA2, 0x90, 0x93, 0x07, 0x04, 0xF0, 0xE4, 0x90, +0x93, 0x37, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, +0x90, 0x93, 0x07, 0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x04, 0x90, 0x93, 0x07, 0xF0, +0x90, 0x93, 0x07, 0xE0, 0x70, 0x03, 0x02, 0x47, 0xA2, 0x43, 0x66, 0x10, 0x90, 0x93, 0x2D, 0xE0, +0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x32, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, +0xE0, 0xD3, 0x9F, 0x50, 0x09, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x2E, 0xE0, 0x80, 0x4A, 0xE4, 0xF5, +0x48, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, +0x03, 0xA4, 0xFF, 0x90, 0x93, 0x2E, 0xE0, 0x04, 0x2F, 0x80, 0x2D, 0x90, 0x93, 0x4F, 0xE0, 0x64, +0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, +0x46, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0x14, 0x75, 0xF0, 0x03, +0xA4, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, +0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x12, 0x51, 0x4C, 0x90, 0x05, 0x22, +0xE4, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x09, 0x12, 0x67, 0x4A, 0x90, 0x05, 0x22, 0x74, +0xFF, 0xF0, 0x22, 0xE4, 0xF5, 0x66, 0xF5, 0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, +0x50, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x93, 0x49, 0xF0, 0x90, 0x93, 0x4E, 0x04, 0xF0, 0x90, +0x93, 0x37, 0xF0, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x93, 0x46, 0x74, +0x05, 0xF0, 0xE4, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x93, 0x44, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, +0x93, 0x3F, 0xF0, 0x90, 0x93, 0x42, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x3C, 0x74, 0x14, 0xF0, 0x90, +0x93, 0x47, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x93, 0x33, 0xF0, 0x90, 0x93, +0x71, 0xF0, 0x90, 0x93, 0x43, 0xF0, 0x90, 0x93, 0x53, 0xF0, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x93, +0x34, 0xF0, 0x90, 0x93, 0x4D, 0xF0, 0x90, 0x93, 0x3E, 0xF0, 0x90, 0x93, 0x3B, 0xF0, 0x90, 0x93, +0x48, 0xF0, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x3D, 0xF0, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x93, +0x40, 0xF0, 0x90, 0x93, 0x70, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, +0x2D, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x93, 0x30, 0xF0, 0x22, 0x8E, 0x69, 0x8F, 0x6A, 0xAD, +0x6A, 0xAC, 0x69, 0xAF, 0x68, 0x12, 0x44, 0xDE, 0xAF, 0x6A, 0xAE, 0x69, 0x90, 0x04, 0x80, 0xE0, +0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, +0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, +0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, +0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, +0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, +0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, +0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, +0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x6C, 0x8D, 0x6D, 0xE5, +0x6C, 0x54, 0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x6C, 0x30, 0xE2, 0x30, +0xE5, 0x63, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0x69, 0xE5, 0x63, 0x30, 0xE3, 0x10, 0xE5, +0x6C, 0x20, 0xE3, 0x0B, 0x12, 0x4D, 0x9D, 0xEF, 0x60, 0x53, 0x12, 0x51, 0x05, 0x80, 0x4E, 0xE5, +0x63, 0x20, 0xE3, 0x49, 0xE5, 0x6C, 0x30, 0xE3, 0x44, 0xAF, 0x6D, 0x12, 0x50, 0x8A, 0x80, 0x3D, +0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x6C, 0x20, 0xE3, 0x09, 0x12, 0x4D, 0x9D, +0xEF, 0x60, 0x2A, 0x12, 0x51, 0x05, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, 0xE5, 0x6C, +0x20, 0xE2, 0x09, 0x12, 0x4B, 0x16, 0xEF, 0x60, 0x14, 0x12, 0x50, 0xB3, 0xE5, 0x63, 0x54, 0x0F, +0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4C, 0x72, 0xEF, 0x60, 0x03, 0x12, 0x51, 0xB0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x01, 0xF0, 0xE0, +0x54, 0xC0, 0x70, 0x11, 0x90, 0x93, 0x48, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, +0x12, 0x51, 0x9C, 0x80, 0x0F, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x4D, 0xE0, 0x70, +0x03, 0x12, 0x4F, 0x63, 0x90, 0x93, 0x01, 0xE0, 0x30, 0xE6, 0x15, 0x43, 0x66, 0x01, 0x90, 0x93, +0x50, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x51, 0x2B, 0x80, 0x0E, 0x12, 0x4F, 0x1D, 0x80, 0x09, +0x90, 0x93, 0x48, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x93, +0x01, 0xE0, 0x30, 0xE7, 0x23, 0x43, 0x66, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x42, 0xE0, 0xF5, +0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, +0xF0, 0x90, 0x93, 0x51, 0x74, 0x01, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, 0xEF, 0x64, 0x01, 0x70, +0x48, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, +0x01, 0x36, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, +0x3A, 0x3F, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x48, 0xF0, +0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x67, 0x4A, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, +0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B, 0xF0, 0xA3, +0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, +0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x06, +0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4E, 0x3E, 0xE5, 0x62, 0x20, 0xE0, 0x05, 0xE4, 0x90, 0x93, +0x39, 0xF0, 0x22, 0x02, 0x4A, 0xD1, 0x02, 0x52, 0xA5, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, +0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, +0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, +0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, +0x80, 0x90, 0x4F, 0xE3, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, +0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, +0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, +0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, +0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, +0xB9, 0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, +0x02, 0xF0, 0x80, 0x53, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, 0x01, 0xB9, +0x74, 0x04, 0xF0, 0x80, 0x42, 0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, +0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x28, 0x90, +0x93, 0x39, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, 0x93, 0x43, +0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, +0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, +0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, 0x64, 0x02, 0x60, 0x06, +0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, 0x37, 0xF0, 0x90, 0x06, +0xAA, 0xE0, 0x90, 0x93, 0x4E, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x70, 0x07, 0x90, 0x93, 0x4E, 0xE0, +0xFF, 0x80, 0x05, 0x90, 0x93, 0x37, 0xE0, 0xFF, 0x90, 0x93, 0x37, 0xEF, 0xF0, 0x90, 0x93, 0x39, +0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x05, +0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x53, +0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x49, +0x82, 0x22, 0x90, 0x93, 0x70, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, 0x90, 0x93, 0x70, +0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0x7D, 0x40, 0x7F, 0x93, 0x12, 0x53, 0xB6, 0x90, 0x00, +0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x28, 0xE0, 0x54, 0xFC, +0xFD, 0x7F, 0x28, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, +0x53, 0xB6, 0x7F, 0x01, 0x12, 0x4D, 0x45, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, 0xFD, 0xE4, 0xFF, +0x12, 0x53, 0xB6, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, 0x53, 0xB6, 0x90, +0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x53, 0xB6, 0x7F, 0x14, 0x7E, 0x00, 0x02, +0x3B, 0x09, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, +0x80, 0x54, 0xE5, 0x18, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x48, 0xE5, 0x64, +0x54, 0x0F, 0xD3, 0x94, 0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x37, 0x90, +0x02, 0x87, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x29, 0x90, 0x02, 0x86, +0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, 0x90, 0x93, 0x3A, 0xE0, +0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, +0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, +0x93, 0x21, 0x12, 0x43, 0xC8, 0x12, 0x51, 0xC3, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x12, 0x1E, +0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, 0x70, 0x44, +0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, +0xFD, 0xE4, 0xFF, 0x12, 0x4F, 0xA5, 0x80, 0x29, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x90, 0x00, +0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x4F, 0xA5, 0x1F, 0x80, 0x14, 0x90, 0x93, 0x21, +0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x4F, 0xA5, 0xE4, +0xFF, 0x12, 0x4A, 0x0C, 0x22, 0x8F, 0x70, 0xE4, 0x90, 0x93, 0xE3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, +0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x70, 0x60, 0x3E, 0xC3, 0x90, +0x93, 0xE4, 0xE0, 0x94, 0x88, 0x90, 0x93, 0xE3, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, +0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0xE3, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, +0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0xE4, 0xE0, 0x94, 0x32, 0x90, 0x93, 0xE3, +0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x12, 0x51, 0x83, +0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, 0x93, 0x4C, +0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x49, 0xE0, 0x60, +0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x04, +0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, +0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, +0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x20, 0x12, 0x53, 0xB6, 0x7F, 0xF4, 0x7E, 0x01, 0x12, +0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, 0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x53, 0xB6, 0x90, 0x00, +0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, 0x28, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, +0xFD, 0x7F, 0x08, 0x12, 0x53, 0xB6, 0xE4, 0xFF, 0x12, 0x4D, 0x45, 0x7F, 0x64, 0x7E, 0x00, 0x12, +0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, 0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x53, 0xB6, 0xE4, 0xFF, +0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, 0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, +0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, 0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, +0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, 0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, +0x45, 0xE0, 0x9D, 0x90, 0x93, 0x44, 0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, +0x90, 0x93, 0x44, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x8F, 0x68, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x6B, +0x74, 0xFF, 0xF0, 0x12, 0x8A, 0x65, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0x69, 0xE0, 0xFF, 0x7D, 0x01, +0x12, 0x58, 0x95, 0x12, 0x48, 0x5B, 0x90, 0x05, 0x22, 0xE5, 0x6B, 0xF0, 0x80, 0x0D, 0x90, 0x93, +0x69, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x95, 0x12, 0x48, 0x5B, 0x90, 0x04, 0x1F, 0x74, 0x20, +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x3D, 0x90, +0x93, 0x50, 0xE0, 0x60, 0x27, 0x12, 0x48, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, +0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, +0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x22, 0xE5, 0x63, 0x54, 0x0F, +0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x22, 0x90, 0x01, 0x5F, +0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, +0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, +0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x49, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, +0xC3, 0x94, 0x0C, 0x50, 0x0D, 0x12, 0x48, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x03, 0x12, +0x67, 0x4A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x4D, 0x74, 0x01, 0xF0, +0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xD3, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xD3, +0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x93, 0xD3, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xD3, +0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, 0x24, 0x02, 0x70, 0x32, +0x80, 0x0A, 0x90, 0x93, 0x4E, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x37, 0xF0, 0xE4, 0x90, 0x93, 0x53, +0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x47, 0xE0, 0x90, 0x93, 0x4E, 0xF0, 0x80, 0x05, 0x90, +0x93, 0x4E, 0xED, 0xF0, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x93, 0x37, 0xF0, 0x90, 0x93, 0x53, 0x74, +0x01, 0xF0, 0x22, 0x48, 0x93, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x93, +0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0x5E, 0x00, 0x41, 0x93, 0x6D, +0x00, 0x41, 0x93, 0xE9, 0x00, 0x41, 0x93, 0x2B, 0x00, 0x41, 0x93, 0x2C, 0x00, 0x41, 0x92, 0x69, +0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, 0x41, 0x93, 0xDF, 0x00, 0x00, 0x90, 0x01, +0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x93, +0x35, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, 0xFF, 0x74, 0x40, 0x7E, 0x00, +0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x90, 0x93, 0x4B, 0xF0, +0xEE, 0x90, 0x93, 0x4A, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x93, 0x6F, 0xE0, 0x90, 0x93, 0xD7, +0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0x6F, 0xE0, 0x90, 0x93, 0xD7, 0x60, 0x09, 0x12, 0x1F, 0xD5, +0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x01, 0x10, 0x7B, 0x01, 0x7A, +0x93, 0x79, 0xD7, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x56, 0x9D, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, +0xF0, 0xEF, 0x60, 0x0A, 0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x8B, 0x53, 0x63, +0xF0, 0x43, 0x63, 0x0C, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x07, 0x90, 0x05, 0x27, 0xE0, 0x54, +0x7F, 0xF0, 0x22, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, +0x8A, 0x65, 0xEF, 0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, +0x3A, 0x93, 0x12, 0x54, 0x14, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0xE5, 0x64, 0x30, 0xE6, +0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, +0x53, 0x64, 0xBF, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x83, 0xE0, 0x30, 0xE0, +0x03, 0x75, 0x64, 0x02, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, +0x05, 0x7F, 0x01, 0x12, 0x4E, 0x8B, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x90, 0x93, 0x98, 0xE0, +0x30, 0xE0, 0x07, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x3D, 0xE0, 0x70, +0x1A, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0x68, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, +0x95, 0x8E, 0x6E, 0x8F, 0x6F, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x3E, 0xE0, +0x60, 0x16, 0x90, 0x93, 0x41, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x3B, 0xE0, 0x90, 0x07, 0x78, 0x60, +0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0xEA, 0xEF, 0xF0, 0x12, 0x56, +0x14, 0x90, 0x93, 0xEA, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, +0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, +0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x98, 0xE0, +0x30, 0xE0, 0x05, 0xAF, 0x64, 0x02, 0x5F, 0x72, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, 0xF4, 0x22, +0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0x02, 0x12, 0x4D, 0xEF, 0x53, 0x63, 0xF0, 0x43, +0x63, 0x02, 0x22, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x38, 0xF0, 0xF5, 0x66, 0x22, 0x90, +0x02, 0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, +0x43, 0xF7, 0x51, 0xFA, 0x00, 0x40, 0x52, 0x22, 0x00, 0x80, 0x52, 0x4D, 0x01, 0x00, 0x52, 0x61, +0x02, 0x00, 0x52, 0x79, 0x04, 0x00, 0x00, 0x00, 0x52, 0x96, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, +0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, +0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0x80, 0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, +0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, +0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, +0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, +0x35, 0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, +0x2D, 0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, +0xFF, 0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, +0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1F, +0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x0C, 0xF0, 0xA3, 0xF0, 0x12, 0x60, 0xFB, 0x75, +0x8E, 0x02, 0x91, 0xE6, 0x12, 0x60, 0x52, 0x90, 0x93, 0x70, 0xEF, 0xF0, 0x12, 0x60, 0x65, 0x90, +0x93, 0x72, 0xEF, 0xF0, 0x12, 0x60, 0x71, 0x90, 0x93, 0x54, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, +0xF5, 0x18, 0xF5, 0x0D, 0xF5, 0x62, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, +0xF0, 0x12, 0x7E, 0x58, 0x12, 0x47, 0xA3, 0x12, 0x37, 0x1C, 0x7F, 0x03, 0x12, 0x88, 0x1B, 0x71, +0x8D, 0x12, 0x60, 0x16, 0x12, 0x60, 0x89, 0x12, 0x60, 0x9E, 0x12, 0x60, 0x34, 0x12, 0x45, 0x02, +0x12, 0x61, 0x03, 0x91, 0xCE, 0x90, 0x93, 0x0E, 0xE5, 0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, +0xE0, 0x44, 0x40, 0xF0, 0x71, 0xFE, 0x75, 0xE8, 0x03, 0x43, 0xA8, 0x85, 0xD2, 0xAF, 0x12, 0x82, +0xBB, 0x51, 0x9B, 0x12, 0x60, 0xA5, 0x90, 0x93, 0x0C, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xA5, 0x90, +0x01, 0xC4, 0xF0, 0x74, 0x52, 0xA3, 0xF0, 0xE5, 0x18, 0x30, 0xE4, 0x0A, 0xC2, 0xAF, 0x53, 0x18, +0xEF, 0xD2, 0xAF, 0x12, 0x67, 0x8F, 0xE5, 0x18, 0x30, 0xE6, 0x0A, 0xC2, 0xAF, 0x53, 0x18, 0xBF, +0xD2, 0xAF, 0x12, 0x76, 0x54, 0xE5, 0x18, 0x30, 0xE7, 0x0A, 0xC2, 0xAF, 0x53, 0x18, 0x7F, 0xD2, +0xAF, 0x12, 0x82, 0x61, 0xC2, 0xAF, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0xBF, 0x01, 0x0D, 0x90, 0x93, +0x3A, 0x74, 0x01, 0xF0, 0x31, 0x9C, 0xE4, 0x90, 0x93, 0x3A, 0xF0, 0xD2, 0xAF, 0x90, 0x01, 0xBD, +0xE5, 0x63, 0xF0, 0x90, 0x93, 0x50, 0xE0, 0x90, 0x01, 0xBC, 0xF0, 0x80, 0x99, 0x90, 0x01, 0x3C, +0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0xFD, 0x7F, 0x54, 0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x55, 0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x56, +0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, +0x83, 0x00, 0xED, 0xF0, 0x71, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0xFD, 0x7F, 0x50, 0x71, 0xB6, 0xE4, 0xFD, 0x7F, 0x51, 0x71, 0xB6, 0xE4, 0xFD, 0x7F, 0x52, 0x71, +0xB6, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xF0, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, +0x22, 0x74, 0xFF, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xB4, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xB8, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, +0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x71, 0xFE, 0x71, 0xF7, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, +0xF0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, +0x44, 0x20, 0xF0, 0x90, 0x93, 0x41, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, +0x93, 0x34, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x4D, 0xF0, 0xFF, 0x7E, 0x08, 0x12, 0x2C, 0x6E, +0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0xEC, 0x54, 0xFD, 0xFC, +0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, +0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x22, 0xE4, +0xFF, 0x11, 0x56, 0x90, 0x93, 0x52, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xB8, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB8, 0xD1, 0x99, 0x90, 0x07, 0x78, 0x74, 0x01, +0xF0, 0x90, 0x93, 0x48, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, +0xE0, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x93, 0xE2, 0xF0, 0x90, 0x93, 0xE0, 0xE0, 0x54, 0x7F, +0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x6C, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, +0x80, 0xFD, 0x7F, 0x80, 0x61, 0xB6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x8A, 0x65, 0xEF, +0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x91, 0x14, 0x90, 0x93, 0x9F, 0x74, 0x02, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x9F, 0xE0, 0x90, 0x93, 0xEB, 0xF0, +0x6F, 0x70, 0x02, 0xA1, 0xDC, 0xEF, 0x14, 0x60, 0x3B, 0x14, 0x60, 0x5F, 0x14, 0x70, 0x02, 0xA1, +0xB6, 0x24, 0x03, 0x60, 0x02, 0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x03, 0x04, 0xD1, 0xE4, +0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x02, 0x04, 0xD1, 0xFC, 0xA1, 0xDC, 0x90, 0x93, 0xEB, +0xE0, 0xB4, 0x04, 0x04, 0xF1, 0x00, 0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0x64, 0x01, 0x70, 0x7C, +0xD1, 0xE6, 0x80, 0x78, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x03, 0x04, 0xF1, 0x35, 0x80, 0x6C, +0xEF, 0xB4, 0x02, 0x04, 0xF1, 0x04, 0x80, 0x64, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x04, 0x04, +0xF1, 0x1A, 0x80, 0x58, 0xEF, 0x70, 0x55, 0xD1, 0x01, 0x80, 0x51, 0x90, 0x93, 0xEB, 0xE0, 0xB4, +0x03, 0x04, 0xF1, 0x25, 0x80, 0x46, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x01, 0x04, 0x91, 0xF6, 0x80, +0x3B, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x04, 0x04, 0xF1, 0x11, 0x80, 0x30, 0x90, 0x93, 0xEB, 0xE0, +0x70, 0x2A, 0xB1, 0xE1, 0x80, 0x26, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x01, 0x04, 0xB1, 0xE5, +0x80, 0x1A, 0xEF, 0xB4, 0x02, 0x04, 0xB1, 0xFD, 0x80, 0x12, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, +0x04, 0x05, 0x12, 0x44, 0xFF, 0x80, 0x05, 0xEF, 0x70, 0x02, 0xB1, 0xF9, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD1, 0x01, 0x81, 0xF6, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, +0xBF, 0xF0, 0x90, 0x93, 0x9F, 0x74, 0x03, 0xF0, 0x22, 0xD1, 0x01, 0x80, 0xE8, 0xD1, 0x14, 0x80, +0xE4, 0x90, 0x01, 0x3E, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, 0x90, 0x93, 0x9F, +0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xAC, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xB0, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, +0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x41, 0xE0, +0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x0A, 0x31, 0x83, +0xEF, 0x64, 0x01, 0x60, 0x03, 0x12, 0x4F, 0x63, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x1C, 0x7F, 0x01, +0x11, 0x56, 0x90, 0x93, 0x52, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xB0, 0x12, 0x1F, 0xD5, 0x00, 0x00, +0x03, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB0, 0xD1, 0x99, 0x71, 0xF7, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x90, 0x93, 0xEC, 0xEF, 0xF0, 0xD1, 0x14, 0x90, 0x93, 0xEC, 0xE0, 0x60, 0x05, 0x90, 0x05, +0x22, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x22, 0x7F, 0x70, 0x7E, 0x08, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, 0xEE, 0x44, 0xF0, 0xA3, +0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0x90, 0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEE, 0xF0, 0x12, +0x1E, 0xF6, 0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, 0x12, 0x88, 0x6C, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x35, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x3A, 0x3F, 0x90, 0x05, 0x27, +0xE4, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x93, 0x9F, 0xF0, 0x22, 0xF1, 0x04, 0x80, 0xE6, +0xF1, 0x1A, 0x80, 0xE2, 0xD1, 0x14, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x9F, 0x04, 0xF0, +0x22, 0x91, 0x14, 0x90, 0x93, 0x9F, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, +0x93, 0x9F, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x0E, 0x90, 0x93, +0x9F, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, +0xF0, 0x90, 0x93, 0x9F, 0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x93, 0xED, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x46, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, +0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x71, 0xFE, +0x90, 0x93, 0xED, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, +0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, +0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4B, 0x90, +0x93, 0xED, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, +0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, 0xF0, 0x71, 0xFE, 0x90, 0x93, 0xED, +0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, +0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, +0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x8B, 0x21, 0x8A, 0x22, 0x89, 0x23, 0x90, 0x93, 0xBC, 0x12, 0x43, 0xC8, 0xAB, 0x24, 0xAA, 0x25, +0xA9, 0x26, 0x90, 0x93, 0xBF, 0x12, 0x43, 0xC8, 0xAF, 0x27, 0x15, 0x27, 0xEF, 0x60, 0x1E, 0x90, +0x93, 0xBF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x93, 0xBC, +0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, 0x12, 0x42, 0x53, 0x80, 0xDB, 0xAB, 0x21, 0xAA, +0x22, 0xA9, 0x23, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x01, 0xC4, 0x74, 0x48, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, +0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, +0xC7, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x11, 0x48, 0xBF, 0x01, 0x0F, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x95, 0x90, 0x04, +0x1F, 0x74, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, +0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, +0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, +0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, +0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, +0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13, +0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x93, 0x01, +0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07, +0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3B, 0x90, 0x93, 0x01, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D, +0xF0, 0x79, 0x40, 0x90, 0x93, 0x01, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0, +0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0x5E, 0xF0, 0x22, 0x90, 0x93, 0x5E, 0xE0, 0x04, +0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0B, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x02, +0x11, 0x80, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, +0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, +0x90, 0x01, 0xC4, 0x74, 0x63, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28, +0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0, +0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x61, 0x57, 0x90, 0x01, 0x34, 0x74, 0x01, +0xF0, 0x85, 0xD1, 0x0E, 0x85, 0xD3, 0x10, 0x85, 0xD4, 0x11, 0x85, 0xD5, 0x12, 0x85, 0xD6, 0x13, +0x85, 0xD7, 0x14, 0x85, 0xD9, 0x15, 0x85, 0xD2, 0x0F, 0x75, 0x24, 0x00, 0x75, 0x25, 0x00, 0x75, +0x26, 0x0E, 0x75, 0x27, 0x08, 0xFB, 0x7A, 0x93, 0x79, 0x5F, 0x12, 0x57, 0xF9, 0x90, 0x93, 0x60, +0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x70, 0x02, +0x61, 0x08, 0x90, 0x93, 0x60, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, +0x61, 0x08, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, 0x93, 0x61, 0xE0, 0x54, 0x3F, 0xF5, 0x4E, 0x90, +0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, +0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xE5, 0x4E, 0xD3, 0x94, 0x04, 0x40, 0x03, +0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, +0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x63, 0xE0, 0x54, +0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, +0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, +0x60, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2F, 0x90, 0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, +0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, +0x12, 0x42, 0x87, 0x90, 0x93, 0x62, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, +0x67, 0xAF, 0x4D, 0x12, 0x71, 0x11, 0x80, 0x60, 0x90, 0x93, 0x60, 0xE0, 0xFF, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x53, 0x90, 0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, 0xFD, 0xE5, 0x4D, 0x25, +0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8D, 0xF0, 0x12, 0x42, 0x87, +0x90, 0x93, 0x62, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0xEE, 0x54, +0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, 0x12, 0x70, 0xAD, 0x80, 0x1B, 0x90, 0x01, 0x02, +0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, 0x0A, 0xE4, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, +0x46, 0x90, 0x93, 0x50, 0xE0, 0x60, 0x37, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, +0x04, 0xF0, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, +0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, +0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x80, 0x09, 0x12, 0x51, +0x83, 0xBF, 0x01, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0xF9, 0x90, 0x01, +0x34, 0x74, 0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, +0x0B, 0x75, 0x4F, 0x88, 0x75, 0x50, 0x0F, 0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, 0x75, +0x50, 0x08, 0x75, 0x51, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x16, 0x90, 0x04, 0x7E, +0xE0, 0x55, 0x51, 0xF5, 0x17, 0x65, 0x16, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x16, 0x75, 0xF0, 0x08, +0xA4, 0x25, 0x4F, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, +0x19, 0x2F, 0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x24, 0x00, 0x75, 0x25, 0x00, 0x75, +0x26, 0x19, 0x75, 0x27, 0x08, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x56, 0x12, 0x57, 0xF9, 0x90, 0x93, +0x56, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0x9F, 0xE5, 0x16, +0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, +0x16, 0x90, 0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x17, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, +0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, +0x18, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, +0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x53, +0xCB, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x53, 0xFE, 0x80, 0xFE, 0xE5, 0x2C, 0x30, +0xE6, 0x06, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x30, 0xE0, 0x52, 0x90, 0x93, 0x71, +0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x93, 0x6E, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, +0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x9E, 0xE0, +0x30, 0xE0, 0x0D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x06, 0x90, 0x93, 0xA0, 0x74, 0x01, 0xF0, +0x90, 0x93, 0x98, 0xE0, 0xFF, 0x30, 0xE0, 0x0D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x06, 0x90, +0x93, 0x9A, 0x74, 0x01, 0xF0, 0x12, 0x45, 0x09, 0xF1, 0xBF, 0x90, 0x93, 0x71, 0xE4, 0xF0, 0xE5, +0x2E, 0x30, 0xE1, 0x7D, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, +0x05, 0x61, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xF5, 0x0A, 0xEC, 0x3E, 0xF5, 0x09, 0x90, 0x05, 0x22, +0xE0, 0xB4, 0xFF, 0x06, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x01, +0xE4, 0xF0, 0x43, 0x18, 0x40, 0x11, 0xF5, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0C, 0xE4, 0xFF, +0xD1, 0x91, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x53, 0xE0, 0x60, 0x1D, +0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, +0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, +0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, +0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x7B, 0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x62, 0xE0, +0xFE, 0x90, 0x05, 0x61, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xF5, 0x0C, 0xEC, 0x3E, 0xF5, 0x0B, 0xD3, +0xE5, 0x0C, 0x95, 0x0A, 0xE5, 0x0B, 0x95, 0x09, 0x40, 0x06, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, +0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0D, 0x90, 0x93, 0x39, 0xE4, 0xF0, 0x90, 0x93, 0x99, 0xE0, +0x64, 0x06, 0x60, 0x3D, 0x12, 0x4B, 0x90, 0x90, 0x93, 0x53, 0xE0, 0x60, 0x34, 0x90, 0x93, 0x4E, +0xE0, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x05, 0x73, +0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, 0x01, 0x7F, +0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x37, 0xE0, 0x14, +0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x62, 0x64, 0x01, +0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, +0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x42, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, 0x90, +0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, 0x60, 0x1C, 0x90, 0x01, +0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x51, 0xE4, 0xF0, 0x53, 0x66, +0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2E, 0x30, 0xE5, 0x1F, 0x90, +0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x14, 0xE5, 0x65, 0x60, 0x10, 0x90, 0x93, +0x50, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x51, 0x2B, 0x80, 0x03, 0x12, 0x4F, 0x1D, 0xE5, 0x2E, +0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, +0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2F, +0x30, 0xE1, 0x18, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x08, +0x90, 0x93, 0x9D, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x12, 0x4E, 0xD6, 0x74, 0x63, 0x04, 0x90, 0x01, +0xC4, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, +0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, +0x32, 0x8F, 0x71, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, +0x93, 0x01, 0xE0, 0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, +0x00, 0x79, 0x19, 0x90, 0x93, 0xCB, 0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x01, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, 0xFF, +0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x92, +0x69, 0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, 0xFF, +0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0x12, 0x81, 0x51, 0xEF, 0x60, 0x72, 0x12, 0x82, 0x61, 0x90, 0x01, +0x3F, 0x74, 0x02, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6B, 0xF9, 0x74, +0x92, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xA8, 0x7E, 0x00, +0x7F, 0x02, 0x12, 0x1E, 0xD0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6D, 0xF9, +0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xCB, +0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xA8, 0x12, +0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x27, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x57, +0xF9, 0x90, 0x92, 0x6A, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xAE, 0x07, 0xE4, 0xFF, 0xD1, 0x91, 0xEF, 0x60, 0x19, 0x90, 0x93, 0x98, 0xE0, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0D, 0xAF, 0x06, 0x7D, 0x01, 0x12, 0x48, 0xF4, 0x12, 0x67, +0x4A, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x26, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x29, +0xE0, 0x54, 0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, 0x93, 0x26, 0x12, 0x43, +0xA8, 0x90, 0x93, 0xCB, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x29, 0xC1, 0xBE, 0x90, +0x93, 0xE0, 0xE0, 0x30, 0xE0, 0x2F, 0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x93, 0xDF, 0xE0, 0x04, +0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x93, 0xE2, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0xDF, 0xF0, +0x90, 0x93, 0xE2, 0xE0, 0xFF, 0x90, 0x93, 0xE1, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x8A, 0xA6, +0xE4, 0x90, 0x93, 0xE2, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, +0xEF, 0x30, 0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, +0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, +0x2B, 0x90, 0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, +0xE5, 0x2B, 0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, +0x43, 0x32, 0x20, 0x90, 0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, +0xF0, 0x22, 0x90, 0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, +0x02, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, 0x7F, 0x01, +0x22, 0x90, 0x93, 0x72, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, +0xFD, 0x7F, 0x33, 0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, +0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, +0x64, 0x74, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, +0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, 0x10, +0xE0, 0x94, 0x88, 0x90, 0x93, 0x0F, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, +0x80, 0xF0, 0x22, 0x90, 0x93, 0x0F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, +0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0x10, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x0F, 0xE0, 0x94, +0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, +0x01, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, +0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, +0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, +0x04, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, +0xC0, 0x06, 0xC0, 0x07, 0x7D, 0x33, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x61, 0xFF, 0xA3, 0xF0, +0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, +0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, +0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, +0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, +0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, +0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, +0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, +0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, +0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, +0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, +0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, 0x56, 0x00, 0x90, 0x01, 0xC4, 0x74, 0xDA, 0xF0, +0x74, 0x61, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, +0xE0, 0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, +0x37, 0xE5, 0x34, 0x30, 0xE0, 0x1A, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x98, 0xE0, +0x30, 0xE0, 0x0D, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0xE5, 0x34, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x44, 0x24, 0xE5, 0x34, +0x30, 0xE2, 0x36, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, +0x75, 0x48, 0x00, 0x90, 0x93, 0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, +0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, +0x08, 0x90, 0x93, 0x4C, 0xE4, 0xF0, 0x12, 0x51, 0x9C, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, +0x3C, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, +0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, +0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x49, 0xE4, +0xF0, 0x12, 0x51, 0x9C, 0xE5, 0x34, 0x30, 0xE4, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0xE5, +0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, 0x90, +0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, 0x64, +0xF0, 0x12, 0x50, 0xDC, 0x12, 0x51, 0x9C, 0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, 0x74, +0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x6D, +0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, +0x04, 0xF0, 0xE5, 0x36, 0x20, 0xE0, 0x02, 0x61, 0xAF, 0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0x90, +0x93, 0x9E, 0xE0, 0x30, 0xE0, 0x13, 0xA3, 0xE0, 0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x5E, +0x91, 0xEF, 0x60, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x11, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x5F, +0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x60, 0x3B, 0x91, 0x86, 0x90, 0x93, 0x99, 0xE0, 0xFF, 0x64, +0x06, 0x60, 0x30, 0xEF, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x04, +0xE4, 0xFF, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, +0x93, 0x99, 0xE0, 0xB4, 0x02, 0x04, 0x7F, 0x01, 0x91, 0xDA, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, +0xF4, 0xF1, 0x4A, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x75, 0x48, 0x00, 0x75, 0x49, 0x03, 0xE4, +0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0xE5, +0x36, 0x30, 0xE1, 0x3C, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0x30, 0xE0, +0x13, 0xA3, 0xE0, 0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x05, 0x7F, +0x02, 0x12, 0x55, 0x11, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x15, 0x12, 0x89, 0xF6, 0x90, 0x93, +0x99, 0xE0, 0x64, 0x06, 0x60, 0x0A, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x02, 0x91, 0xA8, +0xE5, 0x36, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xE5, 0x36, 0x30, 0xE4, 0x06, +0x90, 0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x04, +0xF0, 0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, 0x30, 0xE6, +0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, 0x3E, 0x74, +0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, 0x18, 0x80, +0xE5, 0x37, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x46, 0xAC, 0x90, 0x93, +0x4E, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x12, 0x5F, 0xBF, +0x74, 0xDA, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, +0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, +0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x98, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x30, 0xE0, 0x0A, 0xA3, 0xE0, 0x64, 0x06, 0x60, 0x04, 0x7F, 0x06, 0x91, 0xDA, 0x90, 0x93, 0x99, +0xE0, 0x64, 0x06, 0x60, 0x02, 0xF1, 0x29, 0x22, 0x90, 0x93, 0x39, 0xE0, 0x60, 0x16, 0x90, 0x93, +0x99, 0xE0, 0x70, 0x04, 0x7F, 0x05, 0x80, 0x1F, 0x90, 0x93, 0x99, 0xE0, 0x64, 0x01, 0x70, 0x19, +0x7F, 0x02, 0x80, 0x13, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x08, 0x90, +0x93, 0x99, 0xE0, 0x70, 0x04, 0x7F, 0x04, 0x91, 0xDA, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xC1, 0xAC, 0xEF, 0x12, 0x43, 0xD1, 0x65, +0x08, 0x00, 0x65, 0x43, 0x01, 0x65, 0x8A, 0x02, 0x65, 0xC5, 0x03, 0x65, 0xFE, 0x04, 0x66, 0x37, +0x05, 0x66, 0x73, 0x06, 0x00, 0x00, 0x66, 0xAC, 0xEE, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, +0x81, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xFF, 0xB4, 0x05, 0x04, 0xD1, 0xBB, 0xC1, 0xAC, 0xEF, +0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x06, +0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xD1, +0xF0, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, +0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, +0xD1, 0xE6, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, +0xC1, 0xAC, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xD1, 0xB1, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, +0x64, 0x02, 0x60, 0x02, 0xC1, 0xAC, 0xD1, 0xC5, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, +0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, +0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, 0xD1, 0xE6, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xFE, +0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, 0x80, 0x08, 0xEE, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0xD1, +0xB1, 0xF1, 0x1C, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, +0x81, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, +0x70, 0x04, 0xD1, 0xE6, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, +0xD1, 0xD0, 0x80, 0x06, 0xEE, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xF1, 0x05, 0xC1, 0xAC, 0x90, 0x93, +0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, 0xD1, 0xD0, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, +0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0x90, +0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0xF0, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, +0x02, 0xD1, 0xBB, 0xD1, 0xFB, 0x80, 0x75, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, +0xFF, 0xD1, 0xD0, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, +0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0xD1, +0xF0, 0x80, 0x0C, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x05, 0x7F, 0x01, 0x12, 0x56, 0x81, 0xF1, +0x0F, 0x80, 0x39, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, +0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, +0xD1, 0xE6, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x06, 0xE4, 0xFF, 0xD1, 0xB1, 0x80, +0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xF1, 0x36, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x12, 0x51, 0x69, 0x90, 0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x90, 0x93, 0x99, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x99, 0x04, 0xF0, 0x22, +0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, +0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x51, 0x05, 0x90, 0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, +0x7F, 0x01, 0x12, 0x50, 0x8A, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x22, 0x12, 0x54, 0x0E, 0x90, 0x93, +0x99, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x50, 0xB3, 0x90, 0x93, 0x99, 0x74, 0x03, 0xF0, 0x22, 0x90, +0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, +0xFF, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x93, 0x9D, 0xE0, 0xB4, 0x01, 0x05, +0xE4, 0xF0, 0x12, 0x4E, 0xD6, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x05, 0x22, +0x74, 0x6F, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x06, 0xF0, 0x22, 0x90, 0x93, 0x99, 0xE0, 0x64, 0x06, +0x60, 0x3C, 0xE5, 0x63, 0x54, 0x0F, 0x14, 0x60, 0x2E, 0x14, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x0E, +0x24, 0xF8, 0x70, 0x2A, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x90, 0x05, 0x22, 0xF0, 0x22, 0x90, 0x93, +0x99, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x99, 0x74, 0x03, 0xF0, +0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x0F, 0xF0, +0x90, 0x93, 0x0F, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x68, 0xDA, 0x90, 0x93, 0xE9, 0xE0, 0xFF, 0x74, +0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, +0xEF, 0x5D, 0x70, 0x03, 0x02, 0x68, 0xD3, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, +0xD0, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x75, 0x24, 0x01, 0x75, 0x25, 0x93, 0x75, +0x26, 0x10, 0x75, 0x27, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x11, 0x12, 0x57, 0xF9, 0x90, 0x93, +0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0xE9, 0x30, 0xE0, 0x59, 0xE0, +0x75, 0xF0, 0x02, 0x90, 0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x12, 0xF0, 0x90, 0x93, +0xE9, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x13, 0xF0, +0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, +0x14, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, +0x90, 0x93, 0x15, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, +0x9C, 0xE0, 0x90, 0x93, 0x16, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, +0x43, 0x9C, 0xE0, 0x90, 0x93, 0x12, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, +0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x13, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, +0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x14, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, +0x01, 0x7A, 0x93, 0x79, 0x12, 0x11, 0xDF, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x90, 0x93, 0xE9, 0xE0, +0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, +0x0F, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, +0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, +0x02, 0x67, 0xA0, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, +0x93, 0x17, 0x12, 0x43, 0xC8, 0xEF, 0x12, 0x43, 0xD1, 0x69, 0x2E, 0x01, 0x69, 0x26, 0x02, 0x69, +0x73, 0x03, 0x69, 0x7C, 0x05, 0x69, 0x85, 0x06, 0x69, 0xC8, 0x07, 0x69, 0x8D, 0x08, 0x69, 0x96, +0x0B, 0x69, 0x9F, 0x1B, 0x69, 0xA7, 0x1C, 0x69, 0x37, 0x2D, 0x69, 0x40, 0x2E, 0x69, 0xAF, 0x30, +0x69, 0x52, 0x34, 0x69, 0x49, 0x3B, 0x69, 0x5A, 0x47, 0x69, 0x6B, 0x48, 0x69, 0x63, 0x49, 0x69, +0xB8, 0x4B, 0x00, 0x00, 0x69, 0xC1, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xB9, 0x90, 0x93, +0x17, 0x12, 0x43, 0xA8, 0x02, 0x82, 0xC7, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x83, 0xA8, +0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x83, 0xF0, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, +0x84, 0x29, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xBF, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, +0x02, 0x84, 0x54, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xD5, 0x90, 0x93, 0x17, 0x12, 0x43, +0xA8, 0xE1, 0xCD, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x85, 0x14, 0x90, 0x93, 0x17, 0x12, +0x43, 0xA8, 0x02, 0x80, 0x54, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x80, 0x3C, 0x90, 0x93, 0x17, +0x12, 0x43, 0xA8, 0x02, 0x85, 0x5C, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x80, 0x80, 0x90, +0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xC5, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xA1, 0x90, +0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0xAB, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x88, +0x5A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, +0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0x90, 0x93, 0x1A, +0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, +0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x1F, 0x0F, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, 0x20, 0xF0, 0x90, +0x93, 0x1A, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAD, 0x82, 0xAC, +0x83, 0x90, 0x93, 0x21, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, +0xF9, 0x74, 0x8A, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1C, 0x12, +0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x23, 0x12, 0x43, +0xA8, 0xEF, 0x12, 0x42, 0x53, 0x90, 0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0xFF, 0x90, 0x93, 0x23, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x90, +0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x21, 0xE0, +0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0x8D, 0x82, 0x8C, +0x83, 0xA3, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0xFF, 0x24, 0xC2, 0xF5, +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFE, 0x75, 0xF0, 0x09, +0xEF, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8B, +0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, +0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x8F, 0x57, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, +0xE4, 0x34, 0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, 0x57, 0x75, 0xF0, 0x02, 0xA4, 0x24, +0x02, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0x75, 0xF0, 0x09, +0xE5, 0x57, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, 0x85, 0x83, 0x5D, 0x8F, 0x5E, 0xE5, +0x57, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0x75, 0x5F, 0x01, 0xF5, +0x60, 0x89, 0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x12, +0x43, 0xD1, 0x6B, 0x57, 0x00, 0x6B, 0x6C, 0x01, 0x6B, 0x81, 0x02, 0x6B, 0x96, 0x03, 0x6B, 0xBF, +0x04, 0x6B, 0xD4, 0x05, 0x6B, 0xE9, 0x06, 0x6C, 0x0F, 0x0C, 0x6C, 0x3C, 0x0D, 0x6C, 0x69, 0x0E, +0x6C, 0x96, 0x0F, 0x00, 0x00, 0x6C, 0xCA, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, 0x57, 0x25, 0xE0, +0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80, +0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, +0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, +0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, 0x81, 0xCA, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, +0x74, 0xF5, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, +0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, 0x57, 0x25, 0xE0, +0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x81, 0xCA, 0x90, +0x04, 0x47, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x46, 0xE0, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x45, 0xE0, +0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, 0x81, 0xC1, 0x90, 0x04, 0x4B, 0xE0, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4A, 0xE0, 0xAB, 0x5A, 0xAA, +0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x49, 0xE0, 0x85, 0x59, 0x82, +0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, 0xAB, 0x5A, 0xAA, +0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, +0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, +0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, +0x12, 0x42, 0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, +0x12, 0x42, 0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, +0x50, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, +0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, +0x12, 0x1E, 0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0xAB, 0x5A, 0xE5, +0x5C, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, +0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x5F, 0xD0, +0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xC0, 0x83, +0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, +0xD0, 0x83, 0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, +0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, +0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, +0xE0, 0x4E, 0x60, 0x4B, 0x90, 0x93, 0x26, 0x74, 0x0B, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, +0x94, 0x00, 0x50, 0x02, 0xC1, 0x0F, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, +0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x0A, 0x90, 0x93, 0x26, +0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x26, 0xE0, 0x14, 0xF0, 0x80, 0xBB, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, +0x4E, 0x60, 0x47, 0x90, 0x93, 0x26, 0x74, 0x0F, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, +0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, +0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x26, 0xE0, 0xA3, 0xF0, +0x80, 0x0D, 0x90, 0x93, 0x26, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, +0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x26, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, 0x10, +0x40, 0x02, 0xC1, 0xC8, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, +0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, 0x93, 0x26, 0xE0, 0x80, +0x63, 0x90, 0x93, 0x26, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, +0x26, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, +0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, +0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, +0x4E, 0x60, 0x08, 0x90, 0x93, 0x26, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, 0x93, 0x26, 0xE0, 0x04, +0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x28, 0xF0, 0x90, 0x93, 0x27, 0xE0, 0xFF, 0x75, 0xF0, 0x09, +0xE5, 0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, 0x90, 0x93, 0x28, 0xE0, 0xFE, 0x75, +0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xE5, 0x57, 0xC3, 0x94, +0x20, 0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, +0x9F, 0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, +0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x28, 0xE0, 0xA3, 0xF0, 0x80, 0x37, 0x80, 0x2D, 0x74, +0x27, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x27, 0xE0, +0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x29, 0xEE, 0xF0, 0x80, 0x17, 0x90, 0x93, 0x28, +0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x27, 0xE0, +0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, 0x29, 0xE0, 0xFD, 0xAF, 0x57, 0x12, 0x70, 0x63, 0x90, 0x93, +0x29, 0xE0, 0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, +0x90, 0x93, 0x27, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x03, 0xF0, +0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3, +0x94, 0x03, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x8A, 0x83, 0xF0, +0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x80, 0xC4, 0x13, +0x13, 0x13, 0x54, 0x01, 0xFD, 0xAF, 0x06, 0x21, 0xDD, 0x12, 0x1E, 0xF6, 0xF5, 0x62, 0x22, 0x90, +0x93, 0x1A, 0x02, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0x90, 0x89, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, +0x90, 0x93, 0x6F, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x60, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, +0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xCE, +0x12, 0x43, 0xC8, 0x90, 0x93, 0xD1, 0xE0, 0x54, 0xF0, 0x44, 0x06, 0xFF, 0xF0, 0xED, 0x54, 0x0F, +0xC4, 0x54, 0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x93, 0xCE, 0x12, 0x43, 0xA8, 0x90, +0x93, 0xCB, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xD1, 0x12, 0x5E, 0xBE, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, +0xF0, 0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, +0x54, 0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, +0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, +0x4D, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x0E, +0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, 0x2A, 0x74, 0x27, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0x8B, 0xEF, 0xF0, 0x24, +0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x8C, 0xF0, 0x7B, 0x01, 0x7A, +0x93, 0x79, 0x8B, 0x7D, 0x02, 0x12, 0x6F, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, +0x53, 0xE5, 0x53, 0x54, 0x1F, 0x90, 0x93, 0x03, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0x88, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x93, 0x04, 0x74, 0x01, 0xF0, 0xEB, 0xC3, +0x94, 0x01, 0x40, 0x02, 0x80, 0x3B, 0x90, 0x93, 0x01, 0xE0, 0x25, 0x55, 0xFF, 0xA3, 0xF0, 0xA3, +0xE0, 0x90, 0x41, 0x9E, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x13, 0x74, 0x01, 0x25, 0x52, 0xF5, +0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x01, 0x63, 0x90, 0x93, +0x02, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEF, 0xF0, +0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, +0x06, 0xF0, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, +0x93, 0x05, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, +0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x5D, +0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, +0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x25, +0xE0, 0x25, 0xE0, 0xFF, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, +0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x0D, +0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, 0x93, 0x06, +0xE0, 0xFF, 0x90, 0x93, 0x05, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, 0x05, 0xE0, +0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, +0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, +0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, +0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, +0x90, 0x93, 0x05, 0xE0, 0xFD, 0x11, 0x63, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, +0x12, 0x90, 0x04, 0x30, 0xE0, 0x70, 0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0x04, +0xCF, 0x04, 0xF0, 0x90, 0x93, 0x05, 0xE0, 0xFF, 0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, +0x13, 0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, +0x1F, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, +0x7F, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x22, 0xF0, +0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x24, 0xF0, 0x75, +0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x25, 0xF0, 0xEC, +0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, +0x93, 0x26, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, +0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x28, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, +0xC6, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, +0x90, 0x93, 0x25, 0xE0, 0x90, 0x93, 0x22, 0xF0, 0x90, 0x93, 0x1F, 0xF0, 0xED, 0x70, 0x02, 0x61, +0xA3, 0x90, 0x93, 0x23, 0xED, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x22, +0xE0, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0x14, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0x70, +0x02, 0x61, 0xA3, 0x90, 0x93, 0x22, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0x61, 0xA3, 0xE4, +0x90, 0x93, 0x21, 0xF0, 0xEF, 0x14, 0x90, 0x93, 0x20, 0xF0, 0x90, 0x93, 0x24, 0xE0, 0xFD, 0x90, +0x93, 0x20, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, +0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, +0xF9, 0xFF, 0x90, 0x93, 0x28, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, +0x20, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x26, 0xE0, 0x5E, 0xFE, 0xA3, +0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x93, 0x20, 0xE0, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x21, +0xE0, 0x04, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0x6F, 0x60, 0x08, 0x90, +0x93, 0x20, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, 0x93, 0x23, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, +0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x93, 0x20, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x93, 0x24, 0xE0, 0x90, +0x93, 0x1F, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, +0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x93, 0x1F, 0xE0, 0xFD, 0x11, 0x63, 0x90, 0x93, +0x1F, 0xE0, 0xFF, 0x22, 0xAD, 0x07, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x11, 0x74, +0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x1F, 0xF0, +0x90, 0x93, 0x1F, 0xE0, 0xF9, 0x54, 0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, +0x12, 0x43, 0x9C, 0xE0, 0xFF, 0x90, 0x93, 0x22, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, +0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x23, 0xCB, 0xF0, 0xA3, 0xEB, +0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, +0xE0, 0x90, 0x93, 0x25, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFE, 0x25, 0xE0, +0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, +0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, +0xF0, 0xEE, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0x51, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x74, 0x28, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x93, 0x21, 0xF0, 0x90, +0x93, 0x22, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xA1, 0x8B, 0xEE, +0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x23, 0xE0, 0x5E, 0xFE, +0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x21, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, +0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0xFF, 0x90, 0x93, 0x25, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x21, +0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x93, 0x24, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x93, 0x21, 0x74, 0x17, +0xF0, 0x90, 0x93, 0x21, 0xE0, 0xFF, 0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, +0x23, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x21, 0x74, 0x18, 0xF0, 0x90, 0x93, 0x21, 0xE0, 0x90, +0x93, 0x20, 0xF0, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x42, 0x90, 0x93, 0x21, 0xE0, 0x04, 0xF0, 0x81, +0xAF, 0x90, 0x93, 0x22, 0xE0, 0xFC, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, +0x8A, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x20, 0xE0, +0x44, 0x40, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x93, 0x20, 0xE0, 0xFF, +0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, +0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, +0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, +0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, +0x93, 0x20, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90, 0x93, 0x22, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x20, 0xEF, 0xF0, 0x90, 0x93, 0x1F, +0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, +0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, +0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, +0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, +0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, +0xF0, 0xAF, 0x05, 0x90, 0x93, 0x1F, 0xE0, 0x44, 0x80, 0xFD, 0x11, 0x63, 0x90, 0x93, 0x1F, 0xE0, +0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, 0x94, +0x40, 0x40, 0x03, 0x02, 0x7E, 0x57, 0xEF, 0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, +0x90, 0x89, 0x01, 0xE0, 0xFF, 0x90, 0x8F, 0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, +0x0F, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, +0x03, 0x02, 0x7E, 0x4E, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, +0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x7E, 0x4E, 0x90, +0x93, 0x0F, 0xE0, 0x94, 0x20, 0x40, 0x09, 0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x7E, 0x57, +0x90, 0x93, 0x0F, 0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, +0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, +0x87, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x93, 0x14, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, +0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, +0x93, 0x16, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, +0x13, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, +0x10, 0xF0, 0x80, 0x14, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, +0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x10, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, +0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, +0x90, 0x93, 0x19, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, +0x94, 0x05, 0x40, 0x03, 0x02, 0x79, 0xEC, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x90, 0x93, 0x11, 0xE0, +0x9F, 0x40, 0x13, 0x90, 0x93, 0x19, 0xE0, 0x90, 0x93, 0x11, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, +0x93, 0x10, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0x93, 0x11, 0xE0, 0xFF, 0x90, 0x41, 0x12, 0x93, 0xFE, +0x90, 0x93, 0x0F, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, +0x40, 0x06, 0xEF, 0x90, 0x40, 0xDA, 0x80, 0x07, 0x90, 0x93, 0x11, 0xE0, 0x90, 0x40, 0xF6, 0x93, +0x90, 0x93, 0x18, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x50, 0xF9, 0x74, +0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x8B, 0x57, 0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x0F, 0xE0, +0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, +0x93, 0x12, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, +0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x9D, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, +0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, +0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, +0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, +0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, +0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, +0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, +0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, +0x06, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, +0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, +0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, +0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, +0x58, 0xA9, 0x59, 0x90, 0x00, 0x05, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x14, 0xE0, +0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0xD3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, +0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0xF0, 0x80, 0x07, +0xE4, 0x90, 0x93, 0x12, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x12, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, +0x93, 0x0F, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x10, 0xE0, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, +0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, +0x21, 0xBB, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, +0xE0, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, +0x40, 0x03, 0xEF, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, +0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, +0xC3, 0x9E, 0x90, 0x93, 0x1A, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, +0x23, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, +0xD3, 0x94, 0x01, 0x40, 0x0F, 0x74, 0xC6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, +0x14, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, +0x83, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, +0x83, 0xE0, 0x60, 0x02, 0x81, 0xFC, 0x12, 0x73, 0xF4, 0x81, 0xFC, 0x90, 0x93, 0x10, 0xE0, 0x25, +0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, +0xFF, 0xC3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0x40, 0x02, 0x81, 0xFC, +0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x72, 0x29, 0x81, 0xFC, 0x90, 0x93, 0x0F, 0xE0, +0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, +0x61, 0xCA, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, +0x19, 0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, 0x11, +0x40, 0x2E, 0x80, 0x1F, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x11, 0xE0, +0xC3, 0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, +0x03, 0x40, 0x0D, 0x90, 0x8E, 0xC5, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, +0x90, 0x93, 0x0F, 0xE0, 0xFE, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, +0x93, 0x1E, 0xF0, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, +0x94, 0x30, 0x50, 0x0A, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x74, 0x67, 0x2F, 0x61, 0x75, 0x90, 0x8E, +0xC5, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x6A, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x06, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xEE, +0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, +0xE0, 0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x0F, +0xE0, 0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, +0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, +0x93, 0x0F, 0xE0, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, +0x11, 0xE0, 0x6F, 0x60, 0x56, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, +0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x93, 0x1E, 0x74, 0x05, 0xF0, 0x80, +0x11, 0xEF, 0xD3, 0x94, 0x39, 0x90, 0x93, 0x1E, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, +0x01, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, +0xE0, 0xFE, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, +0x0F, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x80, 0x2F, 0x90, 0x93, 0x0F, 0xE0, 0xFF, +0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x90, +0x93, 0x0F, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, +0x11, 0xE0, 0xFE, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, +0x83, 0xEE, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFE, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, +0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, +0x01, 0x11, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, +0x83, 0xE4, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFD, 0x81, 0xF9, 0xEC, 0x64, 0x06, 0x60, 0x02, 0x81, +0xFC, 0x90, 0x93, 0x12, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xDB, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, +0x14, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x1C, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, +0x93, 0x1E, 0xF0, 0xE4, 0x90, 0x93, 0x1B, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0xD3, 0x94, 0x04, +0x50, 0x47, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, +0xF0, 0x83, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xD6, 0x93, 0xFF, 0x7E, 0x00, +0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x1C, 0xE0, +0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0x50, +0x08, 0x90, 0x93, 0x1B, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x93, 0x1B, 0xE0, 0xC3, 0x13, 0xF0, +0x90, 0x93, 0x1E, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x93, 0x1B, 0xE0, 0x70, 0x5D, 0x90, 0x93, +0x1E, 0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0x70, 0x08, +0x90, 0x93, 0x1E, 0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x1E, 0x74, +0x01, 0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, 0x93, 0x1E, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, +0x1B, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x1E, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, +0x1E, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x17, +0xE0, 0x94, 0x03, 0x90, 0x93, 0x16, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x1E, 0xF0, +0xD3, 0x90, 0x93, 0x17, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x16, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, +0x90, 0x93, 0x1E, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFD, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC4, +0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xED, 0xF0, 0x12, 0x70, 0x23, 0x90, 0x93, 0x0F, 0xE0, +0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, +0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, +0x93, 0x0F, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, +0x16, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, +0x93, 0x0F, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, +0xFA, 0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, 0x50, 0x1C, 0x90, 0x93, 0x16, 0xE0, 0xFE, 0xA3, 0xE0, +0xFF, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, +0x12, 0x42, 0x87, 0x80, 0x14, 0x90, 0x93, 0x0F, 0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x25, 0xE0, +0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, +0xFF, 0x9D, 0xFB, 0x74, 0xFF, 0x9C, 0xFA, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, +0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x0F, 0xE0, 0x50, +0x13, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, +0x42, 0x87, 0x80, 0x10, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, +0xFF, 0xF0, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, +0x00, 0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, +0x1F, 0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x25, +0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, +0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, +0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, +0x0F, 0xE0, 0x04, 0xF0, 0x02, 0x76, 0x59, 0x22, 0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, +0xF0, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, +0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, +0x83, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, +0x90, 0x89, 0x01, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, +0x94, 0x40, 0x40, 0x03, 0x02, 0x80, 0x53, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, +0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, +0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, +0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, +0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, +0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8E, 0x04, 0xF0, 0x90, 0x41, 0x8C, 0x93, 0xFE, 0x74, +0x01, 0x93, 0xFF, 0x90, 0x41, 0x54, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, +0xFE, 0xEF, 0x13, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, +0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, +0x74, 0x01, 0xF0, 0x74, 0xC2, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, +0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, +0xF0, 0x09, 0xED, 0x90, 0x8A, 0x84, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, +0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, +0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x04, 0xF0, +0x02, 0x7E, 0x9A, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x90, 0x00, 0x02, +0x12, 0x1F, 0x0F, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, +0x22, 0xEF, 0xB4, 0x40, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, +0x94, 0x40, 0x40, 0x02, 0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, +0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, +0x1A, 0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, +0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x1C, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, +0x74, 0xFF, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, +0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x20, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, +0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x22, 0xF0, 0xEE, 0xA3, +0xF0, 0xA3, 0xEC, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x1A, 0x02, 0x5F, +0x97, 0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x93, 0xDB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0x93, 0xDB, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, +0xC3, 0x90, 0x93, 0xDE, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0xDD, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, +0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xDD, 0xE4, 0x75, 0xF0, 0x01, +0x12, 0x42, 0x87, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, 0x7F, 0x01, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x68, 0xE0, +0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x31, 0x51, 0xEF, 0x70, 0x02, 0x41, +0x5C, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x75, 0x27, 0x02, +0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x57, 0xF9, 0x90, 0x93, 0xC5, 0x12, 0x43, 0xA8, 0x8B, +0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, +0x54, 0x0F, 0xF5, 0x27, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0x12, 0x57, 0xF9, 0x90, 0x01, 0xAF, +0x74, 0xFF, 0xF0, 0x90, 0x93, 0x70, 0xE0, 0x64, 0x01, 0x70, 0x4A, 0x90, 0x93, 0xC2, 0x12, 0x43, +0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x75, 0x27, 0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x20, +0x12, 0x57, 0xF9, 0x90, 0x93, 0xC5, 0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, +0x93, 0xC2, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x27, 0x7B, 0x01, +0x7A, 0xFD, 0x79, 0x22, 0x12, 0x57, 0xF9, 0x90, 0x93, 0x54, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, +0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, +0x24, 0x6B, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, +0xF0, 0x0F, 0xA4, 0x24, 0x6D, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x90, 0x93, 0xC5, 0x12, 0x43, +0xC8, 0xD0, 0x01, 0xD0, 0x02, 0x31, 0x9F, 0x90, 0x92, 0x69, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, +0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, +0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, +0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, +0x1A, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, +0x1A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x50, 0xF0, 0x90, 0x00, +0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x33, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, +0x01, 0x90, 0x93, 0x34, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x3E, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x3B, 0xF0, 0xEF, 0x13, 0x13, +0x13, 0x54, 0x01, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, +0x01, 0x90, 0x93, 0x3D, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x40, 0xF0, 0xE0, 0x70, +0x38, 0x90, 0x93, 0x3E, 0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0x56, 0x90, 0x93, 0x1D, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0x56, 0x90, 0x93, 0x1D, 0x12, +0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x90, 0x93, 0x1D, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, +0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x34, 0xE0, 0x70, 0x03, 0x12, +0x4F, 0x63, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x4C, 0xDF, 0x90, 0x93, 0x50, 0xE0, 0x90, +0x01, 0xE6, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, +0xE0, 0x25, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x3F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, +0x93, 0x42, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x00, 0x03, 0x12, +0x1F, 0x0F, 0x90, 0x93, 0x47, 0xF0, 0x22, 0x90, 0x93, 0x3F, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x42, +0x74, 0x05, 0xF0, 0x90, 0x93, 0x3C, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x47, 0x74, 0x05, 0xF0, 0x22, +0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x46, 0xF0, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x44, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, +0x93, 0x46, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x44, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, +0x44, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x43, 0xF0, +0x60, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, +0x93, 0x4D, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x63, 0x12, 0x51, 0x4C, 0x90, 0x93, 0x43, 0xE0, 0x90, +0x01, 0xE7, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x2D, 0xE0, 0x54, +0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xFF, 0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, +0x70, 0xFF, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x8F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, +0x90, 0x93, 0x2F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x30, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, +0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xD3, 0x94, 0x20, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, +0x01, 0xF0, 0x80, 0x57, 0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x02, 0xF0, +0x80, 0x49, 0xEF, 0xD3, 0x94, 0x60, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x03, 0xF0, 0x80, 0x3B, +0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, +0x94, 0xA0, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, +0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x06, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, +0x2E, 0x50, 0x05, 0x74, 0x07, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x93, 0x2E, 0xE0, 0x90, +0x93, 0x32, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, +0x2E, 0x90, 0x93, 0x67, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, +0x68, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x69, 0xF0, 0x90, +0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x6A, 0xF0, 0x90, 0x00, 0x04, 0x12, +0x1F, 0x0F, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x6B, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xC8, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x12, 0x1E, +0xF6, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xC1, 0xB6, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, +0xF6, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0x93, 0x9E, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, +0x01, 0xFF, 0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x08, 0xFD, 0xEF, +0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x93, 0x9E, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, +0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0x93, +0x9E, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xC1, 0xA2, +0x90, 0x93, 0x1D, 0x74, 0x21, 0xF0, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, +0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x9E, 0xE0, 0xFD, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x60, +0x31, 0xEF, 0x54, 0x04, 0xFF, 0xED, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, +0xE0, 0x15, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x3A, 0x93, 0x90, 0x93, +0x1D, 0xE0, 0x44, 0x08, 0xF0, 0x80, 0x0B, 0xE4, 0x90, 0x93, 0xA0, 0xF0, 0x7D, 0x40, 0xFF, 0x12, +0x3A, 0x22, 0x90, 0x93, 0x9E, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, +0x93, 0x1D, 0xE0, 0x44, 0x12, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, +0xE0, 0x44, 0x14, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, +0x93, 0x1D, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, +0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x1D, 0xE0, 0x90, 0x05, 0x27, +0xF0, 0x90, 0x93, 0x9F, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x11, 0x90, 0x93, 0x9E, 0xE0, +0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x0E, 0x7F, 0x01, 0x12, 0x5E, +0x91, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x55, 0x11, 0x7F, 0x02, 0x02, +0x88, 0x14, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0xE4, 0xFF, 0x12, 0x55, +0x11, 0x7F, 0x03, 0x02, 0x88, 0x14, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, +0x54, 0x02, 0xFE, 0x90, 0x93, 0x98, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x01, 0xFF, +0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, +0x4D, 0xFF, 0x90, 0x93, 0x98, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, +0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x93, 0x98, 0xF0, +0xEE, 0x54, 0x04, 0xFE, 0xEF, 0x54, 0xFB, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xE1, 0xC7, 0x90, 0x93, +0x1D, 0x74, 0x31, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x15, 0x90, +0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x3A, 0x93, 0x90, 0x93, 0x1D, 0xE0, 0x44, +0x08, 0xF0, 0x80, 0x0B, 0xE4, 0x90, 0x93, 0x9A, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x3A, 0x22, 0x90, +0x93, 0x98, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, +0x44, 0x02, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, 0x44, 0x04, +0xF0, 0x90, 0x93, 0x1D, 0xE0, 0x54, 0x0E, 0x60, 0x0C, 0x90, 0x01, 0x3E, 0x74, 0x03, 0xF0, 0xFD, +0x7F, 0x02, 0x12, 0x3A, 0xAD, 0x90, 0x93, 0x1D, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0x93, 0x98, +0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x64, 0x06, 0x60, 0x33, +0x7F, 0x06, 0x12, 0x64, 0xDA, 0x80, 0x2C, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, +0x99, 0xE0, 0xB4, 0x06, 0x1B, 0x7F, 0x01, 0x12, 0x64, 0xDA, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, +0x60, 0x09, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, 0xF4, 0x80, 0x05, 0x12, 0x64, 0xA8, 0x80, 0x03, +0x12, 0x67, 0x4A, 0x7F, 0x01, 0x80, 0x4D, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, +0xF0, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x3A, 0x3F, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x06, 0x02, 0x80, +0x1B, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, +0x04, 0xE4, 0xFF, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, +0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x05, 0x7F, 0x01, 0x12, 0x64, 0xDA, 0x12, 0x67, 0x29, 0x12, +0x51, 0x9C, 0x7F, 0x03, 0x11, 0x1B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0xEF, 0x64, 0x01, +0x60, 0x04, 0xEF, 0xB4, 0x03, 0x15, 0x90, 0x93, 0x9E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, +0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xED, 0x64, 0x02, 0x60, 0x04, +0xED, 0xB4, 0x03, 0x15, 0x90, 0x93, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x6D, +0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x6E, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xE5, +0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, 0x60, 0x43, 0xC3, 0x90, 0x93, 0xE6, 0xE0, +0x94, 0x88, 0x90, 0x93, 0xE5, 0xE0, 0x94, 0x13, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, +0xF0, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xE5, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, +0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0xE6, 0xE0, 0x94, 0x64, 0x90, 0x93, 0xE5, 0xE0, +0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, +0x22, 0x90, 0x93, 0xA4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xA8, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, +0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x90, 0xD3, 0x12, 0x43, +0x73, 0x50, 0x41, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xA4, 0x12, 0x43, +0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x7B, 0x01, +0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, 0x1B, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x84, 0xEF, +0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0xA8, 0x12, +0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xA8, 0x02, 0x43, 0x84, 0x90, 0x93, 0x73, 0x12, 0x1F, 0xC9, +0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0x77, 0x12, 0x43, 0x90, 0xC3, 0x12, 0x43, 0x73, +0x90, 0x93, 0x73, 0x60, 0x67, 0x12, 0x43, 0x84, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x7F, 0x12, 0x1F, +0xC9, 0x90, 0x93, 0x77, 0x12, 0x43, 0x84, 0x11, 0xC1, 0x90, 0x93, 0x83, 0x12, 0x1F, 0xC9, 0x90, +0x93, 0x77, 0x12, 0x43, 0x84, 0x12, 0x43, 0x66, 0x90, 0x93, 0x7F, 0x12, 0x43, 0x90, 0x12, 0x43, +0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x83, 0x12, 0x43, 0x84, 0xA9, +0x07, 0x90, 0x93, 0x7B, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, 0xD0, 0x02, +0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, 0x90, 0x93, 0x87, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0x73, +0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x87, 0x80, 0x0A, 0x12, 0x43, 0x84, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x93, 0x7B, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0xD0, +0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x9F, 0x74, +0x04, 0xF0, 0x22, 0x12, 0x56, 0x01, 0x80, 0xEE, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x05, +0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x9F, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x56, 0x14, 0x90, +0x93, 0x9F, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x3C, 0x90, 0x01, 0x57, 0xE4, +0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x51, 0xE0, 0x60, 0x07, 0xE4, 0xF0, 0x53, +0x66, 0xFD, 0x80, 0x24, 0x90, 0x93, 0x38, 0xE0, 0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, 0x3F, +0xE0, 0xFF, 0x90, 0x93, 0x38, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0xE5, 0x62, 0xB4, 0x01, 0x09, 0x90, +0x93, 0x39, 0xE0, 0x70, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x5B, 0xE0, 0x60, 0x10, 0x90, 0x01, +0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x01, +0x5F, 0xE0, 0x60, 0x10, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, +0x90, 0x93, 0x49, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xE7, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, +0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, +0x22, 0xD3, 0x90, 0x93, 0xE8, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0xE7, 0xE0, 0x94, 0x03, 0x40, 0x03, +0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x93, 0xE7, 0xE4, 0x75, 0xF0, +0x01, 0x12, 0x42, 0x87, 0x80, 0xC6, 0xE4, 0xFF, 0x02, 0x4E, 0x8B, 0x90, 0x93, 0x1A, 0x12, 0x43, +0xC8, 0x12, 0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x93, 0xE0, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xE0, +0x30, 0xE0, 0x02, 0x51, 0xA6, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xC3, 0x13, +0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0xE1, 0xF0, 0x22, 0x7E, 0xBF, +}; + +#ifdef CONFIG_MP_INCLUDED +u8 Rtl8723EFwBTImgArray[Rtl8723EBTImgArrayLength] = { +0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x55,0xB2,0xCD,0xF7,0x12,0x6B,0x6B,0xEB,0x51,0xB7,0x60,0xCA,0x53,0xB2,0x64,0xF3,0x13,0x6B,0x6B,0xEB,0xE8,0x4F,0x60,0xCA,0x51,0xB2,0x00,0x6B,0x40,0xF0,0x6C,0xC7,0x60,0xC2,0xC0,0xF0,0x58,0x9F,0x4F,0xB3,0x51,0xB0,0x00,0x69,0x6D,0xEA,0xC0,0xF0,0x58,0xDF,0x45,0xF1,0x09,0x6A,0x00,0xF1,0x50,0xCF,0x0E,0xF0,0x1D,0x6A,0x80,0xF1,0x62,0xA7,0x43,0xDF,0x48,0xB2,0x25,0xDF,0x26,0xDF,0x44,0xDF,0x68,0x32,0x69,0xE2,0x46,0xB3,0x44,0x32,0x27,0xDF,0x28,0xDF,0x29,0xDF,0x40,0xCB,0x90,0x67,0xB1,0x67,0x30,0x6E,0x00,0x18,0x64,0x2E,0x04,0xD7,0x01,0x6A,0x4B,0xEA,0x47,0xD8,0x41,0xB3,0x40,0x98,0x42,0xB4,0xB1,0x67,0x6D,0xEA,0x40,0xD8,0x0A,0x6A,0x4C,0xC0,0x08,0x6A,0x4D,0xC0,0x3D,0xB2,0x0C,0x6E,0x00,0x18,0x64,0x2E,0x20,0xC2,0x30,0xB3,0x03,0x6A,0x30,0xB5,0x80,0x9B,0x02,0x6B,0x6B,0xEB,0x6C,0xEC,0x4B,0xEA,0x4C,0xEC,0x05,0x6A,0x4B,0xEA,0x4C,0xEC,0x40,0x9D,0x6C,0xEA,0x40,0xDD,0x04,0x97,0x0E,0xF0,0x1D,0x6A,0x34,0xB3,0x43,0xDF,0x32,0xB2,0x60,0xDA,0x34,0xB3,0x33,0xB2,0x60,0xDA,0x35,0xB3,0x33,0xB2,0x60,0xDA,0x35,0xB3,0x34,0xB2,0x60,0xDA,0x36,0xB3,0x34,0xB2,0x60,0xDA,0x36,0xB3,0x35,0xB2,0x60,0xDA,0x37,0xB3,0x35,0xB2,0x60,0xDA,0x37,0xB3,0x36,0xB2,0x60,0xDA,0x38,0xB3,0x36,0xB2,0x60,0xDA,0x38,0xB3,0x37,0xB2,0x60,0xDA,0x39,0xB3,0x37,0xB2,0x60,0xDA,0x39,0xB3,0x38,0xB2,0x60,0xDA,0x3A,0xB3,0x38,0xB2,0x60,0xDA,0x3A,0xB3,0x39,0xB2,0x60,0xDA,0x3B,0xB3,0x39,0xB2,0x60,0xDA,0x3B,0xB3,0x3A,0xB2,0x60,0xDA,0x3B,0xB2,0x3C,0xB3,0x20,0xCA,0x3A,0xB2,0x60,0xDA,0x3B,0xB2,0x08,0xF1,0x11,0x6B,0x6B,0xEB,0x20,0xCA,0x3A,0xB2,0x60,0xCA,0x3A,0xB2,0x20,0xDA,0x3A,0xB2,0x20,0xDA,0x3A,0xB2,0x06,0xB3,0x4C,0xEC,0x39,0xB2,0x4D,0xEC,0x80,0x18,0x5A,0x37,0x80,0xDB,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0xF4,0x00,0x11,0x80,0xF0,0x00,0x11,0x80,0xD0,0x04,0x11,0x80,0xD2,0x04,0x11,0x80,0xCA,0xA0,0x11,0x80,0x00,0x00,0x00,0x18,0x58,0xC5,0xC8,0x19,0x08,0xA1,0x11,0x80,0xCC,0xA0,0x11,0x80,0x00,0x00,0x00,0x70,0x1C,0xA1,0x11,0x80,0xFC,0xA0,0x11,0x80,0xBC,0x00,0x11,0x80,0x51,0xA9,0x10,0x80,0x44, +0x00,0x11,0x80,0x4D,0xA3,0x10,0x80,0x4C,0x05,0x11,0x80,0x55,0xAE,0x10,0x80,0x44,0x05,0x11,0x80,0x59,0xD1,0x10,0x80,0x58,0x09,0x11,0x80,0xF5,0xD4,0x10,0x80,0x3C,0x00,0x11,0x80,0x35,0xA6,0x10,0x80,0xA0,0x05,0x11,0x80,0x51,0xAB,0x10,0x80,0xC4,0x05,0x11,0x80,0xF1,0xA9,0x10,0x80,0x5C,0x05,0x11,0x80,0xBD,0xDB,0x10,0x80,0x90,0x06,0x11,0x80,0x7D,0xCA,0x10,0x80,0x98,0x07,0x11,0x80,0xB5,0xCD,0x10,0x80,0xA0,0x07,0x11,0x80,0x1D,0xCF,0x10,0x80,0x9C,0x07,0x11,0x80,0xC5,0xCF,0x10,0x80,0xEC,0x04,0x11,0x80,0xB5,0xAF,0x10,0x80,0x80,0x00,0x11,0x80,0xCD,0xD2,0x10,0x80,0x6C,0x06,0x11,0x80,0x29,0xD4,0x10,0x80,0x0A,0xA1,0x11,0x80,0xD4,0x04,0x11,0x80,0x25,0xD3,0x10,0x80,0xC8,0xA0,0x11,0x80,0x0C,0xA1,0x11,0x80,0x10,0xA1,0x11,0x80,0x14,0xA1,0x11,0x80,0xFF,0xFF,0x1F,0xFF,0x00,0x00,0x60,0x00,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x04,0x67,0x2F,0x24,0x80,0x98,0x00,0x6A,0x00,0xF4,0x24,0x98,0xBD,0x67,0x00,0xF4,0x44,0xD8,0xE1,0xF7,0x1F,0x6A,0x4C,0xEC,0x00,0x18,0x2A,0xDF,0x10,0x4D,0x12,0x2A,0x5D,0x67,0x68,0xAA,0xFF,0xF7,0x1F,0x6A,0x4C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x0E,0xB3,0x48,0x32,0x69,0xE2,0xE0,0xF0,0x4B,0xA2,0x01,0x72,0x0A,0x60,0x0B,0xB2,0xB0,0x67,0x00,0x18,0xE0,0x1D,0x83,0x9A,0x07,0x2A,0x00,0x18,0x6A,0x1E,0x11,0x67,0x04,0x10,0x00,0x18,0x7B,0x57,0x90,0x67,0x11,0x67,0xD1,0x29,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0x9C,0x31,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0xFF,0x6B,0x6C,0xEE,0x04,0x76,0x0A,0xD4,0x04,0xD6,0x2B,0x61,0x40,0xA4,0x6C,0xEA,0x03,0x72,0x27,0x61,0x22,0xA4,0x6C,0xE9,0x24,0x29,0x44,0xA4,0x03,0xA4,0x6C,0xEA,0x6C,0xE8,0x40,0x32,0x00,0x1C,0xDD,0x31,0x4D,0xE8,0x13,0xB3,0x1A,0x65,0x40,0xAB,0x0E,0xEA,0x14,0x2A,0x11,0xB2,0x98,0x67,0x00,0x9A,0x20,0xDA,0x10,0xB2,0x20,0xDA,0x08,0xF1,0x11,0x6A,0x4B,0xEA,0x00,0x1C,0xE5,0x31,0x40,0xCB,0x00,0x18,0xA9,0x1D,0x01,0x6C,0x07,0x20,0x80,0x18,0x8A,0x28,0x90,0x67,0x03,0x10,0x00,0x1C,0xE5,0x31,0x98,0x67,0x0A,0x94,0x00,0x18,0xBD,0x89,0x04,0x95,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x0C,0xA1,0x11,0x80, +0x10,0xA1,0x11,0x80,0x14,0xA1,0x11,0x80,0x03,0xB2,0x01,0x6B,0x40,0x9A,0x52,0x32,0x20,0xE8,0x6C,0xEA,0x50,0x60,0x00,0xB0,0x03,0xB2,0x01,0x6B,0x40,0x9A,0x4A,0x32,0x20,0xE8,0x6C,0xEA,0x50,0x60,0x00,0xB0,0xF3,0x63,0x18,0x62,0x17,0xD1,0x16,0xD0,0x7D,0x67,0x00,0x6A,0x20,0xF0,0x50,0xC3,0xA6,0xB3,0x9D,0x67,0x00,0x69,0x58,0xAB,0x40,0xF0,0x48,0xCC,0x20,0xF0,0x5A,0xA3,0x20,0xF0,0x79,0xA3,0x40,0x32,0x4D,0xEB,0xA1,0xB2,0x0D,0xD3,0x01,0x6B,0x40,0x9A,0x0F,0xD2,0xA0,0xB2,0x40,0x9A,0x0E,0xD2,0x9F,0xB2,0x00,0x9A,0x9F,0xB2,0x40,0x9A,0x10,0xD2,0x0E,0x92,0x6C,0xEA,0x3A,0x22,0xBD,0x67,0x83,0x67,0x30,0x4D,0x00,0x6E,0x00,0x18,0x71,0x23,0x23,0x67,0x02,0x2A,0x03,0x69,0x0B,0x11,0x9D,0x67,0x20,0xF0,0x70,0xA4,0x0F,0x94,0xFF,0x6A,0x4C,0xEB,0x80,0xF7,0x82,0x32,0x2C,0xEA,0x4E,0xEB,0x94,0xB4,0x1B,0x2B,0x92,0xB2,0x4D,0xE8,0x40,0x9C,0x56,0x32,0x2C,0xEA,0x02,0x2A,0x91,0xB2,0x4D,0xE8,0x7D,0x67,0x40,0xF0,0x68,0xAB,0x01,0xF0,0x00,0x6A,0x05,0x69,0x6C,0xEA,0xFF,0xF7,0x1F,0x6B,0x6C,0xEA,0x04,0x22,0x00,0x18,0xA4,0x1D,0x0D,0x94,0x0D,0x10,0x00,0x18,0xA9,0x1D,0x0D,0x94,0x09,0x10,0x88,0xB2,0x4C,0xE8,0x40,0x9C,0x56,0x32,0x2C,0xEA,0x02,0x2A,0x86,0xB2,0x4C,0xE8,0x09,0x69,0x0E,0x94,0x01,0x6F,0x86,0x32,0xEC,0xEA,0x41,0x22,0x7F,0xB3,0x40,0x9B,0x56,0x32,0xEC,0xEA,0x3C,0x22,0xBD,0x67,0x10,0x6A,0xC7,0x67,0x02,0x6C,0x30,0x4D,0x14,0xD7,0x00,0x18,0x71,0x23,0x4D,0xE9,0x14,0x97,0x06,0x2A,0x20,0x6A,0x4D,0xE9,0xFF,0xF7,0x1F,0x6C,0x8C,0xE9,0xC0,0x10,0x0F,0x94,0x5D,0x67,0x20,0xF0,0x70,0xA2,0x40,0xF7,0x82,0x32,0xEC,0xEA,0x4E,0xEB,0x70,0xB2,0x80,0x9A,0x19,0x2B,0x6F,0xB2,0x4D,0xE8,0x44,0x67,0xEC,0xEA,0x02,0x2A,0x6B,0xB2,0x4D,0xE8,0x7D,0x67,0x40,0xF0,0x68,0xAB,0x01,0xF0,0x00,0x6A,0xFF,0xF7,0x1F,0x6C,0x6C,0xEA,0x8C,0xEA,0x04,0x22,0x00,0x18,0xA4,0x1D,0x0D,0x94,0x0B,0x10,0x00,0x18,0xA9,0x1D,0x0D,0x94,0x07,0x10,0x65,0xB2,0x4C,0xE8,0x44,0x67,0xEC,0xEA,0x02,0x2A,0x61,0xB2,0x4C,0xE8,0x0E,0x93,0x01,0x6C,0x6A,0x32,0x8C,0xEA,0x3C,0x22,0x5C,0xB3,0x40,0x9B,0x0F,0x6B,0x46,0xEC,0x6C,0xEA,0x03,0x72,0x35,0x60,0xFF,0x6A,0xBD,0x67,0x01,0x4A,0x04,0x6C,0x30,0x4D,0x02,0x6E,0x00,0x18,0x71, +0x23,0x4D,0xE9,0x03,0x2A,0x00,0xF2,0x00,0x6A,0x40,0x10,0x9D,0x67,0x20,0xF0,0x50,0xA4,0x50,0xB3,0x80,0x9B,0x11,0x22,0x53,0xB2,0x03,0x6B,0x4D,0xE8,0x82,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x60,0x96,0x32,0x01,0x6C,0x8C,0xEA,0x02,0x2A,0x4E,0xB2,0x4D,0xE8,0x00,0xF4,0x00,0x6A,0x10,0x10,0x4C,0xB2,0x03,0x6B,0x4C,0xE8,0x82,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x60,0x96,0x32,0x01,0x6B,0x6C,0xEA,0x02,0x2A,0x47,0xB2,0x4C,0xE8,0x01,0xF0,0x00,0x6A,0x4D,0xE9,0x0E,0x94,0x01,0x6B,0x8E,0x32,0x6C,0xEA,0x18,0x22,0x3B,0xB2,0x40,0x9A,0x46,0xEB,0x0F,0x6B,0x6C,0xEA,0x03,0x72,0x11,0x60,0xBD,0x67,0x02,0xF0,0x00,0x6A,0x08,0x6C,0x30,0x4D,0x03,0x6E,0x00,0x18,0x71,0x23,0x4D,0xE9,0x07,0x2A,0x04,0xF0,0x00,0x6A,0x4D,0xE9,0xFF,0xF7,0x1F,0x6A,0x4C,0xE9,0x37,0x10,0x04,0x6A,0x2C,0xEA,0x08,0x2A,0x34,0xB2,0x4C,0xE8,0x34,0xB2,0x4C,0xE8,0x2E,0xB2,0x4C,0xE8,0x2E,0xB2,0x4C,0xE8,0xC0,0xF5,0x02,0x32,0x01,0x6B,0x6C,0xEA,0x0C,0x22,0x27,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x61,0x25,0xB2,0x4C,0xE8,0x25,0xB2,0x4C,0xE8,0x29,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x0C,0x2A,0x1F,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x61,0x1F,0xB2,0x4D,0xE8,0x1F,0xB2,0x4D,0xE8,0x22,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x03,0x2A,0x00,0x18,0xBB,0x30,0x00,0x6C,0x12,0xB2,0x00,0xDA,0x05,0x6A,0x10,0x94,0x04,0xD2,0x0B,0x0A,0x05,0xD2,0x0E,0x93,0x0F,0x92,0x0A,0xD4,0xFA,0x6D,0x04,0x6C,0xE1,0xF3,0x09,0x6E,0xA1,0xF1,0x1A,0x6F,0x06,0xD1,0x09,0xD0,0x07,0xD2,0x20,0x18,0x1B,0x32,0x08,0xD3,0x18,0x97,0x17,0x91,0x16,0x90,0x00,0xEF,0x0D,0x63,0x41,0x00,0x00,0x00,0xDC,0x00,0x11,0x80,0x44,0xA0,0x00,0xB0,0x40,0x60,0x00,0xB0,0x40,0xA0,0x00,0xB0,0x50,0xA0,0x00,0xB0,0x00,0x00,0x80,0x00,0x6C,0x1D,0x11,0x80,0x00,0x00,0x40,0x00,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xBF,0xFF,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xEF,0xFF,0x00,0x00,0xC0,0x00,0x00,0x00,0x30,0x00,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0x65,0xB2,0x01,0x6F,0x20,0x9A,0x2A,0x65,0x36,0x36,0xEC,0xEE,0x0B,0x2E,0x63,0xB4,0x03,0x6B,0x6B,0xEB,0x40,0x9C, +0x6C,0xEA,0x40,0xDC,0x61,0xB4,0x02,0x6B,0x40,0x9C,0x6D,0xEA,0x40,0xDC,0x5F,0xB2,0x00,0x6B,0x0A,0xD3,0xA3,0x67,0x60,0x9A,0x5E,0xB2,0x40,0x9A,0x0A,0x65,0x5D,0xB2,0x00,0x9A,0x51,0x67,0xEC,0xEA,0x10,0x22,0x80,0xF7,0x62,0x32,0x88,0x67,0x8E,0xEA,0xEC,0xEA,0x01,0x5A,0xA7,0x67,0x08,0x60,0x58,0xB2,0x03,0x6D,0x4D,0xE8,0x03,0x2E,0x57,0xB2,0x07,0x6D,0x4D,0xE8,0x0A,0xD7,0x29,0x67,0xC0,0x99,0x01,0x6C,0xD6,0x32,0x8C,0xEA,0x1E,0x22,0x08,0x6A,0x4D,0xED,0x02,0x32,0x52,0x32,0x8C,0xEA,0xFF,0xF7,0x1F,0x6F,0x16,0x22,0x28,0x67,0x26,0x32,0x40,0xF7,0x62,0x33,0x4E,0xEB,0x8C,0xEB,0x83,0xEB,0x0E,0x60,0x10,0x6A,0x4D,0xED,0x49,0xB2,0xEC,0xED,0x4D,0xE8,0x46,0x67,0x8C,0xEA,0x05,0x2A,0x45,0xB2,0x4D,0xE8,0x20,0x6A,0x4D,0xED,0xEC,0xED,0x0A,0xD4,0x68,0x67,0x6A,0x32,0x01,0x6E,0xCC,0xEA,0x16,0x22,0x40,0x6A,0x29,0x67,0x4D,0xED,0x80,0x99,0x3F,0xB2,0x03,0x6B,0x4D,0xE8,0x82,0x32,0x4A,0x32,0x6C,0xEA,0xCA,0xEA,0x03,0x60,0x96,0x32,0xCC,0xEA,0x07,0x2A,0x80,0x6A,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x4C,0xED,0x38,0xB2,0x4D,0xE8,0x02,0x6A,0xAC,0xEA,0x08,0x2A,0x37,0xB2,0x4C,0xE8,0x37,0xB2,0x4C,0xE8,0x37,0xB2,0x4C,0xE8,0x37,0xB2,0x4C,0xE8,0x29,0xB3,0x03,0x69,0x40,0x9B,0x42,0x32,0x4A,0x32,0x2C,0xEA,0x01,0x72,0x04,0x61,0x31,0xB2,0x4C,0xE8,0x2E,0xB2,0x4C,0xE8,0x31,0xB2,0x88,0x67,0x06,0xD5,0x07,0xD4,0xFA,0x6D,0x04,0x6C,0xA1,0xF4,0x0C,0x6E,0xA1,0xF1,0x19,0x6F,0x04,0xD1,0x05,0xD2,0x20,0x18,0x1B,0x32,0x08,0xD0,0x0A,0x92,0x12,0x22,0x29,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x0B,0x2A,0x18,0xB3,0x40,0x9B,0x42,0x32,0x4A,0x32,0x2C,0xEA,0x01,0x72,0x04,0x61,0x1C,0xB2,0x4D,0xE8,0x1C,0xB2,0x4D,0xE8,0x17,0xB2,0x00,0xDA,0x21,0xB2,0x01,0x6C,0xA0,0x9A,0xBE,0x32,0x8C,0xEA,0x17,0x22,0x40,0xF5,0x02,0x32,0x8C,0xEA,0x07,0x22,0x1D,0xB2,0x00,0x6B,0x80,0xC2,0x1D,0xB2,0x60,0xC2,0x1D,0xB2,0x60,0xC2,0xA2,0x32,0x8C,0xEA,0x05,0x22,0x00,0x18,0xA5,0x23,0x00,0x65,0x18,0xB3,0x40,0xC3,0x16,0xB2,0x00,0x18,0x04,0x24,0x80,0xA2,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0x6C,0x1D,0x11,0x80,0x30,0x60,0x00,0xB0,0x34,0x60,0x00,0xB0,0x44,0xA0,0x00,0xB0,0x50,0x60,0x00,0xB0,0x40,0xA0,0x00,0xB0,0x00, +0x00,0x80,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xBF,0xFF,0xF0,0xA5,0x10,0x80,0x00,0x00,0xC0,0x00,0x54,0x45,0x11,0x80,0x17,0x00,0x11,0x80,0x16,0x00,0x11,0x80,0x18,0x00,0x11,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x34,0xB2,0x00,0x6E,0x01,0x6B,0x20,0x6C,0xFF,0xF7,0x1F,0x6D,0x0A,0x65,0xE6,0x67,0x06,0x67,0x4B,0x65,0x2C,0x65,0x6D,0x65,0x2D,0xB1,0xC8,0x32,0x15,0xE1,0x10,0x27,0x68,0x67,0x69,0xE2,0x80,0x9A,0x6A,0x67,0x64,0xEF,0x86,0xEF,0x80,0xDD,0x41,0x9A,0xFF,0x4B,0x29,0x67,0x6C,0xEA,0xEF,0xE1,0x44,0xEB,0x4D,0xEC,0x80,0xDD,0x04,0x10,0x68,0x67,0x69,0xE2,0x40,0x9A,0x40,0xDD,0x01,0x4E,0xFF,0x69,0x2C,0xEE,0x10,0x76,0x11,0x61,0x88,0x67,0x1E,0xB5,0x01,0x4F,0x60,0x9C,0x2C,0xEF,0x4A,0x67,0x44,0xEF,0x11,0xE5,0xFF,0x4A,0xA9,0x67,0x4C,0xEB,0xEB,0xE5,0x64,0xEA,0x40,0x9C,0x00,0x6E,0x6D,0xEA,0x40,0xDC,0x04,0x48,0x4B,0x67,0x4C,0xE8,0x00,0xF4,0x01,0x58,0xCC,0x61,0x13,0xB4,0xFF,0x6E,0x55,0x6D,0x00,0xF4,0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x0F,0xB4,0xFF,0x6E,0x00,0x6D,0x00,0xF5,0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x0B,0xB4,0xFF,0x6E,0xB1,0x67,0x00,0xF6,0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x07,0xB4,0xFF,0x6E,0x0F,0x6D,0x00,0xF7,0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63,0x00,0x00,0x00,0xF8,0x10,0x80,0xDC,0xF4,0x04,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x11,0xB2,0x00,0x68,0xEE,0x6C,0x00,0xDA,0x10,0xB2,0x07,0x6D,0x00,0xDA,0x00,0x18,0x9A,0x33,0x00,0x65,0x0E,0xB4,0x4A,0xF5,0x16,0x6B,0x6B,0xEB,0xFF,0xF7,0x1F,0x6A,0x01,0x48,0x4C,0xE8,0x00,0xF4,0x00,0x58,0x60,0xCC,0xFA,0x61,0x07,0xB2,0x03,0x6B,0x05,0x97,0x60,0xDA,0x04,0x90,0x03,0xB2,0x01,0x6B,0x60,0xDA,0x00,0xEF,0x03,0x63,0x00,0x00,0x10,0xA3,0x00,0xB0,0x20,0xA3,0x00,0xB0,0xF0,0x00,0x00,0xB6,0xFD,0x63,0x04,0x62,0x17,0xB3,0x16,0xB2,0x80,0x18,0x3F,0x2A,0x60,0xDA,0x16,0xB3,0x16,0xB2,0x21,0xB4,0x04,0x97,0x52,0xDB,0x15,0xB2,0x55,0xDB,0x15,0xB2,0x49,0xDB,0x15,0xB2,0x4C,0xDB,0x15,0xB2,0x4F,0xDB,0x15,0xB2,0x46,0xDB,0x15,0xB2,0x5B,0xDB, +0x15,0xB2,0x40,0xDB,0x15,0xB2,0x58,0xDB,0x16,0xB3,0x15,0xB2,0x60,0xDA,0xC0,0xF0,0x50,0x9C,0x40,0x6B,0x6D,0xEA,0xC0,0xF0,0x50,0xDC,0x14,0xB3,0x49,0x9C,0x6D,0xEA,0x13,0xB3,0x6D,0xEA,0x49,0xDC,0x00,0xEF,0x03,0x63,0x00,0x00,0xCC,0x2C,0x11,0x80,0xE9,0xAE,0x10,0x80,0xB8,0x95,0x11,0x80,0x29,0xD8,0x10,0x80,0x99,0xB0,0x10,0x80,0x2D,0xB1,0x10,0x80,0xA1,0xB1,0x10,0x80,0x79,0xD4,0x10,0x80,0xE5,0xD4,0x10,0x80,0x19,0xC9,0x10,0x80,0xF1,0xD3,0x10,0x80,0x6D,0xCA,0x10,0x80,0x3C,0x1C,0x11,0x80,0xA5,0xA2,0x10,0x80,0xDC,0x00,0x11,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x44,0xA4,0x63,0xA4,0x00,0x6E,0x40,0x32,0x69,0xE2,0xFF,0xF7,0x1F,0x6B,0x6C,0xEA,0x7F,0xF4,0x0F,0x72,0x60,0xA5,0x46,0x67,0x08,0x61,0x69,0xE4,0xC2,0xC2,0x01,0x4B,0xFF,0x6A,0x4C,0xEB,0x61,0xC4,0x01,0x6A,0x60,0xC5,0x20,0xE8,0x00,0x65,0x00,0x00,0xF9,0x63,0x0C,0x62,0x0B,0xD1,0x0A,0xD0,0xFF,0x69,0x2C,0xEC,0x08,0xD4,0x61,0xF3,0x06,0x6D,0x00,0x18,0x9A,0x33,0x22,0x6C,0x40,0xB0,0xF3,0x6A,0x24,0x6C,0x20,0xF0,0xBF,0xA0,0x2C,0xED,0xA0,0x35,0x00,0x18,0x9A,0x33,0x4D,0xED,0x40,0xF0,0x41,0xA0,0x40,0xF0,0xA0,0xA0,0x26,0x6C,0x2C,0xEA,0x40,0x32,0x2C,0xED,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x9A,0x33,0x4C,0xED,0xEB,0xF0,0x12,0x6D,0x00,0x18,0x9A,0x33,0x28,0x6C,0x93,0xF7,0x1A,0x6D,0x00,0x18,0x9A,0x33,0x2A,0x6C,0x00,0x18,0xEE,0x33,0x01,0x6C,0x02,0x6C,0x00,0x18,0x9A,0x33,0x20,0x6D,0x2D,0xB2,0x03,0xF4,0x00,0x6D,0x20,0x68,0x81,0xA2,0x00,0x18,0x9A,0x33,0x2C,0xEC,0x2A,0xB2,0xFF,0xF7,0x1F,0x6B,0xFF,0xF7,0x1F,0x6D,0x40,0xAA,0x5E,0x6C,0x4C,0xEB,0x9F,0xF7,0x1F,0x6A,0x4C,0xEB,0x0D,0xEB,0x00,0x18,0x9A,0x33,0x6C,0xED,0xFF,0x6C,0x09,0x4C,0x00,0x18,0x9A,0x33,0x03,0x6D,0x21,0xB2,0xFF,0xF7,0x1F,0x6B,0xFF,0x6D,0x81,0xA2,0x1F,0xB2,0x21,0x4D,0x2C,0xEC,0x49,0xE4,0x40,0xAA,0x4C,0xEB,0xEE,0xF1,0x09,0x6A,0x4C,0xEB,0x6D,0xED,0xFF,0xF7,0x1F,0x6A,0x4C,0xED,0x1A,0xB2,0x07,0x6B,0x40,0xA2,0x2C,0xEA,0x6C,0xEA,0x40,0x32,0x44,0x32,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x9A,0x33,0x4C,0xED,0x02,0x6C,0x00,0x18,0x9A,0x33,0xB0,0x67,0x00,0x6C,0x00,0x18,0x9A,0x33,0x0D,0x6D,0x08,0x92,0x0C,0x22,0x9D,0x67,0x10, +0x4C,0x55,0x6D,0x00,0x18,0x64,0x2E,0x0A,0x6E,0xDD,0x67,0x01,0x6C,0x00,0x6D,0x00,0x18,0xDC,0x34,0x10,0x4E,0x0C,0x97,0x0B,0x91,0x0A,0x90,0x00,0xEF,0x07,0x63,0x00,0x00,0xDC,0x00,0x11,0x80,0x38,0xF4,0x04,0x80,0x5E,0x00,0x00,0xB6,0x30,0xF4,0x04,0x80,0x00,0x00,0x00,0xB6,0x81,0x08,0x11,0x80,0xF6,0x63,0x12,0x62,0x11,0xD1,0x10,0xD0,0x14,0xD4,0x16,0xD6,0x60,0xAC,0x7F,0xF4,0x0A,0x73,0x80,0xF0,0x04,0x60,0x7F,0xF4,0x0A,0x6A,0x62,0xEA,0x13,0x61,0x7F,0xF4,0x07,0x6A,0x62,0xEA,0x08,0x61,0x7F,0xF4,0x06,0x6A,0x42,0xEB,0x23,0x60,0x3F,0xF4,0x00,0x73,0x38,0x60,0x33,0x11,0x7F,0xF4,0x08,0x73,0x47,0x60,0x7F,0xF4,0x09,0x73,0x4A,0x60,0x2C,0x11,0x5F,0xF5,0x00,0x73,0x73,0x60,0x5F,0xF5,0x00,0x6A,0x62,0xEA,0x06,0x61,0x7F,0xF4,0x0F,0x73,0x0B,0x60,0x7F,0xF4,0x10,0x73,0x06,0x10,0x5F,0xF5,0x03,0x73,0x00,0xF1,0x0D,0x60,0x5F,0xF5,0x05,0x73,0x27,0x60,0x17,0x11,0x16,0x92,0x00,0x6B,0x21,0x10,0x7F,0xF4,0x06,0x73,0x03,0x61,0x8C,0xB2,0x00,0x6B,0x60,0xDA,0x8B,0xB2,0x0F,0x6B,0x40,0x9A,0x46,0x32,0x6C,0xEA,0x03,0x72,0x04,0x61,0x89,0xB2,0x60,0x9A,0x89,0xB2,0x60,0xDA,0x8A,0xB3,0x88,0xB2,0x60,0xDA,0x8A,0xB3,0x89,0xB2,0x60,0xDA,0xFF,0x17,0x81,0xB2,0x89,0xB3,0x40,0x9A,0x6E,0xEA,0xE0,0xF0,0x16,0x2A,0x14,0x94,0x87,0xB2,0x63,0xA4,0x60,0xC2,0xE9,0x10,0x14,0x92,0x83,0xA2,0x01,0x24,0x01,0x6C,0x80,0x18,0x88,0x2A,0x00,0x65,0xE1,0x10,0x14,0x94,0x81,0xB2,0x63,0xA4,0x80,0xF1,0x61,0xC2,0xDB,0x10,0x14,0x93,0x7F,0xB1,0xFF,0xF7,0x1F,0x6C,0x43,0xA3,0x44,0x33,0x4D,0xE3,0x6C,0x33,0x4D,0xE3,0x40,0x99,0x68,0x30,0x8C,0xE8,0x4F,0xEA,0x03,0x22,0x00,0x18,0xFD,0x1D,0x91,0x67,0x0F,0x20,0x00,0x18,0x40,0xA4,0x00,0x65,0x76,0xB6,0x00,0x6A,0x01,0x6C,0xB1,0x67,0xE2,0x67,0x00,0x18,0xF3,0x1D,0x04,0xD2,0x80,0x99,0x00,0x18,0x0C,0x1E,0xB0,0x67,0x71,0xB2,0x00,0xCA,0xB7,0x10,0x14,0x93,0x00,0x6E,0x43,0xA3,0x01,0x22,0x01,0x6E,0x6A,0xB2,0x80,0xF1,0xD1,0xC2,0xAE,0x10,0x14,0x94,0x14,0x93,0x61,0xF3,0x06,0x6D,0x85,0xA4,0x0E,0xD4,0x48,0xA3,0x27,0xA3,0xFF,0xF7,0x1F,0x6C,0x40,0x32,0x4D,0xE9,0x00,0x6A,0x45,0xC3,0x4A,0xC3,0x8C,0xE9,0x00,0x18,0x9A,0x33,0x22,0x6C,0x5F,0xB0,0xF3,0x6A,0xFF,0xF7,0x1F,0x6B, +0x20,0xF0,0xBF,0xA0,0x24,0x6C,0xA0,0x35,0x4D,0xED,0x00,0x18,0x9A,0x33,0x6C,0xED,0x40,0xF0,0x41,0xA0,0x40,0xF0,0xA0,0xA0,0x26,0x6C,0x40,0x32,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x9A,0x33,0x4C,0xED,0xEB,0xF0,0x12,0x6D,0x00,0x18,0x9A,0x33,0x28,0x6C,0x93,0xF7,0x1A,0x6D,0x00,0x18,0x9A,0x33,0x2A,0x6C,0x00,0x18,0xEE,0x33,0x01,0x6C,0x7D,0x21,0xFF,0xF7,0x1F,0x6B,0x51,0x67,0x6C,0xE9,0x00,0xF4,0x01,0x59,0x02,0x61,0x00,0xF4,0x00,0x6A,0xFF,0xF7,0x1F,0x69,0x4C,0xE9,0x0E,0x92,0xFF,0x6C,0xFF,0x4A,0x8C,0xEA,0x04,0x5A,0x28,0x61,0x47,0xB0,0x00,0x6A,0x7D,0x67,0x06,0xD2,0x0C,0xCB,0xE0,0xF7,0x1F,0x6A,0x4C,0xE9,0x44,0xB3,0x06,0x92,0x80,0xF4,0x20,0x34,0x01,0x6D,0x6C,0xEA,0x8D,0xEA,0x06,0xD2,0x00,0x6C,0x40,0xB2,0x04,0xD4,0x05,0xD4,0x9D,0x67,0x18,0x4C,0xC5,0x67,0x00,0x6F,0x07,0xD2,0x3F,0x10,0xE0,0xF7,0x1F,0x6A,0x8C,0xEA,0x88,0x67,0x80,0xF4,0x40,0x32,0x8C,0xEB,0x4D,0xEB,0x38,0xB2,0xFF,0x6D,0xEC,0xED,0x60,0xDE,0x41,0xDE,0x2B,0x10,0x0E,0x92,0x00,0x6D,0x91,0x67,0x40,0x33,0x34,0xB2,0x25,0x67,0x41,0xE3,0x7D,0x67,0x18,0x4B,0x2F,0xB2,0x8B,0x65,0x31,0xB3,0x0A,0x65,0xFF,0xF7,0x1F,0x6A,0x6B,0x65,0xFF,0x6B,0x4A,0x65,0x2B,0x65,0x6C,0x67,0xAC,0x32,0x79,0xE2,0x20,0xDE,0x00,0xF1,0x01,0x5C,0x00,0xCE,0x21,0xDE,0x60,0x9E,0xE1,0x45,0xD4,0x61,0x48,0x67,0x6C,0xEA,0xA9,0x67,0x6B,0x67,0x6D,0xEA,0x80,0x4C,0xEC,0xED,0x40,0xDE,0x80,0x4C,0x4A,0x67,0x04,0x5D,0x4C,0xEC,0xE8,0x61,0x00,0x6F,0x9D,0x67,0x04,0xD7,0x05,0xD7,0x18,0x4C,0x01,0x6E,0x00,0x18,0xF7,0x33,0x00,0x65,0x0E,0x10,0x02,0x6C,0x01,0x6D,0x00,0x18,0x1C,0x80,0x00,0x6E,0x08,0x10,0x14,0x93,0x16,0x92,0x80,0xAB,0x00,0x18,0xFA,0x8B,0xA0,0xA2,0x01,0x6A,0x01,0x10,0x00,0x6A,0x12,0x97,0x11,0x91,0x10,0x90,0x00,0xEF,0x0A,0x63,0x38,0x91,0x10,0x80,0x6C,0x1D,0x11,0x80,0x2C,0x00,0x00,0xB5,0x48,0x91,0x10,0x80,0x44,0x91,0x10,0x80,0x32,0x97,0x79,0x23,0x78,0xA0,0x00,0xB0,0x01,0x00,0xA5,0x01,0xAE,0x23,0x87,0x54,0xD0,0x00,0x11,0x80,0xDC,0x00,0x11,0x80,0x88,0x07,0x11,0x80,0x01,0x91,0x02,0x80,0x08,0xA1,0x11,0x80,0x00,0xF8,0x10,0x80,0xFF,0xFF,0x03,0xE0,0x00,0x00,0x00,0x80,0x00,0xFB,0x10,0x80,0x00,0x00,0x00,0x04,0x03, +0xB2,0x00,0x6B,0x60,0xDA,0x20,0xE8,0x00,0x65,0x00,0x00,0x04,0x60,0x00,0xB0,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x40,0xAC,0x01,0xF4,0x03,0x72,0x2C,0x61,0x80,0x18,0x3F,0x2A,0x00,0x69,0x80,0x18,0x91,0x2B,0x00,0x65,0x16,0xB2,0x08,0xF1,0x11,0x6B,0x6B,0xEB,0x60,0xCA,0x15,0xB2,0x91,0x67,0x20,0xDA,0x14,0xB2,0x20,0x18,0x83,0x39,0x20,0xDA,0x14,0xB2,0x15,0xB0,0xB1,0x67,0x80,0xF1,0x62,0xA2,0x90,0x67,0x30,0x6E,0x68,0x32,0x69,0xE2,0x0F,0xB3,0x44,0x32,0x00,0x18,0x64,0x2E,0x40,0xCB,0x01,0x6A,0x4B,0xEA,0x47,0xD8,0x0E,0xB3,0x40,0x98,0x0E,0xB4,0xB1,0x67,0x6D,0xEA,0x40,0xD8,0x00,0x18,0x64,0x2E,0x0C,0x6E,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0x6A,0x00,0xEF,0x04,0x63,0x0C,0xA1,0x11,0x80,0x10,0xA1,0x11,0x80,0x14,0xA1,0x11,0x80,0x08,0xA1,0x11,0x80,0xDC,0x00,0x11,0x80,0xCC,0xA0,0x11,0x80,0x00,0x00,0x00,0x70,0xFC,0xA0,0x11,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0xFF,0xF7,0x1F,0x6A,0xCC,0xEA,0x02,0x74,0x0C,0x65,0x05,0x67,0x4F,0x65,0x2A,0x65,0x0D,0x61,0x2A,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x05,0x61,0x27,0xB3,0x40,0x9B,0xC0,0xF7,0x42,0x32,0xFC,0x2A,0x48,0x67,0x04,0x72,0x38,0x61,0x60,0xA0,0xFF,0x6E,0x46,0x67,0x6C,0xEA,0x10,0x72,0x0B,0x61,0x42,0xA0,0xCC,0xEA,0x02,0x72,0x07,0x61,0x1F,0xB2,0xB0,0x67,0x00,0x18,0xE0,0x1D,0x81,0x9A,0x00,0x6A,0x2D,0x10,0xFF,0x6A,0x6C,0xEA,0x02,0x72,0x01,0x6C,0x04,0x60,0x22,0x72,0x02,0x60,0x2F,0x72,0x1E,0x61,0xFF,0x6E,0x46,0x67,0x6C,0xEA,0x2F,0x72,0x01,0x6A,0x02,0x60,0x42,0xA0,0xCC,0xEA,0xFF,0x6D,0x6F,0x42,0xAC,0xEB,0xAA,0xEB,0x11,0x60,0xE5,0x67,0x01,0x69,0x06,0x4C,0xAC,0xEC,0x99,0xE0,0x42,0xA6,0xAC,0xEA,0x03,0x5A,0x01,0x61,0x22,0xC6,0xFF,0x4B,0xEC,0xEB,0xFF,0x6D,0x08,0x4C,0xAA,0xEB,0xEC,0xEC,0xF1,0x61,0x88,0x67,0xB0,0x67,0xC9,0x67,0x00,0x18,0xCA,0x1E,0xEA,0x67,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63,0x6C,0x1D,0x11,0x80,0x1C,0xA3,0x00,0xB0,0x9C,0x31,0x11,0x80,0x20,0xE8,0x00,0x65,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0xFF,0xF7,0x1F,0x69,0x8C,0xE9,0x24,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x4C,0x32,0x18,0xB3,0x2B,0xE2,0x48,0x32,0x61,0xE2,0x5C,0x98,0x4F,0xEA, +0x05,0x22,0x01,0x6A,0x00,0x6B,0x20,0xF2,0x5E,0xC0,0x1E,0x10,0x00,0x18,0x41,0x5E,0x91,0x67,0x04,0xD2,0x0C,0x6B,0x18,0x2A,0x5F,0x98,0x41,0xA2,0x44,0x72,0x14,0x60,0x00,0x18,0xA5,0x5E,0x91,0x67,0x06,0x22,0x00,0x18,0x69,0x5E,0x91,0x67,0x1F,0x6B,0x0B,0x22,0x05,0x10,0x00,0x18,0x80,0x49,0x91,0x67,0x62,0x67,0x05,0x10,0x91,0x67,0x20,0x18,0x13,0x26,0x0E,0x6D,0x04,0x93,0x08,0x97,0x07,0x91,0x06,0x90,0x43,0x67,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x03,0x44,0x90,0x67,0x00,0x18,0xF2,0x5A,0x0B,0xD5,0x22,0x67,0x1A,0x65,0x1E,0x2A,0xBD,0x67,0x90,0x67,0x00,0x18,0x07,0xDF,0x10,0x4D,0x7D,0x67,0x48,0xAB,0x0B,0x93,0xFF,0xF7,0x1F,0x6D,0x40,0xCB,0x65,0x67,0x4C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x09,0xB3,0x48,0x32,0x69,0xE2,0x20,0xF2,0x3E,0xC2,0x5D,0x67,0x88,0xAA,0x80,0x18,0xEE,0x2B,0xAC,0xEC,0x1A,0x65,0x08,0x97,0x07,0x91,0x06,0x90,0x58,0x67,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0x20,0xB0,0x00,0x6A,0x04,0xD2,0x40,0x98,0x01,0x69,0xC0,0xF6,0x42,0x32,0x2C,0xEA,0x09,0x22,0x00,0x18,0x4F,0x9A,0x06,0xD4,0x04,0xD1,0x40,0x98,0x1A,0xB3,0x6C,0xEA,0x40,0xD8,0x06,0x94,0x44,0xAC,0xFF,0xF7,0x1F,0x6B,0x06,0x72,0x19,0x61,0x40,0x9C,0x17,0x2A,0x45,0xAC,0x6C,0xEA,0x17,0x2A,0x41,0x9C,0x82,0x67,0x42,0x32,0x42,0x32,0x6C,0xEA,0x01,0xF0,0x0B,0x72,0x6C,0xEC,0x04,0x61,0x80,0x18,0xEE,0x2B,0x00,0x65,0x0A,0x10,0x01,0xF0,0x05,0x72,0x07,0x61,0x00,0x18,0x2C,0x48,0x00,0x65,0x03,0x10,0x00,0x18,0x74,0x56,0x00,0x65,0x04,0x92,0x05,0x22,0x06,0xB2,0x07,0xB4,0x60,0x9A,0x8D,0xEB,0x60,0xDA,0x0A,0x97,0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0x00,0x00,0x54,0x45,0x11,0x80,0xFF,0xFF,0xFF,0xF7,0x00,0x00,0x00,0x08,0xF9,0x63,0x0C,0x62,0x44,0xAC,0x07,0x72,0x11,0x61,0x60,0x9C,0xFF,0x6D,0x40,0xA3,0x03,0x72,0x26,0x61,0x42,0xA3,0xAC,0xEA,0x23,0x2A,0x43,0xA3,0x64,0xA3,0xAC,0xEA,0xAC,0xEB,0x60,0x33,0x6D,0xEA,0x12,0xB3,0x40,0xCB,0x1A,0x10,0x08,0x72,0x18,0x61,0x40,0x9C,0x66,0x6B,0x9D,0x67,0x06,0xD2,0x0E,0xB2,0x70,0xCC,0xFD,0x67,0x80,0x9A,0x00,0x6D,0x04,0x06,0x24,0x4F,0xA9, +0xE7,0x40,0xA2,0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x06,0x95,0x07,0x96,0x00,0x18,0x40,0x1E,0x08,0x97,0x03,0x10,0x00,0x18,0x64,0x8B,0x00,0x65,0x0C,0x97,0x00,0xEF,0x07,0x63,0x0C,0xA1,0x11,0x80,0x84,0x21,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x44,0xAC,0x24,0x67,0x66,0x72,0x34,0x61,0x00,0x9C,0xE1,0xF7,0x1F,0x6A,0xBD,0x67,0x80,0x98,0x10,0x4D,0x4C,0xEC,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x2A,0xDF,0x4C,0xEC,0x82,0x67,0x29,0x2A,0x5D,0x67,0x68,0xAA,0xFF,0xF7,0x1F,0x6A,0x4C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x12,0xB3,0x48,0x32,0x69,0xE2,0x20,0xF0,0x78,0xA2,0x03,0x73,0x14,0x60,0xE0,0xF7,0x08,0x6A,0x47,0xEB,0x01,0x6B,0x6C,0xEA,0x0E,0x22,0x0C,0xB3,0x00,0xF4,0x84,0xD8,0x40,0x9B,0x02,0x2A,0x00,0xDB,0x04,0x10,0x0A,0xB2,0x40,0x9A,0x00,0xF4,0x04,0xDA,0x08,0xB2,0x00,0xDA,0x03,0x10,0x00,0x18,0x18,0x58,0x91,0x67,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0x10,0xA1,0x11,0x80,0x14,0xA1,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x0B,0xB0,0xE3,0xF7,0x1F,0x6B,0x7C,0x6C,0x40,0x98,0x01,0x6D,0x56,0x32,0x6C,0xEA,0x69,0x98,0x58,0xEB,0x12,0xEA,0x00,0x18,0xEB,0x9F,0x4A,0xD8,0x6B,0x98,0x05,0x97,0x4D,0xE3,0x6B,0xD8,0x04,0x90,0x00,0xEF,0x03,0x63,0xCC,0xA0,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0x3B,0xB0,0xBD,0x67,0x10,0x4D,0x90,0xA0,0x4F,0xA0,0x80,0x34,0x4D,0xEC,0x4E,0xA0,0x80,0x34,0x00,0x18,0x3A,0xBA,0x4D,0xEC,0x7D,0x67,0x48,0xAB,0x8F,0xA0,0xFD,0x67,0x4C,0xCB,0x49,0xAB,0x4D,0xCB,0x6A,0xAB,0x03,0x6A,0x4C,0xEB,0x4E,0xA0,0x48,0x32,0x4D,0xEB,0x80,0x32,0x48,0x32,0x4D,0xEB,0x50,0xA0,0x6E,0xCF,0x70,0x80,0x48,0x32,0x9A,0x34,0x4D,0xEC,0x00,0x53,0x8F,0xCF,0x05,0x60,0x09,0xF4,0x00,0x6A,0x8D,0xEA,0x4F,0xCF,0x06,0x10,0x0A,0xF0,0x00,0x6A,0x4B,0xEA,0x8D,0xEA,0x7D,0x67,0x4F,0xCB,0x9D,0x67,0x10,0x4C,0xFF,0xF7,0x1F,0x6F,0x0F,0x6A,0x00,0x6E,0x2C,0x65,0x0F,0x65,0x01,0x69,0x4A,0x65,0x89,0x67,0xC4,0x30,0x89,0xE0,0x84,0xAA,0x00,0x6D,0xE8,0x67,0x65,0x67,0xEC,0xEC,0x44,0x67,0x47,0xEB,0x2C,0xEA,0x07,0x22,0xEA,0x67,0x6B,0xE7,0xF1,0x67,0xE4,0xEA,0xED,0xED,0x48,0x67,0x4C,0xED, +0x01,0x4B,0xFF,0x6F,0xEC,0xEB,0x10,0x5B,0xF0,0x61,0x01,0x4E,0x69,0x67,0xEC,0xEE,0x69,0xE0,0x04,0x5E,0xA4,0xCA,0xE1,0x61,0xFD,0x67,0xCC,0xAF,0x51,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x5D,0x67,0xCD,0xAA,0x50,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x7D,0x67,0xCE,0xAB,0x4F,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0xFD,0x67,0xCF,0xAF,0x4E,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x0A,0x97,0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0xCC,0xA0,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6B,0x04,0xD3,0x6C,0xEA,0xFF,0x6B,0x02,0x4B,0x6B,0xEB,0x6C,0xEA,0xFF,0x6B,0x01,0x4B,0xC2,0x67,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x51,0xB1,0x52,0xB3,0x07,0x68,0x41,0x99,0x51,0xB4,0x01,0x6D,0x4E,0x32,0x0C,0xEA,0x69,0xE2,0x60,0xA2,0x40,0x99,0x0C,0xEB,0x40,0xF6,0x60,0x33,0x8C,0xEA,0x6D,0xEA,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x40,0xD9,0x04,0x93,0x57,0x6C,0x01,0x6D,0x4C,0xEB,0x71,0x6A,0x04,0xD3,0x4B,0xEA,0x4C,0xEB,0x40,0x99,0xC3,0x67,0x40,0xF6,0x42,0x32,0x0C,0xEA,0x50,0x32,0x00,0x18,0x01,0xA0,0x4D,0xEE,0x40,0x99,0x01,0x6B,0x03,0x67,0x6C,0xEA,0x06,0x22,0x41,0x99,0x80,0x6B,0x6C,0xEA,0x01,0x5A,0x18,0x67,0x02,0x48,0x56,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x00,0x36,0x37,0xB0,0xFF,0xF7,0x1F,0x69,0x1C,0xF0,0x00,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x60,0x98,0xE3,0xF7,0x1F,0x6C,0xD8,0x36,0x76,0x33,0x8C,0xEB,0x6D,0xEE,0xFB,0xF7,0x1F,0x6B,0x6C,0xEE,0x4D,0xEE,0x56,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x47,0xA0,0xC6,0xA0,0x58,0x6C,0x40,0x32,0x4D,0xEE,0x00,0x18,0x01,0xA0,0x01,0x6D,0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xC8,0xA0,0x04,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x03,0x6B,0x6C,0xEE,0x4D,0xEE,0x59,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x80,0x18,0x9A,0x2C,0x00,0x65,0x40,0x98,0xC0,0xF7,0x42,0x32,0x24,0x22,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x81,0x6B,0x2C,0xEA,0x6B,0xEB,0x6C,0xEA,0xC2,0x67,0x80,0x6B,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x4C,0xE9,0xE0,0xF1,0x1D,0x6A,0x4B,0xEA,0x4C,0xE9,0x45,0xA0,0xFF,0x6B,0xD1,0x67,0x6C,0xEA,0x48,0x32,0xE0, +0xF1,0x1C,0x6B,0x6C,0xEA,0x59,0x6C,0x01,0x6D,0x4D,0xEE,0x0B,0x10,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x4C,0xE9,0x81,0x6A,0x4B,0xEA,0xD1,0x67,0x57,0x6C,0x01,0x6D,0x4C,0xEE,0x00,0x18,0x01,0xA0,0x00,0x65,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0xCC,0xA0,0x11,0x80,0xD8,0xDF,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x0F,0xB1,0xFF,0x68,0x8C,0xE8,0x47,0x99,0x4F,0xEA,0x04,0x22,0x87,0x41,0x00,0x18,0xFD,0x1D,0x15,0x4C,0x0E,0x20,0x0B,0xB6,0x00,0x68,0xA7,0x41,0x01,0x6C,0x15,0x4D,0xF0,0x67,0x00,0x18,0xF3,0x1D,0x04,0xD0,0x87,0x99,0x00,0x18,0x0C,0x1E,0x14,0x6D,0x10,0xC9,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0xCC,0xA0,0x11,0x80,0xF9,0xB5,0x10,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x00,0x6C,0x02,0xF0,0x00,0x6E,0x00,0x18,0x01,0xA0,0xA4,0x67,0x2D,0xB2,0x3C,0x6C,0x00,0x6D,0xC0,0x9A,0x7F,0x6A,0xFF,0xF7,0x1F,0x68,0x80,0xF4,0xC2,0x36,0x4C,0xEE,0xC4,0x36,0xFF,0x6A,0x01,0x4E,0x4C,0xEE,0x00,0x18,0x01,0xA0,0xC0,0x36,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x01,0xF6,0x01,0x69,0x2B,0xE9,0xC2,0x67,0x2C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x2C,0xEA,0x01,0xF6,0x00,0x6B,0xC2,0x67,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x03,0x69,0x2B,0xE9,0xC2,0x67,0x2C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x2C,0xEA,0x02,0x6B,0xC2,0x67,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x4C,0xE8,0xD0,0x67,0x2C,0xEE,0x01,0x6D,0x00,0x18,0x01,0xA0,0x57,0x6C,0x80,0x18,0x38,0x2D,0x01,0x6C,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63,0xCC,0xA0,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x1A,0xB2,0x06,0xD4,0x47,0x9A,0x8E,0xEA,0x05,0x22,0x8F,0xEA,0x03,0x22,0x00,0x18,0xFD,0x1D,0x06,0x04,0x15,0xB0,0x42,0x6B,0x41,0x98,0x6C,0xEA,0x6A,0xEA,0x08,0x60,0x47,0x98,0x4F,0xEA,0x1C,0x22,0x87,0x40,0x00,0x18,0xFD,0x1D,0x15,0x4C,0x17,0x10,0x7D,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x02,0x6E, +0x4C,0xEE,0x04,0x26,0x50,0xA8,0x01,0x4A,0x50,0xC8,0x0C,0x10,0x86,0x67,0x00,0x18,0x01,0xA0,0xA6,0x67,0x49,0x98,0x01,0x4A,0x80,0x18,0x8D,0x2C,0x49,0xD8,0x80,0x18,0x4B,0x2D,0x00,0x65,0x05,0x97,0x04,0x90,0x00,0xEF,0x03,0x63,0xCC,0xA0,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x00,0x6C,0xC4,0x67,0x00,0x18,0x01,0xA0,0xA4,0x67,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0xFF,0x6A,0x04,0x4A,0x4B,0xEA,0x4C,0xEE,0x01,0x6D,0x00,0x18,0x01,0xA0,0x57,0x6C,0x0A,0xB0,0x41,0x6B,0x6B,0xEB,0x41,0x98,0x00,0x6C,0x6C,0xEA,0x80,0x18,0x38,0x2D,0x41,0xD8,0x80,0x18,0x8D,0x2C,0x00,0x65,0x00,0x6A,0x49,0xC0,0x05,0x97,0x04,0x90,0x00,0xEF,0x03,0x63,0x00,0x00,0xCC,0xA0,0x11,0x80,0xFD,0x63,0x04,0x62,0x80,0x18,0xD8,0x2C,0x00,0x65,0x0D,0xB3,0x00,0x6A,0x59,0x6C,0x4B,0xDB,0x49,0xDB,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x00,0xF2,0x01,0x6A,0x4B,0xEA,0x59,0x6C,0x01,0x6D,0x00,0x18,0x01,0xA0,0x4C,0xEE,0x80,0x18,0x4B,0x2D,0x00,0x65,0x04,0x97,0x00,0xEF,0x03,0x63,0xCC,0xA0,0x11,0x80,0xFD,0x63,0x04,0x62,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x02,0xF1,0x01,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x00,0x6C,0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x06,0xB4,0x41,0x6B,0x6B,0xEB,0x41,0x9C,0x04,0x97,0x6C,0xEA,0x41,0xDC,0x00,0x6A,0x49,0xC4,0x00,0xEF,0x03,0x63,0x00,0x00,0xCC,0xA0,0x11,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x80,0x18,0xD8,0x2C,0x00,0x65,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x69,0x02,0xF0,0x01,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x02,0xF0,0x00,0x68,0xC2,0x67,0x0D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x2C,0xEA,0x00,0xF2,0x01,0x6B,0x6B,0xEB,0xC2,0x67,0x6C,0xEE,0x59,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x00,0x6C,0xD0,0x67,0x00,0x18,0x01,0xA0,0xA4,0x67,0x28,0xB2,0x03,0x6C,0x00,0x6D,0x00,0x9A,0x07,0x6A,0x00,0xF7,0x02,0x30,0x00,0x18,0xEB,0x9F,0x4C,0xE8,0x2C,0xEA,0x1F,0xF4,0x01,0x6B,0x6B,0xEB,0x6C,0xEA,0x21,0xB3,0x05,0x48,0x1F,0xF4,0x00,0x6C,0x61,0xE0,0x20,0xF1,0x7A,0xA0,0xC2, +0x67,0x00,0x6D,0x60,0x33,0x68,0x33,0x8C,0xEB,0x6D,0xEE,0x00,0x18,0x01,0xA0,0x03,0x6C,0x18,0xB3,0x7F,0x6A,0x3C,0x6C,0xC0,0x9B,0x00,0x6D,0x01,0x68,0x80,0xF4,0xC2,0x36,0x4C,0xEE,0xC4,0x36,0xFF,0x6A,0x06,0x4E,0x4C,0xEE,0x00,0x18,0x01,0xA0,0xC0,0x36,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x02,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0xC2,0x67,0x0D,0xEE,0xB0,0x67,0x00,0x18,0x01,0xA0,0x57,0x6C,0xB0,0x67,0x00,0x18,0xEB,0x9F,0x57,0x6C,0x02,0x6E,0x4C,0xE9,0xCB,0xEE,0xB0,0x67,0x2C,0xEE,0x00,0x18,0x01,0xA0,0x57,0x6C,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63,0x00,0x00,0xCC,0xA0,0x11,0x80,0xDC,0x00,0x11,0x80,0xFD,0x63,0x04,0x62,0x7F,0xF7,0x0F,0x6D,0x00,0x18,0x5D,0xBA,0x5E,0x6C,0x0E,0xB2,0xFF,0xF6,0x1F,0x6D,0x00,0x18,0x5D,0xBA,0x81,0xA2,0xFF,0x6D,0xD8,0x6C,0x00,0x18,0x9A,0x33,0x08,0x4D,0xFF,0x6C,0x09,0x4C,0x00,0x18,0x9A,0x33,0x00,0x6D,0x07,0xB4,0x41,0x6B,0x6B,0xEB,0x41,0x9C,0x04,0x97,0x6C,0xEA,0x41,0xDC,0x00,0x6A,0x49,0xC4,0x00,0xEF,0x03,0x63,0x30,0xF4,0x04,0x80,0xCC,0xA0,0x11,0x80,0xF7,0x63,0x10,0x62,0x0F,0xD1,0x0E,0xD0,0x72,0xB5,0x73,0xB3,0x07,0x6C,0xC0,0x9D,0xFF,0xF7,0x1F,0x6F,0xC0,0x32,0x58,0x32,0x80,0xF5,0x42,0x31,0x41,0x9D,0x4E,0x32,0x8C,0xEA,0x69,0xE2,0x60,0xA2,0x6D,0xB2,0x8C,0xEB,0x40,0xF6,0x60,0x33,0xCC,0xEA,0x6D,0xEA,0x40,0xF6,0x42,0x33,0x40,0xDD,0xFF,0x6E,0x8C,0xEB,0x61,0x21,0x51,0x67,0xEC,0xE9,0x00,0xF4,0x01,0x59,0x02,0x61,0x00,0xF4,0x00,0x6A,0x27,0x67,0x4C,0xE9,0x4F,0x43,0xCC,0xEA,0x04,0x5A,0x23,0x61,0x61,0xB0,0x00,0x6F,0x5D,0x67,0x06,0xD7,0x0C,0xCA,0x06,0x92,0x5F,0xB3,0x80,0xF4,0x20,0x34,0x01,0x6D,0x6C,0xEA,0x8D,0xEA,0x06,0xD2,0x5D,0xB2,0x9D,0x67,0x18,0x4C,0xC5,0x67,0x07,0xD2,0x04,0xD7,0x05,0xD7,0x3C,0x10,0xE0,0xF7,0x1F,0x6A,0x4C,0xEB,0x49,0x67,0x80,0xF4,0x60,0x33,0xCC,0xEA,0x6D,0xEA,0x40,0xDC,0x54,0xB2,0xFF,0x6D,0xEC,0xED,0x41,0xDC,0x28,0x10,0x53,0xB2,0x60,0x33,0x00,0x6D,0x41,0xE3,0x5D,0x67,0x18,0x4A,0xAA,0x65,0x4D,0xB2,0x71,0x67,0x0D,0x65,0x2A,0x65,0x4E,0xB2,0x6F,0x65,0x4E,0x65,0x8A,0x65,0xAC,0x32,0xCD,0x67,0xD1,0xE2,0x48,0x67,0x40,0xDC,0x00,0xF1,0x01,0x5B,0x00,0xCC,0x41,0xDC,0xC0,0x9C,0xE1,0x45, +0xD7,0x61,0x49,0x67,0xCC,0xEA,0xAC,0x67,0xAD,0xEA,0xAA,0x67,0x80,0x4B,0xEC,0xED,0x80,0x4B,0xCB,0x67,0x04,0x5D,0x40,0xDC,0xCC,0xEB,0xE7,0x61,0x00,0x6F,0x9D,0x67,0x04,0xD7,0x05,0xD7,0x18,0x4C,0x01,0x6E,0x00,0x18,0xF7,0x33,0x00,0x65,0x34,0xB2,0xC4,0x6C,0xA0,0x9A,0x7F,0x6A,0x80,0xF4,0xA2,0x35,0x4C,0xED,0xA0,0x32,0x00,0x18,0x9A,0x33,0x4D,0xED,0x5E,0x6C,0x00,0x18,0x78,0xBA,0x60,0x6D,0x35,0xB2,0x35,0xB0,0x2C,0xB3,0x81,0xA2,0x01,0xF4,0x00,0x6D,0x09,0xE4,0x40,0xAA,0x4C,0xED,0x40,0x9B,0x0F,0x6B,0x46,0x32,0x6C,0xEA,0x40,0x32,0x50,0x32,0x4D,0xED,0x00,0x18,0x9A,0x33,0x2D,0xED,0x2D,0xB2,0x23,0xB6,0xEE,0xF1,0x1F,0x6D,0x21,0xA2,0x60,0x9E,0x01,0xE1,0x40,0xA8,0x07,0x68,0x91,0x67,0x4C,0xED,0x01,0x6A,0x6C,0xEA,0x00,0xF7,0x62,0x33,0x0C,0xEB,0x40,0x32,0x5C,0x32,0x60,0x33,0x64,0x33,0x4D,0xED,0x00,0x18,0x9A,0x33,0x6D,0xED,0x17,0xB2,0x01,0x6C,0xA0,0x9A,0x00,0xF7,0xA2,0x35,0x00,0x18,0x68,0x91,0x0C,0xED,0x13,0xB3,0x01,0x6C,0xA0,0x9B,0x00,0xF7,0xA2,0x35,0x00,0x18,0x82,0x91,0x0C,0xED,0x5E,0x6C,0x00,0x18,0x78,0xBA,0x90,0x6D,0xFF,0x6D,0x91,0x67,0x00,0x18,0x78,0xBA,0x01,0x4D,0xFF,0x6C,0x09,0x4C,0x00,0x18,0x9A,0x33,0x03,0x6D,0xFF,0x6D,0xD8,0x6C,0x00,0x18,0x9A,0x33,0x08,0x4D,0xFE,0xF7,0x1F,0x6D,0x00,0x18,0x5D,0xBA,0x5E,0x6C,0x10,0x97,0x0F,0x91,0x0E,0x90,0x00,0xEF,0x09,0x63,0x00,0x00,0xCC,0xA0,0x11,0x80,0xE0,0xDF,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0x00,0xF8,0x10,0x80,0xFF,0xFF,0x03,0xE0,0x00,0x00,0x00,0x80,0x00,0xFB,0x10,0x80,0x00,0x00,0x00,0x04,0x38,0xF4,0x04,0x80,0x00,0x00,0x00,0xB6,0x30,0xF4,0x04,0x80,0xE0,0x63,0x3F,0x62,0x3E,0xD0,0x0F,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x00,0x68,0x7D,0x67,0x04,0xF0,0x1F,0x6A,0x9D,0x67,0x12,0xC3,0x48,0xCB,0x00,0x18,0xEC,0xC6,0x10,0x4C,0x08,0xB4,0x04,0x63,0x41,0x6B,0x41,0x9C,0x09,0xC4,0x3F,0x97,0x3E,0x90,0x6B,0xEB,0x6C,0xEA,0x41,0xDC,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0xCC,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x18,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x16,0xB5,0x17,0xB3,0x07,0x6E,0x41,0x9D,0x16,0xB4,0x4E,0x32,0xCC,0xEA,0x69,0xE2,0x40,0xA2,0x60,0x9D,0xCC, +0xEA,0x40,0xF6,0x40,0x32,0x8C,0xEB,0x4D,0xEB,0x9D,0x67,0x04,0xF0,0x1E,0x6A,0x60,0xDD,0x48,0xCC,0x03,0x6A,0x52,0xC4,0x80,0xF4,0x62,0x32,0x7F,0x6C,0x8C,0xEA,0x9D,0x67,0x53,0xC4,0x62,0x32,0x40,0xF6,0x62,0x33,0xCC,0xEB,0x75,0xC4,0x54,0xC4,0x00,0x18,0xAA,0xC6,0x10,0x4C,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0xCC,0xA0,0x11,0x80,0xD0,0xDF,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0xE0,0x63,0x3E,0x62,0x3D,0xD1,0x3C,0xD0,0x11,0xB4,0xFB,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x7D,0x67,0x04,0xF0,0x1F,0x6A,0x48,0xCB,0x0D,0xB2,0x0E,0xB0,0x00,0x69,0xA1,0xF1,0x48,0xAA,0x9D,0x67,0x32,0xC3,0x49,0xD8,0x00,0x18,0xEC,0xC6,0x10,0x4C,0x41,0x98,0x41,0x6B,0x6B,0xEB,0x05,0x63,0x6C,0xEA,0x29,0xC0,0x41,0xD8,0x3E,0x97,0x3D,0x91,0x3C,0x90,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0x58,0x46,0x11,0x80,0xCC,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x0E,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x7D,0x67,0x04,0xF0,0x1D,0x6A,0x48,0xCB,0x01,0x6A,0x52,0xC3,0x09,0xB2,0x7F,0x6B,0x9D,0x67,0x40,0x9A,0x10,0x4C,0x80,0xF4,0x42,0x32,0x6C,0xEA,0x7D,0x67,0x00,0x18,0x7C,0xC6,0x53,0xC3,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x76,0x5D,0x11,0x80,0xCC,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x24,0xB4,0xFC,0x63,0x08,0x6E,0x00,0x18,0x64,0x2E,0x00,0x6D,0x7D,0x67,0x04,0xF0,0x0D,0x6A,0x48,0xCB,0x19,0x6A,0x00,0x6C,0x52,0xC3,0x60,0x6A,0x4B,0xEA,0x53,0xC3,0x94,0xC3,0x55,0xC3,0x96,0xC3,0x97,0xC3,0x98,0xC3,0x1B,0xB3,0xBD,0x67,0x9F,0xC5,0x54,0xA3,0x20,0xF0,0x80,0xC5,0x20,0xF0,0x82,0xC5,0x59,0xC5,0x55,0xA3,0x20,0xF0,0x84,0xC5,0x20,0xF0,0x85,0xC5,0x5A,0xC5,0x56,0xA3,0x20,0xF0,0x87,0xC5,0x20,0xF0,0x89,0xC5,0x5B,0xC5,0x57,0xA3,0x5C,0xC5,0x58,0xA3,0x5D,0xC5,0x59,0xA3,0x5E,0xC5,0x02,0x6A,0x20,0xF0,0x41,0xC5,0x20,0xF0,0x43,0xC5,0x1E,0x6A,0x20,0xF0,0x46,0xC5,0x12,0x6A,0x20,0xF0,0x48,0xC5,0x20,0xF0,0x4A,0xC5,0x20,0xF0,0x8B,0xC5,0x9D,0x67,0x00,0x18,0xFC,0xC2,0x10,0x4C,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0xCC,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x1A,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E, +0x7D,0x67,0x04,0xF0,0x06,0x6A,0x48,0xCB,0x0F,0x6A,0x9D,0x67,0x52,0xC3,0x00,0x6A,0x54,0xC4,0x56,0xC4,0x57,0xC4,0x58,0xC4,0x59,0xC4,0x5A,0xC4,0x5B,0xC4,0x5C,0xC4,0x5D,0xC4,0x5E,0xC4,0x5F,0xC4,0x07,0x6A,0x20,0x6B,0x20,0xF0,0x40,0xC4,0x03,0x6A,0x73,0xC4,0x75,0xC4,0x20,0xF0,0x41,0xC4,0x00,0x18,0xA8,0xC1,0x10,0x4C,0x7D,0x67,0x04,0xF0,0x0A,0x6A,0x48,0xCB,0x9D,0x67,0x01,0x6A,0x52,0xC3,0x53,0xC3,0x00,0x18,0x5E,0xC2,0x10,0x4C,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x76,0x5D,0x11,0x80,0xE0,0x63,0x3E,0x62,0xFB,0x63,0x7D,0x67,0x00,0xF4,0x06,0x6A,0x48,0xCB,0x03,0x6A,0x52,0xC3,0x13,0x6A,0x55,0xC3,0x26,0xB2,0x6D,0xA2,0x08,0x73,0x22,0x60,0x70,0x32,0x69,0xE2,0x24,0xB6,0x48,0x32,0x6B,0xE2,0x48,0x32,0xD1,0xE2,0x20,0xF1,0x4F,0xA4,0x01,0x6D,0xAC,0xEA,0x16,0x22,0x00,0xF1,0x52,0xAE,0x47,0xEB,0xAC,0xEA,0x11,0x22,0x20,0xF1,0x6C,0xAC,0xFF,0xF7,0x1F,0x6A,0x9D,0x67,0x4C,0xEB,0x5D,0x67,0x73,0xC2,0xBD,0x67,0x62,0x32,0x7D,0x67,0x54,0xC3,0x00,0xF1,0x18,0x4D,0x00,0x18,0xD2,0x48,0x10,0x4C,0x13,0xB2,0x6C,0xA2,0x0A,0x73,0x1D,0x60,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x10,0xB3,0x48,0x32,0x71,0xE2,0xE0,0xF0,0x4B,0xA4,0xFF,0x6B,0x6C,0xEA,0x01,0x72,0x0E,0x61,0x60,0xF2,0x7C,0xAC,0x5D,0x67,0x9D,0x67,0x73,0xC2,0xBD,0x67,0x62,0x32,0x7D,0x67,0x54,0xC3,0x00,0xF1,0x18,0x4D,0x00,0x18,0xD2,0x48,0x10,0x4C,0x05,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0xCC,0xA0,0x11,0x80,0x58,0x46,0x11,0x80,0x48,0x60,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x12,0xB0,0x00,0x6A,0xFF,0x6D,0xC0,0xF1,0x46,0xC0,0xC0,0xF1,0x5A,0xC0,0x03,0x6A,0xC0,0xF1,0x58,0xC0,0x0E,0xB2,0x02,0x6B,0xAC,0xEC,0xC0,0xF1,0x65,0xC0,0xC0,0xF1,0x64,0xC0,0xC0,0xF1,0x79,0xC0,0x40,0xF1,0x9E,0xC0,0x60,0xC2,0x00,0x18,0xEB,0xA4,0xAC,0xEC,0x20,0xF1,0x8E,0x40,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x05,0x97,0x04,0x90,0x00,0xEF,0x03,0x63,0x48,0x5C,0x11,0x80,0xBD,0x5B,0x11,0x80,0xE0,0x63,0x3E,0x62,0x3D,0xD1,0x3C,0xD0,0xF5,0x63,0x7D,0x67,0x00,0xF4,0x05,0x6A,0x7E,0xB5,0x54,0xCB,0x9D,0x67,0x0D,0x6A,0x20,0xF0,0x4A,0xC3,0x2B,0x4C,0x00,0x18,0x2E,0x2E,0x06,0x6E,0x7A,0xB0,0x00,0x6A,0x9D,0x67,0x01, +0x6B,0x20,0xF0,0x51,0xC4,0x20,0xF0,0x52,0xC4,0x20,0xF0,0x73,0xC4,0x20,0xF0,0x54,0xC4,0x20,0xF0,0x55,0xC4,0x20,0xF0,0x56,0xC4,0x20,0xF0,0x77,0xC4,0xC0,0xF1,0x46,0xC0,0xC0,0xF1,0x5A,0xC0,0x03,0x6A,0xC0,0xF1,0x58,0xC0,0x6F,0xB2,0x02,0x6B,0xC0,0xF1,0x65,0xC0,0xC0,0xF1,0x64,0xC0,0xC0,0xF1,0x79,0xC0,0x20,0xF1,0x8E,0x40,0x60,0xC2,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x60,0xF1,0x4E,0xA0,0x02,0x72,0x07,0x60,0x03,0x52,0x02,0x60,0x01,0x72,0x01,0x10,0x03,0x72,0x15,0x61,0xAF,0x10,0x63,0xB5,0x00,0x6B,0xFF,0x6C,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x48,0x32,0xA9,0xE2,0x20,0xF0,0x58,0xA2,0x8C,0xEA,0x80,0xF0,0x1F,0x2A,0x01,0x4B,0x8C,0xEB,0x0A,0x5B,0xEF,0x61,0x00,0x18,0xD4,0x5A,0x0A,0x04,0x62,0x67,0x80,0xF0,0x1D,0x2A,0x0A,0x02,0x06,0x4A,0x64,0xA2,0xFF,0xF7,0x1F,0x6C,0xBD,0x67,0x60,0x33,0x4C,0xD3,0x43,0xA2,0x22,0x4D,0x4D,0xEB,0x8C,0xEB,0x4C,0xD3,0x5D,0x67,0x20,0xF0,0x53,0xA2,0x7D,0x67,0x4D,0xD2,0x20,0xF0,0x74,0xA3,0x0A,0x02,0x0A,0x4A,0x4E,0xD3,0x24,0xA2,0x43,0xA2,0x20,0x31,0x8C,0xE9,0x4D,0xE9,0x8C,0xE9,0x9D,0x67,0x20,0xF0,0x97,0xA4,0x4F,0xD4,0x9D,0x67,0x00,0x18,0x8E,0xDF,0x20,0x4C,0x50,0xD2,0x62,0x67,0x75,0x2A,0x5D,0x67,0x71,0xAA,0xFF,0xF7,0x1F,0x6C,0x3D,0xB5,0x8C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x3C,0xB3,0x48,0x32,0x61,0xE2,0xE0,0xF0,0x8D,0x40,0x00,0x18,0x2E,0x2E,0x06,0x6E,0x5D,0x67,0x20,0xF1,0x50,0xAA,0x7D,0x67,0x9D,0x67,0x60,0xF2,0x5E,0xC8,0x20,0xF1,0x74,0xA3,0x5D,0x67,0xE0,0xF0,0x7A,0xC0,0x20,0xF1,0x98,0xA4,0x7D,0x67,0xE0,0xF0,0x9C,0xC0,0x20,0xF1,0x5C,0xA2,0xE0,0xF0,0x5D,0xC0,0x20,0xF0,0x40,0xA3,0xE0,0xF0,0x53,0xC0,0x01,0x6A,0x80,0xF2,0x42,0xC0,0x91,0xAB,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x45,0x95,0x4C,0xEC,0x7D,0x67,0x40,0xF1,0x60,0xA3,0x22,0x32,0x5E,0x32,0x00,0xF1,0x71,0xC0,0x18,0x22,0xEF,0xF7,0x1F,0x6A,0x4C,0xE9,0x01,0x6A,0x80,0xF0,0x3E,0xC8,0x04,0xD2,0x20,0xB2,0xFF,0xF7,0x1F,0x6C,0xFA,0x6D,0x05,0xD2,0x80,0xF0,0x5E,0xA8,0xA4,0xF4,0x1A,0x6E,0x20,0xF5,0x17,0x6F,0x8C,0xEA,0x06,0x6C,0x20,0x18,0x1B,0x32,0x06,0xD2,0x05,0x10,0x5D,0x67,0x40,0xF1,0x40,0xAA,0x80,0xF0, +0x5E,0xC8,0x00,0x18,0x4E,0x9B,0x0A,0x04,0x22,0x67,0x0F,0x22,0x7D,0x67,0x20,0xF0,0x80,0xA3,0xE0,0xF0,0xA8,0xA0,0x00,0x18,0xB6,0xDF,0x00,0x65,0x0B,0xB4,0x00,0x18,0xD3,0xDF,0x00,0x65,0x07,0x10,0x0C,0x6B,0x06,0x10,0x5D,0x67,0x91,0xAA,0x20,0x18,0x13,0x26,0x01,0x6D,0x71,0x67,0x0B,0x63,0x3E,0x97,0x3D,0x91,0x3C,0x90,0x43,0x67,0x00,0xEF,0x20,0x63,0x00,0x00,0xE0,0xA0,0x11,0x80,0x48,0x5C,0x11,0x80,0xBD,0x5B,0x11,0x80,0x48,0x60,0x11,0x80,0xF0,0xA5,0x10,0x80,0xF3,0x63,0x18,0x62,0x17,0xD1,0x16,0xD0,0x00,0x6A,0x0C,0xD2,0x0D,0xD2,0x0E,0xD2,0x7D,0x67,0x01,0xF4,0x03,0x6A,0x1A,0xD4,0x54,0xCB,0x62,0xA4,0x23,0xA4,0x26,0x5B,0x20,0xF4,0x05,0x60,0x00,0xF0,0x10,0x0A,0x64,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3,0x00,0xEB,0x00,0x65,0x4D,0x00,0x59,0x00,0xAD,0x00,0x77,0x02,0x23,0x03,0x63,0x03,0xEF,0x03,0x3F,0x08,0x11,0x04,0x25,0x04,0x43,0x04,0x57,0x04,0x25,0x07,0xC7,0x05,0x6B,0x04,0x97,0x05,0xAF,0x05,0x25,0x07,0xD7,0x05,0xE9,0x05,0xFB,0x05,0x29,0x06,0x35,0x06,0x4B,0x06,0x57,0x06,0x6B,0x06,0x7B,0x06,0x8B,0x06,0x97,0x06,0xA9,0x06,0x3B,0x08,0x3B,0x08,0x3B,0x08,0x3B,0x08,0xC7,0x06,0x07,0x07,0x13,0x07,0x31,0x08,0x21,0xF0,0x04,0xB2,0x03,0x6C,0x40,0xAA,0x0C,0xD2,0x17,0x13,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x02,0xF1,0x03,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x00,0x6C,0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x80,0x18,0x38,0x2D,0x00,0x6C,0x00,0x18,0xFE,0x4F,0x00,0x65,0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18,0x95,0x2B,0xC5,0x67,0xC0,0xF7,0x1C,0xB3,0x0A,0x6A,0x4C,0xC3,0x08,0x6A,0x4D,0xC3,0x00,0x6A,0x49,0xC3,0x4A,0xC3,0xC9,0x13,0x0B,0x59,0x18,0x67,0xA0,0xF3,0x0D,0x20,0xC0,0xF7,0x00,0xB4,0x05,0x21,0x41,0x9C,0x40,0x6B,0x6C,0xEA,0x07,0x22,0x8F,0x13,0x41,0x9C,0x40,0x6B,0x6C,0xEA,0x02,0x2A,0x29,0xC4,0xB7,0x13,0xA0,0xF7,0x04,0xB3,0x04,0x6A,0xFA,0x6D,0x89,0xA3,0x29,0xC3,0x04,0xD2,0x80,0xF7,0x1C,0xB2,0x06,0xD1,0x0B,0xD4,0x05,0xD2,0x4A,0xA3,0x01,0x6C,0xA4,0xF1,0x00,0x6E,0x07,0xD2,0x61,0x9B,0xE1,0xF4,0x11,0x6F,0x6A,0x32,0x66,0xEC,0x8C,0xEA,0x8C,0xEB,0x08,0xD2,0x20,0x18,0x1B,0x32,0x09,0xD3,0xA0, +0xF0,0x08,0x20,0x00,0xF0,0x10,0x0A,0x24,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3,0x00,0xEB,0x00,0x65,0x17,0x00,0x95,0x00,0xC1,0x00,0xF7,0x00,0x17,0x01,0x1B,0x01,0x1F,0x01,0x41,0x01,0x29,0x01,0x31,0x01,0x39,0x01,0x40,0xF7,0x04,0xB2,0x61,0x9A,0x01,0x6A,0x6C,0xEA,0x0B,0x22,0x02,0x6A,0x6C,0xEA,0x04,0x22,0x80,0x18,0x9A,0x2D,0x00,0x65,0x15,0x10,0x80,0x18,0xC0,0x2D,0x00,0x65,0x11,0x10,0x02,0x6A,0x6C,0xEA,0x04,0x22,0x80,0x18,0xD3,0x2E,0x00,0x65,0x0A,0x10,0x04,0x6A,0x6C,0xEA,0x04,0x22,0x80,0x18,0xA4,0x2E,0x00,0x65,0x03,0x10,0x80,0x18,0x12,0x2E,0x00,0x65,0x00,0xF7,0x00,0xB0,0x6B,0x98,0x4A,0x98,0x29,0x98,0x10,0xD3,0x00,0x18,0xFE,0x4F,0x0F,0xD2,0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18,0x95,0x2B,0xC5,0x67,0x0B,0x94,0x0A,0x6A,0x4C,0xC0,0x02,0x5C,0x08,0x6A,0x4D,0xC0,0x40,0xF3,0x0D,0x60,0x0F,0x92,0x10,0x93,0x29,0xD8,0x4A,0xD8,0x6B,0xD8,0x47,0x13,0xC0,0xF6,0x04,0xB4,0x02,0x6A,0x61,0x9C,0x4D,0xEB,0x04,0x6A,0x6C,0xEA,0x61,0xDC,0x07,0x22,0x02,0x6A,0x4B,0xEA,0x6C,0xEA,0x80,0x18,0xE9,0x2E,0x41,0xDC,0x1A,0x10,0x01,0x6A,0x6D,0xEA,0x80,0x18,0xB0,0x2D,0x41,0xDC,0x14,0x10,0x80,0xF6,0x18,0xB4,0x03,0x6A,0x4B,0xEA,0x61,0x9C,0x4C,0xEB,0x02,0x6A,0x4B,0xEA,0x4C,0xEB,0x04,0x6A,0x6C,0xEA,0x61,0xDC,0x04,0x22,0x80,0x18,0xB6,0x2E,0x00,0x65,0x03,0x10,0x80,0x18,0x25,0x2E,0x00,0x65,0x60,0xF6,0x10,0xB2,0x40,0x6C,0x61,0x9A,0x8D,0xEB,0x61,0xDA,0x16,0x13,0x60,0xF6,0x04,0xB0,0x03,0x6B,0x6B,0xEB,0x41,0x98,0x6C,0xEA,0x01,0x6B,0x6D,0xEA,0x80,0x18,0xD2,0x2D,0x41,0xD8,0x41,0x98,0x40,0x6B,0x6D,0xEA,0x41,0xD8,0x06,0x13,0x01,0x6C,0x03,0x10,0x02,0x6C,0x01,0x10,0x03,0x6C,0x80,0x18,0x6B,0x2F,0x00,0x65,0xFD,0x12,0x80,0x18,0xFA,0x2E,0x00,0x65,0xF9,0x12,0x80,0x18,0x21,0x2F,0x00,0x65,0xF5,0x12,0x80,0x18,0x3D,0x2F,0x00,0x65,0xF1,0x12,0x80,0x18,0x80,0x2F,0x00,0x65,0xE0,0xF2,0x0C,0x22,0x12,0x72,0x98,0x67,0x01,0x5C,0x78,0x67,0x01,0x5B,0x58,0x67,0x03,0x4A,0xE3,0x12,0x04,0x59,0xA0,0xF2,0x13,0x60,0x80,0x18,0x38,0x2D,0x00,0x6C,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x02,0xF1,0x03,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D, +0x00,0x6C,0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x00,0x18,0xFE,0x4F,0x00,0x65,0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18,0x95,0x2B,0xC5,0x67,0xA0,0xF5,0x18,0xB0,0x0A,0x6A,0x4C,0xC0,0x08,0x6A,0x2A,0xC0,0x00,0x1C,0xDD,0x31,0x4D,0xC0,0x11,0xD2,0x41,0x98,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0x01,0x71,0x41,0xD8,0x06,0x61,0x80,0x18,0x6B,0x2F,0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0x02,0x71,0x04,0x61,0x41,0x98,0x04,0x6B,0x6D,0xEA,0x41,0xD8,0x00,0x1C,0xE5,0x31,0x11,0x94,0x02,0x6A,0x04,0xD2,0x60,0xF5,0x18,0xB2,0x06,0xD1,0x01,0x6C,0x05,0xD2,0x41,0x98,0xFA,0x6D,0x44,0xF2,0x19,0x6E,0x4A,0x32,0x8C,0xEA,0xE1,0xF4,0x12,0x6F,0x20,0x18,0x1B,0x32,0x07,0xD2,0x8E,0x12,0x4F,0x59,0x25,0x60,0x1A,0x93,0x44,0xA3,0x08,0x5A,0x21,0x60,0x40,0xF5,0x08,0xB5,0x7F,0x6A,0x4C,0xE9,0x80,0x9D,0x40,0xF5,0x04,0xB2,0x80,0xF4,0x20,0x33,0x4C,0xEC,0x6D,0xEC,0x80,0xDD,0x1A,0x92,0x64,0xA2,0xFF,0x6A,0x4C,0xEB,0x07,0x6A,0x4C,0xEB,0x20,0xF5,0x10,0xB2,0x00,0xF7,0x60,0x33,0x8C,0xEA,0x6D,0xEA,0x40,0xDD,0x6E,0x12,0x1A,0x93,0x0A,0x59,0x45,0xA3,0x84,0xA3,0x40,0x32,0x4D,0xEC,0x03,0x61,0x03,0x6C,0x0D,0xD4,0x64,0x12,0x00,0xF5,0x00,0xB6,0x00,0xF5,0x0C,0xB3,0xE3,0xF7,0x1F,0x6A,0xA0,0x9E,0x8C,0xEA,0x54,0x32,0x6C,0xED,0x00,0xF5,0x00,0xB3,0x4D,0xED,0x24,0x32,0x69,0xE2,0x40,0xAA,0xFF,0xF7,0x1F,0x6B,0xA0,0xDE,0x6C,0xEA,0x4C,0x32,0x82,0xEA,0x20,0xF2,0x14,0x61,0x03,0x59,0x05,0x60,0x02,0x6A,0x4B,0xEA,0x4C,0xED,0xA0,0xDE,0x0F,0x10,0x06,0x59,0xFF,0x6B,0x58,0x67,0x01,0x6C,0x6C,0xEA,0x61,0x9E,0x8D,0xED,0x8C,0xEA,0x81,0x6C,0x8B,0xEC,0x5C,0x32,0x8C,0xEB,0x4D,0xEB,0xA0,0xDE,0x61,0xDE,0xA0,0xF4,0x1C,0xB2,0x1F,0x6B,0x6B,0xEB,0x49,0xE1,0x80,0xA2,0x0F,0x6A,0x4C,0xEC,0x40,0x9E,0x84,0x34,0x6C,0xEA,0x8D,0xEA,0x40,0xDE,0x28,0x12,0x1A,0x92,0x85,0xA2,0x05,0x5C,0xE0,0xF1,0x15,0x60,0x60,0xF4,0x1C,0xB5,0x07,0x6A,0x4C,0xEC,0x41,0x9D,0x39,0x6B,0x6B,0xEB,0x8C,0x34,0x6C,0xEA,0x8D,0xEA,0x41,0xDD,0x17,0x12,0x1A,0x94,0x60,0xF4,0x04,0xB3,0x43,0xA4,0x46,0xC3,0x44,0xA4,0x47,0xC3,0x45,0xA4,0x48,0xC3,0x0D,0x12,0x40,0xF4,0x10,0xB5,0x60,0xF4,0x08,0xB3,0x3E,0x34,0x40,0x9D,0xC0,0xF7,0x80,0x34,0x6C,0xEA,0x8D, +0xEA,0x40,0xDD,0x7F,0x6A,0x4C,0xE9,0x25,0xC5,0xFE,0x11,0x1A,0x94,0x20,0xF4,0x10,0xB3,0x43,0xA4,0x4E,0xC3,0x44,0xA4,0x4F,0xC3,0x45,0xA4,0x50,0xC3,0xF4,0x11,0x1A,0x94,0x00,0xF4,0x1C,0xB3,0x43,0xA4,0x51,0xC3,0x44,0xA4,0x52,0xC3,0x45,0xA4,0x53,0xC3,0xEA,0x11,0x00,0xF4,0x0C,0xB6,0xFF,0x6C,0xA4,0x67,0x69,0xA6,0x6C,0xED,0x0A,0x75,0x40,0x61,0x4C,0xA6,0x00,0x6F,0x8C,0xEA,0x0A,0x72,0x14,0x60,0x22,0x67,0x44,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x4C,0x32,0x00,0xF4,0x04,0xB3,0x2B,0xE2,0x48,0x32,0x69,0xE2,0x20,0xF0,0x58,0xA2,0x05,0x6F,0x8C,0xEA,0x04,0x72,0x03,0x60,0x0A,0x6A,0x00,0x6F,0x4C,0xC6,0x4D,0xA6,0x08,0x72,0x6A,0x60,0x22,0x67,0x50,0x32,0x29,0xE2,0xF8,0xB4,0x48,0x32,0x2B,0xE2,0x48,0x32,0x89,0xE2,0x20,0xF1,0x4F,0xA2,0x01,0x6B,0x05,0x6F,0x6C,0xEA,0x05,0x22,0x00,0xF1,0x52,0xAC,0x47,0xE9,0x6C,0xEA,0x57,0x2A,0x08,0x6A,0x00,0x6F,0x4D,0xC6,0x53,0x10,0xEF,0xB0,0x7F,0x4D,0x6E,0x4D,0x05,0x6F,0x90,0x67,0xB5,0xE3,0x06,0x6E,0x00,0x18,0x2E,0x2E,0x15,0xD7,0xFF,0xF7,0x38,0xC0,0x25,0x10,0x4B,0x43,0x8C,0xEA,0x03,0x5A,0x23,0x60,0xE5,0xB5,0x04,0x6F,0x00,0x69,0x24,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x4C,0x32,0x2B,0xE2,0x48,0x33,0xA9,0xE3,0x20,0xF0,0x58,0xA2,0x8C,0xEA,0x04,0x72,0xDF,0x60,0x01,0x49,0x8C,0xE9,0x0A,0x59,0xEF,0x61,0x2D,0x10,0xDC,0xB0,0x60,0xF1,0x02,0x4D,0x05,0x6F,0x90,0x67,0xB5,0xE3,0x06,0x6E,0x00,0x18,0x2E,0x2E,0x15,0xD7,0xFF,0xF7,0x39,0xC0,0x15,0x97,0x1F,0x10,0x48,0x43,0x8C,0xEA,0x02,0x5A,0xE5,0x67,0x1A,0x60,0xD2,0xB5,0x04,0x6F,0x00,0x69,0x01,0x6E,0xFF,0xF7,0x1F,0x68,0x30,0x32,0x29,0xE2,0x48,0x32,0x2B,0xE2,0x48,0x33,0xA9,0xE3,0x20,0xF1,0x4F,0xA2,0xCC,0xEA,0x06,0x22,0x00,0xF1,0x52,0xAD,0x0C,0xEA,0x47,0xE9,0xCC,0xEA,0xD7,0x2A,0x01,0x49,0x8C,0xE9,0x08,0x59,0xEC,0x61,0xBC,0xB2,0x4A,0xA2,0x0C,0xD2,0x0C,0x93,0xE0,0x32,0x4D,0xEB,0x0C,0xD3,0x77,0x10,0xC3,0xB2,0x20,0xF0,0x7C,0xA2,0x0C,0xD3,0x20,0xF0,0x7D,0xA2,0x0C,0x94,0x20,0xF0,0x5E,0xA2,0x60,0x33,0x6D,0xEC,0x85,0x10,0xBD,0xB2,0x20,0xF0,0x7F,0xA2,0x0C,0xD3,0x40,0xF0,0x60,0xA2,0x0C,0x94,0x40,0xF0,0x41,0xA2,0x60,0x33,0x6D,0xEC,0x79,0x10,0x1A,0x93,0x43,0xA3,0x62,0xAB,0x60,0x33, +0x6D,0xEA,0xB5,0xB3,0x41,0xDB,0x34,0x11,0x1A,0x94,0xA7,0xB3,0x43,0xA4,0x54,0xC3,0x44,0xA4,0x55,0xC3,0x45,0xA4,0x56,0xC3,0x2B,0x11,0x1A,0x94,0xA3,0xB3,0x43,0xA4,0x57,0xC3,0x44,0xA4,0x58,0xC3,0x45,0xA4,0x59,0xC3,0x22,0x11,0x4F,0x41,0xFF,0x6B,0x6C,0xEA,0x09,0x5A,0x00,0xF1,0x04,0x60,0x5C,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x79,0x6A,0x4B,0xEA,0x4C,0xEE,0x2C,0x33,0x78,0x6A,0x4C,0xEB,0x5C,0x6C,0x01,0x6D,0x6D,0xEE,0xD6,0x10,0x93,0xB2,0x92,0xAA,0x69,0x9A,0x0C,0xD4,0x9E,0xB4,0x07,0x10,0x90,0xB2,0x69,0x9A,0x62,0x34,0x82,0x34,0x0C,0xD4,0xFF,0xF7,0x1F,0x6C,0x8C,0xEB,0x69,0xDA,0x02,0x6A,0x3C,0x10,0x8B,0xB2,0x96,0xAA,0x6B,0x9A,0x0C,0xD4,0x96,0xB4,0x07,0x10,0x88,0xB2,0x6B,0x9A,0x62,0x34,0x82,0x34,0x0C,0xD4,0xFF,0xF7,0x1F,0x6C,0x8C,0xEB,0x6B,0xDA,0xEE,0x17,0x78,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x02,0x6B,0x0C,0xD2,0x0E,0xD3,0xE2,0x10,0x76,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xD2,0x02,0x6C,0x0E,0xD4,0xDA,0x10,0x77,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xD2,0xD8,0x17,0x78,0xB2,0x74,0xA2,0x0C,0xD3,0x75,0xA2,0x0C,0x94,0x56,0xA2,0x60,0x33,0x6D,0xEC,0x08,0x10,0x73,0xB2,0x77,0xA2,0x0C,0xD3,0x78,0xA2,0x0C,0x94,0x59,0xA2,0x60,0x33,0x6D,0xEC,0x40,0x32,0x40,0x32,0x4D,0xEC,0x0C,0xD4,0x03,0x6A,0x0E,0xD2,0xBC,0x10,0x1A,0x93,0x79,0xB1,0x43,0xA3,0x44,0x33,0x4D,0xE3,0x6C,0x33,0x4D,0xE3,0x40,0x99,0x68,0x30,0x4F,0xEA,0x03,0x22,0x00,0x18,0xFD,0x1D,0x91,0x67,0x0E,0x20,0x00,0x18,0x40,0xA4,0x00,0x65,0x72,0xB6,0x00,0x6F,0x01,0x6C,0xB1,0x67,0x00,0x18,0xF3,0x1D,0x04,0xD7,0x80,0x99,0x00,0x18,0x0C,0x1E,0xB0,0x67,0x6D,0xB2,0x00,0xCA,0x9C,0x10,0x1A,0x94,0x66,0xB2,0x63,0xA4,0x80,0xF1,0x61,0xC2,0x96,0x10,0x1A,0x94,0x00,0x6B,0x43,0xA4,0x01,0x22,0x01,0x6B,0x61,0xB2,0x80,0xF1,0x71,0xC2,0x8D,0x10,0x05,0x59,0x00,0x6A,0x78,0x67,0x12,0xD2,0x70,0x23,0x1A,0x94,0x42,0xA4,0x02,0xAC,0x0C,0x72,0x05,0x61,0x5B,0xB2,0x01,0x6F,0x41,0x9A,0x12,0xD2,0x03,0x10,0x12,0x97,0x03,0x6A,0x0E,0xD2,0x7A,0x23,0x00,0xF0,0x12,0x0A,0x24,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3,0x00,0xEB,0x00,0x65,0x0B,0x00,0x29,0x00,0x83,0x00,0xA5,0x00,0xAF,0x00,0x06, +0x27,0x12,0x96,0x3F,0x6A,0x90,0x67,0x4C,0xEC,0x00,0x6D,0x31,0x10,0x3F,0x6A,0x90,0x67,0x4C,0xEC,0x00,0x18,0xEB,0x9F,0xA7,0x67,0x0C,0xD2,0x5E,0x10,0x02,0x31,0x01,0x6B,0x6C,0xE9,0x09,0x21,0xA3,0x67,0x40,0x6C,0xD1,0x67,0x14,0xD3,0x00,0x18,0x01,0xA0,0x15,0xD7,0x15,0x97,0x14,0x93,0x0C,0x27,0x7F,0x6A,0x4C,0xE8,0x07,0x34,0x40,0x6A,0x12,0x96,0x4D,0xEC,0xFF,0x6A,0x4C,0xEC,0x00,0x18,0x01,0xA0,0xA3,0x67,0x0B,0x10,0x7F,0x6A,0x4C,0xE8,0x07,0x34,0x40,0x6A,0x4D,0xEC,0xFF,0x6A,0x4C,0xEC,0x00,0x18,0xEB,0x9F,0xA3,0x67,0x0C,0xD2,0x38,0x21,0x40,0x6C,0x01,0x6D,0x00,0x6E,0x00,0x18,0x01,0xA0,0x00,0x65,0x31,0x10,0x01,0x6A,0x0C,0xEA,0x03,0x22,0x03,0x6B,0x0D,0xD3,0x2B,0x10,0x08,0x27,0x12,0x95,0xFF,0xF7,0x1F,0x6A,0x90,0x67,0x00,0x18,0x9A,0x33,0x4C,0xED,0x22,0x10,0x30,0xB2,0x12,0x10,0x01,0x6A,0x0C,0xEA,0x05,0x2A,0x2E,0xB2,0x06,0x10,0x01,0x6A,0x0C,0xEA,0x02,0x22,0x03,0x6A,0x15,0x10,0x2C,0xB2,0x06,0x27,0x7D,0x67,0x40,0xF0,0x68,0xAB,0x49,0xE0,0x60,0xCA,0x0E,0x10,0x49,0xE0,0x40,0xAA,0xFF,0xF7,0x1F,0x6C,0x4C,0xEC,0x0C,0xD4,0x07,0x10,0x01,0x6A,0x4C,0xE9,0x24,0xB2,0x20,0xC2,0x02,0x10,0x02,0x6A,0x0D,0xD2,0x0E,0x93,0x0D,0x94,0x70,0x32,0x4D,0xEC,0x1A,0x92,0x83,0xC2,0x1A,0x93,0x1A,0x94,0x41,0xA3,0x10,0x6B,0x6B,0xEB,0x6C,0xEA,0x41,0xC4,0x1A,0x92,0x0C,0x96,0x02,0x6C,0x00,0x18,0x2C,0x2B,0xA0,0x9A,0x18,0x97,0x17,0x91,0x16,0x90,0x00,0xEF,0x0D,0x63,0x00,0x00,0xD2,0x04,0x11,0x80,0xCC,0xA0,0x11,0x80,0xF0,0xA5,0x10,0x80,0xFF,0xFF,0x03,0xFE,0xFF,0xFF,0xFF,0x8F,0x1F,0x00,0xFC,0xFF,0xE8,0xDF,0x10,0x80,0xFC,0xDF,0x10,0x80,0xFF,0xFF,0xFF,0x7F,0x48,0x60,0x11,0x80,0x58,0x46,0x11,0x80,0xE0,0xA0,0x11,0x80,0xDC,0x00,0x11,0x80,0xFC,0xA0,0x11,0x80,0x00,0x00,0xFF,0xFF,0x88,0x07,0x11,0x80,0x01,0x91,0x02,0x80,0x08,0xA1,0x11,0x80,0x00,0x00,0x00,0xB6,0x00,0xA0,0x00,0xB0,0x00,0x10,0x00,0xB6,0x1C,0xA1,0x11,0x80,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0x44,0xAC,0x24,0x67,0x01,0x72,0x55,0x61,0x00,0x9C,0x5D,0x67,0xFA,0x6D,0x20,0xF0,0x08,0xC2,0x02,0x6A,0x04,0xD2,0x45,0xB2,0x06,0xD0,0xE4,0xF4,0x03,0x6E,0x05,0xD2,0x41,0x9C,0xC1,0xF4,0x1C,0x6F,0x04,0x6C,0x20,0x18,0x1B,0x32, +0x07,0xD2,0x3F,0x6A,0x4C,0xE8,0x20,0x70,0x0A,0x61,0x62,0xA1,0xFF,0x6A,0x4C,0xEB,0x06,0x2B,0x3C,0xB2,0x60,0xDA,0x3C,0xB2,0x60,0xDA,0x01,0x6A,0x42,0xC1,0x7D,0x67,0x20,0xF0,0x68,0xA3,0x3F,0x6A,0x6C,0xEA,0x24,0x72,0x03,0x67,0x24,0x61,0x7D,0x67,0x01,0xF4,0x03,0x6A,0x00,0x1C,0xDD,0x31,0x50,0xCB,0x00,0x18,0xFE,0x4F,0x02,0x67,0x00,0x6D,0x9D,0x67,0x20,0x4C,0x80,0x18,0x95,0x2B,0xC5,0x67,0x2F,0xB3,0x40,0x99,0x6C,0xEA,0x2F,0xB3,0x6E,0xEA,0x06,0x2A,0x80,0x18,0x6B,0x2F,0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0xA0,0x99,0x02,0x6C,0x00,0x18,0x2C,0x2B,0x00,0x6E,0x00,0x1C,0xE5,0x31,0x90,0x67,0x3E,0x10,0xFF,0x6A,0x4C,0xE8,0x30,0x70,0x04,0x61,0x80,0x18,0x07,0x30,0x91,0x67,0x36,0x10,0x44,0xA9,0x02,0x72,0x30,0x61,0x21,0xB2,0x00,0xA2,0x2D,0x28,0x40,0x99,0x04,0xF0,0x0F,0x6B,0x6C,0xEA,0x6A,0xEA,0x0B,0x61,0x1E,0xB2,0xFF,0xF7,0x1F,0x6B,0x40,0xAA,0x6C,0xEA,0x40,0x32,0x40,0x32,0x00,0xF2,0x0F,0x6B,0x6D,0xEA,0x40,0xD9,0x02,0x6A,0x04,0xD2,0x11,0xB2,0x05,0x6C,0xFA,0x6D,0x05,0xD2,0x40,0x99,0x24,0xF5,0x13,0x6E,0xC1,0xF4,0x1D,0x6F,0x06,0xD2,0x41,0x99,0x20,0x18,0x1B,0x32,0x07,0xD2,0x11,0xB2,0xFF,0x6B,0x40,0xA2,0x6C,0xEA,0x07,0x22,0x40,0x99,0x6C,0xEA,0x30,0x72,0x03,0x60,0x0E,0xB2,0x00,0xDA,0x03,0x10,0x00,0x18,0xF4,0x2C,0x91,0x67,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0xF0,0xA5,0x10,0x80,0x14,0xE0,0x10,0x80,0x38,0x91,0x10,0x80,0x00,0x00,0xFF,0x00,0x00,0x00,0x01,0x00,0x98,0x00,0x11,0x80,0x04,0x09,0x11,0x80,0x1C,0xA1,0x11,0x80,0x94,0x00,0x11,0x80,0xFD,0x63,0x04,0x62,0x00,0x18,0x23,0xEA,0x00,0x65,0x04,0x97,0x00,0xEF,0x03,0x63,0xEF,0x63,0x20,0x62,0x1F,0xD1,0x1E,0xD0,0x80,0xAC,0x00,0x6A,0xC0,0xB3,0x11,0xD4,0xA0,0xA5,0x1B,0xD2,0x84,0x32,0x89,0xE2,0x4C,0x32,0x8B,0xE2,0x4C,0x32,0x8B,0xE2,0x48,0x32,0x69,0xE2,0x19,0xD2,0x12,0xD5,0xE0,0xF0,0x6C,0xA2,0x18,0xD3,0xA0,0xF0,0x9A,0xAA,0x19,0x93,0x13,0xD4,0xA0,0xF0,0x58,0xAA,0x19,0x94,0x14,0xD2,0xA0,0xF0,0x7C,0xAB,0x19,0x92,0x15,0xD3,0x7D,0x67,0x60,0xF0,0x6C,0xA3,0xC0,0xF0,0x80,0xAC,0x16,0xD4,0xC0,0xF2,0x74,0xC2,0x9D,0x67,0xE0,0xF0,0x13,0xA2,0x60,0xF0,0x8C,0xA4,0xE0,0xF0,0x28,0xA2,0xC0,0xF2,0x95, +0xC2,0xB1,0x67,0x00,0x18,0x7B,0xBB,0x90,0x67,0x17,0xD2,0x17,0x93,0x48,0x32,0x1C,0xD2,0x69,0xE2,0xA6,0xB3,0x44,0x32,0x69,0xE2,0x1A,0xD2,0x19,0x92,0xE0,0xF0,0xA8,0xA2,0x00,0x18,0xC3,0x34,0x90,0x67,0x12,0x93,0x0E,0x23,0x18,0x94,0x01,0x74,0x0B,0x61,0x1A,0x92,0x03,0xF4,0x00,0x6C,0x18,0xF0,0x00,0x6D,0xC3,0xAA,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x8D,0x93,0x4C,0xEE,0x14,0x93,0x05,0x23,0x19,0x94,0x00,0xF2,0x57,0xA4,0x01,0x72,0x15,0x60,0x03,0x6A,0x04,0xD2,0x95,0xB2,0x19,0x93,0x12,0x94,0x05,0xD2,0x14,0x92,0xFA,0x6D,0x64,0xF6,0x09,0x6E,0x06,0xD2,0x00,0xF2,0x57,0xA3,0x64,0xF4,0x18,0x6F,0x08,0xD4,0x04,0x6C,0x20,0x18,0x1B,0x32,0x07,0xD2,0x0C,0x11,0x00,0x1C,0xDD,0x31,0x00,0x65,0x9D,0x67,0x40,0x4C,0xB1,0x67,0x00,0x18,0x3B,0x94,0x1B,0xD2,0x10,0x92,0x88,0xB6,0x46,0x32,0x01,0x4A,0xCC,0xEA,0x10,0xD2,0x19,0x92,0xC0,0xF2,0xEE,0xAA,0x07,0x2F,0x12,0x93,0x01,0x73,0x04,0x61,0x00,0x1C,0xE5,0x31,0x1B,0x94,0xF2,0x10,0x10,0x95,0x08,0x25,0x14,0x94,0x06,0x24,0x9B,0xED,0x01,0x2C,0xE5,0xE8,0x10,0xEA,0x00,0x65,0x01,0x10,0x00,0x6A,0x14,0x93,0xFF,0xF7,0x1F,0x6C,0x4B,0xE3,0x13,0x93,0x8C,0xEA,0x65,0xE2,0x14,0x92,0x23,0xEA,0x01,0x60,0x47,0xE1,0x12,0x93,0x01,0x73,0x18,0x61,0x19,0x92,0xEC,0xEC,0xA0,0xF2,0x74,0x9A,0x14,0xD4,0xCC,0xEB,0x73,0xE5,0xA3,0xEB,0x44,0x67,0x02,0x61,0x6F,0xB2,0x49,0xE4,0x14,0x94,0x9A,0xEA,0x01,0x2C,0xE5,0xE8,0x12,0xE9,0x41,0x41,0x00,0x65,0x98,0xEA,0x12,0xEA,0x65,0xE2,0xA7,0xE1,0xCC,0xE9,0x19,0x94,0xFF,0x6B,0x14,0x35,0xE0,0xF0,0x48,0xA4,0x6C,0xED,0x02,0x6C,0x6C,0xEA,0x40,0x32,0x4C,0x32,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x9A,0x33,0x4C,0xED,0x10,0x92,0x2D,0xE2,0x1D,0xD3,0x08,0x59,0x06,0x60,0x1D,0x94,0x14,0x93,0x71,0xE4,0x65,0xE1,0x1D,0xD4,0xF8,0x17,0x1D,0x94,0x43,0xE4,0x00,0x18,0xC4,0x36,0x04,0x30,0x41,0xE0,0x19,0x92,0x4E,0x6C,0x13,0xDA,0x00,0x18,0x9A,0x33,0x14,0x95,0x1D,0x95,0xFF,0xF7,0x1F,0x6B,0x48,0x6C,0x00,0x18,0x9A,0x33,0x6C,0xED,0x18,0x94,0x03,0x2C,0x16,0x95,0x15,0x90,0x07,0x10,0x15,0x92,0x16,0x93,0xFF,0xF7,0x1F,0x6C,0x00,0x6D,0x61,0xE2,0x8C,0xE8,0x00,0x18,0x9A,0x33,0x4C,0x6C,0x4A,0x6C,0x00,0x18,0x9A,0x33,0xB0,0x67, +0x00,0x6C,0x00,0x18,0x9A,0x33,0x07,0x6D,0x12,0x92,0x0D,0x2A,0x18,0x93,0x01,0x73,0x0A,0x61,0x17,0x94,0x44,0xB2,0x7D,0x67,0x40,0xF0,0x68,0xA3,0x49,0xE4,0x60,0xC2,0x42,0xB2,0x49,0xE4,0x60,0xC2,0x1B,0x94,0x00,0x1C,0xE5,0x31,0x02,0x49,0x00,0x18,0x4E,0x05,0x00,0x65,0x01,0xF0,0x00,0x6D,0x00,0x18,0x78,0xBA,0x5E,0x6C,0x12,0x92,0x21,0x2A,0x18,0x93,0x01,0x73,0x0D,0x61,0x1A,0x92,0x18,0xF0,0x00,0x6C,0x03,0xF4,0x00,0x6D,0x00,0x18,0x8D,0x93,0xC3,0xAA,0x19,0x93,0x20,0x6A,0x00,0xF2,0x55,0xC3,0x11,0x10,0x51,0x59,0x07,0x61,0x11,0x95,0xFF,0xF7,0x1F,0x6A,0x91,0x67,0x00,0x18,0x3A,0x96,0x4C,0xEC,0x1A,0x92,0x18,0xF0,0x00,0x6C,0x01,0xF4,0x00,0x6D,0x00,0x18,0x8D,0x93,0xC3,0xAA,0x18,0x93,0x14,0x2B,0x12,0x94,0x12,0x24,0x51,0x59,0x10,0x61,0x11,0x95,0xFF,0xF7,0x1F,0x68,0x91,0x67,0x00,0x18,0x3A,0x96,0x0C,0xEC,0x1A,0x92,0x01,0xF4,0x00,0x6C,0x18,0xF0,0x00,0x6D,0xC3,0xAA,0x00,0x18,0x8D,0x93,0x0C,0xEE,0x2B,0x6A,0x7D,0x67,0x58,0xCB,0x14,0x94,0x1D,0xB2,0xFD,0x67,0x0A,0xD4,0x80,0x9A,0x00,0x6D,0x04,0x06,0x34,0x4F,0xA9,0xE7,0x40,0xA2,0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x0A,0x95,0x0B,0x96,0x00,0x18,0x40,0x1E,0x0C,0x97,0x17,0x92,0x0F,0x22,0x1C,0x93,0x13,0xB2,0x49,0xE3,0x00,0x6B,0xFF,0xF7,0x7C,0xDA,0x1C,0x94,0x11,0xB2,0x49,0xE4,0xFF,0xF7,0x7C,0xDA,0x10,0xB2,0x49,0xE4,0xFF,0xF7,0x7C,0xDA,0x20,0x97,0x1F,0x91,0x1E,0x90,0x01,0x6A,0x00,0xEF,0x11,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x70,0x45,0x11,0x80,0xF0,0xA5,0x10,0x80,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x08,0x48,0x06,0x11,0x80,0x3C,0x06,0x11,0x80,0x68,0x52,0x11,0x80,0x18,0x07,0x11,0x80,0xE8,0x06,0x11,0x80,0xB8,0x06,0x11,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0xC0,0xAC,0xFF,0xF7,0x1F,0x6A,0xFF,0x6F,0x4C,0xEE,0xEC,0xEE,0x4C,0xED,0x0A,0x65,0xCC,0x32,0xC9,0xE2,0x48,0x32,0x4D,0xB3,0xCB,0xE2,0x48,0x32,0x71,0xE2,0x29,0xA4,0xFF,0xF7,0x1F,0x75,0xEC,0xE9,0x4E,0x61,0x58,0xA4,0xEC,0xEA,0x01,0x72,0x42,0x61,0x47,0xB2,0x49,0xE1,0x40,0xA2,0xEC,0xEA,0x3D,0x2A,0x46,0xB2,0x01,0x6B,0x80,0x9A,0x40,0xF6,0x82,0x32,0x6C,0xEA,0x36,0x22,0xC4,0x30,0xC9,0xE0,0x42,0xB3,0x48,0x32,0xCB,0xE2,0x48,0x32,0x7D, +0xE2,0xB3,0xAF,0x48,0x67,0x80,0xF6,0x82,0x34,0xAC,0xEA,0x0A,0x65,0x03,0x6A,0x4C,0xEC,0x2B,0x65,0x02,0x6A,0x88,0x33,0x44,0xEB,0x68,0x67,0x42,0xEB,0x04,0x60,0x03,0x24,0x41,0x45,0x53,0xCF,0x1C,0x10,0xC9,0xE0,0x48,0x32,0xCB,0xE2,0x48,0x32,0x69,0x67,0x61,0xE2,0x20,0xF0,0x48,0xA0,0x0E,0x2A,0x33,0xB2,0xFF,0xF7,0x1F,0x6B,0xA3,0x67,0x40,0xAA,0xE0,0xF1,0x0E,0x6C,0x4C,0xED,0x08,0xF0,0x00,0x6A,0x4D,0xED,0x00,0x18,0x9A,0x33,0x6C,0xED,0x00,0x6A,0x53,0xC8,0x01,0x6A,0x20,0xF0,0x48,0xC0,0x2A,0xB2,0x00,0x6B,0x49,0xE1,0x60,0xC2,0x24,0xB2,0x49,0xE1,0x60,0xC2,0x3B,0x10,0x1F,0xF7,0x00,0x6A,0xAC,0xEA,0xEC,0xED,0x0C,0x22,0x24,0xB2,0x01,0x6B,0x49,0xE1,0x60,0xC2,0x1E,0xB2,0x03,0x25,0x49,0xE1,0x60,0xC2,0x0B,0x10,0x49,0xE1,0xA0,0xC2,0x08,0x10,0x07,0x25,0x19,0xB2,0x4D,0xE1,0x40,0xA3,0xEC,0xEA,0x02,0x2A,0x01,0x6A,0x40,0xC3,0x58,0xA4,0xFF,0x6D,0x01,0x72,0x1E,0x61,0x14,0xB2,0x49,0xE1,0x40,0xA2,0xAC,0xEA,0x01,0x72,0x18,0x61,0xC4,0x32,0xC9,0xE2,0x48,0x32,0x11,0xB3,0xCB,0xE2,0x48,0x32,0x61,0xE2,0x20,0xF0,0x48,0xA0,0xAC,0xEA,0x09,0x22,0x0E,0xB2,0xF7,0xF7,0x1F,0x6D,0xE0,0xF1,0x0E,0x6C,0x40,0xAA,0x00,0x18,0x9A,0x33,0x4C,0xED,0x00,0x6A,0x53,0xC8,0x20,0xF0,0x48,0xC0,0x06,0x97,0x05,0x91,0x04,0x90,0x01,0x6A,0x00,0xEF,0x04,0x63,0x00,0x00,0x4C,0x7D,0x11,0x80,0xCC,0x05,0x11,0x80,0x00,0x46,0x11,0x80,0x98,0x5F,0x11,0x80,0xEE,0x01,0x00,0xB6,0xD4,0x05,0x11,0x80,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0x00,0xA4,0x24,0xB3,0x04,0x31,0x09,0xE1,0x48,0x32,0x0B,0xE2,0x48,0x32,0x71,0xE2,0x20,0xF0,0x44,0xA4,0x02,0x72,0x20,0x61,0x1F,0xB2,0x01,0x6B,0x40,0x9A,0x40,0xF6,0x42,0x32,0x6C,0xEA,0x0E,0x22,0x20,0xF0,0x48,0xA4,0xFF,0x6B,0x6C,0xEA,0x09,0x22,0x1A,0xB2,0xF7,0xF7,0x1F,0x6D,0xE0,0xF1,0x0E,0x6C,0x40,0xAA,0x00,0x18,0x9A,0x33,0x4C,0xED,0x09,0xE1,0x13,0xB3,0x48,0x32,0x0B,0xE2,0x48,0x32,0x69,0xE2,0x00,0x6B,0x73,0xCA,0x20,0xF0,0x68,0xC2,0x16,0x10,0x39,0x6A,0x7D,0x67,0x50,0xCB,0x10,0xB2,0xFD,0x67,0x06,0xD0,0x80,0x9A,0x00,0x6D,0x04,0x06,0x24,0x4F,0xA9,0xE7,0x40,0xA2,0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x06,0x95,0x07,0x96,0x00,0x18,0x40,0x1E,0x08,0x97, +0x0E,0x97,0x0D,0x91,0x0C,0x90,0x01,0x6A,0x00,0xEF,0x08,0x63,0x98,0x5F,0x11,0x80,0x00,0x46,0x11,0x80,0xEE,0x01,0x00,0xB6,0x28,0x45,0x11,0x80,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0xC0,0xA4,0xFF,0x6B,0x34,0xB2,0x6C,0xEE,0xC4,0x34,0x2A,0x65,0xC9,0xE4,0x48,0x32,0xCB,0xE2,0x48,0x32,0x0C,0x65,0x89,0x67,0x9D,0xE2,0x20,0xF0,0x44,0xA7,0x6C,0xED,0x6C,0xEA,0x02,0x72,0x04,0x60,0x20,0xF0,0x43,0xA7,0x6C,0xEA,0x35,0x2A,0x2B,0xB2,0x01,0x6B,0x00,0x9A,0x40,0xF6,0x02,0x32,0x6C,0xEA,0x45,0x22,0x02,0x75,0x43,0x61,0x03,0x6A,0x80,0xF6,0x02,0x35,0x4C,0xED,0x33,0xAF,0xA8,0x33,0x02,0x6A,0x44,0xEB,0x42,0xE9,0x04,0x60,0x03,0x25,0x41,0x41,0x53,0xCF,0x35,0x10,0x68,0x67,0xC9,0xE3,0x48,0x32,0xCB,0xE2,0x48,0x32,0x89,0x67,0x81,0xE2,0x20,0xF0,0x48,0xA0,0x0E,0x2A,0x1B,0xB2,0xFF,0xF7,0x1F,0x6B,0xA3,0x67,0x40,0xAA,0xE0,0xF1,0x0E,0x6C,0x4C,0xED,0x08,0xF0,0x00,0x6A,0x4D,0xED,0x00,0x18,0x9A,0x33,0x6C,0xED,0x00,0x6A,0x53,0xC8,0x01,0x6A,0x20,0xF0,0x48,0xC0,0x17,0x10,0x3A,0x6A,0x7D,0x67,0x50,0xCB,0x11,0xB2,0xFD,0x67,0x06,0xD6,0x80,0x9A,0x07,0xD5,0x04,0x06,0x00,0x6D,0x24,0x4F,0xA9,0xE7,0x40,0xA2,0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x06,0x95,0x07,0x96,0x00,0x18,0x40,0x1E,0x08,0x97,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x01,0x6A,0x00,0xEF,0x08,0x63,0x00,0x00,0x98,0x5F,0x11,0x80,0x00,0x46,0x11,0x80,0xEE,0x01,0x00,0xB6,0x28,0x45,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0xFF,0xF7,0x1F,0x6A,0x8C,0xEA,0x04,0xD2,0x04,0x93,0x01,0x69,0x44,0xE9,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x20,0xB3,0x48,0x32,0x0D,0xD5,0x69,0xE2,0x05,0xD2,0x00,0x68,0x20,0x18,0xE4,0x06,0x90,0x67,0x01,0x48,0xFF,0x6B,0x6C,0xE8,0x45,0xE1,0x04,0x58,0x6C,0xE9,0xF6,0x61,0x05,0x94,0x44,0x41,0xA0,0xF0,0x88,0xAC,0x98,0xEA,0x17,0xB2,0x06,0xD4,0x60,0xF1,0x42,0xA2,0x6C,0xEA,0x02,0x5A,0x12,0xE9,0x00,0x65,0x06,0x61,0x40,0xF1,0x00,0x59,0x06,0x60,0xFF,0x69,0x41,0x49,0x03,0x10,0xEE,0x59,0x01,0x60,0xEE,0x69,0x00,0x1C,0xDD,0x31,0x00,0x65,0x05,0x93,0x02,0x67,0x26,0x32,0xA0,0xF0,0x48,0xCB,0x04,0x94,0x00,0x18,0x2A,0xFF,0x0D,0x95,0x9D,0x67,0x4C,0xAC,0x05,0x94,0xA0,0xF0,0x48, +0xCC,0x00,0x1C,0xE5,0x31,0x90,0x67,0x0A,0x97,0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0x5D,0x67,0x03,0x46,0x10,0xD4,0x26,0x67,0x13,0xD7,0x06,0x04,0x40,0xF0,0xA4,0xCA,0x06,0x6E,0x00,0x18,0x2E,0x2E,0xB0,0x67,0x69,0xA1,0x9D,0x67,0x09,0xD3,0x40,0xF0,0x64,0xAC,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x4D,0xB3,0x48,0x32,0x69,0xE2,0x0A,0xD2,0x20,0xF0,0x58,0xA2,0x0D,0x72,0x3D,0x60,0x0E,0x52,0x03,0x60,0x06,0x72,0x04,0x60,0x7F,0x10,0x1B,0x72,0x36,0x60,0x7C,0x10,0x13,0x93,0x01,0x6A,0x00,0x6D,0x40,0xC3,0x80,0xA9,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0xC5,0x4A,0x4C,0xEC,0x0A,0x94,0x00,0x18,0xFD,0x1D,0x28,0x4C,0x09,0x93,0x9D,0x67,0x40,0xF0,0x44,0xAC,0x01,0x73,0x14,0x60,0xFF,0xF7,0x1F,0x6C,0x20,0x18,0x7C,0x2F,0x4C,0xEC,0x62,0x67,0x0A,0x92,0xE0,0xF0,0x9F,0xA2,0xFF,0x6A,0x4C,0xEC,0x20,0x6A,0x4C,0xEC,0x01,0x2C,0x64,0x67,0x01,0x73,0x7D,0x67,0x40,0xF0,0x44,0xAB,0x06,0x60,0xFF,0xF7,0x1F,0x6C,0x00,0x18,0xAD,0xE1,0x4C,0xEC,0x52,0x10,0xFF,0xF7,0x1F,0x6C,0x4C,0xEC,0x80,0x18,0x2C,0x34,0x06,0x05,0x4B,0x10,0x00,0x6C,0x40,0x6B,0x1F,0x6A,0x66,0xC0,0x00,0xF0,0x47,0xC8,0x8C,0xC1,0x6A,0xC0,0x27,0xB3,0x00,0xF0,0x4B,0xC8,0x10,0x6A,0x90,0xC1,0x8F,0xC0,0x4E,0xC0,0x50,0xAB,0xBD,0x67,0xDD,0x67,0x50,0xC0,0x50,0xAB,0xE0,0x6B,0x44,0x4D,0x42,0x32,0x54,0xC1,0x20,0xB2,0x92,0xC0,0x20,0x4E,0x41,0xA2,0x91,0x67,0x01,0x6F,0x48,0x32,0x6C,0xEA,0x56,0x32,0xC0,0xF3,0x00,0x6B,0x6D,0xEA,0x00,0xF0,0x53,0xC8,0x13,0x93,0x01,0x6A,0x00,0x18,0x37,0x40,0x40,0xC3,0x02,0x67,0x16,0x22,0x5D,0x67,0x40,0xF0,0x84,0xAA,0xFF,0xF7,0x1F,0x6B,0x00,0x18,0xAE,0x5D,0x6C,0xEC,0x0A,0x94,0x0A,0x96,0x00,0x6F,0x60,0xF2,0xBC,0xAC,0x7F,0x4E,0x04,0xD2,0xFF,0xF7,0x1F,0x6A,0x90,0x67,0x4C,0xED,0x00,0x18,0x6F,0x4E,0x6E,0x4E,0x10,0x93,0x00,0x6C,0x80,0xC3,0x07,0x10,0x10,0x93,0x0C,0x6A,0x40,0xC3,0x03,0x10,0x10,0x94,0x00,0x6A,0x40,0xC4,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xC0,0x5B,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x00,0x1C,0xDD,0x31, +0x00,0x65,0x02,0x67,0x0F,0xB2,0x0F,0xB3,0x40,0x9A,0x6E,0xEA,0x00,0x6B,0x02,0x2A,0x0E,0xB2,0x60,0x9A,0x0E,0xB5,0x62,0x33,0x62,0x33,0x40,0x9D,0xFF,0xF7,0x1F,0x6C,0x60,0x33,0x60,0x33,0x8C,0xEA,0x6D,0xEA,0x40,0xDD,0x00,0x18,0xFE,0x25,0x00,0x6C,0x00,0x1C,0xE5,0x31,0x90,0x67,0x05,0x97,0x04,0x90,0x00,0xEF,0x03,0x63,0x44,0x91,0x10,0x80,0x32,0x97,0x79,0x23,0x48,0x91,0x10,0x80,0x30,0x00,0x00,0xB5,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x2C,0xB5,0x01,0x68,0xFF,0x6E,0x40,0xF1,0x5E,0xA5,0x0C,0xEA,0x4A,0x22,0x2A,0xB2,0x00,0x6F,0xFF,0xF7,0x1F,0x6C,0x60,0xAA,0x02,0xF0,0x00,0x6A,0x6C,0xEA,0x25,0x2A,0x60,0xF1,0x42,0xA5,0xCC,0xEA,0x05,0x2A,0x01,0x10,0x00,0x6F,0x23,0xB2,0xE0,0xCA,0x2E,0x10,0x06,0x67,0x22,0xB1,0x23,0xB6,0x67,0x67,0xA4,0x67,0x64,0x34,0x69,0xE4,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x48,0x32,0x29,0xE2,0xE0,0xF0,0x4B,0xA2,0x0C,0xEA,0x01,0x72,0x05,0x61,0xC9,0xE4,0x40,0xAA,0xAC,0xEA,0x02,0x5A,0xE5,0x61,0x01,0x4B,0xAC,0xEB,0x0A,0x5B,0xEA,0x61,0x12,0x10,0x14,0xB2,0x60,0xAA,0x01,0x4B,0x60,0xCA,0x4F,0xAD,0x8C,0xEB,0x8C,0xEA,0x4A,0x32,0x8C,0xEA,0x43,0xEB,0x07,0x61,0x4D,0xAD,0x8C,0xEA,0x4A,0x32,0x8C,0xEA,0x43,0xEB,0x01,0x61,0xF0,0x67,0x09,0x27,0x00,0x18,0xB7,0xB5,0x00,0x65,0x00,0x18,0x31,0xBE,0x00,0x65,0x07,0xB2,0x00,0x6B,0x60,0xCA,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0x6A,0x00,0xEF,0x04,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0xE0,0x00,0x00,0xB6,0xC8,0xA0,0x11,0x80,0x48,0x60,0x11,0x80,0x10,0x06,0x11,0x80,0xFD,0x63,0x04,0x62,0x44,0xAC,0x04,0x72,0x0F,0x61,0x0A,0xB2,0x00,0x6B,0x00,0x18,0x3B,0x2B,0x60,0xC2,0x08,0xB6,0x00,0x6B,0x0A,0x6D,0xFF,0x6C,0xC9,0xE3,0x01,0x4B,0x8C,0xEB,0x04,0x5B,0xA0,0xC2,0xFA,0x61,0x04,0x97,0x00,0xEF,0x03,0x63,0x00,0x00,0xFE,0x08,0x11,0x80,0xB4,0x5B,0x11,0x80,0xFD,0x63,0x04,0x62,0x80,0x18,0x91,0x2B,0x00,0x65,0x0E,0xB2,0x00,0x6B,0x0F,0xB4,0x60,0xCA,0x0D,0xB2,0x02,0xF0,0x00,0x6D,0x04,0x97,0x60,0xC2,0x0C,0xB2,0x01,0xF0,0x00,0x6B,0xA0,0xF0,0x72,0xCC,0x6C,0xCA,0xAE,0xCA,0x80,0xF0,0x43,0xA4,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0xA0,0xF0,0xB6,0xCC,0x80,0xF0,0x43,0xC4,0x00,0xEF,0x03,0x63,0xC8,0xA0,0x11,0x80,0xCA, +0xA0,0x11,0x80,0xDC,0x00,0x11,0x80,0x48,0x5C,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x44,0xAC,0xC9,0x72,0x24,0x61,0x00,0x1C,0xDD,0x31,0x00,0x65,0x15,0xB1,0x04,0xD2,0x60,0xF1,0x54,0xA1,0x40,0xF1,0x9E,0xA1,0x04,0x99,0x05,0xD2,0x80,0x6A,0x44,0xD9,0x55,0x6A,0x60,0xF1,0x54,0xC1,0x00,0x18,0xEB,0xA4,0x00,0x65,0x60,0xF1,0x54,0xA1,0x04,0xD9,0x55,0x72,0x04,0x60,0x00,0x18,0x31,0xBE,0x00,0x65,0x04,0x10,0x5D,0x67,0x54,0xA2,0x60,0xF1,0x54,0xC1,0x00,0x1C,0xE5,0x31,0x04,0x94,0x03,0x10,0x00,0x18,0x2F,0xB9,0x00,0x65,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0xFD,0x63,0x04,0x62,0x00,0x18,0x24,0xB4,0x00,0x65,0x04,0x97,0x00,0xEF,0x03,0x63,0x0D,0xB2,0xFF,0xF7,0x1F,0x6B,0xAC,0xEB,0x43,0xA2,0x01,0x6D,0xAC,0xEA,0x10,0x22,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x07,0xB3,0x48,0x32,0x69,0xE2,0x60,0xF2,0x4D,0xA2,0xAA,0xEA,0x03,0x61,0x45,0x67,0x20,0xE8,0xA0,0xC4,0x20,0xE8,0x00,0x6A,0x00,0x46,0x11,0x80,0x48,0x60,0x11,0x80,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0xC4,0x67,0xFF,0xF7,0x1F,0x6D,0xAC,0xEE,0xFF,0x76,0x68,0x60,0xC4,0x32,0xC9,0xE2,0x4C,0x32,0xCB,0xE2,0x35,0xB3,0x4C,0x32,0xCB,0xE2,0x48,0x32,0x65,0xE2,0xC0,0xF0,0x74,0xA9,0x40,0x6F,0xAC,0xEB,0x6C,0xEF,0x25,0x27,0x04,0x6A,0x6C,0xEA,0x08,0x22,0xE0,0xF0,0x8D,0x41,0x00,0xF1,0xA7,0x41,0x00,0x18,0x47,0x43,0x0A,0xD6,0x0A,0x96,0x7D,0x67,0x01,0x6A,0x58,0xC3,0x86,0x67,0x00,0x6A,0x03,0x6E,0xBD,0x67,0x5A,0xC3,0x00,0x68,0x00,0xF2,0x4A,0xC1,0x18,0x4D,0x64,0x6A,0xE6,0x67,0x04,0xD2,0x00,0x18,0xA0,0xDD,0x05,0xD0,0x02,0x6C,0x00,0x18,0xE0,0xDC,0xB0,0x67,0x6F,0x99,0x4D,0xEB,0x6F,0xD9,0x2D,0x10,0xE0,0xF0,0x4C,0xA1,0xFF,0x6C,0x01,0x72,0x1C,0xB2,0x15,0x61,0x43,0xA2,0x01,0x6B,0x6C,0xEA,0x04,0x22,0xC0,0xF2,0x58,0xA1,0x8C,0xEA,0x1F,0x2A,0x33,0x6A,0x7D,0x67,0xBD,0x67,0x58,0xC3,0x86,0x67,0x64,0x6A,0x18,0x4D,0x02,0x6E,0x04,0xD2,0x00,0x18,0xA0,0xDD,0x05,0xD7,0x12,0x10,0x43,0xA2,0x01,0x6B,0x6C,0xEA,0x04,0x22,0xC0,0xF2,0x57,0xA1,0x8C,0xEA,0x0A,0x2A,0x60,0xF2,0x4D,0xA1,0x8C,0xEA,0x01,0x72,0x05,0x61,0x9D,0x67,0x20,0x4C,0x80,0x18,0x3D,0x35, +0xA6,0x67,0xC0,0xF0,0x54,0xA9,0x07,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC9,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x00,0x46,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0xFF,0xF7,0x1F,0x6F,0xAC,0xEF,0xE4,0x32,0xE9,0xE2,0x4C,0x32,0xEB,0xE2,0x38,0xB3,0x4C,0x32,0xEB,0xE2,0x48,0x32,0x65,0xE2,0xC0,0xF0,0x54,0xA9,0xFF,0xF7,0x1F,0x6B,0xC4,0x67,0x6C,0xEA,0x02,0x6B,0x6C,0xEA,0x09,0x2A,0xC4,0xA4,0x01,0x6A,0x87,0x67,0x28,0x6D,0x4C,0xEE,0x20,0x18,0x9B,0x27,0x24,0x6F,0x52,0x10,0xF0,0xF0,0x0F,0x41,0xA5,0x46,0x90,0x67,0x08,0x6E,0x00,0x18,0x2E,0x2E,0x04,0xD7,0x29,0xB2,0x01,0x6D,0xFF,0x6E,0x60,0xA2,0x28,0xB2,0x04,0x97,0x83,0xA2,0xAC,0xEC,0x0E,0x24,0xC0,0xF2,0x56,0xA1,0xCC,0xEA,0x03,0x2A,0xC0,0xF2,0xB6,0xC1,0x0C,0x10,0x60,0xF2,0xBC,0xA9,0xFF,0xF7,0x1F,0x6A,0x00,0x6C,0x4C,0xED,0x29,0x10,0x20,0xF0,0x58,0xA1,0xCC,0xEA,0x03,0x72,0x1F,0x61,0x00,0xF1,0x46,0x81,0x00,0x52,0x17,0x60,0x7E,0x32,0x15,0x22,0xC0,0xF0,0x54,0xA9,0x04,0x68,0x03,0x6E,0x0D,0xEA,0x87,0x67,0xC0,0xF0,0x54,0xC9,0x00,0xF1,0xAF,0xC1,0x00,0x18,0x2D,0xE2,0xE6,0x67,0x7F,0x6C,0x00,0x18,0xE0,0xDC,0xB0,0x67,0x6F,0x99,0x4D,0xEB,0x6F,0xD9,0x13,0x10,0x80,0x18,0x4C,0x35,0x87,0x67,0x0F,0x10,0x60,0xF2,0xBC,0xA9,0xFF,0xF7,0x1F,0x6B,0x6C,0xED,0x00,0x18,0xF8,0x4E,0xD0,0x67,0xC0,0xF0,0x54,0xA9,0x03,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC9,0x08,0x97,0x07,0x91,0x06,0x90,0x01,0x6A,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0xC0,0x5B,0x11,0x80,0x00,0x46,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0xFF,0xF7,0x1F,0x69,0xAC,0xE9,0x24,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x38,0xB3,0x4C,0x32,0x2B,0xE2,0x48,0x32,0x0C,0xD4,0x61,0xE2,0xC0,0xF0,0x54,0xA8,0x66,0xA4,0xFF,0xF7,0x1F,0x6C,0x8C,0xEA,0x04,0x6E,0xCC,0xEA,0x06,0x22,0x00,0xF1,0x4F,0xA0,0xFF,0x6D,0xAC,0xEA,0x6E,0xEA,0x0D,0x22,0x0C,0x92,0xFF,0x6C,0x7F,0x6D,0xE4,0xA2,0x24,0x6A,0x04,0xD2,0x8C,0xEF,0x01,0x6A,0x91,0x67,0x00,0x18,0xEF,0xE1,0x4C,0xEF,0x47,0x10,0x02,0x5B,0x0B,0x60,0x0C,0x95,0x6C,0x34,0x11,0xE4,0xE0,0xF0,0x1F,0x4C,0x08,0x4D,0x08,0x6E,0x00,0x18,0x2E,0x2E,0x06,0xD3,0x06, +0x93,0x21,0xB2,0x01,0x6D,0x83,0xA2,0xAC,0xEC,0x15,0x24,0xC0,0xF2,0x57,0xA0,0xFF,0x6C,0x8C,0xEA,0x07,0x2A,0x80,0x18,0x4C,0x35,0x91,0x67,0x01,0x6D,0xC0,0xF2,0xB7,0xC0,0x29,0x10,0x1A,0xB2,0x60,0xF2,0xBC,0xA8,0x00,0x6C,0xF0,0xA2,0x0C,0x92,0x08,0x4A,0x04,0xD2,0x11,0x10,0x20,0xF0,0x58,0xA0,0xFF,0x6D,0xAC,0xEA,0x03,0x72,0x04,0x61,0x00,0x18,0xA5,0xFF,0x91,0x67,0x16,0x10,0x10,0xB2,0x60,0xF2,0xBC,0xA8,0xF0,0xA2,0x0C,0x92,0x08,0x4A,0x04,0xD2,0xFF,0xF7,0x1F,0x6A,0x4C,0xED,0xFF,0x6A,0xC3,0x67,0x00,0x18,0x8A,0x41,0x4C,0xEF,0xC0,0xF0,0x54,0xA8,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC8,0x0A,0x97,0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x00,0x46,0x11,0x80,0xC0,0x5B,0x11,0x80,0xEF,0x63,0x20,0x62,0x1F,0xD1,0x1E,0xD0,0x64,0xAC,0xC4,0x67,0x24,0x73,0x22,0x61,0xB2,0xB2,0x60,0xF1,0x50,0xA2,0x1E,0x22,0x7D,0x67,0x01,0xF4,0x03,0x6A,0x40,0xF0,0x58,0xCB,0x00,0x1C,0xDD,0x31,0x00,0x65,0x00,0x18,0xFE,0x4F,0x02,0x67,0x00,0x6D,0x9D,0x67,0xC5,0x67,0x80,0x18,0x95,0x2B,0x58,0x4C,0x80,0x18,0x6B,0x2F,0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0x20,0x18,0x10,0x2F,0x00,0x65,0x00,0x1C,0xE5,0x31,0x90,0x67,0x3C,0x11,0xFF,0xF7,0x1F,0x69,0x51,0x67,0x6C,0xEA,0x9C,0x72,0x1D,0x61,0x00,0x9E,0xFF,0x6F,0x44,0xA0,0x46,0x32,0x2C,0xEA,0x18,0x72,0x16,0x61,0xBA,0xA0,0x99,0xA0,0xDD,0x67,0xEC,0xED,0xEC,0xEC,0x00,0x18,0x1A,0xDF,0x5A,0x4E,0x06,0x2A,0xBD,0x67,0x40,0xF0,0x9A,0xAD,0x20,0x18,0x62,0x23,0x2C,0xEC,0x20,0x18,0xCF,0x06,0x90,0x67,0x93,0xB2,0xB0,0x67,0x80,0x9A,0x12,0x11,0xFF,0xF7,0x1F,0x6C,0x44,0x67,0x6C,0xEA,0x93,0x72,0x29,0x61,0x00,0x9E,0x44,0xA0,0x46,0x32,0x11,0x72,0x07,0x60,0x7F,0x72,0x22,0x61,0x45,0xA0,0xFF,0x6B,0x6C,0xEA,0x17,0x72,0x1D,0x61,0x6B,0xA8,0x8C,0xEB,0xFF,0x73,0x19,0x60,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x84,0xB3,0x48,0x32,0x69,0xE2,0xBF,0x9A,0x82,0x67,0x00,0x18,0xB2,0x69,0x1C,0xD6,0x01,0x72,0x64,0xA0,0x1C,0x96,0x03,0x61,0x01,0x6A,0x6D,0xEA,0x03,0x10,0x02,0x6A,0x4B,0xEA,0x6C,0xEA,0x44,0xC0,0x44,0xAE,0xFF,0xF7,0x1F,0x6C,0x93,0x72,0xE0,0xF0,0x01,0x61,0x40,0x9E,0x18,0xD2,0x18,0x95, +0x64,0xA2,0xFF,0x6A,0xA5,0xA5,0x22,0x67,0x6C,0xE9,0x4C,0xED,0x18,0x92,0x19,0xD5,0x26,0x31,0x4B,0xAA,0x8C,0xE9,0x7F,0x71,0x8C,0xEA,0x1A,0xD2,0x02,0x61,0x04,0x75,0x07,0x60,0x28,0x71,0x05,0x60,0x2D,0x71,0x03,0x60,0x2E,0x71,0xC0,0xF0,0x06,0x61,0xFF,0x68,0xC1,0x9E,0x50,0x67,0x6C,0xEA,0x18,0x93,0x46,0x31,0xA6,0x67,0x9D,0x67,0xDA,0xC3,0x0C,0xE9,0x5C,0x4C,0x0C,0xED,0x00,0x18,0x3B,0x94,0x1C,0xD6,0x7F,0x71,0x58,0x67,0x1B,0xD2,0x1C,0x96,0x04,0x22,0xE1,0xF4,0x03,0x6F,0x00,0x6B,0x05,0x10,0x18,0x94,0x01,0xF4,0x16,0x6F,0x65,0xA4,0x0C,0xEB,0x10,0x6A,0x04,0xD2,0x5B,0xB2,0x18,0x95,0x08,0xD3,0x05,0xD2,0x17,0x92,0x07,0xD1,0x01,0x6B,0x06,0xD2,0x59,0xA5,0x0A,0xD6,0x04,0x6C,0x09,0xD2,0x44,0xA5,0x6C,0xEA,0x0B,0xD2,0x4B,0xAD,0x0C,0xD2,0x54,0xB2,0x49,0xE6,0x44,0xA2,0x82,0xF6,0x17,0x6E,0x6C,0xEA,0x0D,0xD2,0x44,0xA5,0x0E,0xD2,0x45,0xA5,0x0F,0xD2,0x46,0xA5,0x10,0xD2,0x47,0xA5,0x11,0xD2,0x48,0xA5,0x12,0xD2,0x49,0xA5,0x13,0xD2,0x4A,0xA5,0x14,0xD2,0x4B,0xA5,0xFA,0x6D,0x20,0x18,0x1B,0x32,0x15,0xD2,0x1A,0x92,0xFF,0x72,0x72,0x60,0x1A,0x93,0x44,0x32,0xFF,0x6C,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x3F,0xB3,0x48,0x32,0x61,0xE2,0xE0,0xF0,0x4B,0xA0,0x8C,0xEA,0x01,0x72,0x62,0x61,0x20,0xF0,0x58,0xA0,0xFF,0x6D,0xAC,0xEA,0x0B,0x72,0x13,0x61,0x37,0xB2,0x18,0x95,0x00,0x18,0xE0,0x1D,0x80,0x9A,0x00,0xF2,0x54,0xA0,0xFF,0x6B,0x6C,0xEA,0x01,0x72,0x5B,0x61,0x8D,0x98,0x00,0x18,0x1A,0x1E,0x00,0x6D,0x00,0x6A,0x00,0xF2,0x54,0xC0,0x53,0x10,0x1A,0x94,0x00,0x18,0x5E,0xDE,0x18,0x95,0x1B,0x94,0x08,0x2C,0x19,0x95,0x04,0x75,0x05,0x61,0x18,0x94,0x80,0x18,0xCA,0x35,0x1A,0x95,0x3B,0x10,0x28,0x71,0x05,0x61,0x18,0x94,0x80,0x18,0x8A,0x35,0x1A,0x95,0x34,0x10,0x2D,0x71,0x15,0x61,0x20,0xF0,0x58,0xA0,0x03,0x72,0x2E,0x60,0x05,0x72,0x2C,0x60,0x06,0x72,0x2A,0x60,0x07,0x72,0x28,0x60,0x08,0x72,0x26,0x60,0x09,0x72,0x24,0x60,0x0A,0x72,0x22,0x60,0x18,0x94,0x00,0x18,0x35,0xFC,0x1A,0x95,0x1D,0x10,0x2E,0x71,0x1B,0x61,0x20,0xF0,0x58,0xA0,0x03,0x72,0x0C,0x60,0x05,0x72,0x0A,0x60,0x06,0x72,0x08,0x60,0x07,0x72,0x06,0x60,0x08,0x72,0x04,0x60,0x09,0x72,0x02,0x60,0x0A,0x72,0x07, +0x61,0x1A,0x94,0x2E,0x6D,0x02,0x6E,0x20,0x18,0x9B,0x27,0x24,0x6F,0x04,0x10,0x18,0x94,0x00,0x18,0x0B,0xFC,0x1A,0x95,0x09,0xB2,0x18,0x95,0x80,0x9A,0x00,0x18,0xE0,0x1D,0x00,0x65,0x03,0x10,0x20,0x18,0xFA,0x24,0x86,0x67,0x20,0x97,0x1F,0x91,0x1E,0x90,0x00,0xEF,0x11,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0x64,0x52,0x11,0x80,0x48,0x60,0x11,0x80,0xF0,0xA5,0x10,0x80,0x04,0x46,0x11,0x80,0xFF,0x63,0x00,0xD0,0x0F,0xB0,0xFF,0xF7,0x1F,0x6A,0x4C,0xEC,0x00,0x6B,0xE2,0x67,0xFF,0x6E,0x64,0x32,0x69,0xE2,0x48,0x32,0x6B,0xE2,0x48,0x32,0x15,0xE2,0x43,0xAD,0xEC,0xEA,0x8E,0xEA,0x05,0x2A,0x42,0x9D,0x08,0x72,0x02,0x61,0x00,0x6A,0x05,0x10,0x01,0x4B,0xCC,0xEB,0x03,0x5B,0xED,0x61,0x01,0x6A,0x00,0x90,0x20,0xE8,0x01,0x63,0x98,0x5F,0x11,0x80,0xFD,0x63,0x04,0x62,0x16,0xB2,0x00,0x6B,0x60,0xF1,0x43,0xA2,0x01,0x72,0x14,0x61,0x14,0xB6,0x83,0x67,0xFF,0x6D,0x84,0x32,0x89,0xE2,0x4C,0x32,0x8B,0xE2,0x4C,0x32,0x8B,0xE2,0x48,0x32,0xC9,0xE2,0xE0,0xF0,0x4B,0xA2,0xAC,0xEA,0x01,0x72,0x0D,0x60,0x01,0x4C,0xAC,0xEC,0x0A,0x5C,0xEF,0x61,0x09,0xB2,0x60,0xF1,0x43,0xA2,0x02,0x5A,0x02,0x60,0x43,0x67,0x07,0x23,0x0C,0x6A,0x05,0x10,0x80,0x18,0xC5,0x36,0x00,0x65,0x62,0x67,0xF2,0x17,0x04,0x97,0x00,0xEF,0x03,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0x48,0x60,0x11,0x80,0xF9,0x63,0x0C,0x62,0x0B,0xD1,0x0A,0xD0,0x00,0x6A,0x0F,0xD5,0x06,0xD2,0x40,0xAC,0x24,0x67,0x01,0xF0,0x0B,0x72,0x0C,0x61,0xBD,0x67,0x80,0x18,0x0D,0x2C,0x10,0x4D,0x80,0xA9,0xFF,0xF7,0x1F,0x6B,0xA2,0x67,0x00,0x18,0xC5,0x4A,0x6C,0xEC,0xAC,0x10,0x00,0xF4,0x19,0x72,0x2C,0x61,0x49,0xA4,0x03,0x5A,0x02,0x61,0x01,0x6A,0x49,0xC4,0x7D,0x67,0x58,0xA3,0x00,0x1C,0xDD,0x31,0x52,0xC3,0xBD,0x67,0x91,0x67,0x12,0x4D,0x00,0x18,0xB7,0x45,0x07,0xD2,0x02,0x67,0x0C,0x2A,0xA9,0xA1,0xFF,0x6B,0x20,0x6A,0x6C,0xED,0xB8,0x35,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0xAA,0x6C,0x00,0x18,0xB6,0x33,0x4C,0xED,0x00,0x1C,0xE5,0x31,0x07,0x94,0x7D,0x67,0x52,0xA3,0xFF,0x6B,0x6C,0xEA,0x61,0x2A,0x80,0xA9,0xFF,0xF7,0x1F,0x6A,0xB0,0x67,0x4C,0xEC,0x58,0x10,0x00,0xF4,0x05,0x72,0x06,0x61,0x4B,0xA4,0x03,0x5A,0x79,0x61,0x01,0x6A,0x4B,0xC4,0x76,0x10,0x41,0xF4,0x12,0x72, +0x10,0x61,0x00,0x18,0xE5,0x41,0x00,0x65,0x06,0x94,0x00,0x18,0x78,0x36,0x02,0x67,0x80,0xA9,0x06,0x96,0xFF,0xF7,0x1F,0x6A,0x4C,0xEC,0x00,0x18,0x33,0x4B,0xB0,0x67,0x3F,0x10,0x01,0xF0,0x04,0x72,0x3F,0x61,0x04,0xA4,0xFF,0xF7,0x1F,0x6A,0xFF,0xF7,0x1F,0x6B,0x00,0x30,0x4C,0xE8,0x43,0xA4,0xBD,0x67,0x14,0x4D,0x4D,0xE8,0x6C,0xE8,0x00,0x18,0x2A,0xDF,0x90,0x67,0x04,0x22,0x5D,0x67,0x0A,0xCA,0x02,0x6A,0x23,0x10,0x7D,0x67,0xAA,0xAB,0xFF,0xF7,0x1F,0x6B,0xAC,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x27,0xB3,0x48,0x32,0x69,0xE2,0x20,0xF0,0x78,0xA2,0xFF,0x6A,0x4C,0xEB,0x12,0x73,0x0A,0x60,0x19,0x73,0x08,0x60,0x80,0xA9,0xFF,0xF7,0x1F,0x6A,0x0C,0x6D,0x00,0x18,0xC5,0x4A,0x4C,0xEC,0x2E,0x10,0xFF,0xF7,0x1F,0x6C,0x00,0x18,0x0C,0x48,0xAC,0xEC,0x80,0xA9,0xA2,0x67,0x00,0x18,0xC5,0x4A,0x00,0x65,0x01,0x6B,0x06,0xD3,0x21,0x10,0x21,0xF4,0x06,0x72,0x1E,0x61,0x80,0x18,0xD6,0x36,0x00,0x65,0x10,0x2A,0x14,0xB0,0x7D,0x67,0x78,0xA3,0x60,0xF1,0x43,0xA0,0x91,0x67,0x60,0xF1,0x63,0xC0,0x00,0x18,0xFC,0x52,0x08,0xD2,0x7D,0x67,0x20,0xF0,0x60,0xA3,0x60,0xF1,0x63,0xC0,0x80,0xA9,0x06,0x96,0xFF,0xF7,0x1F,0x6B,0x6C,0xEC,0x00,0x18,0x33,0x4B,0xA2,0x67,0x01,0x6A,0x06,0xD2,0x06,0x92,0x03,0x22,0x0F,0x93,0x66,0x6A,0x40,0xC3,0x0C,0x97,0x0B,0x91,0x0A,0x90,0x01,0x6A,0x00,0xEF,0x07,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xF5,0x63,0x14,0x62,0x13,0xD1,0x12,0xD0,0x00,0x6D,0x17,0xF7,0x0C,0x6E,0x00,0x18,0x01,0xA0,0x33,0x6C,0x61,0xB4,0x20,0x18,0xD6,0x32,0x00,0x69,0x20,0x18,0x5B,0x30,0x00,0x65,0x00,0x18,0xA6,0x5C,0x00,0x65,0x00,0x18,0xC8,0x8A,0x00,0x65,0x00,0x18,0xA3,0x9B,0x00,0x65,0x5A,0xB4,0x00,0x18,0x44,0x81,0x00,0x65,0x59,0xB0,0x00,0x18,0x4C,0x81,0x90,0x67,0x87,0x40,0x00,0x18,0x4C,0x81,0x01,0x4C,0x56,0xB4,0x57,0xB5,0x20,0xC0,0x00,0x18,0x2E,0x2E,0x30,0x6E,0x55,0xB5,0x88,0x40,0xD8,0x4C,0x00,0x18,0x2E,0x2E,0x30,0x6E,0x53,0xB5,0x87,0x40,0x11,0x4C,0x00,0x18,0x2E,0x2E,0x18,0x6E,0x51,0xB0,0x03,0x6B,0x40,0x98,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x6A,0xEA,0x05,0x60,0x4E,0xB2,0x20,0xF1,0x2C,0xC2,0x20,0xF1,0x36,0xC2,0x00,0x18,0x04,0xF6,0x00, +0x65,0x00,0x18,0x48,0x3C,0x00,0x65,0x00,0x18,0x71,0x32,0x00,0x65,0x00,0x18,0xE2,0x24,0x00,0x65,0x00,0x18,0x9A,0x7E,0x00,0x65,0x00,0x18,0xB5,0xC8,0x00,0x65,0x45,0xB3,0x43,0xB2,0x60,0xDA,0x00,0x18,0x0B,0x2B,0x00,0x65,0x40,0x98,0x0F,0x6B,0x46,0x32,0x6C,0xEA,0x03,0x72,0x05,0x61,0x9D,0x67,0x40,0x4C,0x00,0x18,0x1B,0x28,0x00,0x6D,0x00,0x18,0xE9,0x2F,0x00,0x65,0x80,0x18,0x54,0x2A,0x00,0x65,0x20,0x18,0xA2,0x39,0x00,0x65,0x80,0x18,0x08,0x2A,0x00,0x65,0x00,0x1C,0xAD,0x31,0x00,0x65,0x29,0xF6,0x00,0x6D,0x00,0x18,0x17,0x2D,0x01,0x6C,0x09,0x6A,0x04,0xD2,0x32,0xB2,0x2F,0xB3,0x01,0x6C,0x05,0xD2,0x9B,0xF4,0x0D,0x6A,0x06,0xD2,0x32,0xF0,0x0E,0x6A,0x07,0xD2,0x2E,0xB2,0xFA,0x6D,0x8A,0xF2,0x01,0x6E,0x40,0x9A,0xA1,0xF3,0x16,0x6F,0x08,0xD2,0x40,0xF0,0x41,0xA3,0x09,0xD2,0x40,0xF0,0x40,0xA3,0x0A,0xD2,0x20,0xF0,0x5F,0xA3,0x0B,0xD2,0x20,0xF0,0x5E,0xA3,0x0C,0xD2,0x20,0xF0,0x5D,0xA3,0x0D,0xD2,0x20,0xF0,0x5C,0xA3,0x20,0x18,0x1B,0x32,0x0E,0xD2,0x21,0xB2,0x22,0xB3,0x40,0x9A,0x6E,0xEA,0x19,0x2A,0x21,0xB1,0x21,0xB3,0x40,0x99,0x6E,0xEA,0x14,0x2A,0x20,0xB0,0x21,0xB2,0x21,0xB3,0x80,0x98,0x8C,0xEA,0x6E,0xEA,0x0B,0x2A,0x20,0xB3,0x00,0xF6,0x82,0x32,0x00,0x6D,0x3F,0xF4,0x00,0x6C,0x00,0x18,0xFA,0x8B,0x40,0xC3,0x00,0x6A,0x40,0xD8,0x00,0x6A,0x40,0xD9,0x13,0xB3,0x12,0xB2,0x20,0x18,0x3D,0x36,0x60,0xDA,0x14,0x97,0x13,0x91,0x12,0x90,0x00,0xEF,0x0B,0x63,0x84,0xC8,0x00,0x80,0x03,0x00,0x00,0xC4,0x98,0x24,0x11,0x80,0x38,0x24,0x11,0x80,0x58,0xDF,0x10,0x80,0xA0,0xDF,0x10,0x80,0x88,0xDF,0x10,0x80,0x6C,0x1D,0x11,0x80,0xDC,0x00,0x11,0x80,0x5C,0xA1,0x00,0xB0,0x00,0x00,0x01,0x00,0xF0,0xA5,0x10,0x80,0x90,0x1E,0x11,0x80,0x3C,0x91,0x10,0x80,0xEF,0xBE,0x23,0x87,0x44,0x91,0x10,0x80,0x32,0x97,0x79,0x23,0x40,0x91,0x10,0x80,0xFF,0xFF,0xFF,0x00,0xEE,0xFF,0xC0,0x00,0xD0,0x00,0x11,0x80,0x00,0x00,0x00,0x00,0x2E,0x5A,0x2C,0x4B,0xCF,0x9D,0xF2,0xCB,0x74,0x9C,0x13,0xCE,0x57,0xF4,0x4C,0x54,0x48,0xA9,0xD3,0x53,0xC5,0x19,0x73,0x6F,0xF7,0xEB,0x68,0x53,0xCC,0xAE,0x50,0xF1,0x57,0x02,0xE2,0x66,0xA3,0x5C,0xBC,0xD3,0xB7,0xA6,0x2F,0xC9,0xAE,0xDC,0x77,0x9E,0x07,0x91,0x5F,0x86,0x91,0x8D, +0xDC,0x27,0x00,0x5D,0xF1,0xD6,0xCF,0x0C,0x14,0x2B,0x62,0x5E,0xD2,0xEF,0xF4,0xA5,0x18,0xFF,0x15,0x20,0x70,0x09,0x98,0x44,0x21,0xA6,0x58,0x6F,0x9F,0xC3,0xFE,0x7E,0x43,0x29,0xD2,0x80,0x9E,0xA5,0x11,0x25,0xF8,0xED,0xB0,0x9D,0x42,0xB8,0x1B,0xC5,0xBD,0x00,0x9F,0x79,0xE4,0xB5,0x9D,0xBB,0xAA,0x85,0x7F,0xCA,0x85,0x6F,0xB9,0xF7,0xEA,0x25,0x07,0x04,0x05,0x01,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x04,0x00,0x00,0x00,0x01,0x03,0x02,0x04,0x00,0x00,0x00,0x00,0x1B,0x00,0xB7,0x00,0x53,0x01,0x36,0x00,0x6F,0x01,0xA7,0x02,0x53,0x00,0x28,0x02,0xFD,0x03,0x25,0x00,0x04,0x0B,0x0F,0x04,0x0A,0x0E,0x08,0x0B,0x0F,0x00,0x00,0x00,0x05,0x41,0x32,0x12,0x00,0x00,0x00,0x00,0x8D,0xDC,0x2E,0x90, +}; + +#endif //CONFIG_MP_INCLUDED +#ifndef CONFIG_PHY_SETTING_WITH_ODM +const u32 Rtl8723SPHY_REG_2TArray[Rtl8723SPHY_REG_2TArrayLength] = { +0x0, }; + +const u32 Rtl8723SPHY_REG_1TArray[Rtl8723SPHY_REG_1TArrayLength] = { +0x800,0x80040000, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66f60110, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000760, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xa78,0x00000900, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x69543420, +0xc54,0x43bc0094, +0xc58,0x69543420, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x7116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +const u32 Rtl8723SPHY_ChangeTo_1T1RArray[Rtl8723SPHY_ChangeTo_1T1RArrayLength] = { +0x0, }; + +const u32 Rtl8723SPHY_ChangeTo_1T2RArray[Rtl8723SPHY_ChangeTo_1T2RArrayLength] = { +0x0, }; + +const u32 Rtl8723SPHY_ChangeTo_2T2RArray[Rtl8723SPHY_ChangeTo_2T2RArrayLength] = { +0x0, }; + +const u32 Rtl8723SRadioA_2TArray[Rtl8723SRadioA_2TArrayLength] = { +0x0, }; + +const u32 Rtl8723SRadioB_2TArray[Rtl8723SRadioB_2TArrayLength] = { +0x0, }; + +const u32 Rtl8723SRadioA_1TArray[Rtl8723SRadioA_1TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00039c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001a3f1, +0x00b,0x00014787, +0x00c,0x000896fe, +0x00d,0x0000e02c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00030355, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0000024f, +0x01f,0x00000000, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x00057730, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f474, +0x015,0x0004f477, +0x015,0x0008f474, +0x015,0x000cf474, +0x016,0x00000339, +0x016,0x00040339, +0x016,0x00080339, +0x016,0x000c0366, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00000003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00000247, +0x01f,0x00000000, +0x000,0x00030159, +}; + +const u32 Rtl8723SRadioB_1TArray[Rtl8723SRadioB_1TArrayLength] = { +0x0, }; + +const u32 Rtl8723SRadioB_GM_Array[Rtl8723SRadioB_GM_ArrayLength] = { +0x0, }; + +const u32 Rtl8723SMAC_2T_Array[Rtl8723SMAC_2T_ArrayLength] = { +0x420,0x00000080, +0x423,0x00000000, +0x430,0x00000000, +0x431,0x00000000, +0x432,0x00000000, +0x433,0x00000001, +0x434,0x00000004, +0x435,0x00000005, +0x436,0x00000006, +0x437,0x00000007, +0x438,0x00000000, +0x439,0x00000000, +0x43a,0x00000000, +0x43b,0x00000001, +0x43c,0x00000004, +0x43d,0x00000005, +0x43e,0x00000006, +0x43f,0x00000007, +0x440,0x0000005d, +0x441,0x00000001, +0x442,0x00000000, +0x444,0x00000015, +0x445,0x000000f0, +0x446,0x0000000f, +0x447,0x00000000, +0x458,0x00000041, +0x459,0x000000a8, +0x45a,0x00000072, +0x45b,0x000000b9, +0x460,0x00000066, +0x461,0x00000066, +0x462,0x00000008, +0x463,0x00000003, +0x4c8,0x000000ff, +0x4c9,0x00000008, +0x4cc,0x000000ff, +0x4cd,0x000000ff, +0x4ce,0x00000001, +0x500,0x00000026, +0x501,0x000000a2, +0x502,0x0000002f, +0x503,0x00000000, +0x504,0x00000028, +0x505,0x000000a3, +0x506,0x0000005e, +0x507,0x00000000, +0x508,0x0000002b, +0x509,0x000000a4, +0x50a,0x0000005e, +0x50b,0x00000000, +0x50c,0x0000004f, +0x50d,0x000000a4, +0x50e,0x00000000, +0x50f,0x00000000, +0x512,0x0000001c, +0x514,0x0000000a, +0x515,0x00000010, +0x516,0x0000000a, +0x517,0x00000010, +0x51a,0x00000016, +0x524,0x0000000f, +0x525,0x0000004f, +0x546,0x00000040, +0x547,0x00000000, +0x550,0x00000010, +0x551,0x00000010, +0x559,0x00000002, +0x55a,0x00000002, +0x55d,0x000000ff, +0x605,0x00000030, +0x608,0x0000000e, +0x609,0x0000002a, +0x652,0x00000020, +0x63c,0x0000000a, +0x63d,0x0000000e, +0x63e,0x0000000a, +0x63f,0x0000000e, +0x66e,0x00000005, +0x700,0x00000021, +0x701,0x00000043, +0x702,0x00000065, +0x703,0x00000087, +0x708,0x00000021, +0x709,0x00000043, +0x70a,0x00000065, +0x70b,0x00000087, +}; + +const u32 Rtl8723SAGCTAB_2TArray[Rtl8723SAGCTAB_2TArrayLength] = { +0x0, }; + +const u32 Rtl8723SAGCTAB_1TArray[Rtl8723SAGCTAB_1TArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7a060001, +0xc78,0x79070001, +0xc78,0x78080001, +0xc78,0x77090001, +0xc78,0x760a0001, +0xc78,0x750b0001, +0xc78,0x740c0001, +0xc78,0x730d0001, +0xc78,0x720e0001, +0xc78,0x710f0001, +0xc78,0x70100001, +0xc78,0x6f110001, +0xc78,0x6e120001, +0xc78,0x6d130001, +0xc78,0x6c140001, +0xc78,0x6b150001, +0xc78,0x6a160001, +0xc78,0x69170001, +0xc78,0x68180001, +0xc78,0x67190001, +0xc78,0x661a0001, +0xc78,0x651b0001, +0xc78,0x641c0001, +0xc78,0x631d0001, +0xc78,0x621e0001, +0xc78,0x611f0001, +0xc78,0x60200001, +0xc78,0x49210001, +0xc78,0x48220001, +0xc78,0x47230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7a460001, +0xc78,0x79470001, +0xc78,0x78480001, +0xc78,0x77490001, +0xc78,0x764a0001, +0xc78,0x754b0001, +0xc78,0x744c0001, +0xc78,0x734d0001, +0xc78,0x724e0001, +0xc78,0x714f0001, +0xc78,0x70500001, +0xc78,0x6f510001, +0xc78,0x6e520001, +0xc78,0x6d530001, +0xc78,0x6c540001, +0xc78,0x6b550001, +0xc78,0x6a560001, +0xc78,0x69570001, +0xc78,0x68580001, +0xc78,0x67590001, +0xc78,0x665a0001, +0xc78,0x655b0001, +0xc78,0x645c0001, +0xc78,0x635d0001, +0xc78,0x625e0001, +0xc78,0x615f0001, +0xc78,0x60600001, +0xc78,0x49610001, +0xc78,0x48620001, +0xc78,0x47630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + +#endif//endif CONFIG_PHY_SETTING_ODM + +const u32 Rtl8723SPHY_REG_Array_PG[Rtl8723SPHY_REG_Array_PGLength] = { +0xe00,0xffffffff,0x0a0c0c0c, +0xe04,0xffffffff,0x02040608, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x0a0c0d0e, +0xe14,0xffffffff,0x02040608, +0xe18,0xffffffff,0x0a0c0d0e, +0xe1c,0xffffffff,0x02040608, +0x830,0xffffffff,0x0a0c0c0c, +0x834,0xffffffff,0x02040608, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x0a0c0d0e, +0x848,0xffffffff,0x02040608, +0x84c,0xffffffff,0x0a0c0d0e, +0x868,0xffffffff,0x02040608, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x06060606, +0xe14,0xffffffff,0x00020406, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x06060606, +0x848,0xffffffff,0x00020406, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +const u32 Rtl8723SMACPHY_Array_PG[Rtl8723SMACPHY_Array_PGLength] = { +0x0, }; +#if MP_DRIVER == 1 +const u32 Rtl8723SPHY_REG_Array_MP[Rtl8723SPHY_REG_Array_MPLength] = { +0xc30,0x69e9ac4a, +0xc3c,0x0a979718, +}; +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.h index e1d022f97d37..1adbefd4486d 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.h @@ -1,67 +1,67 @@ -#ifndef __INC_HAL8723S_FW_IMG_H -#define __INC_HAL8723S_FW_IMG_H - -/*Created on 2013/02/26, 18:59*/ - -#define Rtl8723SUMCBCutMPImgArrayLength 24174 - -#define Rtl8723SUMCBCutImgArrayWithBTLength 24118 -#define Rtl8723SUMCBCutImgArrayWithoutBTLength 19200 - -#define Rtl8723SImgArrayLength 20606 -extern const u8 Rtl8723SFwImgArray[Rtl8723SImgArrayLength]; -#define Rtl8723SBTImgArrayLength 1 -extern const u8 Rtl8723SFwBTImgArray[Rtl8723SBTImgArrayLength]; - -#ifdef CONFIG_MP_INCLUDED -#define Rtl8723EBTImgArrayLength 15275 -extern u8 Rtl8723EFwBTImgArray[Rtl8723EBTImgArrayLength] ; -extern const u8 Rtl8723SFwUMCBCutMPImgArray[Rtl8723SUMCBCutMPImgArrayLength]; -#endif //CONFIG_MP_INCLUDED - -extern const u8 Rtl8723SFwUMCBCutImgArrayWithBT[Rtl8723SUMCBCutImgArrayWithBTLength]; -extern const u8 Rtl8723SFwUMCBCutImgArrayWithoutBT[Rtl8723SUMCBCutImgArrayWithoutBTLength]; - -#ifndef CONFIG_PHY_SETTING_WITH_ODM -#define Rtl8723SPHY_REG_2TArrayLength 1 -extern const u32 Rtl8723SPHY_REG_2TArray[Rtl8723SPHY_REG_2TArrayLength]; -#define Rtl8723SPHY_REG_1TArrayLength 372 -extern const u32 Rtl8723SPHY_REG_1TArray[Rtl8723SPHY_REG_1TArrayLength]; -#define Rtl8723SPHY_ChangeTo_1T1RArrayLength 1 -extern const u32 Rtl8723SPHY_ChangeTo_1T1RArray[Rtl8723SPHY_ChangeTo_1T1RArrayLength]; -#define Rtl8723SPHY_ChangeTo_1T2RArrayLength 1 -extern const u32 Rtl8723SPHY_ChangeTo_1T2RArray[Rtl8723SPHY_ChangeTo_1T2RArrayLength]; -#define Rtl8723SPHY_ChangeTo_2T2RArrayLength 1 -extern const u32 Rtl8723SPHY_ChangeTo_2T2RArray[Rtl8723SPHY_ChangeTo_2T2RArrayLength]; - - -#define Rtl8723SRadioA_2TArrayLength 1 -extern const u32 Rtl8723SRadioA_2TArray[Rtl8723SRadioA_2TArrayLength]; -#define Rtl8723SRadioB_2TArrayLength 1 -extern const u32 Rtl8723SRadioB_2TArray[Rtl8723SRadioB_2TArrayLength]; -#define Rtl8723SRadioA_1TArrayLength 282 -extern const u32 Rtl8723SRadioA_1TArray[Rtl8723SRadioA_1TArrayLength]; -#define Rtl8723SRadioB_1TArrayLength 1 -extern const u32 Rtl8723SRadioB_1TArray[Rtl8723SRadioB_1TArrayLength]; -#define Rtl8723SRadioB_GM_ArrayLength 1 -extern const u32 Rtl8723SRadioB_GM_Array[Rtl8723SRadioB_GM_ArrayLength]; -#define Rtl8723SMAC_2T_ArrayLength 172 -extern const u32 Rtl8723SMAC_2T_Array[Rtl8723SMAC_2T_ArrayLength]; -#define Rtl8723SAGCTAB_2TArrayLength 1 -extern const u32 Rtl8723SAGCTAB_2TArray[Rtl8723SAGCTAB_2TArrayLength]; -#define Rtl8723SAGCTAB_1TArrayLength 320 -extern const u32 Rtl8723SAGCTAB_1TArray[Rtl8723SAGCTAB_1TArrayLength]; -#endif//#ifndef CONFIG_PHY_SETTING_WITH_ODM - -#define Rtl8723SPHY_REG_Array_PGLength 336 -extern const u32 Rtl8723SPHY_REG_Array_PG[Rtl8723SPHY_REG_Array_PGLength]; -#define Rtl8723SMACPHY_Array_PGLength 1 -extern const u32 Rtl8723SMACPHY_Array_PG[Rtl8723SMACPHY_Array_PGLength]; - -#if MP_DRIVER == 1 -#define Rtl8723SPHY_REG_Array_MPLength 4 -extern const u32 Rtl8723SPHY_REG_Array_MP[Rtl8723SPHY_REG_Array_MPLength]; -#endif//#if MP_DRIVER == 1 - -#endif //#ifndef __INC_HAL8723S_FW_IMG_H - +#ifndef __INC_HAL8723S_FW_IMG_H +#define __INC_HAL8723S_FW_IMG_H + +/*Created on 2013/02/26, 18:59*/ + +#define Rtl8723SUMCBCutMPImgArrayLength 24174 + +#define Rtl8723SUMCBCutImgArrayWithBTLength 24348 +#define Rtl8723SUMCBCutImgArrayWithoutBTLength 19200 + +#define Rtl8723SImgArrayLength 20606 +extern const u8 Rtl8723SFwImgArray[Rtl8723SImgArrayLength]; +#define Rtl8723SBTImgArrayLength 1 +extern const u8 Rtl8723SFwBTImgArray[Rtl8723SBTImgArrayLength]; + +#ifdef CONFIG_MP_INCLUDED +#define Rtl8723EBTImgArrayLength 16404 +extern u8 Rtl8723EFwBTImgArray[Rtl8723EBTImgArrayLength] ; +extern const u8 Rtl8723SFwUMCBCutMPImgArray[Rtl8723SUMCBCutMPImgArrayLength]; +#endif //CONFIG_MP_INCLUDED + +extern const u8 Rtl8723SFwUMCBCutImgArrayWithBT[Rtl8723SUMCBCutImgArrayWithBTLength]; +extern const u8 Rtl8723SFwUMCBCutImgArrayWithoutBT[Rtl8723SUMCBCutImgArrayWithoutBTLength]; + +#ifndef CONFIG_PHY_SETTING_WITH_ODM +#define Rtl8723SPHY_REG_2TArrayLength 1 +extern const u32 Rtl8723SPHY_REG_2TArray[Rtl8723SPHY_REG_2TArrayLength]; +#define Rtl8723SPHY_REG_1TArrayLength 372 +extern const u32 Rtl8723SPHY_REG_1TArray[Rtl8723SPHY_REG_1TArrayLength]; +#define Rtl8723SPHY_ChangeTo_1T1RArrayLength 1 +extern const u32 Rtl8723SPHY_ChangeTo_1T1RArray[Rtl8723SPHY_ChangeTo_1T1RArrayLength]; +#define Rtl8723SPHY_ChangeTo_1T2RArrayLength 1 +extern const u32 Rtl8723SPHY_ChangeTo_1T2RArray[Rtl8723SPHY_ChangeTo_1T2RArrayLength]; +#define Rtl8723SPHY_ChangeTo_2T2RArrayLength 1 +extern const u32 Rtl8723SPHY_ChangeTo_2T2RArray[Rtl8723SPHY_ChangeTo_2T2RArrayLength]; + + +#define Rtl8723SRadioA_2TArrayLength 1 +extern const u32 Rtl8723SRadioA_2TArray[Rtl8723SRadioA_2TArrayLength]; +#define Rtl8723SRadioB_2TArrayLength 1 +extern const u32 Rtl8723SRadioB_2TArray[Rtl8723SRadioB_2TArrayLength]; +#define Rtl8723SRadioA_1TArrayLength 282 +extern const u32 Rtl8723SRadioA_1TArray[Rtl8723SRadioA_1TArrayLength]; +#define Rtl8723SRadioB_1TArrayLength 1 +extern const u32 Rtl8723SRadioB_1TArray[Rtl8723SRadioB_1TArrayLength]; +#define Rtl8723SRadioB_GM_ArrayLength 1 +extern const u32 Rtl8723SRadioB_GM_Array[Rtl8723SRadioB_GM_ArrayLength]; +#define Rtl8723SMAC_2T_ArrayLength 172 +extern const u32 Rtl8723SMAC_2T_Array[Rtl8723SMAC_2T_ArrayLength]; +#define Rtl8723SAGCTAB_2TArrayLength 1 +extern const u32 Rtl8723SAGCTAB_2TArray[Rtl8723SAGCTAB_2TArrayLength]; +#define Rtl8723SAGCTAB_1TArrayLength 320 +extern const u32 Rtl8723SAGCTAB_1TArray[Rtl8723SAGCTAB_1TArrayLength]; +#endif//#ifndef CONFIG_PHY_SETTING_WITH_ODM + +#define Rtl8723SPHY_REG_Array_PGLength 336 +extern const u32 Rtl8723SPHY_REG_Array_PG[Rtl8723SPHY_REG_Array_PGLength]; +#define Rtl8723SMACPHY_Array_PGLength 1 +extern const u32 Rtl8723SMACPHY_Array_PG[Rtl8723SMACPHY_Array_PGLength]; + +#if MP_DRIVER == 1 +#define Rtl8723SPHY_REG_Array_MPLength 4 +extern const u32 Rtl8723SPHY_REG_Array_MP[Rtl8723SPHY_REG_Array_MPLength]; +#endif//#if MP_DRIVER == 1 + +#endif //#ifndef __INC_HAL8723S_FW_IMG_H + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.c index 18e69ede5a9f..9967bb8d60bb 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.c @@ -1,8018 +1,6746 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -/*Created on 2013/01/14, 15:51*/ -#include "../odm_precomp.h" - -u8 Rtl8723UFwImgArray[Rtl8723UImgArrayLength] = { -0x01,0x23,0x02,0x00,0x0e,0x00,0x00,0x00,0x01,0x13,0x16,0x18,0x7c,0x56,0x01,0x00, -0x54,0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x58,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x60,0xec,0x00,0x00,0x00,0x00,0x00,0x02,0x61,0x93,0x00,0x00, -0x00,0x00,0x00,0x02,0x67,0x2b,0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03, -0x00,0x04,0x06,0x05,0x04,0x02,0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09, -0x08,0x06,0x00,0x08,0x0a,0x09,0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08, -0x0a,0x09,0x08,0x00,0x00,0x08,0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10, -0x00,0x18,0x22,0x21,0x20,0x18,0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21, -0x20,0x08,0x00,0x20,0x22,0x21,0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20, -0x22,0x20,0x18,0x08,0x00,0x20,0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00, -0x00,0x30,0x31,0x2f,0x10,0x10,0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28, -0x10,0x00,0x00,0x30,0x31,0x20,0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30, -0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05, -0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05, -0x05,0x05,0x06,0x07,0x0a,0x0b,0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11, -0x08,0x08,0x09,0x09,0x0a,0x0c,0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07, -0x07,0x07,0x08,0x0a,0x04,0x04,0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07, -0x08,0x0b,0x0d,0x0f,0x04,0x04,0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12, -0x04,0x04,0x05,0x05,0x06,0x0a,0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f, -0x21,0x27,0x29,0x2a,0x00,0x00,0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04, -0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90, -0x00,0xc0,0x00,0xd8,0x00,0x50,0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90, -0x01,0xe0,0x02,0x30,0x01,0x2c,0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0, -0x06,0x40,0x07,0xd0,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12, -0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c, -0x00,0x50,0x00,0x64,0x00,0xa0,0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0, -0x00,0xf0,0x01,0x68,0x01,0xf4,0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02, -0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12, -0x05,0x07,0x07,0x08,0x0b,0x12,0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04, -0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08, -0x09,0x0a,0x0b,0x0c,0x20,0x1e,0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00, -0xbb,0x01,0x06,0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01, -0xf3,0x22,0xf8,0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83, -0xe8,0xf0,0x22,0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25, -0x82,0xc8,0xf2,0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82, -0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, -0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb, -0xfe,0x07,0xe3,0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5, -0xf0,0x74,0x01,0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, -0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0, -0x08,0xe6,0x22,0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22, -0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a, -0x89,0x82,0x8a,0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0, -0x19,0x22,0xbb,0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11, -0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0, -0x22,0x50,0x09,0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9, -0x25,0x82,0xc8,0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed, -0x49,0xfd,0xec,0x48,0xfc,0x22,0xbb,0x01,0x07,0x89,0x82,0x8a,0x83,0x02,0x43,0x46, -0x50,0x05,0xe9,0xf8,0x02,0x43,0xda,0xbb,0xfe,0x05,0xe9,0xf8,0x02,0x43,0xe6,0x89, -0x82,0x8a,0x83,0x02,0x43,0xf2,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, -0xff,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb, -0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0, -0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0, -0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12, -0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83, -0xe4,0x73,0x74,0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0xd0,0x83,0xd0, -0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74, -0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0xb5,0xf0,0x06,0x74,0x03, -0x93,0x68,0x60,0xe9,0xa3,0xa3,0xa3,0xa3,0x80,0xd8,0xe6,0xfc,0x08,0xe6,0xfd,0x08, -0xe6,0xfe,0x08,0xe6,0xff,0x22,0xe2,0xfc,0x08,0xe2,0xfd,0x08,0xe2,0xfe,0x08,0xe2, -0xff,0x22,0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0x74,0x02,0x93,0xfe,0x74,0x03,0x93, -0xff,0x22,0x02,0x44,0x40,0x02,0x50,0x33,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40, -0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07, -0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56, -0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, -0x90,0x44,0x85,0xe4,0x7e,0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09, -0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8, -0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82, -0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf, -0xe9,0xde,0xe7,0x80,0xbe,0x48,0x9e,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x48,0x9e,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x9e,0xab,0x00,0x41, -0x9f,0x19,0x00,0x41,0x9e,0x84,0x80,0x41,0x9e,0x85,0x80,0x41,0x9d,0xa8,0x00,0x41, -0x9d,0xa9,0x00,0x41,0x9d,0xa7,0x00,0x41,0x9e,0xbd,0x00,0x00,0x90,0x02,0x84,0xef, -0xf0,0xa3,0xee,0xf0,0xa3,0x74,0x05,0xf0,0x22,0xfd,0x7f,0x81,0xd3,0x10,0xaf,0x01, -0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0,0x12,0x4f,0x6d,0xd0,0xd0,0x92, -0xaf,0x22,0xe4,0x90,0x9e,0xb9,0xf0,0x90,0x00,0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80, -0x80,0xda,0x8f,0x82,0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0x12,0x4f,0x49,0x02, -0x4f,0x7d,0x22,0x02,0x6a,0xe7,0x02,0x6a,0xee,0xef,0x8e,0xf0,0x71,0xad,0x45,0x26, -0x00,0x40,0x45,0x4e,0x00,0x80,0x45,0x79,0x01,0x00,0x45,0x8d,0x02,0x00,0x45,0xa5, -0x04,0x00,0x00,0x00,0x45,0xc2,0xed,0x54,0x3f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e, -0x00,0x7f,0x40,0xef,0x2d,0xff,0xee,0x3c,0xfe,0xef,0x78,0x06,0xce,0xc3,0x13,0xce, -0x13,0xd8,0xf9,0x78,0x06,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x80,0x26,0xed,0x54, -0x7f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x00,0x7f,0x80,0xef,0x2d,0xff,0xee,0x3c, -0xfe,0xef,0x78,0x07,0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x78,0x07,0xc3,0x33,0xce, -0x33,0xce,0xd8,0xf9,0xfd,0xac,0x06,0x80,0x49,0xed,0x70,0x04,0xfe,0xff,0x80,0x04, -0x7e,0x01,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x7d,0x00,0xfc,0x80,0x35,0xec,0x54,0x01, -0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x02,0x7f,0x00,0xef,0x2d,0xee,0x3c,0xc3, -0x13,0x7d,0x00,0x80,0x1a,0xec,0x54,0x03,0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e, -0x04,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x13,0x13,0x54,0x3f,0x7d,0x00,0x25,0xe0,0x25, -0xe0,0xfc,0xae,0x04,0xaf,0x05,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0x90, -0x9e,0x71,0xf0,0xa3,0x74,0x08,0xf0,0xa3,0xf0,0x90,0x01,0x1f,0xe0,0xfe,0x90,0x01, -0x1e,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x9e,0x6b,0xf0,0xa3,0xef,0xf0, -0x90,0x02,0x87,0xe0,0x90,0x9e,0x70,0xf0,0x90,0x9e,0xc1,0xe0,0x20,0xe0,0x02,0xe1, -0x3b,0xe4,0x90,0x9e,0x6f,0xf0,0x90,0x9e,0x70,0xe0,0xff,0x90,0x9e,0x6f,0xe0,0xc3, -0x9f,0x40,0x02,0xe1,0x3b,0x90,0x9e,0x6b,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0x90,0xfd, -0x11,0xf0,0x74,0x02,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0x0f,0xfc, -0x33,0x33,0x33,0x54,0xf8,0xff,0xed,0x24,0x18,0x2f,0x90,0x9e,0x6d,0xf0,0xe0,0x24, -0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0xfc,0x90,0x9e,0x6e,0xf0,0x74, -0x01,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0xfe,0x74,0x00,0x2d,0xf5,0x82, -0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x7a,0x00,0x24,0x00,0xff,0xea,0x3e,0x54,0x3f,0xab, -0x07,0xfa,0xaf,0x04,0xef,0x75,0xf0,0x08,0xa4,0x24,0x18,0xff,0xe4,0x35,0xf0,0xfe, -0xef,0x2b,0xfb,0xee,0x3a,0xfa,0x90,0x9e,0xc5,0xe0,0xfe,0xa3,0xe0,0xff,0xad,0x03, -0xac,0x02,0xb1,0x09,0xaa,0x06,0xab,0x07,0x90,0x9e,0x6b,0xee,0x8f,0xf0,0x51,0x54, -0x90,0x9e,0xc7,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x9e,0x6b,0xe0,0xfc,0xa3,0xe0,0xfd, -0xd3,0x9f,0xec,0x9e,0x40,0x1b,0x90,0x9e,0xc8,0xe0,0x24,0x01,0xff,0x90,0x9e,0xc7, -0xe0,0x34,0x00,0xfe,0xc3,0xed,0x9f,0xff,0xec,0x9e,0x90,0x9e,0x6b,0xf0,0xa3,0xef, -0xf0,0x90,0x9e,0x6e,0xe0,0xff,0x24,0x40,0x60,0x04,0x24,0x20,0x70,0x2b,0x90,0x9e, -0xc9,0xe0,0xfe,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x26,0xef,0x90,0x00,0x81, -0xb4,0xa0,0x05,0xe0,0x44,0x04,0x80,0x03,0xe0,0x44,0x08,0xfd,0x7f,0x81,0x91,0xcc, -0x90,0x9e,0xc1,0xe0,0x44,0x80,0xf0,0x80,0x09,0x90,0x9e,0xc9,0xe0,0xc4,0x13,0x13, -0x54,0x03,0x90,0x9e,0xc1,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x03, -0x12,0x92,0x86,0x12,0x95,0x13,0xbf,0x01,0x0a,0x90,0x9e,0x6b,0xe0,0xfe,0xa3,0xe0, -0xff,0x91,0xbc,0x90,0x9e,0x6f,0xe0,0x04,0xf0,0xc1,0x06,0xd0,0xd0,0x92,0xaf,0x22, -0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x9e,0xef, -0x71,0x7e,0xab,0x63,0xaa,0x64,0xa9,0x65,0x90,0x9e,0xf2,0x71,0x7e,0xaf,0x66,0x15, -0x66,0xef,0x60,0x1b,0x90,0x9e,0xf2,0xe4,0x75,0xf0,0x01,0x71,0x67,0x12,0x1f,0x04, -0xff,0x90,0x9e,0xef,0xe4,0x75,0xf0,0x01,0x71,0x67,0xef,0x51,0x20,0x80,0xde,0xab, -0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e,0xba,0xe0,0xb4,0x01, -0x04,0x7d,0x91,0x80,0x0c,0x90,0x9e,0xba,0xe0,0x70,0x04,0x7d,0x90,0x80,0x02,0xe4, -0xfd,0x7f,0x93,0x91,0xcc,0x90,0x00,0x29,0xe0,0x54,0x3f,0xfd,0x7f,0x29,0x91,0xcc, -0x90,0x00,0x28,0xe0,0x54,0xfc,0xfd,0x7f,0x28,0x91,0xcc,0x90,0x00,0x08,0xe0,0x44, -0x10,0xfd,0x7f,0x08,0x91,0xcc,0x7f,0x01,0x12,0x78,0xe1,0x90,0x00,0x00,0xe0,0x44, -0x20,0xfd,0xe4,0xff,0x91,0xcc,0x90,0x00,0x20,0xe0,0x54,0xfe,0xfd,0x7f,0x20,0x91, -0xcc,0x90,0x00,0x90,0xe0,0x44,0x01,0xfd,0x7f,0x90,0x91,0xcc,0x7f,0x14,0x7e,0x00, -0x02,0x3b,0x3b,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a, -0x90,0x05,0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90, -0x01,0xc7,0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf, -0x22,0x90,0x9e,0xb6,0xe0,0xff,0x7d,0x01,0xe4,0xfb,0xfa,0xef,0x30,0xe0,0x02,0x7b, -0x80,0xef,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0xed,0x60,0x0e, -0x74,0x0f,0x2b,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0xaf,0x03, -0x74,0x08,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2f,0xf5, -0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2b,0xf5,0x82,0xe4, -0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf7,0xf0,0xae,0x02,0xaf,0x03,0x22,0x8f,0x25,0x90, -0x9e,0x86,0xe0,0x30,0xe0,0x39,0x90,0x04,0x1d,0xe0,0x70,0x6a,0x12,0x47,0xf3,0xef, -0x64,0x01,0x70,0x62,0x11,0x21,0x8e,0x26,0x8f,0x27,0xe5,0x25,0x60,0x10,0x74,0x21, -0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x42,0x74,0x21, -0x25,0x27,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x80,0x31,0x12, -0x47,0xf3,0xef,0x64,0x01,0x70,0x2f,0x11,0x21,0x8e,0x26,0x8f,0x27,0xe5,0x25,0x60, -0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, -0x0f,0x74,0x21,0x25,0x27,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0, -0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x67, -0xb4,0x01,0x04,0x7f,0x01,0x11,0x7d,0x53,0x68,0xf0,0x43,0x68,0x04,0x90,0x9e,0xda, -0xe0,0x30,0xe0,0x07,0x90,0x05,0x27,0xe0,0x44,0x80,0xf0,0x22,0xf0,0x7d,0x01,0x7f, -0x0c,0x90,0x9f,0x0e,0xed,0xf0,0x90,0x9f,0x0d,0xef,0xf0,0x54,0x0f,0xff,0xe5,0x68, -0x54,0x0f,0x6f,0x60,0x6d,0x90,0x9f,0x0d,0xe0,0x30,0xe2,0x28,0xe5,0x68,0x20,0xe2, -0x04,0x7f,0x01,0xf1,0x30,0xe5,0x68,0x30,0xe3,0x09,0x90,0x9f,0x0d,0xe0,0x20,0xe3, -0x02,0x80,0xa4,0xe5,0x68,0x20,0xe3,0x4a,0x90,0x9f,0x0d,0xe0,0x30,0xe3,0x43,0xa3, -0xe0,0xff,0xe1,0xb4,0xe5,0x68,0x54,0x0f,0xff,0xbf,0x0c,0x0f,0x90,0x9f,0x0d,0xe0, -0x20,0xe3,0x08,0x12,0x77,0xa3,0xef,0x60,0x29,0x11,0xf7,0xe5,0x68,0x54,0x0f,0xff, -0xbf,0x04,0x0f,0x90,0x9f,0x0d,0xe0,0x20,0xe2,0x08,0x12,0x77,0xec,0xef,0x60,0x12, -0xf1,0x91,0xe5,0x68,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x78,0x6b,0xef,0x60,0x02, -0xf1,0x1d,0x22,0xe4,0x90,0x9e,0x5a,0xf0,0x90,0x9e,0x86,0xe0,0x20,0xe0,0x02,0x81, -0x06,0x90,0x9e,0x8c,0xe0,0x64,0x01,0x70,0x5c,0x90,0x9e,0x89,0xe0,0x30,0xe0,0x19, -0xe0,0xc3,0x13,0x30,0xe0,0x02,0x80,0x0b,0x90,0x9e,0x89,0xe0,0x13,0x13,0x54,0x3f, -0x30,0xe0,0x06,0xa3,0xe0,0x90,0x9e,0x5a,0xf0,0xe4,0xf5,0x48,0x90,0x9e,0x5a,0xe0, -0x24,0x03,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x60,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01, -0x63,0x74,0x05,0xf0,0x90,0x9e,0x8c,0xe0,0x04,0xf0,0x90,0x9e,0x86,0xe0,0xc4,0x13, -0x54,0x07,0x30,0xe0,0x02,0x81,0x06,0x90,0x9e,0x86,0xe0,0xc4,0x54,0x0f,0x20,0xe0, -0x02,0x61,0xa5,0x61,0x9d,0x90,0x9e,0x8c,0xe0,0x64,0x02,0x60,0x02,0x41,0xc1,0x90, -0x07,0x78,0x04,0xf0,0x90,0x9e,0x89,0xe0,0x30,0xe0,0x20,0xe0,0xc3,0x13,0x30,0xe0, -0x02,0x80,0x0b,0x90,0x9e,0x89,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x0d,0xa3,0xe0, -0x90,0x9e,0x5a,0xf0,0x90,0x9e,0x89,0xe0,0x54,0xfb,0xf0,0xe4,0xf5,0x48,0x90,0x9e, -0x87,0xe0,0xff,0xc3,0x74,0x2e,0x9f,0xff,0x90,0x9e,0x5a,0xe0,0xfe,0xc3,0xef,0x9e, -0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x60,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x63,0x74, -0x05,0xf0,0x90,0x9e,0x86,0xe0,0xff,0xc3,0x13,0x90,0x9e,0x56,0x30,0xe0,0x09,0x12, -0x1f,0xe3,0x00,0x00,0x03,0x00,0x80,0x07,0x12,0x1f,0xe3,0x00,0x00,0x03,0x10,0x91, -0x07,0xe4,0x90,0x9e,0x8b,0xf0,0xa3,0xe0,0x04,0xf0,0x90,0x9e,0x86,0xe0,0xc4,0x13, -0x54,0x07,0x30,0xe0,0x02,0x81,0x00,0x90,0x9e,0x86,0xe0,0xc4,0x54,0x0f,0x30,0xe0, -0x02,0x80,0x06,0xe5,0x6a,0x70,0x02,0x81,0x00,0xe4,0xfd,0xaf,0x69,0x31,0x21,0x81, -0x00,0x90,0x9e,0x8c,0xe0,0x64,0x03,0x60,0x02,0x61,0x66,0x90,0x9e,0x86,0xe0,0xc4, -0x13,0x13,0x54,0x03,0x90,0x07,0x78,0x30,0xe0,0x05,0x74,0x0d,0xf0,0x80,0x03,0x74, -0x09,0xf0,0xe4,0xf5,0x48,0x90,0x9e,0x88,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x60, -0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x63,0x74,0x05,0xf0,0x90,0x9e,0x56,0x12,0x1f, -0xe3,0x00,0x00,0x03,0x10,0x91,0x07,0x90,0x9e,0x8b,0x74,0x01,0xf0,0xa3,0xe0,0x04, -0xf0,0x90,0x9e,0x86,0xe0,0xc4,0x13,0x54,0x07,0x20,0xe0,0x1f,0x90,0x9e,0x86,0xe0, -0xc4,0x54,0x0f,0x30,0xe0,0x0b,0x90,0x05,0x22,0xe4,0xf0,0x7d,0x01,0x7f,0x0c,0x80, -0x08,0xe5,0x6a,0x60,0x06,0xe4,0xfd,0x7f,0x04,0x31,0x21,0x90,0x05,0x22,0xe4,0xf0, -0x90,0x9e,0x96,0xe0,0x60,0x02,0x81,0x00,0x90,0x9e,0x86,0xe0,0xc4,0x13,0x54,0x07, -0x30,0xe0,0x02,0x81,0x06,0x90,0x9e,0x86,0xe0,0xff,0x13,0x13,0x54,0x3f,0x20,0xe0, -0x02,0x81,0x06,0x02,0x64,0x90,0x90,0x9e,0x8c,0xe0,0x64,0x04,0x70,0x3e,0xf5,0x48, -0x75,0x49,0x03,0xfb,0xfd,0x7f,0x60,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x63,0x74, -0x05,0xf0,0x90,0x9e,0x8c,0xe0,0x04,0xf0,0x90,0x9e,0x86,0xe0,0xc4,0x13,0x54,0x07, -0x20,0xe0,0x73,0x90,0x9e,0x86,0xe0,0xc4,0x54,0x0f,0x30,0xe0,0x08,0xe4,0xfd,0x7f, -0x04,0x31,0x21,0x80,0x5b,0x90,0x05,0x22,0x74,0xff,0xf0,0x22,0x90,0x9e,0x8c,0xe0, -0x64,0x05,0x70,0x52,0x90,0x07,0x78,0x04,0xf0,0x90,0x9e,0x86,0xe0,0xff,0xc3,0x13, -0x90,0x9e,0x56,0x30,0xe0,0x09,0x12,0x1f,0xe3,0x00,0x00,0x03,0x00,0x80,0x07,0x12, -0x1f,0xe3,0x00,0x00,0x03,0x10,0x91,0x07,0xe4,0x90,0x9e,0x8b,0xf0,0xa3,0xf0,0x90, -0x9e,0x86,0xe0,0xc4,0x13,0x54,0x07,0x20,0xe0,0x16,0x90,0x9e,0x86,0xe0,0xc4,0x54, -0x0f,0x30,0xe0,0x02,0x80,0x04,0xe5,0x6a,0x60,0x06,0xe4,0xfd,0xaf,0x69,0x31,0x21, -0x90,0x05,0x22,0x74,0x6f,0xf0,0x22,0x7b,0x01,0x7a,0x9e,0x79,0x56,0x7f,0x70,0x7e, -0x08,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xef,0x54,0xfc,0xff,0x90,0x01,0xe8,0xf0, -0xee,0x44,0xf0,0xa3,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0x01,0xec,0xf0,0x90, -0x00,0x02,0x12,0x1f,0x1d,0x90,0x01,0xed,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90, -0x01,0xee,0xf0,0x12,0x1f,0x04,0x90,0x01,0xef,0xf0,0x90,0x01,0xeb,0x74,0x40,0xf0, -0x12,0x8e,0xd6,0xd0,0xd0,0x92,0xaf,0x22,0xef,0x64,0x01,0x70,0x32,0x7d,0x78,0x7f, -0x02,0x12,0x3a,0x54,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x54,0x90,0x01,0x57,0xe4,0xf0, -0x90,0x01,0x3c,0x74,0x02,0x31,0x1c,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x02,0xd1,0x27, -0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90, -0x01,0x36,0x74,0x78,0xf0,0xa3,0x74,0x02,0xf0,0x7d,0x78,0xff,0x12,0x3a,0xc5,0x7d, -0x02,0x7f,0x03,0x12,0x3a,0xc5,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a, -0xe0,0x44,0x07,0xf0,0x12,0x79,0x87,0xe5,0x67,0x30,0xe0,0x21,0x90,0x9e,0x90,0xe0, -0x70,0x20,0xe0,0x04,0xf0,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01, -0x7f,0x04,0x31,0x21,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x07,0xc1,0x27,0xe4,0x90,0x9e, -0x90,0xf0,0x22,0x8b,0x13,0x8a,0x14,0x89,0x15,0x12,0x77,0x6d,0xab,0x13,0xaa,0x14, -0xa9,0x15,0x12,0x1f,0x04,0xf5,0x6a,0x12,0x43,0x87,0x4d,0x13,0x00,0x4d,0x1b,0x01, -0x4d,0x2e,0x02,0x4d,0x42,0x03,0x4d,0x48,0x04,0x4d,0x5f,0x05,0x4d,0x77,0x06,0x00, -0x00,0x4d,0x82,0x7f,0x01,0x91,0x58,0x7f,0x01,0x80,0x64,0xab,0x13,0xaa,0x14,0xa9, -0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0xe4,0xff,0xb1,0x92,0x80,0x18,0xab,0x13, -0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0x7f,0x01,0xb1,0x92,0x1f, -0x80,0x04,0xb1,0x83,0xe4,0xff,0x81,0x58,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00, -0x02,0x12,0x1f,0x1d,0xfd,0xe4,0xff,0xb1,0x92,0x91,0x58,0xe4,0xff,0x80,0x20,0xab, -0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0x7f,0x01,0xb1,0x92, -0x1f,0x91,0x58,0xe4,0xff,0x80,0x08,0xb1,0x83,0xe4,0xff,0x91,0x58,0xe4,0xff,0x12, -0x77,0x79,0x22,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd, -0x7f,0x02,0xef,0x24,0xfe,0x60,0x12,0x04,0x70,0x2f,0x90,0x9e,0x9d,0x74,0x01,0xf0, -0x90,0x9e,0x8e,0xf0,0x90,0x9e,0xa0,0xf0,0x22,0xed,0x70,0x0a,0x90,0x9e,0x9a,0xe0, -0x90,0x9e,0x9d,0xf0,0x80,0x05,0x90,0x9e,0x9d,0xed,0xf0,0x90,0x9e,0x9d,0xe0,0x90, -0x9e,0x8e,0xf0,0x90,0x9e,0xa0,0x74,0x01,0xf0,0x22,0x90,0x9e,0xda,0xe0,0x30,0xe0, -0x04,0xaf,0x69,0x80,0x2f,0x7d,0x01,0xaf,0x69,0x21,0x21,0x11,0xf7,0x90,0x9e,0xdb, -0x74,0x01,0xf0,0x22,0x90,0x9e,0x43,0xe0,0xc3,0x13,0x30,0xe0,0x16,0xef,0x7b,0x01, -0xb4,0x01,0x06,0x7a,0x9e,0x79,0x4a,0x80,0x04,0x7a,0x9e,0x79,0x46,0x7f,0x80,0x7e, -0x08,0x91,0x11,0x22,0xae,0x07,0xe4,0xff,0xd1,0x6c,0xef,0x60,0x17,0x90,0x9e,0xda, -0xe0,0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x0b,0xaf,0x06,0x7d,0x01,0x31,0x21,0xd1, -0x27,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x9e,0xdb,0xe0,0x64,0x06,0x60,0x3c,0xe5, -0x68,0x54,0x0f,0x14,0x60,0x2e,0x14,0x60,0x1e,0x24,0xfe,0x60,0x0e,0x24,0xf8,0x70, -0x2a,0xe4,0x90,0x9e,0xdb,0xf0,0x90,0x05,0x22,0xf0,0x22,0x90,0x9e,0xdb,0x74,0x01, -0xf0,0x90,0x05,0x22,0xe4,0xf0,0x22,0x90,0x9e,0xdb,0x74,0x03,0xf0,0x90,0x05,0x22, -0x74,0xff,0xf0,0x22,0x90,0x01,0xc6,0xe0,0x44,0x08,0xf0,0x22,0x8f,0x6e,0x90,0x05, -0x43,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0x22,0xe4,0x90,0x9f,0x1b,0xf0,0xe5, -0x6a,0x70,0x02,0xe1,0x1c,0xe5,0x67,0x64,0x01,0x60,0x02,0xe1,0x1c,0xe5,0x6a,0x14, -0x60,0x28,0x24,0xfd,0x60,0x24,0x24,0x02,0x24,0xfb,0x50,0x02,0x80,0x22,0xe4,0x90, -0x9e,0x8e,0xf0,0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x9e,0x8e,0xe0,0x70,0x0a, -0x90,0x9e,0x9d,0xe0,0x90,0x9e,0x8e,0xf0,0x80,0x00,0x90,0x9f,0x1b,0x74,0x01,0xf0, -0x90,0x9e,0xda,0xe0,0x30,0xe0,0x15,0xa3,0xe0,0xb4,0x06,0x05,0xe4,0x90,0x9f,0x1b, -0xf0,0xe4,0xff,0xd1,0x6c,0xef,0x70,0x04,0x90,0x9f,0x1b,0xf0,0x90,0x9f,0x1b,0xe0, -0x60,0x3a,0x43,0x6b,0x10,0xe4,0xf5,0x48,0x90,0x9e,0x99,0xe0,0xf5,0x49,0xe4,0xfb, -0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x68, -0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01,0x7f,0x04,0x31,0x21,0x90,0x9e,0xda, -0xe0,0x30,0xe0,0x08,0xd1,0x27,0x90,0x05,0x22,0x74,0xff,0xf0,0x22,0x53,0x68,0xf0, -0x43,0x68,0x01,0x12,0x47,0x8a,0x12,0x79,0x39,0x53,0x68,0xf0,0x43,0x68,0x02,0x22, -0x90,0x9f,0x1a,0xef,0xf0,0xf1,0x49,0x90,0x9f,0x1a,0xe0,0x60,0x05,0x90,0x05,0x22, -0xe4,0xf0,0x53,0x68,0xf0,0x43,0x68,0x04,0x22,0x90,0x01,0x01,0xe0,0x44,0x02,0xf0, -0x90,0x01,0x00,0x74,0xff,0xf0,0x90,0x00,0x02,0xe0,0x44,0x01,0xf0,0xf1,0x6d,0x90, -0x01,0xba,0xe4,0xf0,0x22,0xf4,0xff,0x90,0x00,0x63,0xe0,0x5f,0xf0,0xd3,0x10,0xaf, -0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x05,0x22, -0x74,0x6f,0xf0,0x90,0x05,0x27,0xe0,0x54,0xbf,0xf0,0x90,0x9e,0xe1,0x74,0x03,0xf0, -0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x12,0x8f,0xd5,0xef,0x70,0x06,0x90,0x01,0xc8, -0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x3a,0xc5,0x12,0x57,0x64,0x53,0x68,0xf0, -0x43,0x68,0x02,0x22,0x90,0x06,0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x67, -0xb4,0x01,0x04,0xe4,0xff,0x11,0x7d,0x53,0x68,0xf0,0x43,0x68,0x0c,0x90,0x9e,0xda, -0xe0,0x30,0xe0,0x07,0x90,0x05,0x27,0xe0,0x54,0x7f,0xf0,0x22,0x80,0x9f,0x12,0x57, -0x90,0x80,0x9a,0xf1,0x49,0x90,0x9e,0xe1,0x74,0x04,0xf0,0x22,0xf1,0x91,0x90,0x9e, -0xdb,0x74,0x03,0xf0,0x22,0xf1,0x30,0x90,0x9e,0xdb,0x74,0x01,0xf0,0x22,0x12,0x47, -0xf3,0xbf,0x01,0x10,0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x48,0x28,0x90,0x04, -0x1f,0x74,0x20,0xf0,0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x07,0xf5,0x2b, -0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5, -0x2b,0xf0,0x22,0xe4,0x90,0x9e,0x68,0xf0,0xa3,0xf0,0x12,0x60,0xb4,0x75,0x8e,0x02, -0x12,0x44,0xe2,0x12,0x60,0x0b,0x90,0x9e,0xba,0xef,0xf0,0x12,0x60,0x1e,0x90,0x9e, -0xbc,0xef,0xf0,0x12,0x60,0x2a,0x90,0x9e,0xa1,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xf5, -0x57,0x12,0x82,0x34,0x12,0x77,0x03,0x12,0x37,0x4e,0x31,0x3d,0x11,0x15,0x12,0x60, -0x42,0x12,0x60,0x57,0xf1,0xe8,0x12,0x45,0x02,0x12,0x60,0xbc,0x12,0x94,0x02,0x31, -0x25,0x90,0x9e,0x6a,0xe5,0xd9,0xf0,0x12,0x5f,0xdc,0xc2,0xaf,0x90,0x00,0x80,0xe0, -0x44,0x40,0xf0,0x12,0x4f,0x6d,0x75,0xe8,0x03,0x43,0xa8,0x85,0x12,0x8e,0x27,0xd2, -0xaf,0x12,0x84,0x56,0x12,0x60,0x5e,0x90,0x9e,0x68,0xe0,0x64,0x01,0xf0,0x24,0x33, -0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xe5,0x57,0x30,0xe0,0x0a,0xc2,0xaf,0x53, -0x57,0xfe,0x12,0x95,0x34,0xd2,0xaf,0xe5,0x57,0x30,0xe2,0x10,0x12,0x6a,0xf5,0xbf, -0x01,0x0a,0xc2,0xaf,0x53,0x57,0xfb,0xd2,0xaf,0x12,0x45,0xc7,0xe5,0x57,0x30,0xe4, -0x0a,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x12,0x6b,0x32,0xe5,0x57,0x30,0xe6,0x0a, -0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x7b,0xd8,0xe5,0x57,0x30,0xe7,0x0a,0xc2, -0xaf,0x53,0x57,0x7f,0xd2,0xaf,0x12,0x5d,0xe9,0xc2,0xaf,0xe5,0x69,0x54,0x0f,0xff, -0xbf,0x01,0x0e,0x90,0x9e,0x92,0x74,0x01,0xf0,0x12,0x4d,0xca,0xe4,0x90,0x9e,0x92, -0xf0,0xd2,0xaf,0x80,0x82,0x90,0x9e,0xbe,0xe0,0x54,0xfe,0xf0,0xe4,0x90,0x9e,0xc0, -0xf0,0x90,0x9e,0xbe,0xe0,0x54,0x7f,0xf0,0xa3,0x74,0x0a,0xf0,0x22,0x90,0x9e,0xe0, -0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0x90,0x9e,0xda,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3, -0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90, -0x9e,0x76,0x12,0x43,0x7e,0xe4,0x90,0x9e,0x79,0xf0,0x12,0x1f,0x04,0xc3,0x13,0x20, -0xe0,0x02,0x41,0xbb,0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x54,0x02, -0xfe,0x90,0x9e,0xe0,0xe0,0x54,0xfd,0x4e,0xfe,0xf0,0xef,0x54,0x01,0xff,0xee,0x54, -0xfe,0x4f,0xff,0xf0,0x12,0x1f,0x04,0xfe,0x54,0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff, -0x90,0x9e,0xe0,0xf0,0xee,0x54,0x10,0xfe,0xef,0x54,0xef,0x4e,0xff,0xf0,0x12,0x1f, -0x04,0xfe,0x54,0x20,0xfd,0xef,0x54,0xdf,0x4d,0xff,0x90,0x9e,0xe0,0xf0,0xee,0x54, -0x40,0xfe,0xef,0x54,0xbf,0x4e,0xf0,0x20,0xe0,0x02,0x41,0xab,0x31,0x3d,0x90,0x9e, -0x79,0x74,0x21,0xf0,0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x13,0x13, -0x54,0x01,0xfe,0x90,0x9e,0xe0,0xe0,0xfd,0x13,0x13,0x54,0x01,0x6e,0x60,0x31,0xef, -0x54,0x04,0xff,0xed,0x54,0xfb,0x4f,0xf0,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x15, -0x90,0x01,0x34,0x74,0x40,0xf0,0xfd,0xe4,0xff,0x12,0x3a,0xc5,0x90,0x9e,0x79,0xe0, -0x44,0x08,0xf0,0x80,0x0b,0xe4,0x90,0x9e,0xe2,0xf0,0x7d,0x40,0xff,0x12,0x3a,0x54, -0x90,0x9e,0xe0,0xe0,0xfd,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x9e,0x79, -0xe0,0x44,0x12,0xf0,0xed,0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x9e,0x79,0xe0,0x44, -0x14,0xf0,0x90,0x9e,0xe0,0xe0,0xc4,0x13,0x54,0x07,0x30,0xe0,0x07,0x90,0x9e,0x79, -0xe0,0x44,0x80,0xf0,0x90,0x9e,0xe0,0xe0,0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x07, -0x90,0x9e,0x79,0xe0,0x44,0x40,0xf0,0x90,0x9e,0x79,0xe0,0x90,0x05,0x27,0xf0,0x90, -0x9e,0xe1,0xe0,0x70,0x04,0x7f,0x01,0xd1,0x20,0x90,0x9e,0xe0,0xe0,0xc4,0x13,0x13, -0x54,0x03,0x30,0xe0,0x04,0x7f,0x03,0x80,0x0e,0x7f,0x01,0x12,0x4e,0x6c,0xef,0x60, -0x04,0x7f,0x01,0x80,0x02,0x7f,0x02,0xd1,0x20,0x81,0x0e,0x90,0x9e,0x79,0x74,0x01, -0xf0,0x90,0x05,0x27,0xf0,0xe4,0xff,0xd1,0x20,0x81,0x0c,0x90,0x9e,0x76,0x12,0x43, -0x5e,0x12,0x1f,0x04,0xff,0x54,0x02,0xfe,0x90,0x9e,0xda,0xe0,0x54,0xfd,0x4e,0xfe, -0xf0,0xef,0x54,0x01,0xff,0xee,0x54,0xfe,0x4f,0xff,0xf0,0x12,0x1f,0x04,0xfe,0x54, -0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff,0x90,0x9e,0xda,0xf0,0xee,0x54,0x10,0xfe,0xef, -0x54,0xef,0x4e,0xff,0xf0,0x12,0x1f,0x04,0x54,0x40,0xfe,0xef,0x54,0xbf,0x4e,0x90, -0x9e,0xda,0xf0,0x20,0xe0,0x02,0x61,0xdf,0x31,0x3d,0x90,0x9e,0x79,0x74,0x31,0xf0, -0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x13,0x13,0x54,0x01,0xfe,0x90, -0x9e,0xda,0xe0,0xfd,0x13,0x13,0x54,0x01,0x6e,0x60,0x31,0xef,0x54,0x04,0xff,0xed, -0x54,0xfb,0x4f,0xf0,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x15,0x90,0x01,0x34,0x74, -0x40,0xf0,0xfd,0xe4,0xff,0x12,0x3a,0xc5,0x90,0x9e,0x79,0xe0,0x44,0x08,0xf0,0x80, -0x0b,0xe4,0x90,0x9e,0xdc,0xf0,0x7d,0x40,0xff,0x12,0x3a,0x54,0x90,0x9e,0xda,0xe0, -0xfd,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x9e,0x79,0xe0,0x44,0x02,0xf0, -0xed,0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x9e,0x79,0xe0,0x44,0x04,0xf0,0x90,0x9e, -0x79,0xe0,0x54,0x0e,0x60,0x0c,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12, -0x3a,0xdf,0x90,0x9e,0x79,0xe0,0x90,0x05,0x27,0xf0,0x90,0x9e,0xda,0xe0,0xff,0xc4, -0x13,0x13,0x54,0x03,0x30,0xe0,0x0c,0xa3,0xe0,0x64,0x06,0x60,0x61,0x7f,0x06,0x91, -0x13,0x80,0x5b,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0x90,0x9e,0xdb,0xe0,0xb4,0x06, -0x19,0x7f,0x01,0x91,0x13,0xe4,0xff,0x12,0x4e,0x6c,0xef,0x60,0x09,0x7d,0x01,0xaf, -0x69,0x12,0x49,0x21,0x80,0x04,0xf1,0xb6,0x80,0x34,0x12,0x4e,0x27,0x80,0x2f,0x90, -0x9e,0x79,0x74,0x01,0xf0,0x90,0x05,0x27,0xf0,0x7d,0x03,0x7f,0x02,0x12,0x3a,0x71, -0x90,0x9e,0xdb,0xe0,0xb4,0x06,0x04,0x7f,0x01,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4, -0x04,0x04,0xe4,0xff,0x91,0x13,0x12,0x5f,0x5f,0x12,0x4d,0xca,0x31,0x3d,0xd0,0xd0, -0x92,0xaf,0x22,0x90,0x9e,0xdb,0xe0,0xfe,0x6f,0x70,0x02,0xa1,0xd0,0xef,0x12,0x43, -0x87,0x54,0x3a,0x00,0x54,0x6f,0x01,0x54,0xaf,0x02,0x54,0xea,0x03,0x55,0x22,0x04, -0x55,0x5a,0x05,0x55,0x95,0x06,0x00,0x00,0x55,0xd0,0xee,0xb4,0x04,0x04,0x7f,0x01, -0xa1,0xfc,0x90,0x9e,0xdb,0xe0,0xff,0xb4,0x05,0x02,0xa1,0xd1,0xef,0xb4,0x06,0x06, -0x7f,0x01,0xb1,0xe6,0x80,0x17,0x90,0x9e,0xdb,0xe0,0xb4,0x03,0x07,0x7f,0x01,0x12, -0x4f,0xf5,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x02,0x02,0xb1,0xdb,0xc1,0x15,0x90, -0x9e,0xdb,0xe0,0xb4,0x04,0x06,0x7f,0x01,0xb1,0xfc,0x80,0x09,0x90,0x9e,0xdb,0xe0, -0xb4,0x05,0x02,0xb1,0xd1,0x90,0x9e,0xdb,0xe0,0x70,0x03,0x02,0x4d,0xdb,0x90,0x9e, -0xdb,0xe0,0xfe,0xb4,0x06,0x04,0x7f,0x01,0xa1,0xe6,0xee,0xb4,0x03,0x05,0x7f,0x01, -0x02,0x4f,0xf5,0x90,0x9e,0xdb,0xe0,0x64,0x02,0x60,0x02,0xa1,0xd0,0xa1,0xdb,0x90, -0x9e,0xdb,0xe0,0xb4,0x04,0x06,0x7f,0x01,0xb1,0xfc,0x80,0x09,0x90,0x9e,0xdb,0xe0, -0xb4,0x05,0x02,0xb1,0xd1,0x90,0x9e,0xdb,0xe0,0x70,0x05,0x12,0x4d,0xdb,0x80,0x17, -0x90,0x9e,0xdb,0xe0,0xfe,0xb4,0x06,0x06,0x7f,0x01,0xb1,0xe6,0x80,0x09,0xee,0xb4, -0x03,0x05,0x7f,0x01,0x12,0x4f,0xf5,0x02,0x8f,0xb4,0x90,0x9e,0xdb,0xe0,0xb4,0x04, -0x06,0x7f,0x01,0xb1,0xfc,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x05,0x02,0xb1,0xd1, -0x90,0x9e,0xdb,0xe0,0x70,0x05,0x12,0x4d,0xdb,0x80,0x14,0x90,0x9e,0xdb,0xe0,0xfe, -0xb4,0x06,0x06,0xe4,0xff,0xb1,0xe6,0x80,0x06,0xee,0xb4,0x02,0x02,0xb1,0xdb,0x02, -0x4f,0xec,0x90,0x9e,0xdb,0xe0,0xfe,0xb4,0x06,0x06,0xe4,0xff,0xb1,0xe6,0x80,0x14, -0xee,0xb4,0x03,0x07,0x7f,0x01,0x12,0x4f,0xf5,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4, -0x02,0x02,0xb1,0xdb,0x90,0x9e,0xdb,0xe0,0xb4,0x01,0x04,0xd1,0x15,0x80,0x09,0x90, -0x9e,0xdb,0xe0,0xb4,0x05,0x02,0xb1,0xd1,0xe1,0x87,0x90,0x9e,0xdb,0xe0,0xfe,0xb4, -0x06,0x06,0xe4,0xff,0xb1,0xe6,0x80,0x14,0xee,0xb4,0x03,0x07,0x7f,0x01,0x12,0x4f, -0xf5,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x02,0x02,0xb1,0xdb,0x90,0x9e,0xdb,0xe0, -0xb4,0x01,0x04,0xd1,0x15,0x80,0x0b,0x90,0x9e,0xdb,0xe0,0xb4,0x04,0x04,0x7f,0x01, -0xb1,0xfc,0x02,0x8f,0xa7,0x90,0x9e,0xdb,0xe0,0xb4,0x04,0x06,0x7f,0x01,0xb1,0xfc, -0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x05,0x02,0xb1,0xd1,0x90,0x9e,0xdb,0xe0,0x70, -0x05,0x12,0x4d,0xdb,0x80,0x17,0x90,0x9e,0xdb,0xe0,0xb4,0x03,0x07,0xe4,0xff,0x12, -0x4f,0xf5,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x02,0x02,0xb1,0xdb,0x12,0x8f,0xc1, -0x22,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xdb,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0, -0x90,0x9e,0xdb,0x04,0xf0,0x22,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0xef,0x60,0x05, -0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xdb,0x74,0x01,0xf0,0x22,0x90,0x9f,0x1d,0xef, -0xf0,0x12,0x4f,0x49,0x90,0x9f,0x1d,0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0xe4, -0x90,0x9e,0xdb,0xf0,0x22,0x7f,0x01,0x12,0x4f,0xb4,0xe4,0x90,0x9e,0xdb,0xf0,0x22, -0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xe1,0xe0,0x90,0x9f,0x1c,0xf0,0x6f, -0x70,0x02,0xc1,0xf0,0xef,0x14,0x60,0x3d,0x14,0x60,0x61,0x14,0x70,0x02,0xc1,0xc7, -0x24,0x03,0x60,0x02,0xc1,0xf0,0x90,0x9f,0x1c,0xe0,0xb4,0x03,0x04,0xf1,0x0c,0xc1, -0xf0,0x90,0x9f,0x1c,0xe0,0xb4,0x02,0x04,0xf1,0x24,0xc1,0xf0,0x90,0x9f,0x1c,0xe0, -0xb4,0x04,0x04,0xf1,0x28,0xc1,0xf0,0x90,0x9f,0x1c,0xe0,0x64,0x01,0x60,0x02,0xc1, -0xf0,0xf1,0x0e,0x80,0x7b,0x90,0x9f,0x1c,0xe0,0xff,0xb4,0x03,0x04,0xf1,0xa3,0x80, -0x6f,0xef,0xb4,0x02,0x04,0xf1,0x40,0x80,0x67,0x90,0x9f,0x1c,0xe0,0xff,0xb4,0x04, -0x04,0xf1,0x35,0x80,0x5b,0xef,0x70,0x58,0xf1,0x90,0x80,0x54,0x90,0x9f,0x1c,0xe0, -0xb4,0x03,0x04,0xf1,0x4e,0x80,0x49,0x90,0x9f,0x1c,0xe0,0xb4,0x01,0x04,0xd1,0xf7, -0x80,0x3e,0x90,0x9f,0x1c,0xe0,0xb4,0x04,0x04,0xf1,0x2c,0x80,0x33,0x90,0x9f,0x1c, -0xe0,0x70,0x2d,0xd1,0xf5,0x80,0x29,0x90,0x9f,0x1c,0xe0,0xff,0xb4,0x01,0x05,0x12, -0x4f,0x7d,0x80,0x1c,0xef,0xb4,0x02,0x05,0x12,0x44,0xfc,0x80,0x13,0x90,0x9f,0x1c, -0xe0,0xff,0xb4,0x04,0x05,0x12,0x4f,0xdc,0x80,0x06,0xef,0x70,0x03,0x12,0x4f,0xde, -0xd0,0xd0,0x92,0xaf,0x22,0xf1,0x90,0x12,0x8f,0xd5,0xef,0x70,0x06,0x90,0x01,0xc8, -0x74,0xfd,0xf0,0xf1,0x64,0x90,0x9e,0xe1,0x74,0x02,0xf0,0x22,0xf1,0xa3,0x7d,0x03, -0x7f,0x02,0x12,0x3a,0x71,0x90,0x05,0x27,0xe4,0xf0,0xe0,0x54,0xbf,0xf0,0xe4,0x90, -0x9e,0xe1,0xf0,0x22,0xf1,0x40,0x80,0xe6,0xf1,0x35,0x80,0xe2,0xf1,0x64,0x90,0x9e, -0xe1,0x74,0x02,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xe1,0x04,0xf0,0x22, -0x12,0x4f,0x49,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xe1,0x04,0xf0,0x22,0x90,0x05, -0x27,0xe0,0x44,0x40,0xf0,0xf1,0x5e,0x90,0x9e,0xe1,0x74,0x02,0xf0,0x22,0x90,0x05, -0x22,0x74,0xff,0xf0,0x90,0x00,0x02,0xe0,0x54,0xfe,0xf0,0x12,0x4f,0x6d,0x90,0x01, -0x00,0x74,0x3f,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0x90,0x05,0x53,0xe0,0x44,0x20,0xf0, -0x90,0x01,0xba,0x74,0xcc,0xf0,0x22,0xf1,0x5e,0x90,0x9e,0xdb,0x74,0x04,0xf0,0x22, -0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x3a,0xdf,0x90,0x9e,0xe1,0x74, -0x01,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0x90, -0x9e,0xe1,0x74,0x01,0xf0,0x22,0x90,0x9e,0x90,0xe0,0x60,0x16,0x90,0x9e,0xdb,0xe0, -0x70,0x04,0x7f,0x05,0x80,0x1f,0x90,0x9e,0xdb,0xe0,0x64,0x01,0x70,0x19,0x7f,0x02, -0x80,0x13,0x90,0x9e,0xdb,0xe0,0xb4,0x01,0x04,0x7f,0x03,0x80,0x08,0x90,0x9e,0xdb, -0xe0,0x70,0x04,0x7f,0x04,0x91,0x13,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5, -0x32,0x43,0x32,0x20,0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5, -0x32,0xf0,0x22,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, -0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0x12,0x44,0xcc,0xe4,0xfd, -0x7f,0x51,0x12,0x44,0xcc,0xe4,0xfd,0x7f,0x52,0x12,0x44,0xcc,0xe4,0xfd,0x7f,0x53, -0x02,0x44,0xcc,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00, -0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07, -0x90,0x01,0xc4,0x74,0x33,0xf0,0x74,0x58,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55,0x28, -0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5,0x2f, -0xe5,0x2c,0x20,0xe0,0x02,0x21,0xe9,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1,0x4d, -0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52,0x85,0xd7,0x53,0x85, -0xd9,0x54,0x85,0xd2,0x4e,0x78,0xac,0x7c,0x9e,0xfd,0x7b,0x00,0x7a,0x00,0x79,0x4d, -0x7e,0x00,0x7f,0x08,0x12,0x1e,0xde,0x90,0x9e,0xad,0xe0,0xff,0xc4,0x13,0x54,0x01, -0xfe,0xef,0xc4,0x13,0x13,0x54,0x01,0x6e,0x70,0x02,0x21,0x9b,0x90,0x9e,0xad,0xe0, -0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x02,0x21,0x9b,0xef,0x54,0x1f,0xf5, -0x08,0x90,0x9e,0xae,0xe0,0x54,0x3f,0xf5,0x09,0x90,0x9e,0xb0,0xe0,0x54,0x1f,0xff, -0xe5,0x08,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4,0x8f,0xf0, -0x12,0x42,0x54,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03,0x75,0x09,0x04,0x75,0xf0,0x0a, -0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75,0xf0,0x02,0xe5,0x09,0x12,0x43,0x52, -0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x9e,0xb0,0xe0,0x54,0x1f,0x2f,0xff,0xe4,0x3e,0xfe, -0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75,0xf0,0x02,0xe5,0x09, -0x12,0x43,0x52,0xee,0xf0,0xa3,0xef,0xf0,0x90,0x9e,0xad,0xe0,0xc4,0x13,0x13,0x54, -0x03,0x20,0xe0,0x28,0x90,0x9e,0xb0,0xe0,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24, -0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x54,0x90,0x9e, -0xaf,0xe0,0x30,0xe7,0x36,0xaf,0x08,0x12,0x74,0xbb,0x80,0x2f,0x90,0x9e,0xb0,0xe0, -0x54,0x1f,0xff,0xfd,0xe5,0x08,0x25,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5, -0x83,0xe4,0x8d,0xf0,0x12,0x42,0x54,0x90,0x9e,0xaf,0xe0,0xfe,0x30,0xe7,0x0c,0x54, -0x7f,0xfd,0x8f,0x0d,0xab,0x09,0xaf,0x08,0x12,0x74,0x58,0xe5,0x6a,0x14,0x24,0xfd, -0x50,0x02,0x80,0x45,0x90,0x9e,0x9e,0xe0,0x60,0x37,0x90,0x01,0x5b,0xe4,0xf0,0x90, -0x01,0x3c,0x74,0x04,0xf0,0x91,0xb8,0xef,0x64,0x01,0x70,0x2d,0x90,0x9e,0x93,0xe0, -0xf5,0x48,0x75,0x49,0x00,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x39,0xa9,0x90, -0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90,0x9e,0x9c,0xf0,0x80, -0x08,0x91,0xb8,0xbf,0x01,0x03,0x12,0x4d,0xca,0xe5,0x2c,0x30,0xe1,0x7b,0x90,0x01, -0x34,0x74,0x02,0xf0,0x90,0xfd,0x10,0x74,0x7f,0xf0,0x90,0x04,0x7f,0xe0,0x54,0x07, -0xf5,0x55,0x90,0x04,0x7e,0xe0,0x54,0x07,0xf5,0x56,0x65,0x55,0x60,0x5b,0xe4,0xff, -0x75,0xf0,0x08,0xe5,0x55,0xa4,0x2f,0xf5,0x82,0xe4,0x35,0xf0,0xf5,0x83,0xe5,0x82, -0x24,0xc0,0xf5,0x82,0xe5,0x83,0x34,0xfc,0xf5,0x83,0xe0,0xfe,0x74,0x58,0x2f,0xf8, -0xa6,0x06,0x0f,0xbf,0x08,0xda,0x78,0xa3,0x7c,0x9e,0x7d,0x01,0x7b,0x00,0x7a,0x00, -0x79,0x58,0x7e,0x00,0x7f,0x08,0x12,0x1e,0xde,0x90,0x9e,0xa3,0xe0,0xff,0xc4,0x13, -0x13,0x54,0x03,0x30,0xe0,0x02,0xb1,0x18,0xe5,0x55,0x24,0x01,0xff,0xef,0x54,0x07, -0xf5,0x55,0x90,0x04,0x7f,0xf0,0xb5,0x56,0xa5,0xe5,0x2c,0x30,0xe3,0x10,0x90,0x01, -0x34,0x74,0x08,0xf0,0x90,0x9e,0xc1,0xe0,0x30,0xe0,0x03,0x43,0x57,0x04,0xe5,0x2c, -0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, -0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, -0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x11,0x03,0x90,0x00,0x03,0xe0,0x54,0xfb, -0xf0,0x12,0x4f,0x6d,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, -0xf0,0xe5,0x2e,0x30,0xe0,0x41,0x90,0x9e,0xbb,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, -0x12,0x95,0xd8,0x90,0x9e,0xe0,0xe0,0x30,0xe0,0x0d,0x13,0x13,0x54,0x3f,0x30,0xe0, -0x06,0x90,0x9e,0xe2,0x74,0x01,0xf0,0x90,0x9e,0xda,0xe0,0xff,0x30,0xe0,0x0d,0x13, -0x13,0x54,0x3f,0x30,0xe0,0x06,0x90,0x9e,0xdc,0x74,0x01,0xf0,0x12,0x4e,0x7a,0x12, -0x94,0xbe,0x90,0x9e,0xbb,0xe4,0xf0,0xe5,0x2e,0x30,0xe1,0x60,0x90,0x01,0x36,0x74, -0x02,0xf0,0x43,0x57,0x40,0x12,0x96,0x30,0x90,0x01,0x02,0xe0,0x54,0x03,0x64,0x01, -0x70,0x29,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a,0x74,0x01,0xf0,0x90,0x9e,0xab,0xe4, -0xf0,0x80,0x18,0x90,0x9e,0xab,0xe0,0x04,0xf0,0xe0,0xc3,0x94,0x0a,0x40,0x0c,0xe4, -0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x4f,0xfe,0x90,0x9e,0xda,0xe0,0x30, -0xe0,0x0d,0xe4,0xff,0x12,0x4e,0x6c,0xef,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90, -0x9e,0xa0,0xe0,0x60,0x07,0x7d,0x02,0x7f,0x02,0x12,0x3a,0x54,0xe5,0x2e,0x30,0xe2, -0x43,0x90,0x01,0x36,0x74,0x04,0xf0,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x06,0xa3,0xe0, -0x64,0x06,0x60,0x30,0x12,0x65,0x92,0x90,0x9e,0xa0,0xe0,0x60,0x27,0x90,0x9e,0x9d, -0xe0,0xff,0x90,0x9e,0x8e,0xe0,0xb5,0x07,0x1b,0x90,0x9e,0x9d,0xe0,0x90,0x05,0x73, -0xf0,0x90,0x01,0x3f,0x74,0x10,0xf0,0xfd,0x7f,0x03,0x12,0x3a,0xdf,0x7d,0x01,0x7f, -0x02,0x12,0x3a,0x54,0xe5,0x2e,0x30,0xe3,0x34,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5, -0x67,0x64,0x01,0x70,0x28,0xe5,0x6a,0x60,0x24,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01, -0x3c,0x74,0x02,0xf0,0x75,0x48,0x00,0x90,0x9e,0x95,0xe0,0xf5,0x49,0xe4,0xfb,0xfd, -0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30, -0xe4,0x2b,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x67,0xb4,0x01,0x20,0xe5,0x6a,0x60, -0x1c,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0x9f,0xe4, -0xf0,0x53,0x6b,0xfd,0xe5,0x6b,0x54,0x07,0x70,0x03,0x12,0x4d,0xca,0xe5,0x2e,0x30, -0xe5,0x25,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x67,0xb4,0x01,0x1a,0xe5,0x6a,0x60, -0x16,0x90,0x9e,0x9e,0xe0,0x64,0x02,0x60,0x0b,0xe5,0x68,0x64,0x0c,0x60,0x08,0x12, -0x64,0x90,0x80,0x03,0x12,0x66,0x76,0xe5,0x2e,0x30,0xe6,0x1b,0x90,0x01,0x36,0x74, -0x40,0xf0,0xe5,0x67,0xb4,0x01,0x10,0xe5,0x6a,0x60,0x0c,0x53,0x6b,0xfe,0xe5,0x6b, -0x54,0x07,0x70,0x03,0x12,0x4d,0xca,0xe5,0x2f,0x30,0xe1,0x26,0x90,0x01,0x37,0x74, -0x02,0xf0,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x17,0xe4,0xff,0x12,0x4e,0x6c,0xef,0x60, -0x07,0x91,0xd1,0x12,0x4e,0x27,0x80,0x0a,0x90,0x9e,0xdf,0x74,0x01,0xf0,0x80,0x02, -0x91,0xd1,0x74,0x33,0x04,0x90,0x01,0xc4,0xf0,0x74,0x58,0xa3,0xf0,0xd0,0x07,0xd0, -0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0, -0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0x04,0x1a,0xe0,0xf4,0x60,0x03,0x7f, -0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x07,0x64,0x07,0x7f,0x01,0x60,0x02,0x7f,0x00, -0x22,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x54,0xe5,0x6a,0x14,0x24,0xfd,0x50,0x06,0x24, -0xfd,0x50,0x24,0x80,0x32,0x90,0x9e,0x86,0xe0,0x20,0xe0,0x2b,0x90,0x9e,0x9e,0xe0, -0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x1c,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50, -0x16,0x7d,0x01,0x7f,0x04,0x80,0x0d,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07, -0x7d,0x01,0x7f,0x04,0x12,0x49,0x21,0x22,0x90,0x9e,0x52,0xe0,0x54,0xf0,0x44,0x03, -0xf0,0x54,0x0f,0x44,0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x9e,0xfe,0x12, -0x43,0x7e,0x0b,0x7a,0x9e,0x79,0x52,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e, -0xfb,0x12,0x43,0x7e,0x90,0x9d,0xa9,0xe0,0xff,0x90,0x9d,0xa8,0xe0,0xb5,0x07,0x07, -0x7d,0x02,0x7f,0x03,0x12,0x3a,0xdf,0x90,0x9d,0xa8,0xe0,0x70,0x06,0xa3,0xe0,0x64, -0x09,0x60,0x0b,0x90,0x9d,0xa8,0xe0,0x14,0xff,0xa3,0xe0,0xb5,0x07,0x0d,0xf1,0x05, -0xef,0x60,0x71,0xb1,0xe9,0x90,0x01,0x3f,0x74,0x02,0xf0,0x90,0x9d,0xa9,0xe0,0x75, -0xf0,0x0f,0xa4,0x24,0xad,0xf9,0x74,0x9d,0x35,0xf0,0xa8,0x01,0xfc,0x7d,0x01,0x90, -0x9e,0xfb,0x12,0x43,0x5e,0x7e,0x00,0x7f,0x02,0x12,0x1e,0xde,0x90,0x9d,0xa9,0xe0, -0x75,0xf0,0x0f,0xa4,0x24,0xaf,0xf9,0x74,0x9d,0x35,0xf0,0xfa,0x7b,0x01,0xc0,0x03, -0xc0,0x02,0xc0,0x01,0x90,0x9e,0xfe,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65, -0x90,0x9e,0xfb,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0xc4,0x54,0x0f,0xf5,0x66,0xd0, -0x01,0xd0,0x02,0xd0,0x03,0x12,0x47,0x40,0x90,0x9d,0xa9,0xe0,0x04,0xf0,0xe0,0xb4, -0x0a,0x02,0xe4,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x90,0x9d,0xa8,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xad,0xf9,0x74,0x9d,0x35,0xf0,0xfa, -0x7b,0x01,0xc0,0x02,0xc0,0x01,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xaf,0xf9,0x74,0x9d, -0x35,0xf0,0xfa,0x90,0x9e,0xf8,0x12,0x43,0x7e,0xd0,0x01,0xd0,0x02,0xd1,0x43,0x90, -0x9d,0xa8,0xe0,0x04,0xf0,0xe0,0xb4,0x0a,0x02,0xe4,0xf0,0x90,0x9d,0xa9,0xe0,0xff, -0x90,0x9d,0xa8,0xe0,0xb5,0x07,0x07,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x71,0xd0,0xd0, -0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xf5,0x12,0x43,0x7e, -0x90,0x9d,0xa7,0xe0,0xff,0x04,0xf0,0x90,0x00,0x01,0xef,0x12,0x42,0x32,0xf1,0x05, -0xef,0x70,0x02,0xe1,0x00,0x90,0x9e,0xf5,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89, -0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0x12,0x47,0x40,0x90,0x9e,0xf8, -0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x90,0x9e,0xf5,0x12,0x43,0x5e,0x12, -0x1f,0x04,0xff,0xc4,0x54,0x0f,0xf5,0x66,0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x47, -0x40,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90,0x9e,0xba,0xe0,0x64,0x01,0x70,0x4a,0x90, -0x9e,0xf5,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01, -0x7a,0xfd,0x79,0x20,0x12,0x47,0x40,0x90,0x9e,0xf8,0x12,0x43,0x5e,0x8b,0x63,0x8a, -0x64,0x89,0x65,0x90,0x9e,0xf5,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0xc4,0x54,0x0f, -0xf5,0x66,0x7b,0x01,0x7a,0xfd,0x79,0x22,0x12,0x47,0x40,0x90,0x9e,0xa1,0xe0,0xfe, -0xa3,0xe0,0xf5,0x82,0x8e,0x83,0x74,0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0, -0xd0,0xd0,0x92,0xaf,0x22,0x7f,0xaf,0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x90,0x9f,0x06,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90,0x9f,0x06, -0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x9f,0x09,0xe0, -0x94,0xe8,0x90,0x9f,0x08,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0,0x44,0x10, -0xf0,0x7f,0x00,0x80,0x15,0x90,0x9f,0x08,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f, -0x0a,0x7e,0x00,0x12,0x3b,0x3b,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0x90, -0x9e,0xdf,0xe0,0xb4,0x01,0x04,0xe4,0xf0,0x91,0xd1,0x22,0x90,0x9e,0xda,0xe0,0xff, -0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x0b,0xa3,0xe0,0x64,0x06,0x60,0x05,0x7f,0x06, -0x12,0x54,0x13,0x90,0x9e,0xdb,0xe0,0x64,0x06,0x60,0x02,0xf1,0x5f,0x22,0xad,0x07, -0x90,0x9e,0x56,0xe0,0x54,0xf0,0x44,0x05,0xf0,0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e, -0x58,0xef,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x58,0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7a, -0x9e,0x79,0x56,0xa1,0x37,0xad,0x07,0x90,0x9e,0x60,0xe0,0x54,0xf0,0x44,0x07,0xf0, -0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e,0x62,0xef,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x62, -0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x60,0xa1,0x37,0x90,0x01,0x3c,0x74, -0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, -0xfd,0x7f,0x54,0x12,0x44,0xcc,0x7d,0xff,0x7f,0x55,0x12,0x44,0xcc,0x7d,0xff,0x7f, -0x56,0x12,0x44,0xcc,0x7d,0xff,0x7f,0x57,0x02,0x44,0xcc,0x90,0x00,0xf4,0xe0,0x20, -0xe3,0x09,0xe0,0x7f,0x01,0x20,0xe2,0x05,0x7f,0x02,0x22,0x7f,0x00,0x22,0x90,0x00, -0xf3,0xe0,0x7f,0x00,0x30,0xe3,0x02,0x7f,0x01,0x22,0x90,0x9e,0xbc,0xe0,0xb4,0x01, -0x0c,0x90,0x00,0xf2,0xe0,0x30,0xe7,0x05,0x7e,0xfd,0x7f,0x33,0x22,0x7e,0xfd,0x7f, -0x2f,0x22,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90, -0x05,0x5a,0xf0,0xa3,0xe4,0xf0,0x22,0x90,0x01,0x64,0x74,0x20,0xf0,0x22,0xe4,0x90, -0x9e,0x6b,0xf0,0xa3,0xf0,0x90,0x01,0x98,0xe0,0x7f,0x00,0x30,0xe4,0x02,0x7f,0x01, -0xef,0x64,0x01,0x60,0x3e,0xc3,0x90,0x9e,0x6c,0xe0,0x94,0x88,0x90,0x9e,0x6b,0xe0, -0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44,0x80,0xf0,0x22,0x90,0x9e,0x6b,0xe4, -0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x14,0x7e,0x00,0x12,0x3b,0x3b,0xd3,0x90,0x9e, -0x6c,0xe0,0x94,0x32,0x90,0x9e,0x6b,0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0, -0x30,0xe3,0xb2,0x22,0x90,0x01,0x94,0xe0,0x44,0x01,0xf0,0x22,0x90,0x01,0x01,0xe0, -0x44,0x04,0xf0,0x90,0x01,0x9c,0x74,0x7e,0xf0,0xa3,0x74,0x92,0xf0,0xa3,0x74,0xa0, -0xf0,0xa3,0x74,0x24,0xf0,0x90,0x01,0x9b,0x74,0x49,0xf0,0x90,0x01,0x9a,0x74,0xe0, -0xf0,0x90,0x01,0x99,0xe4,0xf0,0x90,0x01,0x98,0x04,0xf0,0x22,0xc0,0xe0,0xc0,0x83, -0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x7d,0xec,0x90, -0x01,0xc4,0xed,0xf0,0x74,0x60,0xff,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0, -0xfe,0x90,0x00,0x55,0xe0,0x5e,0xf5,0x3d,0x90,0x00,0x52,0xe0,0xfe,0x90,0x00,0x56, -0xe0,0x5e,0xf5,0x3e,0xe5,0x3d,0x30,0xe4,0x06,0x90,0x00,0x55,0x74,0x10,0xf0,0xe5, -0x3d,0x30,0xe5,0x06,0x90,0x00,0x55,0x74,0x20,0xf0,0xe5,0x3d,0x30,0xe6,0x06,0x90, -0x00,0x55,0x74,0x40,0xf0,0xe5,0x3d,0x30,0xe7,0x06,0x90,0x00,0x55,0x74,0x80,0xf0, -0xe5,0x3e,0x30,0xe0,0x06,0x90,0x00,0x56,0x74,0x01,0xf0,0xe5,0x3e,0x30,0xe1,0x06, -0x90,0x00,0x56,0x74,0x02,0xf0,0xe5,0x3e,0x30,0xe2,0x06,0x90,0x00,0x56,0x74,0x04, -0xf0,0xe5,0x3e,0x30,0xe3,0x06,0x90,0x00,0x56,0x74,0x08,0xf0,0x90,0x01,0xc4,0xed, -0xf0,0xa3,0xef,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0xd0,0xd0,0x82,0xd0,0x83, -0xd0,0xe0,0x32,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00, -0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07, -0x90,0x01,0xc4,0x74,0x93,0xf0,0x74,0x61,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c, -0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5, -0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74, -0x01,0xf0,0xe5,0x34,0x30,0xe1,0x08,0x90,0x01,0x3c,0x74,0x02,0xf0,0xd1,0x38,0xe5, -0x34,0x30,0xe2,0x36,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0, -0x21,0x75,0x48,0x00,0x90,0x9e,0x93,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x58,0x7e, -0x01,0x12,0x39,0xa9,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0, -0x80,0x08,0x90,0x9e,0x9c,0xe4,0xf0,0x12,0x4d,0xca,0xe5,0x34,0x30,0xe3,0x36,0x90, -0x01,0x3c,0x74,0x08,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe1,0x21,0x75,0x48,0x00,0x90, -0x9e,0x93,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x12,0x39,0xa9,0x90, -0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x08,0x90,0x9e,0x9b, -0xe4,0xf0,0x12,0x4d,0xca,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,0xf0, -0x12,0x49,0xa3,0xe5,0x34,0x30,0xe5,0x06,0x90,0x01,0x3c,0x74,0x20,0xf0,0xe5,0x35, -0x30,0xe0,0x18,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x01,0x2f,0xe0,0x44,0x7f,0xf0, -0x90,0x00,0x83,0xe0,0xf5,0x69,0x91,0x71,0x12,0x4d,0xca,0xe5,0x35,0x30,0xe2,0x0c, -0x90,0x01,0x3d,0x74,0x04,0xf0,0x53,0x6b,0xfb,0x12,0x4d,0xca,0xe5,0x36,0x30,0xe0, -0x6d,0x90,0x01,0x3e,0x74,0x01,0xf0,0x90,0x9e,0xe0,0xe0,0x30,0xe0,0x13,0xa3,0xe0, -0x64,0x03,0x60,0x0d,0x7f,0x01,0x12,0x4e,0x6c,0xef,0x60,0x05,0x7f,0x01,0x12,0x56, -0x20,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x46,0xe4,0xff,0x12,0x4e,0x6c,0xef,0x60,0x3e, -0x12,0x5f,0x6b,0x90,0x9e,0xdb,0xe0,0xff,0x64,0x06,0x60,0x32,0xef,0xb4,0x04,0x02, -0x80,0x07,0x90,0x9e,0xdb,0xe0,0xb4,0x05,0x04,0xe4,0xff,0x80,0x14,0x90,0x9e,0xdb, -0xe0,0xb4,0x03,0x04,0x7f,0x01,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x02,0x05,0x7f, -0x01,0x12,0x54,0x13,0x7d,0x01,0xaf,0x69,0x12,0x49,0x21,0x12,0x4e,0x27,0xe5,0x36, -0x30,0xe1,0x3c,0x90,0x01,0x3e,0x74,0x02,0xf0,0x90,0x9e,0xe0,0xe0,0x30,0xe0,0x13, -0xa3,0xe0,0x64,0x03,0x60,0x0d,0x7f,0x01,0x12,0x4e,0x6c,0xef,0x70,0x05,0x7f,0x02, -0x12,0x56,0x20,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x15,0xd1,0xbc,0x90,0x9e,0xdb,0xe0, -0x64,0x06,0x60,0x0b,0xe4,0xff,0x12,0x4e,0x6c,0xef,0x70,0x03,0x12,0x57,0xb6,0xe5, -0x36,0x30,0xe3,0x09,0x90,0x01,0x3e,0x74,0x08,0xf0,0x43,0x6b,0x04,0xe5,0x36,0x30, -0xe4,0x06,0x90,0x01,0x3e,0x74,0x10,0xf0,0xe5,0x36,0x30,0xe2,0x76,0x90,0x01,0x3e, -0x74,0x04,0xf0,0x90,0x07,0x8f,0xe0,0x30,0xe7,0x13,0x74,0x80,0xf0,0x90,0x07,0x95, -0x74,0x04,0xf0,0xa3,0xe0,0x44,0x04,0xf0,0xe4,0xff,0x12,0x4d,0xe4,0x90,0x07,0x8f, -0xe0,0x30,0xe6,0x12,0x74,0x40,0xf0,0x90,0x07,0x7c,0xe0,0xb4,0x06,0x08,0x90,0x07, -0x80,0xe0,0xff,0x12,0x5f,0x8e,0x90,0x07,0x8f,0xe0,0x30,0xe5,0x14,0x74,0x20,0xf0, -0xe4,0xff,0x12,0x4d,0xe4,0x90,0x07,0x95,0xe0,0x44,0x01,0xf0,0xa3,0xe0,0x44,0x01, -0xf0,0x90,0x07,0x95,0xe0,0x30,0xe2,0x0d,0x74,0x04,0xf0,0xa3,0xe0,0x54,0xfb,0xf0, -0x7f,0x01,0x12,0x4d,0xe4,0x90,0x07,0x95,0xe0,0x30,0xe0,0x07,0x74,0x01,0xf0,0xff, -0x12,0x4d,0xe4,0xe5,0x36,0x30,0xe5,0x06,0x90,0x01,0x3e,0x74,0x20,0xf0,0xe5,0x36, -0x30,0xe6,0x08,0x90,0x01,0x3e,0x74,0x40,0xf0,0x91,0x90,0xe5,0x36,0x30,0xe7,0x0c, -0x90,0x01,0x3e,0x74,0x80,0xf0,0x53,0x6b,0xfe,0x12,0x4d,0xca,0xe5,0x37,0x30,0xe1, -0x09,0x90,0x01,0x3f,0x74,0x02,0xf0,0x43,0x57,0x80,0xe5,0x37,0x30,0xe4,0x1c,0x90, -0x01,0x3f,0x74,0x10,0xf0,0x12,0x4e,0x7a,0x90,0x9e,0x9d,0xe0,0x90,0x05,0x73,0xf0, -0x90,0x01,0x36,0x74,0x02,0xf0,0xfd,0xff,0x12,0x3a,0xc5,0x74,0x93,0x04,0x90,0x01, -0xc4,0xf0,0x74,0x61,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03, -0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0, -0x32,0xe5,0x69,0x30,0xe6,0x19,0xe5,0x69,0x54,0x0f,0xff,0x90,0x9e,0x85,0xe0,0xfe, -0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x9e,0x85,0xf0,0x53,0x69,0xbf,0x22, -0x90,0x9e,0x86,0xe0,0x30,0xe0,0x11,0x90,0x05,0x22,0xe0,0x20,0xe4,0x20,0x12,0x47, -0xf3,0xef,0x64,0x01,0x70,0x18,0x80,0x06,0x12,0x47,0xf3,0xbf,0x01,0x10,0x90,0x9e, -0xb5,0xe0,0xff,0xe4,0xfd,0x12,0x48,0x28,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90, -0x06,0xa9,0xe0,0x90,0x9e,0x52,0xf0,0xe0,0x54,0xc0,0x70,0x09,0x53,0x6b,0xfe,0x53, -0x6b,0xfd,0x12,0x4d,0xca,0x90,0x9e,0x52,0xe0,0x30,0xe6,0x13,0x43,0x6b,0x01,0x90, -0x9e,0x9e,0xe0,0x64,0x02,0x60,0x04,0x91,0x90,0x80,0x07,0xd1,0x76,0x80,0x03,0x53, -0x6b,0xfe,0x90,0x9e,0x52,0xe0,0x30,0xe7,0x2a,0x43,0x6b,0x02,0xe4,0xf5,0x48,0x90, -0x9e,0x95,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9,0x90, -0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0x9f,0x74,0x01,0xf0,0x90,0x9e,0x89,0xe0,0x44, -0x04,0xf0,0x22,0x53,0x6b,0xfd,0x22,0x90,0x06,0xa9,0xe0,0x90,0x9e,0x52,0xf0,0xe0, -0x54,0xc0,0x70,0x09,0x53,0x6b,0xfe,0x53,0x6b,0xfd,0x02,0x4d,0xca,0x90,0x9e,0x52, -0xe0,0x30,0xe6,0x1d,0x90,0x9e,0x8d,0xe0,0x70,0x07,0x43,0x6b,0x01,0x91,0x90,0x80, -0x13,0x90,0x9e,0x9e,0xe0,0xb4,0x01,0x0c,0x43,0x6b,0x04,0x7f,0x01,0xb1,0xff,0x80, -0x03,0x53,0x6b,0xfe,0x90,0x9e,0x52,0xe0,0x30,0xe7,0x23,0x43,0x6b,0x02,0xe4,0xf5, -0x48,0x90,0x9e,0x95,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39, -0xa9,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0x9f,0x74,0x01,0xf0,0x22,0x53,0x6b, -0xfd,0x22,0xe5,0x67,0x64,0x01,0x70,0x66,0xe5,0x6a,0x60,0x62,0xe5,0x6a,0x64,0x02, -0x60,0x06,0xe5,0x6a,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x9e,0x8e,0xf0, -0x90,0x06,0xaa,0xe0,0x90,0x9e,0x9d,0xf0,0x90,0x9e,0x8e,0xe0,0x70,0x07,0x90,0x9e, -0x9d,0xe0,0xff,0x80,0x05,0x90,0x9e,0x8e,0xe0,0xff,0x90,0x9e,0x8e,0xef,0xf0,0x90, -0x9e,0x90,0xe0,0x60,0x03,0xe0,0x14,0xf0,0xe4,0x90,0x9e,0x8f,0xf0,0x90,0x01,0x57, -0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x53,0x6b,0xfd,0x53,0x6b,0xef,0xe5,0x6a,0x14, -0x24,0xfd,0x50,0x06,0x24,0xfd,0x50,0x04,0x80,0x04,0x81,0xbf,0xb1,0x27,0x22,0x8f, -0x6d,0x12,0x47,0xf3,0xef,0x64,0x01,0x70,0x2e,0x90,0x9e,0xb7,0x12,0x48,0x24,0xe5, -0x6d,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10, -0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef, -0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xe5,0x6a,0x60,0x39,0x90,0x9e,0x9f,0xe0, -0x60,0x0d,0xe4,0xf0,0x53,0x6b,0xfd,0xe5,0x6b,0x54,0x07,0x70,0x28,0x80,0x23,0x90, -0x9e,0x8f,0xe0,0x04,0xf0,0x53,0x6b,0xef,0x90,0x9e,0x94,0xe0,0xff,0x90,0x9e,0x8f, -0xe0,0xd3,0x9f,0x40,0x0d,0xe5,0x67,0xb4,0x01,0x0b,0xa3,0xe0,0x70,0x07,0xe0,0x04, -0xf0,0x22,0x12,0x4d,0xca,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08, -0xf0,0xe4,0xf5,0x48,0x90,0x9e,0x93,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e, -0x01,0x12,0x39,0xa9,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0, -0x90,0x9e,0x9b,0x14,0xf0,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x0c,0x50,0x0d,0x12,0x49, -0x1d,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x03,0x12,0x4e,0x27,0x22,0x90,0x01,0x57,0xe0, -0x60,0x3c,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0x9f, -0xe0,0x60,0x07,0xe4,0xf0,0x53,0x6b,0xfd,0x80,0x24,0x90,0x9e,0x8f,0xe0,0x04,0xf0, -0x53,0x6b,0xef,0x90,0x9e,0x94,0xe0,0xff,0x90,0x9e,0x8f,0xe0,0xd3,0x9f,0x40,0x0e, -0xe5,0x67,0xb4,0x01,0x09,0x90,0x9e,0x90,0xe0,0x70,0x03,0xe0,0x04,0xf0,0x90,0x01, -0x5b,0xe0,0x60,0x10,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0xe4, -0x90,0x9e,0x9c,0xf0,0x90,0x01,0x5f,0xe0,0x60,0x10,0x90,0x01,0x5f,0xe4,0xf0,0x90, -0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x9e,0x9b,0xf0,0x22,0xc0,0xe0,0xc0,0xf0,0xc0, -0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03, -0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x53,0x91,0xbf,0x90,0xfd,0x68,0xe0,0x20, -0xe0,0x03,0x02,0x68,0xe1,0x90,0x01,0xba,0xe0,0x04,0xf0,0x90,0xfd,0x62,0xe0,0x90, -0x01,0xbc,0xf0,0x90,0xfd,0x63,0xe0,0x90,0x01,0xbd,0xf0,0x90,0xfd,0x60,0xe0,0x90, -0x01,0xbe,0xf0,0x90,0xfd,0x60,0xe0,0x64,0x0e,0x60,0x03,0x02,0x68,0x22,0x90,0x9e, -0x43,0xe0,0xff,0x13,0x13,0x13,0x54,0x1f,0x20,0xe0,0x03,0x02,0x68,0x22,0x90,0xfd, -0x62,0xe0,0x54,0xc0,0xfe,0x90,0x07,0x90,0xe0,0x54,0x3f,0x4e,0xf0,0x90,0xfd,0x63, -0xe0,0x90,0x07,0x91,0xf0,0x90,0xfd,0x64,0xe0,0x90,0x07,0x92,0xf0,0x90,0xfd,0x65, -0xe0,0x90,0x07,0x93,0xf0,0x90,0x07,0x95,0x74,0x01,0xf0,0xef,0x20,0xe0,0x44,0x90, -0x9e,0x43,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x19,0x90,0x07,0x78,0x12,0x68,0xfc, -0x90,0x9e,0x43,0xe0,0xff,0xc3,0x13,0x30,0xe0,0x48,0x90,0x07,0x83,0xe0,0x44,0x40, -0xf0,0x80,0x3f,0x90,0x9e,0x43,0xe0,0xff,0xc3,0x13,0x30,0xe0,0x11,0xe4,0xff,0x12, -0x4d,0xe4,0x90,0x07,0x95,0xe0,0x44,0x01,0xf0,0xa3,0xe0,0x44,0x01,0xf0,0x90,0x07, -0x78,0x80,0x13,0x90,0x9e,0x43,0xe0,0xff,0x13,0x13,0x54,0x3f,0x90,0x07,0x78,0x30, -0xe0,0x04,0x11,0xfc,0x80,0x0c,0xe0,0x44,0x10,0xf0,0xe0,0x44,0x20,0xf0,0xe0,0x54, -0xdf,0xf0,0x90,0xfd,0x60,0xe0,0xb4,0x0f,0x0a,0x90,0xfd,0x62,0xe0,0xff,0xa3,0xe0, -0xfd,0x51,0x62,0x90,0xfd,0x60,0xe0,0x64,0x15,0x70,0x64,0x90,0xfd,0x62,0xe0,0x90, -0x9e,0x5e,0xf0,0x90,0xfd,0x62,0xe0,0x30,0xe0,0x15,0x90,0x9e,0x5e,0xe0,0xf4,0x54, -0x3f,0x04,0xff,0x90,0x9e,0x4e,0xe0,0x13,0x13,0x54,0x3f,0xc3,0x9f,0x80,0x10,0x90, -0x9e,0x4e,0xe0,0x13,0x13,0x54,0x3f,0xff,0x90,0x9e,0x5e,0xe0,0x54,0x3f,0x2f,0x90, -0x9e,0x5d,0xf0,0x90,0x9e,0x5d,0xe0,0xff,0x54,0x30,0xc4,0x54,0x0f,0xfe,0xef,0x25, -0xe0,0x25,0xe0,0x4e,0x90,0x9e,0x5f,0xf0,0x90,0x00,0x2e,0xf0,0x90,0x9e,0x5d,0xe0, -0xc4,0x54,0xf0,0xff,0x90,0x9e,0x4f,0xe0,0x54,0x0f,0x4f,0x90,0x00,0x2d,0xf0,0x90, -0xfd,0x60,0xe0,0xb4,0x16,0x08,0x90,0xfd,0x62,0xe0,0xff,0x12,0x5f,0xb5,0x90,0xfd, -0x60,0xe0,0xb4,0x21,0x07,0x90,0xfd,0x62,0xe0,0xff,0x31,0xe9,0x90,0xfd,0x60,0xe0, -0xb4,0x22,0x02,0x51,0x11,0x90,0xfd,0x60,0xe0,0xb4,0x23,0x05,0xa3,0xe0,0xff,0x51, -0x8d,0x90,0xfd,0x60,0xe0,0xb4,0x24,0x02,0x51,0x39,0x90,0xfd,0x68,0xe0,0x44,0x01, -0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0, -0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xe0,0x54,0xef,0xf0, -0x90,0xfd,0x63,0xe0,0x54,0x3f,0x25,0xe0,0x25,0xe0,0xff,0x90,0xfd,0x62,0xe0,0x54, -0x03,0x4f,0x90,0x9e,0x5b,0xf0,0x90,0xfd,0x64,0xe0,0x54,0x3f,0x25,0xe0,0x25,0xe0, -0xff,0x90,0xfd,0x63,0xe0,0x54,0x03,0x4f,0x90,0x9e,0x5c,0xf0,0x90,0x9e,0x5b,0xe0, -0xfd,0xa3,0xe0,0xfb,0xe4,0xff,0x90,0x9e,0x60,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0xeb, -0xf0,0x12,0x47,0xf3,0xef,0x64,0x01,0x60,0x02,0x21,0xe8,0x90,0x9e,0xb8,0x12,0x48, -0x24,0x90,0x9e,0x60,0xe0,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, -0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, -0x83,0xe0,0x54,0xef,0xf0,0xad,0x07,0x74,0x06,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5, -0x83,0xe0,0x44,0x10,0xf0,0x74,0x11,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0, -0x54,0xef,0xf0,0xad,0x07,0x74,0x16,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0, -0x44,0x02,0xf0,0x74,0x16,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0x03, -0xf0,0x90,0x9e,0x61,0xe0,0xfd,0xac,0x07,0x74,0x22,0x2c,0xf5,0x82,0xe4,0x34,0xfc, -0xf5,0x83,0xed,0xf0,0x90,0x9e,0x62,0xe0,0xfd,0x74,0x23,0x2c,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xed,0xf0,0x74,0x24,0x2c,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0, -0x04,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xad,0x07,0x90,0x9e,0x60,0xe0,0x54, -0xf0,0x44,0x09,0xf0,0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e,0x62,0xef,0xf0,0x7b,0x01, -0x7a,0x9e,0x79,0x62,0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x60,0x02,0x5d, -0x37,0x90,0x00,0x75,0xe0,0x44,0x01,0xf0,0x7f,0x01,0x7e,0x00,0x12,0x3a,0xaa,0x90, -0xfe,0x13,0x74,0x03,0xf0,0x7f,0x02,0x7e,0x00,0x12,0x3a,0xaa,0x90,0xfe,0x13,0xe4, -0xf0,0x90,0x00,0x75,0xe0,0x54,0xfe,0xf0,0x22,0x90,0x9e,0x60,0xe0,0x54,0xf0,0x44, -0x0d,0xf0,0x54,0x0f,0x44,0x10,0xf0,0x90,0xfd,0x62,0xe0,0x90,0x9e,0x62,0xf0,0x7b, -0x01,0x7a,0x9e,0x79,0x62,0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x60,0x02, -0x5d,0x37,0xae,0x07,0x90,0x9e,0x60,0xe0,0x54,0xf0,0x44,0x04,0xf0,0x54,0x0f,0x44, -0x20,0xf0,0x90,0x9e,0x62,0xee,0xf0,0xa3,0xed,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x62, -0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x60,0x02,0x5d,0x37,0xad,0x07,0x90, -0x9e,0x60,0xe0,0x54,0xf0,0x44,0x0c,0xf0,0x54,0x0f,0xf0,0xed,0xb4,0x02,0x08,0xe0, -0x54,0x0f,0x44,0x20,0xf0,0x80,0x0d,0xed,0xb4,0x04,0x09,0x90,0x9e,0x60,0xe0,0x54, -0x0f,0x44,0x40,0xf0,0x90,0xfd,0x62,0xe0,0x90,0x9e,0x62,0xf0,0x90,0xfd,0x63,0xe0, -0x90,0x9e,0x63,0xf0,0x90,0xfd,0x64,0xe0,0x90,0x9e,0x64,0xf0,0x90,0xfd,0x65,0xe0, -0x90,0x9e,0x65,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x62,0x90,0x9e,0xfe,0x12,0x43,0x7e, -0x7a,0x9e,0x79,0x60,0x02,0x5d,0x37,0x8f,0x1f,0x8c,0x20,0x8d,0x21,0x22,0x8f,0x22, -0x8c,0x23,0x8d,0x24,0x22,0xe4,0x90,0x9e,0x6b,0xf0,0xa3,0xf0,0x90,0x02,0x86,0xe0, -0x20,0xe1,0x2c,0xc3,0x90,0x9e,0x6c,0xe0,0x94,0xd0,0x90,0x9e,0x6b,0xe0,0x94,0x07, -0x40,0x0a,0x90,0x01,0xc6,0xe0,0x44,0x20,0xf0,0x7f,0x00,0x22,0x90,0x9e,0x6b,0xe4, -0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x0a,0x7e,0x00,0x12,0x3b,0x3b,0x80,0xcd,0x7f, -0x01,0x22,0x90,0x01,0xcc,0xe0,0x54,0x0f,0x90,0x9e,0x6b,0xf0,0x90,0x9e,0x6b,0xe0, -0xfd,0x70,0x02,0x81,0x73,0x90,0x9f,0x19,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81, -0x6c,0x90,0x9f,0x19,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x52,0xe0,0x90, -0x9e,0x6c,0xf0,0x75,0x63,0x01,0x75,0x64,0x9e,0x75,0x65,0x6c,0x75,0x66,0x01,0x7b, -0x01,0x7a,0x9e,0x79,0x6d,0x12,0x47,0x40,0x90,0x9e,0x6d,0xe0,0xff,0xc4,0x13,0x13, -0x13,0x54,0x01,0x90,0x9f,0x19,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88, -0x12,0x43,0x52,0xe0,0x90,0x9e,0x6e,0xf0,0x90,0x9f,0x19,0xe0,0x75,0xf0,0x02,0x90, -0x00,0x89,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6f,0xf0,0x90,0x9f,0x19,0xe0,0x75,0xf0, -0x04,0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x9e,0x70,0xf0,0x90,0x9f,0x19,0xe0, -0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90,0x9e,0x71,0xf0,0x90,0x9f, -0x19,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52,0xe0,0x90,0x9e,0x72,0xf0, -0x80,0x33,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6e, -0xf0,0x90,0x9f,0x19,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90, -0x9e,0x6f,0xf0,0x90,0x9f,0x19,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52, -0xe0,0x90,0x9e,0x70,0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x9e,0x79,0x6e,0x91, -0x74,0x90,0x9e,0x6b,0xe0,0xff,0x90,0x9f,0x19,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08, -0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x90,0x9e,0x6b,0xf0,0x90,0x9f,0x19,0xe0, -0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0, -0x90,0x9f,0x19,0xe0,0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0x3c,0x90,0x01,0xc6,0xe0, -0x44,0x02,0xf0,0x22,0x90,0x9e,0x73,0x12,0x43,0x7e,0xef,0x12,0x43,0x87,0x6d,0x0c, -0x01,0x6d,0x15,0x02,0x6d,0x42,0x03,0x6d,0x4b,0x05,0x6d,0x54,0x06,0x6e,0xad,0x07, -0x6d,0x5c,0x08,0x6d,0x65,0x10,0x6d,0x6e,0x11,0x6d,0x77,0x12,0x6d,0x80,0x13,0x6d, -0x89,0x14,0x6d,0x92,0x15,0x6d,0x9b,0x16,0x6d,0xa5,0x17,0x6d,0xaf,0x18,0x6d,0xb9, -0x19,0x6e,0x82,0x1a,0x6e,0x8b,0x1b,0x6e,0x94,0x1c,0x6d,0xc2,0x1d,0x6d,0xcc,0x1e, -0x6d,0xd7,0x21,0x6d,0xe0,0x22,0x6d,0xe9,0x23,0x6d,0xf2,0x24,0x6d,0xfb,0x25,0x6e, -0x04,0x26,0x6e,0x0d,0x27,0x6e,0x16,0x28,0x6e,0x1f,0x29,0x6d,0x1e,0x2d,0x6d,0x27, -0x2e,0x6e,0x28,0x2f,0x6e,0x9d,0x30,0x6e,0x3a,0x32,0x6e,0x31,0x33,0x6d,0x39,0x34, -0x6e,0x43,0x36,0x6e,0x4c,0x37,0x6e,0x55,0x38,0x6e,0x5e,0x3a,0x6d,0x30,0x3b,0x6e, -0x79,0x3c,0x6e,0x67,0x3e,0x6e,0x70,0x3f,0x00,0x00,0x6e,0xa6,0x90,0x9e,0x73,0x12, -0x43,0x5e,0x02,0x84,0x62,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x84,0x8c,0x90,0x9e, -0x73,0x12,0x43,0x5e,0x02,0x84,0x92,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x84,0xda, -0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x85,0x08,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02, -0x85,0x15,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x85,0x30,0x90,0x9e,0x73,0x12,0x43, -0x5e,0x02,0x84,0x06,0x90,0x9e,0x73,0x12,0x43,0x5e,0xc1,0xae,0x90,0x9e,0x73,0x12, -0x43,0x5e,0x02,0x51,0x68,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x85,0x78,0x90,0x9e, -0x73,0x12,0x43,0x5e,0x02,0x85,0xbf,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x85,0xe6, -0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x86,0x05,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02, -0x86,0x1f,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x86,0xf7,0x90,0x9e,0x73,0x12,0x43, -0x5e,0x7f,0x01,0x80,0x2f,0x90,0x9e,0x73,0x12,0x43,0x5e,0x7f,0x02,0x80,0x25,0x90, -0x9e,0x73,0x12,0x43,0x5e,0x7f,0x03,0x80,0x1b,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02, -0x88,0x7c,0x90,0x9e,0x73,0x12,0x43,0x5e,0xe4,0xff,0x80,0x08,0x90,0x9e,0x73,0x12, -0x43,0x5e,0x7f,0x04,0x02,0x87,0x9a,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x88,0xee, -0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x89,0x15,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02, -0x89,0x3c,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x89,0x63,0x90,0x9e,0x73,0x12,0x43, -0x5e,0x02,0x89,0x8a,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x89,0xb1,0x90,0x9e,0x73, -0x12,0x43,0x5e,0x02,0x89,0xd8,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8a,0x0f,0x90, -0x9e,0x73,0x12,0x43,0x5e,0x02,0x8a,0x36,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8a, -0x5e,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8a,0xa1,0x90,0x9e,0x73,0x12,0x43,0x5e, -0x02,0x8a,0xca,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8a,0xf3,0x90,0x9e,0x73,0x12, -0x43,0x5e,0x02,0x8c,0x86,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8c,0x98,0x90,0x9e, -0x73,0x12,0x43,0x5e,0x02,0x8c,0xcd,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8e,0x8a, -0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8e,0xb3,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02, -0x94,0x4b,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x92,0xc6,0x90,0x9e,0x73,0x12,0x43, -0x5e,0x02,0x84,0x4e,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x84,0x35,0x90,0x9e,0x73, -0x12,0x43,0x5e,0x02,0x94,0xf3,0x90,0x01,0xc6,0xe0,0x44,0x01,0xf0,0x22,0x90,0x00, -0x04,0x12,0x1f,0x1d,0xff,0x54,0x1f,0xfe,0xef,0x54,0x20,0xc4,0x13,0x54,0x07,0xfd, -0xaf,0x06,0x90,0x9e,0x76,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0x12,0x43,0x7e,0x90,0x9e, -0x78,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x1f,0x1d,0x54,0xf0,0xc4,0x54,0x0f,0x90, -0x9e,0x7b,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x54,0x40,0xc4,0x13,0x13,0x54,0x03, -0x90,0x9e,0x7c,0xf0,0x90,0x9e,0x76,0xe0,0xff,0x75,0xf0,0x09,0x90,0x96,0x46,0x12, -0x43,0x52,0xad,0x82,0xac,0x83,0x90,0x9e,0x7d,0xec,0xf0,0xa3,0xed,0xf0,0xef,0x75, -0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,0x35,0xf0,0xfa,0x7b,0x01,0xa3,0x12,0x43, -0x7e,0x90,0x9e,0x78,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x1f,0x1d,0x54,0x0f,0xff, -0x90,0x9e,0x7f,0x12,0x43,0x5e,0xef,0x12,0x42,0x20,0x90,0x9e,0x78,0x12,0x43,0x5e, -0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x90,0x9e,0x7f,0x12,0x43,0x5e,0x90,0x00,0x01, -0xef,0x12,0x42,0x32,0x90,0x9e,0x78,0x12,0x43,0x5e,0x90,0x00,0x01,0x12,0x1f,0x1d, -0xff,0x90,0x9e,0x7d,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5,0x82,0x8c,0x83,0xef,0xf0,0x12, -0x1f,0x04,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x9e,0x7b,0xe0,0xfe,0x90,0x9e,0x76, -0xe0,0xff,0x24,0x82,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0x90,0x9e,0x77, -0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4a,0x12,0x43,0x52,0xee,0xf0,0x75,0xf0, -0x09,0xef,0x90,0x96,0x4b,0x12,0x43,0x52,0x74,0x01,0xf0,0x90,0x9e,0x7c,0xe0,0xfe, -0x75,0xf0,0x09,0xef,0x90,0x96,0x4c,0x12,0x43,0x52,0xee,0xf0,0x8f,0x13,0xef,0x25, -0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xaf,0x82,0xf5,0x15,0x8f,0x16,0xe5,0x13, -0x75,0xf0,0x02,0xa4,0x24,0x02,0xf9,0x74,0x95,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18, -0x89,0x19,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x46,0x12,0x43,0x52,0xaf,0x82,0x85, -0x83,0x1a,0x8f,0x1b,0xe5,0x13,0x75,0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,0x35, -0xf0,0x75,0x1c,0x01,0xf5,0x1d,0x89,0x1e,0x74,0x82,0x25,0x13,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0xe0,0x12,0x43,0x87,0x70,0x3c,0x00,0x70,0x51,0x01,0x70,0x66,0x02, -0x70,0x7b,0x03,0x70,0xa4,0x04,0x70,0xb9,0x05,0x70,0xce,0x06,0x70,0xf4,0x0c,0x71, -0x21,0x0d,0x71,0x4e,0x0e,0x71,0x7b,0x0f,0x00,0x00,0x71,0xaf,0xe5,0x13,0x25,0xe0, -0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x15,0x80, -0x3c,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0, -0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34, -0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80,0x12,0xe5,0x13,0x25,0xe0,0x24, -0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,0xe5,0x13, -0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74, -0x8f,0xf0,0x21,0xaf,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5, -0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5, -0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,0xe5,0x13, -0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d, -0xf0,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0, -0xa3,0xf0,0x21,0xaf,0x90,0x04,0x47,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x12,0x42, -0x20,0x90,0x04,0x46,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x01,0x12,0x42, -0x32,0x90,0x04,0x45,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xf0,0x90,0x04,0x44,0x21, -0xa6,0x90,0x04,0x4b,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x12,0x42,0x20,0x90,0x04, -0x4a,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x04, -0x49,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04, -0x4f,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x12,0x42,0x20,0x90,0x04,0x4e,0xe0,0xab, -0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x04,0x4d,0xe0,0x85, -0x16,0x82,0x85,0x15,0x83,0xf0,0x90,0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab, -0x17,0xaa,0x18,0xa9,0x19,0x12,0x42,0x20,0x90,0x04,0x52,0xe0,0xab,0x17,0xaa,0x18, -0xa9,0x19,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x04,0x51,0xe0,0x85,0x16,0x82,0x85, -0x15,0x83,0xf0,0x90,0x04,0x50,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xa3,0xf0,0xab, -0x17,0xaa,0x18,0xa9,0x19,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x1f,0x04,0xff,0xab, -0x1c,0xaa,0x1d,0xa9,0x1e,0x12,0x1f,0x04,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12, -0x42,0x20,0xab,0x17,0xe5,0x19,0x24,0x01,0xf9,0xe4,0x35,0x18,0xfa,0xc0,0x03,0xc0, -0x02,0xc0,0x01,0x12,0x1f,0x04,0xff,0xab,0x1c,0xaa,0x1d,0xa9,0x1e,0x90,0x00,0x01, -0x12,0x1f,0x1d,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x20,0x85,0x16,0x82, -0x85,0x15,0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1b,0x82,0x85,0x1a,0x83,0xe0, -0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0x85,0x16,0x82,0x85,0x15,0x83,0xa3,0xc0, -0x83,0xc0,0x82,0xe0,0xff,0x85,0x1b,0x82,0x85,0x1a,0x83,0xa3,0xe0,0xfe,0xef,0x5e, -0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0x75,0x14,0x0b,0x74,0x01,0x7e,0x00, -0xa8,0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x13,0x25, -0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f, -0x4e,0x60,0x06,0xe5,0x14,0x24,0x10,0x80,0x5d,0x15,0x14,0xe5,0x14,0xc3,0x94,0x00, -0x50,0xca,0x80,0x56,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5, -0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3d,0x75,0x14,0x0f,0x74,0x01,0x7e,0x00,0xa8, -0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x13,0x25,0xe0, -0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e, -0x60,0x08,0x90,0x9e,0x82,0xe5,0x14,0xf0,0x80,0x10,0x15,0x14,0xe5,0x14,0xc3,0x94, -0x00,0x50,0xc8,0x80,0x05,0xe4,0x90,0x9e,0x82,0xf0,0xe5,0x13,0x25,0xe0,0x24,0xc6, -0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5, -0x14,0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, -0xf9,0xff,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0, -0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x9e,0x83,0xe5,0x14,0xf0,0x80,0x5b, -0x05,0x14,0xe5,0x14,0xb4,0x10,0xca,0x80,0x52,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5, -0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x14, -0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, -0xff,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e, -0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x14,0x24,0x10,0x80,0x0a,0x05,0x14,0xe5, -0x14,0xb4,0x0c,0xcc,0x80,0x05,0xe4,0x90,0x9e,0x83,0xf0,0x90,0x9e,0x82,0xe0,0xff, -0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x48,0x12,0x43,0x52,0xef,0xf0,0x90,0x9e,0x83, -0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x49,0x12,0x43,0x52,0xee,0xf0,0x74, -0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90, -0x9e,0x82,0x71,0xfe,0x74,0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0, -0xff,0x90,0x9e,0x83,0xe0,0xfe,0xef,0xc3,0x9e,0x50,0x02,0x71,0xfe,0x90,0x9e,0x82, -0xe0,0xff,0xd3,0x94,0x13,0x40,0x07,0x90,0x96,0x43,0x74,0x03,0xf0,0x22,0xef,0xd3, -0x94,0x0b,0x40,0x07,0x90,0x96,0x43,0x74,0x02,0xf0,0x22,0xef,0xd3,0x94,0x03,0x40, -0x07,0x90,0x96,0x43,0x74,0x01,0xf0,0x22,0xe4,0x90,0x96,0x43,0xf0,0x22,0xe0,0xfd, -0x74,0x26,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xed,0xf0,0xaf,0x13,0xd3, -0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xef,0xc3,0x94,0x20,0x50,0x0e,0x74,0x84,0x2f,0xf5, -0x82,0xe4,0x34,0x04,0xf5,0x83,0xed,0xf0,0x80,0x29,0x74,0xa6,0x2f,0xf5,0x82,0xe4, -0x34,0x9c,0xf5,0x83,0xed,0xf0,0x90,0x9e,0xcd,0xef,0xf0,0x24,0xa6,0xf5,0x82,0xe4, -0x34,0x9c,0xf5,0x83,0xe0,0x90,0x9e,0xce,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0xcd,0x7d, -0x02,0xb1,0x27,0xd0,0xd0,0x92,0xaf,0x22,0x8f,0x0a,0x8d,0x0b,0xe5,0x0b,0x54,0x1f, -0xf5,0x10,0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x0e,0x90, -0x04,0xfd,0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3, -0x95,0x11,0x40,0x04,0xaf,0x0a,0x80,0x33,0xe5,0x0e,0x25,0x0d,0xf5,0x0f,0xe5,0x10, -0x90,0x41,0xdc,0x93,0xff,0xe5,0x0f,0xd3,0x9f,0x74,0x01,0x40,0x11,0x25,0x0a,0xf5, -0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xad,0x0b,0xaf,0x0a,0x81,0x0f,0x25,0x0a, -0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x0f,0xf0,0x22,0xad,0x07,0x75,0xf0,0x09, -0xed,0x90,0x96,0x48,0x12,0x43,0x52,0xe0,0xff,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34, -0x9d,0xf5,0x83,0xe0,0x54,0x1f,0xf5,0x12,0xd3,0x9f,0x40,0x02,0x8f,0x12,0xe5,0x12, -0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01, -0x93,0xff,0xe5,0x12,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, -0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0, -0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x05, -0xad,0x12,0x91,0x0f,0xaf,0x12,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9f, -0x01,0x12,0x43,0x7e,0x90,0x9f,0x04,0xe0,0x54,0xf0,0x44,0x06,0xff,0xf0,0xed,0x54, -0x0f,0xc4,0x54,0xf0,0xfe,0xef,0x54,0x0f,0x4e,0xf0,0x90,0x9f,0x01,0x12,0x43,0x5e, -0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7b,0x01,0x7a,0x9f,0x79,0x04,0x12,0x5d,0x37,0xd0, -0xd0,0x92,0xaf,0x22,0xac,0x07,0xec,0xc3,0x94,0x20,0x50,0x0d,0x74,0x84,0x2c,0xf5, -0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x80,0x0b,0x74,0xa6,0x2c,0xf5,0x82,0xe4,0x34, -0x9c,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1e,0xe5,0x1e,0x54,0x1f,0xff,0x90,0x9e,0x77, -0xf0,0x75,0xf0,0x09,0xec,0x90,0x96,0x49,0x12,0x43,0x52,0xe0,0x90,0x9e,0x79,0xf0, -0x75,0xf0,0x09,0xec,0x90,0x96,0x48,0x12,0x43,0x52,0xe0,0xfe,0x90,0x9e,0x7a,0xf0, -0xec,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfb,0xa3,0xe0, -0x90,0x9e,0x7b,0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x7d,0xcb,0xf0,0xa3,0xeb,0xf0, -0xef,0xd3,0x9e,0x40,0x0a,0x90,0x9e,0x7a,0xe0,0x90,0x9e,0x77,0xf0,0xf5,0x1e,0xed, -0x70,0x02,0xc1,0xba,0x90,0x9e,0x78,0xed,0xf0,0xe5,0x1e,0x30,0xe6,0x0a,0x90,0x9e, -0x77,0xe0,0xf5,0x1e,0xa3,0xe0,0x14,0xf0,0x90,0x9e,0x78,0xe0,0x70,0x02,0xc1,0xba, -0x90,0x9e,0x77,0xe0,0xff,0xd3,0x94,0x00,0x50,0x02,0xc1,0xba,0xe4,0x90,0x9e,0x76, -0xf0,0xef,0x14,0x90,0x9e,0x75,0xf0,0x90,0x9e,0x79,0xe0,0xfd,0x90,0x9e,0x75,0xe0, -0xff,0xd3,0x9d,0x40,0x6b,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01, -0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, -0x9e,0x7d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x9e,0x75,0xe0,0xff, -0xc3,0x94,0x10,0x50,0x33,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33, -0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x7b,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e, -0x60,0x16,0x90,0x9e,0x75,0xe0,0xf5,0x1e,0xa3,0xe0,0x04,0xf0,0x90,0x9e,0x78,0xe0, -0xff,0x90,0x9e,0x76,0xe0,0x6f,0x60,0x08,0x90,0x9e,0x75,0xe0,0x14,0xf0,0x80,0x87, -0x90,0x9e,0x78,0xe0,0xff,0x90,0x9e,0x76,0xe0,0xc3,0x9f,0x50,0x0d,0x90,0x9e,0x75, -0xe0,0xb5,0x05,0x06,0x90,0x9e,0x79,0xe0,0xf5,0x1e,0xe5,0x1e,0x25,0xe0,0x24,0xa4, -0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xe5,0x1e, -0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff, -0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0,0x24,0xc2,0xf5,0x82, -0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04,0xad,0x1e,0x91,0x0f, -0xaf,0x1e,0x22,0xe4,0xf5,0x67,0xf5,0x6b,0xf5,0x6a,0x75,0x69,0x0c,0x75,0x68,0x0c, -0x90,0x9e,0x9e,0xf0,0x90,0x9e,0x9c,0xf0,0x90,0x9e,0x9b,0xf0,0x90,0x9e,0x9d,0x04, -0xf0,0x90,0x9e,0x8e,0xf0,0xe4,0x90,0x9e,0x9f,0xf0,0x90,0x9e,0x90,0xf0,0x90,0x9e, -0x99,0x74,0x07,0xf0,0xe4,0x90,0x9e,0x8f,0xf0,0x90,0x9e,0x97,0xf0,0xa3,0x74,0x0b, -0xf0,0x90,0x9e,0x94,0x74,0x01,0xf0,0xa3,0x74,0x03,0xf0,0x90,0x9e,0x93,0x74,0x14, -0xf0,0x90,0x9e,0x9a,0x74,0x05,0xf0,0xe4,0x90,0x9e,0x92,0xf0,0x90,0x9e,0x8d,0xf0, -0x90,0x9e,0xbb,0xf0,0x90,0x9e,0x96,0xf0,0x90,0x9e,0xa0,0xf0,0x22,0xe4,0x90,0x9e, -0x9f,0xf0,0x90,0x9e,0x8f,0xf0,0xf5,0x6b,0x22,0xef,0xb4,0x01,0x07,0x7d,0xc8,0x7f, -0x02,0x02,0x3a,0x71,0x7d,0x60,0x7f,0x02,0x12,0x3a,0x54,0x90,0x01,0x3d,0x74,0x04, -0xf0,0xa3,0x74,0xc8,0xf0,0x7d,0x04,0x7f,0x01,0x12,0x3a,0xdf,0x7d,0xc8,0x7f,0x02, -0x02,0x3a,0xdf,0x12,0x5c,0xb8,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01, -0xf0,0x80,0x30,0x90,0x9e,0x9c,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80, -0x22,0x90,0x9e,0x9b,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x14,0xe5, -0x69,0x54,0x0f,0xd3,0x94,0x04,0x40,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x03, -0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x08,0xf0,0x7f,0x00,0x22,0x12,0x5c,0xb8,0xef, -0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x66,0xe5,0x6b,0x54,0x03, -0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x58,0xe5,0x69,0x54,0x0f,0xd3,0x94, -0x02,0x40,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x47,0xe5,0x6b,0x30,0xe2,0x08, -0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x3a,0xe5,0x6b,0x30,0xe4,0x08,0x90,0x01,0xb9, -0x74,0x10,0xf0,0x80,0x2d,0x90,0x9e,0x90,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x20, -0xf0,0x80,0x1f,0x90,0x9e,0x8b,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x40,0xf0,0x80, -0x11,0x90,0x9e,0x96,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x80,0xf0,0x80,0x03,0x7f, -0x01,0x22,0x90,0x01,0xb8,0x74,0x04,0xf0,0x7f,0x00,0x22,0xe5,0x57,0x60,0x08,0x90, -0x01,0xb9,0x74,0x01,0xf0,0x80,0x61,0xe5,0x69,0x54,0x0f,0xd3,0x94,0x01,0x40,0x08, -0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x50,0x90,0x02,0x87,0xe0,0x60,0x08,0x90,0x01, -0xb9,0x74,0x04,0xf0,0x80,0x42,0x90,0x9e,0xba,0xe0,0xb4,0x01,0x10,0x90,0x9e,0xa1, -0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x1c,0x80,0x2b,0x90,0x9e,0xba, -0xe0,0x70,0x14,0x90,0x9d,0xa9,0xe0,0xff,0x90,0x9d,0xa8,0xe0,0x6f,0x60,0x08,0x90, -0x01,0xb9,0x74,0x08,0xf0,0x80,0x11,0x90,0x9e,0x92,0xe0,0x70,0x08,0x90,0x01,0xb9, -0x74,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x02,0xf0,0x7f,0x00, -0x22,0x8f,0x6c,0xe4,0x90,0x9f,0x0f,0xf0,0xa3,0xf0,0x90,0x01,0x09,0xe0,0x7f,0x00, -0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90,0x9f,0x10,0xe0,0x94, -0x88,0x90,0x9f,0x0f,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44,0x80,0xf0, -0x22,0x90,0x9f,0x0f,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x14,0x7e,0x00,0x12, -0x3b,0x3b,0xd3,0x90,0x9f,0x10,0xe0,0x94,0x32,0x90,0x9f,0x0f,0xe0,0x94,0x00,0x40, -0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x90,0x00,0x20,0xe0,0x44,0x01,0xfd, -0x7f,0x20,0x12,0x44,0xcc,0x7f,0xf4,0x7e,0x01,0x12,0x3b,0x3b,0x90,0x00,0x00,0xe0, -0x54,0xdf,0xfd,0xe4,0xff,0x12,0x44,0xcc,0x90,0x00,0x28,0xe0,0x44,0x03,0xfd,0x7f, -0x28,0x12,0x44,0xcc,0x90,0x00,0x08,0xe0,0x54,0xef,0xfd,0x7f,0x08,0x12,0x44,0xcc, -0xe4,0xff,0x11,0xe1,0x7f,0x64,0x7e,0x00,0x12,0x3b,0x3b,0x90,0x00,0x29,0xe0,0x44, -0xc0,0xfd,0x7f,0x29,0x02,0x44,0xcc,0x90,0x9e,0x97,0xe0,0xa3,0xe0,0x90,0x05,0x58, -0xf0,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef,0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0, -0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54, -0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, -0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d, -0xf0,0x22,0xad,0x07,0xed,0xc3,0x94,0x20,0x50,0x0d,0x74,0x84,0x2d,0xf5,0x82,0xe4, -0x34,0x04,0xf5,0x83,0xe0,0x80,0x0b,0x74,0xa6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5, -0x83,0xe0,0x54,0x7f,0xf5,0x1e,0xe5,0x1e,0x54,0x1f,0xfc,0x75,0xf0,0x09,0xed,0x90, -0x96,0x48,0x12,0x43,0x52,0xe0,0xff,0x90,0x9e,0x75,0xf0,0xed,0x25,0xe0,0x24,0x02, -0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x76,0xcb,0xf0, -0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0, -0xfb,0xa3,0xe0,0x90,0x9e,0x78,0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25,0xe0,0x24,0x6c, -0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01,0x93,0xfb,0xed,0x25, -0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xea,0xf0,0xa3,0xeb,0xf0,0xec, -0xc3,0x9f,0x40,0x02,0x41,0xf0,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83, -0xec,0xf0,0x04,0xfb,0x90,0x9e,0x75,0xe0,0xff,0xeb,0xd3,0x9f,0x40,0x02,0x61,0x21, -0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x76,0xe0,0x5e, -0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50,0x40,0x74,0x01,0x7e, -0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e, -0x78,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x23,0xbb,0x11,0x09,0x90,0x9e,0x77, -0xe0,0x30,0xe7,0x02,0x7b,0x17,0xeb,0x64,0x13,0x60,0x03,0xbb,0x12,0x09,0x90,0x9e, -0x76,0xe0,0x30,0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1e,0x80,0x34,0x0b,0x80,0x84, -0x90,0x9e,0x75,0xe0,0xfb,0x6c,0x70,0x69,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d, -0xf5,0x83,0xec,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4a,0x12,0x43,0x52,0xe0,0xb4, -0x01,0x0c,0xe5,0x1e,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1e,0x80,0x03,0xaf,0x1e, -0x22,0xec,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe, -0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, -0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25, -0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80, -0x5b,0xec,0xd3,0x9b,0x40,0x56,0x90,0x9e,0x75,0xe0,0xff,0x74,0x67,0x2d,0xf5,0x82, -0xe4,0x34,0x9d,0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1e,0xec,0x25,0xe0,0x24,0xa4, -0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25, -0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4, -0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1e,0x22,0x74,0x01,0x2d,0xf5, -0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1e,0x44,0x80,0xfd,0x12, -0x74,0x0f,0xe5,0x1e,0x44,0x80,0xff,0x22,0xe4,0xf5,0x13,0xe5,0x13,0xb4,0x20,0x14, -0x90,0x9a,0xc5,0xe0,0x04,0xf0,0x90,0x95,0x01,0xe0,0xff,0x90,0x9a,0xc5,0xe0,0xb5, -0x07,0x02,0xe4,0xf0,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x4b,0x12,0x43,0x52,0xe0, -0x64,0x01,0x60,0x03,0x02,0x82,0x27,0xe5,0x13,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4, -0x34,0x93,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3,0x94,0x00,0xee,0x94,0x00,0x50,0x03, -0x02,0x82,0x27,0xe5,0x13,0x94,0x20,0x40,0x09,0x90,0x9a,0xc5,0xe0,0x60,0x03,0x02, -0x82,0x33,0xe5,0x13,0x75,0xf0,0x0a,0xa4,0x24,0x00,0xf9,0x74,0x90,0x35,0xf0,0x75, -0x18,0x01,0xf5,0x19,0x89,0x1a,0xe5,0x13,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34, -0x93,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x9e,0x6f,0xcf,0xf0,0xa3,0xef,0xf0,0xe5, -0x13,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xff,0xa3,0xe0, -0x90,0x9e,0x71,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x13,0xc3,0x94,0x20,0x50,0x14,0x74, -0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x9e,0x6b, -0xf0,0x80,0x12,0x74,0xa6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x54, -0x3f,0x90,0x9e,0x6b,0xf0,0x90,0x9e,0x6b,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0, -0x09,0xe5,0x13,0x90,0x96,0x48,0x12,0x43,0x52,0xe0,0x90,0x9e,0x74,0xf0,0x74,0xe6, -0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0xc1, -0xfd,0x90,0x9e,0x74,0xe0,0xff,0x90,0x9e,0x6c,0xe0,0x9f,0x40,0x13,0x90,0x9e,0x74, -0xe0,0x90,0x9e,0x6c,0xf0,0xee,0x54,0x40,0xfe,0x90,0x9e,0x6b,0xf0,0xef,0x4e,0xf0, -0x90,0x04,0xfd,0xe0,0x54,0x05,0x64,0x01,0x70,0x29,0x90,0x9e,0x6c,0xe0,0xff,0x90, -0x41,0x50,0x93,0xfe,0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0, -0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xe0,0x80,0x30,0x90,0x9e,0x6c,0xe0,0x90,0x40, -0xfc,0x80,0x27,0x90,0x9e,0x6c,0xe0,0xff,0x90,0x41,0x50,0x93,0xfe,0x74,0x44,0x25, -0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x41, -0x18,0x80,0x07,0x90,0x9e,0x6c,0xe0,0x90,0x41,0x34,0x93,0x90,0x9e,0x73,0xf0,0x90, -0x9e,0x73,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x56,0xf9,0x74,0x40,0x35,0xf0,0x75,0x15, -0xff,0xf5,0x16,0x89,0x17,0x90,0x9e,0x6b,0xe0,0x90,0x41,0xf8,0x93,0xff,0xd3,0x90, -0x9e,0x72,0xe0,0x9f,0x90,0x9e,0x71,0xe0,0x94,0x00,0x40,0x0a,0xe4,0xfd,0xaf,0x13, -0x12,0x75,0x64,0x02,0x81,0xbe,0xe5,0x13,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0xe0,0xf5,0x1b,0xa3,0xe0,0xf5,0x1c,0xab,0x15,0xaa,0x16,0xa9,0x17, -0x12,0x1f,0x04,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,0x42,0x6a,0xfd, -0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab, -0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0x7e,0x00,0xab,0x18, -0xaa,0x19,0xa9,0x1a,0x90,0x00,0x02,0x12,0x42,0x95,0xfd,0xac,0xf0,0x12,0x1f,0x4a, -0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17, -0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90, -0x00,0x04,0x12,0x42,0x95,0xfd,0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c, -0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x03,0x12,0x1f, -0x1d,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x06,0x12,0x42,0x95, -0xfd,0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b, -0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0x7e,0x00,0xab, -0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x08,0x12,0x42,0x95,0xfd,0xac,0xf0,0x12,0x1f, -0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9, -0x17,0x90,0x00,0x05,0x12,0x1f,0x1d,0xff,0x7e,0x00,0x90,0x9e,0x6f,0xe0,0xfc,0xa3, -0xe0,0xfd,0x12,0x1f,0x4a,0xd3,0xe5,0x1c,0x9f,0xe5,0x1b,0x9e,0x40,0x0c,0xe5,0x1c, -0x9f,0xf5,0x1c,0xe5,0x1b,0x9e,0xf5,0x1b,0x80,0x05,0xe4,0xf5,0x1b,0xf5,0x1c,0xe5, -0x13,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe5,0x1b,0xf0,0xa3, -0xe5,0x1c,0xf0,0x90,0x9e,0x6b,0xe0,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41, -0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,0x95,0x1b,0x50,0x07,0xaf,0x13, -0x31,0xd2,0x02,0x81,0x92,0x90,0x9e,0x6b,0xe0,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4, -0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,0x95,0x1b,0x50,0x03, -0x02,0x81,0x92,0x7d,0x01,0xaf,0x13,0x12,0x75,0x64,0x02,0x81,0x92,0x74,0xe6,0x25, -0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x03,0x02,0x80, -0x9b,0x90,0x96,0x43,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x9e,0x6c,0xe0,0xc3,0x94,0x19, -0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x9e,0x6c,0xe0,0xc3,0x94,0x11,0x40, -0x2e,0x80,0x1f,0x90,0x96,0x43,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x9e,0x6c,0xe0,0xc3, -0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x9e,0x6c,0xe0,0xc3,0x94,0x03, -0x40,0x0d,0x90,0x9a,0x84,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x9a,0x84,0xf0,0x74, -0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1d,0x74,0x44,0x25, -0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x03,0x02, -0x80,0x48,0x90,0x9a,0x84,0xe0,0x64,0x01,0x60,0x03,0x02,0x80,0x48,0x74,0x85,0x25, -0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05, -0xff,0xe4,0x33,0xfe,0x74,0x41,0x25,0x13,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0, -0xfd,0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff, -0xe4,0x33,0xfe,0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xd3, -0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x26,0x25,0x13,0xf5,0x82, -0xe4,0x34,0x9d,0xf5,0x83,0xe0,0xff,0x90,0x9e,0x6c,0xe0,0x6f,0x60,0x3d,0x74,0x44, -0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05, -0x75,0x1d,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1d,0x03,0x80,0x03, -0x75,0x1d,0x01,0x74,0x41,0x25,0x13,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xef,0xf0, -0x74,0x85,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0x80,0x29,0x74,0xe6,0x25,0x13,0xf5, -0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x85,0x25,0x13,0xf5,0x82,0xe4,0x34, -0x9a,0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1d,0x74,0xe6,0x25,0x13,0xf5, -0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x90,0x9e,0x6c,0xe0,0xff,0x74,0x26,0x25, -0x13,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xef,0xf0,0x74,0x84,0x25,0x13,0xf5,0x82, -0xe4,0x34,0x98,0xf5,0x83,0xe5,0x1d,0xf0,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x4c, -0x12,0x43,0x52,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1d,0x74,0xe6,0x25,0x13,0xf5,0x82, -0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0xad,0x1d,0x21,0x8d,0xec,0x64,0x06,0x60,0x02, -0x21,0x92,0xf5,0x1b,0xf5,0x1c,0x90,0x42,0x19,0x93,0xff,0x7e,0x00,0x90,0x9e,0x6f, -0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1f,0x4a,0x90,0x9e,0x6d,0xee,0xf0,0xa3,0xef,0xf0, -0x74,0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1d,0xe4,0xf5, -0x14,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x75,0xf0,0x02,0xe5,0x14,0xa4,0xf5,0x82,0x85, -0xf0,0x83,0x12,0x42,0x95,0xfd,0xac,0xf0,0xe5,0x14,0x90,0x42,0x14,0x93,0xff,0x7e, -0x00,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xc3,0x90, -0x9e,0x6e,0xe0,0x95,0x1c,0x90,0x9e,0x6d,0xe0,0x95,0x1b,0x40,0x07,0x05,0x14,0xe5, -0x14,0xb4,0x05,0xbd,0xe5,0x14,0xc3,0x13,0xf5,0x14,0xe5,0x1d,0xb4,0x01,0x06,0xe5, -0x14,0x70,0x46,0x80,0x13,0xe5,0x1d,0xb4,0x03,0x15,0xe5,0x14,0x70,0x05,0x75,0x1d, -0x03,0x80,0x39,0xe5,0x14,0xb4,0x01,0x05,0x75,0x1d,0x01,0x80,0x2f,0x80,0x2a,0xe5, -0x1d,0xb4,0x05,0x28,0xe5,0x14,0x70,0x05,0x75,0x1d,0x05,0x80,0x0d,0xe5,0x14,0xb4, -0x01,0x05,0x75,0x1d,0x03,0x80,0x03,0x75,0x1d,0x01,0xd3,0x90,0x9e,0x72,0xe0,0x94, -0x03,0x90,0x9e,0x71,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1d,0xd3,0x90,0x9e,0x72, -0xe0,0x94,0x03,0x90,0x9e,0x71,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1d,0x74,0x84, -0x25,0x13,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe5,0x1d,0xf0,0xfd,0xaf,0x13,0x12, -0x79,0x92,0x74,0xe6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xd3,0x94, -0x05,0x74,0xe6,0x50,0x0e,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x04, -0xf0,0x80,0x0b,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0xab,0x18, -0xaa,0x19,0xa9,0x1a,0xe4,0xf5,0xf0,0x12,0x42,0xcd,0xab,0x18,0xaa,0x19,0xa9,0x1a, -0x90,0x00,0x02,0xe4,0xf5,0xf0,0x12,0x42,0xec,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12, -0x42,0xec,0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x42,0xec,0x90,0x00,0x08,0xe4,0xf5, -0xf0,0x12,0x42,0xec,0xe5,0x13,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5, -0x83,0xe4,0xf0,0xa3,0xf0,0xe5,0x13,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98, -0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xe5,0x13,0x25,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34, -0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x13,0xe5,0x13,0xc3,0x94,0x40,0x50,0x03, -0x02,0x7b,0xdb,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74, -0x0f,0xf0,0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, -0xe4,0xf0,0x0d,0xbd,0x10,0xf0,0xe4,0x90,0x9a,0xc5,0xf0,0x90,0x95,0x01,0x04,0xf0, -0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0, -0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, -0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed, -0x90,0x90,0x06,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90, -0x08,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x74,0x26,0x2d,0xf5,0x82,0xe4,0x34,0x9d, -0xf5,0x83,0x74,0x13,0xf0,0x74,0x85,0x2d,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4, -0xf0,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xed,0x25,0xe0, -0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0, -0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0, -0x24,0xc4,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0, -0x24,0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0, -0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0, -0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x86,0x2d, -0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x46,0x2d,0xf5,0x82,0xe4,0x34, -0x9c,0xf5,0x83,0xe4,0xf0,0x74,0xe6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4, -0xf0,0x90,0x41,0xca,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x92,0x74,0x01,0x93, -0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2, -0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x75,0xf0,0x09,0xed, -0x90,0x96,0x4b,0x12,0x43,0x52,0x74,0x01,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4a, -0x12,0x43,0x52,0x74,0x01,0xf0,0x74,0x82,0x2d,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x46,0x12,0x43,0x52,0x74,0xff,0xf0, -0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x44,0x12,0x43,0x52,0xe4,0xf0,0xa3,0x74, -0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x52,0x74,0x13,0xf0,0x75, -0xf0,0x09,0xed,0x90,0x96,0x49,0x12,0x43,0x52,0xe4,0xf0,0xed,0xc3,0x94,0x20,0x50, -0x0f,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x80,0x0d, -0x74,0xa6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64, -0x40,0x60,0x02,0x41,0x62,0x22,0x12,0x1f,0x04,0xf5,0x13,0xc3,0x94,0x40,0x50,0x15, -0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a, -0xf5,0x83,0xef,0xf0,0x22,0xe5,0x13,0xb4,0x40,0x0a,0x90,0x00,0x02,0x12,0x1f,0x1d, -0x90,0x96,0x42,0xf0,0x22,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0x54,0x3f,0xfe,0xef, -0x54,0x80,0xc4,0x13,0x13,0x13,0x54,0x01,0xfd,0xaf,0x06,0x02,0x6e,0xc2,0x12,0x1f, -0x04,0x90,0x95,0x01,0xf0,0x22,0xe4,0x90,0x9d,0xa8,0xf0,0xa3,0xf0,0x90,0x01,0xaf, -0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90, -0x9e,0x9e,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0x9e,0x8d,0xf0,0x12,0x1f,0x04, -0x65,0x6a,0x60,0x03,0x12,0x4c,0xe3,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x1f,0x04,0xf5, -0x67,0x22,0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x30,0xe0,0x25,0x12,0x1f,0x04,0x90, -0x9e,0x94,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e,0x95,0xf0,0xef,0xc3,0x13, -0x54,0x7f,0x90,0x9e,0x93,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0x9e,0x9a,0xf0, -0x22,0x90,0x9e,0x94,0x74,0x01,0xf0,0x90,0x9e,0x95,0x74,0x03,0xf0,0x90,0x9e,0x93, -0x74,0x14,0xf0,0x90,0x9e,0x9a,0x74,0x05,0xf0,0x22,0x12,0x1f,0x04,0x30,0xe0,0x18, -0xc3,0x13,0x54,0x7f,0x90,0x9e,0x99,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0x90, -0x9e,0x97,0xe4,0xf0,0xa3,0xef,0xf0,0x22,0x90,0x9e,0x99,0x74,0x07,0xf0,0x90,0x9e, -0x97,0xe4,0xf0,0xa3,0x74,0x0b,0xf0,0x22,0x12,0x1f,0x04,0x60,0x02,0x80,0x01,0xe4, -0x90,0x9e,0x96,0xf0,0x22,0x12,0x1f,0x04,0x30,0xe0,0x07,0x54,0x01,0x90,0x9e,0xa0, -0xf0,0x22,0x7d,0x10,0x7f,0x03,0x12,0x3a,0x71,0x7d,0x01,0x7f,0x02,0x02,0x3a,0xc5, -0x90,0x02,0x09,0xe0,0xfd,0x12,0x1f,0x04,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x9e,0xb4, -0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0xed,0x2f,0x90,0x9e,0xb5,0xf0,0x90,0x00, -0x02,0x12,0x1f,0x1d,0xff,0xed,0x2f,0x90,0x9e,0xb6,0xf0,0x90,0x00,0x03,0x12,0x1f, -0x1d,0xff,0xed,0x2f,0x90,0x9e,0xb7,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0xae, -0x05,0xed,0x2f,0x90,0x9e,0xb8,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x3f,0x90, -0xfd,0x50,0x74,0x0b,0xf0,0xa3,0x74,0x05,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0, -0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, -0x90,0xfd,0x54,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0xfd,0x55,0xf0,0x90,0x00, -0x04,0x12,0x1f,0x1d,0x90,0xfd,0x56,0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x22,0x90, -0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x0c,0xf0,0xa3,0x74,0x01,0xf0, -0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, -0x90,0xfd,0x58,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x17,0x90,0xfd,0x50, -0x74,0x0d,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0x90,0xfd, -0x58,0x74,0x01,0xf0,0x22,0x12,0x1f,0x04,0x30,0xe0,0x0e,0x90,0x07,0x78,0xe0,0x54, -0xfd,0xf0,0x90,0x9e,0x50,0x74,0x01,0xf0,0x22,0xe4,0x90,0x9e,0x50,0xf0,0x22,0x90, -0x07,0x78,0xe0,0x44,0x0c,0xf0,0x12,0x1f,0x04,0xff,0x30,0xe0,0x75,0x90,0xfd,0x58, -0xe0,0x20,0xe0,0x10,0x90,0xfd,0x50,0x74,0x14,0xf0,0xa3,0x74,0x01,0xf0,0xa3,0xf0, -0x90,0xfd,0x58,0xf0,0x90,0x9e,0x43,0xe0,0x44,0x08,0xf0,0xef,0x30,0xe1,0x0d,0xe0, -0x44,0x01,0xf0,0x90,0x07,0x78,0xe0,0x54,0xfd,0xf0,0x80,0x07,0x90,0x07,0x78,0xe0, -0x44,0x02,0xf0,0x12,0x1f,0x04,0xff,0x30,0xe2,0x1e,0x90,0x9e,0x43,0xe0,0x44,0x04, -0xf0,0x90,0x04,0x26,0xe0,0x44,0x40,0xf0,0x90,0x07,0x78,0xe0,0x54,0xef,0xf0,0x90, -0x07,0x83,0xe0,0x44,0x40,0xf0,0x80,0x07,0x90,0x07,0x78,0xe0,0x44,0x10,0xf0,0xef, -0x30,0xe4,0x63,0x90,0x9e,0x43,0xe0,0x44,0x02,0xf0,0x90,0x04,0x26,0xe0,0x44,0x80, -0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x12,0x90,0xfd,0x50,0x74,0x14,0xf0,0xa3, -0x74,0x01,0xf0,0xa3,0xe4,0xf0,0x90,0xfd,0x58,0x04,0xf0,0x90,0x9e,0x43,0xe0,0x54, -0xfe,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xf7,0xf0,0x90,0x07, -0x78,0xe0,0x54,0xe3,0xf0,0x90,0x07,0x83,0xe0,0x54,0x3f,0xf0,0x90,0x04,0x26,0xe0, -0x54,0x3f,0xf0,0x90,0x9e,0x4a,0x12,0x43,0x46,0x90,0x81,0x57,0x12,0x1f,0xd7,0x7f, -0x80,0x7e,0x08,0x12,0x34,0x55,0x22,0x12,0x1f,0x04,0xff,0x30,0xe0,0x4b,0x90,0x07, -0x78,0xe0,0x44,0x02,0xf0,0x90,0x07,0x83,0xe0,0x44,0x02,0xf0,0x90,0x07,0x78,0xe0, -0x44,0x80,0x54,0xbf,0xf0,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1a,0x90,0xfd,0x50,0x74, -0x1a,0xf0,0xa3,0x74,0x01,0xf0,0xa3,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, -0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0xef,0x30,0xe1,0x5f,0x90,0x9e,0x43,0xe0,0x44,0x02, -0xf0,0x90,0x07,0x95,0xe0,0x44,0x06,0xf0,0x22,0x90,0x9e,0x43,0xe0,0x54,0xfd,0xf0, -0x90,0x07,0x78,0xe0,0x54,0x3f,0xf0,0x90,0x07,0x83,0xe0,0x54,0xfd,0xf0,0x90,0x07, -0x95,0xe0,0x54,0xf9,0xf0,0x90,0x9e,0x4a,0x12,0x43,0x46,0x90,0x81,0x57,0x12,0x1f, -0xd7,0x7f,0x80,0x7e,0x08,0x12,0x34,0x55,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1a,0x90, -0xfd,0x50,0x74,0x1a,0xf0,0xa3,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0xef,0x70,0x21,0x12,0x1f,0x04, -0x30,0xe0,0x14,0x90,0x00,0x40,0xe0,0x44,0x20,0xf0,0xe0,0x54,0x3f,0xf0,0x90,0x07, -0x78,0xe0,0x44,0x01,0xf0,0x80,0x07,0x90,0x07,0x78,0xe0,0x54,0xfe,0xf0,0xef,0x64, -0x01,0x70,0x6a,0x12,0x1f,0x04,0x90,0x00,0x01,0x30,0xe0,0x2e,0x12,0x1f,0x1d,0x90, -0x06,0xc0,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x06,0xc1,0xf0,0x90,0x00,0x03, -0x12,0x1f,0x1d,0x90,0x06,0xc2,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x90,0x06,0xc3, -0xf0,0x90,0x06,0xcc,0xe0,0x54,0xfe,0xf0,0x80,0x2c,0x12,0x1f,0x1d,0x90,0x06,0xc4, -0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x06,0xc5,0xf0,0x90,0x00,0x03,0x12,0x1f, -0x1d,0x90,0x06,0xc6,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x90,0x06,0xc7,0xf0,0x90, -0x06,0xcc,0xe0,0x44,0x01,0xf0,0x90,0x06,0xcc,0xe0,0x44,0x02,0xf0,0xef,0xb4,0x02, -0x11,0x12,0x1f,0x04,0x90,0x06,0xc8,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x06, -0xc9,0xf0,0xef,0xb4,0x03,0x11,0x12,0x1f,0x04,0x90,0x06,0xca,0xf0,0x90,0x00,0x01, -0x12,0x1f,0x1d,0x90,0x06,0xcb,0xf0,0xef,0x64,0x04,0x70,0x1f,0x12,0x1f,0x04,0xff, -0x90,0x07,0x83,0x30,0xe0,0x06,0xe0,0x44,0x10,0xf0,0x80,0x04,0xe0,0x54,0x6f,0xf0, -0xef,0x30,0xe1,0x07,0x90,0x07,0x83,0xe0,0x44,0x80,0xf0,0x22,0x90,0x9e,0x76,0x12, -0x43,0x7e,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x37,0x90,0xfd,0x50,0x74,0x11,0xf0,0xa3, -0x74,0x03,0xf0,0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0, -0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, -0x90,0xfd,0x54,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x80,0x16, -0x43,0x57,0x01,0x78,0xaa,0x7c,0x9d,0x7d,0x01,0x90,0x9e,0x76,0x12,0x43,0x5e,0x7e, -0x00,0x7f,0x03,0x12,0x1e,0xde,0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0x60, -0x07,0x90,0x9e,0x51,0x74,0x01,0xf0,0x22,0xe4,0x90,0x9e,0x51,0xf0,0x22,0x90,0xfd, -0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x17,0xf0,0xa3,0x74,0x01,0xf0,0x12, -0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, -0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74, -0x18,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0, -0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0, -0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x19,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04, -0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, -0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1a,0xf0, -0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0, -0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0, -0x1f,0x90,0xfd,0x50,0x74,0x1b,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd, -0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0, -0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1c,0xf0,0xa3,0x74, -0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x2f,0x90, -0xfd,0x50,0x74,0x1d,0xf0,0xa3,0x74,0x03,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0, -0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, -0x90,0xfd,0x54,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90, -0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1e,0xf0,0xa3,0x74,0x01,0xf0, -0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x12,0x1f,0x04,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x18, -0x12,0x1f,0xc4,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x9e,0x4a,0x12,0x43, -0x46,0xec,0x54,0x03,0xfc,0x12,0x43,0x19,0x90,0x9e,0x46,0x02,0x1f,0xd7,0x90,0xfd, -0x58,0xe0,0x20,0xe0,0x3b,0x12,0x1f,0x04,0x90,0xfd,0x50,0xf0,0xa3,0x74,0x04,0xf0, -0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x52,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, -0x90,0xfd,0x53,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0xfd,0x54,0xf0,0x90,0x00, -0x04,0x12,0x1f,0x1d,0x90,0xfd,0x55,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0x04,0xf0, -0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x21,0x90,0xfd,0x50,0x74,0x1f,0xf0,0xa3,0x74, -0x01,0xf0,0x12,0x1f,0x04,0x54,0x01,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0, -0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0, -0x21,0x90,0xfd,0x50,0x74,0x20,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x54,0x01, -0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, -0x04,0xf0,0x22,0x12,0x1f,0x04,0xff,0x30,0xe0,0x54,0x90,0xfd,0x58,0xe0,0x20,0xe0, -0x4d,0x90,0xfd,0x50,0x74,0x0a,0xf0,0xa3,0x74,0x06,0xf0,0x90,0x00,0x01,0x12,0x1f, -0x1d,0x90,0xfd,0x52,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0xa3, -0xe4,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x06,0xa3,0x74,0xa0,0xf0,0x80,0x06,0x90,0xfd, -0x55,0x74,0xc0,0xf0,0x90,0xfd,0x56,0x74,0x10,0xf0,0xa3,0x74,0x80,0xf0,0x90,0xfd, -0x50,0x74,0x0a,0xf0,0xa3,0x74,0x06,0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x90,0x00, -0x02,0x12,0x1f,0x1d,0xfe,0x90,0x00,0x01,0x12,0x1f,0x1d,0x7c,0x00,0x24,0x00,0xff, -0xec,0x3e,0xfe,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0xfc,0x74,0x20,0x2f,0xff, -0xe4,0x3e,0xfe,0x90,0x9e,0x76,0xef,0xf0,0xee,0xf9,0x90,0x02,0x09,0xe0,0xc3,0x13, -0x90,0xfd,0x10,0xf0,0xec,0xc3,0x99,0x50,0x43,0xec,0x70,0x04,0x7d,0x04,0x80,0x02, -0xe4,0xfd,0xed,0xc3,0x94,0x20,0x50,0x07,0xaf,0x05,0x71,0xda,0x0d,0x80,0xf3,0x0c, -0x90,0xfd,0x10,0xe0,0x04,0xf0,0xec,0xb5,0x01,0xda,0xe4,0xfd,0xed,0x75,0xf0,0x08, -0xa4,0xff,0x90,0x9e,0x76,0xe0,0xfb,0xc3,0xef,0x9b,0x74,0x80,0xf8,0x65,0xf0,0x98, -0x50,0x07,0xaf,0x05,0x71,0xda,0x0d,0x80,0xe3,0x0c,0x80,0xb8,0x90,0x00,0x81,0xe0, -0x44,0x80,0x12,0x44,0xc9,0xd0,0xd0,0x92,0xaf,0x22,0x90,0xfd,0x58,0xe0,0x30,0xe0, -0x08,0x90,0x01,0xb8,0xe0,0x04,0xf0,0x80,0xf1,0xef,0x75,0xf0,0x08,0xa4,0x24,0x00, -0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x50,0xf0,0xef,0x75,0xf0,0x08, -0xa4,0x24,0x01,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x51,0xf0,0xef, -0x75,0xf0,0x08,0xa4,0x24,0x02,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd, -0x52,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x03,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, -0xe0,0x90,0xfd,0x53,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x04,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x54,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x05,0xf5, -0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x55,0xf0,0xef,0x75,0xf0,0x08,0xa4, -0x24,0x06,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x56,0xf0,0xef,0x75, -0xf0,0x08,0xa4,0x24,0x07,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x57, -0xf0,0xa3,0x74,0x01,0xf0,0x22,0x12,0x1f,0x04,0x90,0xfe,0x10,0x60,0x05,0xe0,0x44, -0x01,0xf0,0x22,0xe0,0x54,0xfe,0xf0,0x22,0x90,0x01,0xb8,0xe0,0x04,0xf0,0x90,0xfd, -0x58,0xe0,0x90,0x01,0xb9,0xf0,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50, -0x74,0x23,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4, -0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0x9e,0x7a, -0x12,0x43,0x7e,0x12,0x1f,0x04,0x20,0xe0,0x02,0xa1,0x9c,0xb1,0xe7,0x90,0x9e,0x7a, -0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x54,0x01,0xfe,0x90,0x9e,0x86,0xe0,0x54,0xfe, -0x4e,0xf0,0xef,0x54,0x02,0xff,0xe0,0x54,0xfd,0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54, -0x04,0xfe,0x90,0x9e,0x86,0xe0,0x54,0xfb,0x4e,0xf0,0xef,0x54,0x10,0xff,0xe0,0x54, -0xef,0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54,0x20,0xfe,0x90,0x9e,0x86,0xe0,0x54,0xdf, -0x4e,0xf0,0xef,0x54,0x40,0xff,0xe0,0x54,0xbf,0x4f,0xf0,0x90,0x00,0x01,0x12,0x1f, -0x1d,0xff,0xc3,0x94,0x17,0x50,0x12,0xef,0xc3,0x94,0x03,0x90,0x9e,0x87,0x50,0x05, -0x74,0x03,0xf0,0x80,0x0a,0xef,0xf0,0x80,0x06,0x90,0x9e,0x87,0x74,0x17,0xf0,0x90, -0x9e,0x7a,0x12,0x43,0x5e,0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0xc3,0x94,0x18,0x50, -0x12,0xef,0xc3,0x94,0x03,0x90,0x9e,0x88,0x50,0x05,0x74,0x03,0xf0,0x80,0x0a,0xef, -0xf0,0x80,0x06,0x90,0x9e,0x88,0x74,0x18,0xf0,0xe4,0x90,0x9e,0x50,0xf0,0x90,0x9e, -0x86,0xe0,0xc4,0x54,0x0f,0x30,0xe0,0x0d,0x75,0x69,0x04,0x90,0x05,0x00,0x74,0x1c, -0xf0,0xa3,0x74,0x11,0xf0,0x90,0x05,0x58,0x74,0x02,0xf0,0x22,0x90,0x9e,0x7a,0x12, -0x43,0x5e,0x12,0x1f,0x04,0xff,0x13,0x13,0x13,0x54,0x1f,0x90,0x9e,0x76,0x30,0xe0, -0x09,0x12,0x1f,0xe3,0x00,0x00,0x03,0x10,0x80,0x07,0x12,0x1f,0xe3,0x00,0x00,0x03, -0x00,0xb1,0xe7,0x90,0x00,0x40,0x74,0x24,0xf0,0x90,0x07,0x78,0x74,0x01,0xf0,0xfb, -0x7a,0x9e,0x79,0x76,0x12,0x4c,0x0d,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x00,0x74, -0x1c,0xf0,0xa3,0x74,0x43,0xf0,0x22,0x90,0x9e,0x86,0xe0,0x54,0xfe,0xf0,0xa3,0x74, -0x0b,0xf0,0xa3,0x74,0x08,0xf0,0xe4,0x90,0x9e,0x8b,0xf0,0xa3,0xf0,0x90,0x9e,0x86, -0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xef,0xf0,0xe0,0x54,0xf7,0xf0, -0xe0,0x54,0xdf,0xf0,0xe0,0x54,0xbf,0xf0,0x90,0x9e,0x89,0xe0,0x54,0xfe,0xf0,0xe0, -0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0x22,0x75,0xe8,0x07,0x90,0xfd,0x68,0x74,0x02,0xf0, -0x90,0x9e,0x43,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0x54,0xfd,0xf0,0x54,0xf7,0xf0, -0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0x12,0x1f,0xe3,0x00,0x00,0x00,0x00,0x7f,0x80,0x7e, -0x08,0x12,0x2c,0x87,0x90,0x9e,0x4a,0x12,0x1f,0xd7,0x90,0x00,0x2e,0xe0,0x90,0x9e, -0x4e,0xf0,0x90,0x00,0x2d,0xe0,0x90,0x9e,0x4f,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, -0x04,0x26,0xe0,0x44,0x10,0xf0,0x90,0x07,0x83,0xe4,0xf0,0x90,0x07,0x78,0x74,0x03, -0xf0,0xb1,0xe7,0x7d,0x04,0x7f,0x02,0x02,0x3a,0xdf,0x90,0xfd,0x58,0xe0,0x20,0xe0, -0x21,0x90,0xfd,0x50,0x74,0x24,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x54,0x01, -0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, -0x04,0xf0,0x22,0x12,0x1f,0x04,0xff,0x54,0x01,0xfe,0x90,0x9e,0x89,0xe0,0x54,0xfe, -0x4e,0xf0,0xef,0x54,0x02,0xff,0xe0,0x54,0xfd,0x4f,0xf0,0x90,0x00,0x01,0x12,0x1f, -0x1d,0x90,0x9e,0x8a,0xf0,0x22,0xe4,0x90,0x9f,0x11,0xf0,0xa3,0xf0,0x90,0x01,0xeb, -0xe0,0x54,0xc0,0x60,0x43,0xc3,0x90,0x9f,0x12,0xe0,0x94,0x88,0x90,0x9f,0x11,0xe0, -0x94,0x13,0x40,0x0a,0x90,0x01,0xc6,0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x90,0x9f, -0x11,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x14,0x7e,0x00,0x12,0x3b,0x3b,0xd3, -0x90,0x9f,0x12,0xe0,0x94,0x64,0x90,0x9f,0x11,0xe0,0x94,0x00,0x40,0xbf,0x90,0x01, -0xc7,0xe0,0x30,0xe2,0xb8,0x7f,0x00,0x22,0x7f,0x01,0x22,0xd3,0x10,0xaf,0x01,0xc3, -0xc0,0xd0,0xef,0x54,0xfc,0xff,0x90,0x01,0xe8,0xf0,0xee,0xa3,0xf0,0x90,0x01,0xeb, -0x74,0x80,0xf0,0xd1,0xd6,0x90,0x01,0xec,0xe0,0xff,0x90,0x9f,0x0a,0x12,0x43,0x5e, -0x90,0x00,0x03,0xef,0x12,0x42,0x32,0x90,0x01,0xed,0xe0,0x90,0x00,0x02,0x12,0x42, -0x32,0x90,0x01,0xee,0xe0,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x01,0xef,0xe0,0x12, -0x42,0x20,0x90,0x9f,0x0a,0x12,0x43,0x5e,0x12,0x43,0x26,0xd0,0xd0,0x92,0xaf,0x22, -0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0x90,0x9e,0xe1,0x74,0x04,0xf0,0x22,0x12,0x57, -0x90,0x80,0xee,0x90,0x05,0x22,0x74,0xff,0xf0,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0, -0x90,0x9e,0xe1,0x74,0x04,0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0x90,0x9e,0xdb, -0x74,0x05,0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0x90,0x9e,0xdb,0x74,0x02,0xf0, -0x22,0x90,0x05,0x27,0xe0,0x54,0xbf,0xf0,0x90,0x05,0x22,0x74,0x6f,0xf0,0x90,0x9e, -0xdb,0x74,0x06,0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0xe4,0x90,0x9f,0x13,0xf0, -0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07, -0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x9f,0x14,0xe0,0x94,0xe8,0x90,0x9f, -0x13,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x3b,0x3b, -0x90,0x9f,0x13,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x80,0xc6,0xd3,0x10,0xaf,0x01, -0xc3,0xc0,0xd0,0x90,0x9f,0x1e,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74, -0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0, -0x5f,0xf0,0x12,0x4f,0x6d,0x90,0x9f,0x1e,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb, -0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8, -0xf8,0xff,0x80,0x4c,0x90,0x9f,0x1e,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x62,0xe0,0x5f,0xf0, -0x12,0x4f,0x6d,0x90,0x9f,0x1e,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, -0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x60,0xe0,0xfb,0xe4,0xfe, -0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, -0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9f,0x16,0xed, -0xf0,0x90,0x9f,0x15,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90, -0x9f,0x15,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4, -0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x9f,0x15,0xe0,0xff,0x74,0x01, -0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0, -0x12,0x4f,0x6d,0x90,0x9f,0x15,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, -0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x67,0x90,0x9f,0x15,0xe0,0x24,0xf8, -0xf0,0xa3,0xe0,0x70,0x1a,0x90,0x9f,0x15,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80, -0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x63,0xe0,0x5f,0xf0,0x80,0x17,0x90, -0x9f,0x15,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff, -0x90,0x00,0x63,0xe0,0x4f,0xf0,0x12,0x4f,0x6d,0x90,0x9f,0x15,0xe0,0xff,0x74,0x01, -0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0x65,0x90,0x9f,0x15,0xe0, -0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00, -0x62,0xe0,0x5f,0xf0,0x12,0x4f,0x6d,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01, -0xc3,0xc0,0xd0,0x90,0x9f,0x18,0xed,0xf0,0x90,0x9f,0x17,0xef,0xf0,0xd3,0x94,0x07, -0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4, -0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0x6d,0x90,0x9f,0x17,0xe0,0xff,0x74, -0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f, -0xf0,0x12,0x4f,0x6d,0x90,0x9f,0x18,0xe0,0x60,0x16,0x90,0x9f,0x17,0xe0,0xff,0x74, -0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x62, -0x90,0x9f,0x17,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, -0xf4,0xff,0x90,0x00,0x45,0x80,0x64,0x90,0x9f,0x17,0xe0,0x24,0xf8,0xf0,0xe0,0xff, -0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0x65,0x90,0x9f, -0x17,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90, -0x00,0x62,0xe0,0x4f,0xf0,0x12,0x4f,0x6d,0x90,0x9f,0x18,0xe0,0x60,0x18,0x90,0x9f, -0x17,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90, -0x00,0x61,0xe0,0x4f,0x80,0x17,0x90,0x9f,0x17,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, -0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x61,0xe0,0x5f,0xf0,0x12,0x4f, -0x6d,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x90,0xe0,0x44,0x01,0xf0,0x90,0x9e,0xcc, -0xe0,0x30,0xe0,0x31,0x90,0x9e,0xca,0xe0,0xff,0x90,0x9e,0xc9,0xe0,0xfe,0xc4,0x13, -0x54,0x01,0xfd,0x31,0x9c,0x90,0x9e,0xcb,0xe0,0x75,0xf0,0x20,0xa4,0xff,0xae,0xf0, -0x12,0x3b,0x3b,0x90,0x9e,0xca,0xe0,0xff,0x90,0x9e,0xc9,0xe0,0xfe,0xc4,0x13,0x54, -0x01,0xf4,0xfd,0x31,0x9c,0x22,0x90,0x9e,0x76,0x12,0x43,0x7e,0x12,0x1f,0x04,0x20, -0xe0,0x02,0x61,0xbe,0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x54,0x01, -0xfe,0x90,0x9e,0xc9,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0x54,0x04,0xff,0xe0,0x54,0xfb, -0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54,0x02,0xfe,0x90,0x9e,0xc9,0xe0,0x54,0xfd,0x4e, -0xf0,0xef,0x54,0x08,0xff,0xe0,0x54,0xf7,0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54,0x10, -0xfe,0x90,0x9e,0xc9,0xe0,0x54,0xef,0x4e,0xf0,0xef,0x54,0x20,0xff,0xe0,0x54,0xdf, -0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54,0x40,0xfe,0x90,0x9e,0xc9,0xe0,0x54,0xbf,0x4e, -0xf0,0xef,0x54,0x80,0xff,0xe0,0x54,0x7f,0x4f,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, -0x90,0x9e,0xcb,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e,0xca,0xf0,0x90,0x00, -0x03,0x12,0x1f,0x1d,0xff,0x54,0x01,0xfe,0x90,0x9e,0xcc,0xe0,0x54,0xfe,0x4e,0xf0, -0xef,0x54,0x02,0xff,0xe0,0x54,0xfd,0x4f,0xf0,0xe4,0x12,0x44,0xc9,0x90,0x9e,0x76, -0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0xc3,0x13,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0, -0x44,0x02,0xf0,0xef,0x13,0x13,0x54,0x3f,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44, -0x04,0xf0,0x12,0x1f,0x04,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x06,0x90, -0xe0,0x44,0x08,0xf0,0x90,0x9e,0xcc,0xe0,0x30,0xe0,0x12,0x90,0x9e,0xca,0xe0,0xff, -0x90,0x9e,0xc9,0xe0,0xfe,0xc4,0x13,0x54,0x01,0xf4,0xfd,0x31,0x9c,0x22,0x90,0x06, -0x90,0xe4,0xf0,0x71,0xcc,0x90,0x01,0x3f,0x74,0x04,0xf0,0x22,0x90,0x9e,0xc9,0xe0, -0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xf7,0xf0,0xe0, -0x54,0xef,0xf0,0xe0,0x54,0xdf,0xf0,0xe0,0x54,0xbf,0xf0,0xe0,0x54,0x7f,0xf0,0xe4, -0xa3,0xf0,0xa3,0xf0,0xa3,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb, -0xf0,0x22,0x90,0x9e,0xc1,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0x7f,0xf0,0x90,0x01,0x17, -0xe0,0xfe,0x90,0x01,0x16,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x9e,0xc7, -0xf0,0xa3,0xef,0xf0,0x90,0x01,0x04,0xe0,0x54,0x0f,0x90,0x9e,0x6b,0xf0,0xe0,0xff, -0x74,0x40,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, -0x90,0x9e,0xc6,0xf0,0xee,0x90,0x9e,0xc5,0xf0,0x80,0x81,0xd3,0x10,0xaf,0x01,0xc3, -0xc0,0xd0,0x12,0x1f,0x04,0x54,0x01,0xff,0x90,0x9e,0xc1,0xe0,0x54,0xfe,0x4f,0xf0, -0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e,0xc2,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, -0x90,0x9e,0xc3,0xf0,0x90,0x9e,0xc1,0xe0,0x30,0xe0,0x20,0x90,0x06,0x09,0xe0,0x54, -0xfe,0xf0,0x90,0x02,0x86,0xe0,0x44,0x04,0xf0,0x43,0x57,0x04,0x7d,0x08,0xe4,0xff, -0x12,0x3a,0xc5,0x90,0x01,0x3f,0x74,0x04,0xf0,0x80,0x10,0x7d,0x08,0xe4,0xff,0x12, -0x3a,0x54,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x71,0xbe,0xd0,0xd0,0x92,0xaf,0x22, -0xe5,0x68,0x30,0xe3,0x04,0xe4,0xff,0x80,0x02,0x7f,0x01,0x02,0x48,0x7d,0x90,0x9e, -0xbe,0xe0,0x30,0xe0,0x2d,0xe5,0x67,0xb4,0x01,0x28,0x90,0x9e,0xbd,0xe0,0x04,0xf0, -0xe0,0xb4,0x0a,0x0b,0x90,0x9e,0xc0,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0xbd,0xf0,0x90, -0x9e,0xc0,0xe0,0xff,0x90,0x9e,0xbf,0xe0,0xb5,0x07,0x07,0x91,0xb0,0xe4,0x90,0x9e, -0xc0,0xf0,0x22,0x12,0x1f,0x04,0xff,0x54,0x01,0xfe,0x90,0x9e,0xbe,0xe0,0x54,0xfe, -0x4e,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x0a,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e, -0xbf,0xf0,0x22,0x90,0x9e,0xc1,0xe0,0xc4,0x13,0x13,0x13,0x54,0x01,0x20,0xe0,0x07, -0x90,0x01,0x3f,0xe0,0x30,0xe2,0x0a,0x90,0x9e,0xc1,0xe0,0x44,0x80,0xf0,0x7f,0x00, -0x22,0x7f,0x01,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x2d,0x90,0xfd,0x50,0x74,0x11, -0xf0,0xa3,0x74,0x04,0xf0,0x90,0x9d,0xaa,0xe0,0x90,0xfd,0x52,0xf0,0x90,0x9d,0xab, -0xe0,0x90,0xfd,0x53,0xf0,0x90,0x9d,0xac,0xe0,0x90,0xfd,0x54,0xf0,0xa3,0x74,0x28, -0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x22,0x43,0x57,0x01,0x22,0x90,0x9e,0xe6,0xe0, -0x54,0xf0,0x44,0x0a,0xf0,0x90,0xfd,0x60,0xe0,0x90,0x9e,0xe8,0xf0,0x90,0xfd,0x62, -0xe0,0x90,0x9e,0xe9,0xf0,0x90,0xfd,0x63,0xe0,0x90,0x9e,0xea,0xf0,0x90,0xfd,0x64, -0xe0,0x90,0x9e,0xeb,0xf0,0x90,0xfd,0x65,0xe0,0x90,0x9e,0xec,0xf0,0x90,0xfd,0x60, -0xe0,0x90,0x9e,0xe6,0x30,0xe6,0x08,0xe0,0x54,0x0f,0x44,0x50,0xf0,0x80,0x16,0xe0, -0x54,0x0f,0x44,0x70,0xf0,0x90,0xfd,0x66,0xe0,0x90,0x9e,0xed,0xf0,0x90,0xfd,0x67, -0xe0,0x90,0x9e,0xee,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0xe8,0x90,0x9e,0xfe,0x12,0x43, -0x7e,0x7a,0x9e,0x79,0xe6,0x02,0x5d,0x37,0x90,0x9e,0x86,0xe0,0x30,0xe0,0x50,0xe0, -0xff,0xc4,0x13,0x13,0x54,0x03,0x90,0x07,0x78,0x30,0xe0,0x05,0x74,0x0d,0xf0,0x80, -0x03,0x74,0x09,0xf0,0x90,0x9e,0x52,0x12,0x1f,0xe3,0x00,0x00,0x03,0x10,0x7b,0x01, -0x7a,0x9e,0x79,0x52,0x12,0x4c,0x0d,0x90,0x9e,0x8b,0x74,0x01,0xf0,0x90,0x9e,0x86, -0xe0,0xc4,0x13,0x54,0x07,0x30,0xe0,0x06,0x90,0x05,0x22,0xe4,0xf0,0x22,0x90,0x9e, -0x86,0xe0,0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x05,0x22,0xe4,0x12,0x49,0x1c,0x22, -0x90,0x9e,0x86,0xe0,0x30,0xe0,0x41,0xe4,0xf5,0x48,0xa3,0xe0,0xf5,0x49,0xe4,0xfb, -0xfd,0x7f,0x60,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x63,0x74,0x05,0xf0,0x90,0x9e, -0x52,0x12,0x1f,0xe3,0x00,0x00,0x03,0x10,0x7b,0x01,0x7a,0x9e,0x79,0x52,0x12,0x4c, -0x0d,0x90,0x9e,0x8b,0x74,0x01,0xf0,0xa3,0xf0,0x90,0x9e,0x96,0xe0,0x90,0x05,0x22, -0x60,0x04,0x74,0x6f,0xf0,0x22,0xe4,0xf0,0x22,0x00,0x79,0x4e,}; - -u8 Rtl8723UFwBTImgArray[Rtl8723UBTImgArrayLength] = { -0x30,}; - - - //WiFi for BT MP New FW 0326 -const u8 Rtl8723SFwUMCBCutMPImgArray[Rtl8723SUMCBCutMPImgArrayLength] = { -0x02, 0x23, 0x02, 0x00, 0x21, 0x00, 0x00, 0x00, 0x03, 0x27, 0x23, 0x01, 0x4E, 0x5E, 0x01, 0x00, -0x73, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4A, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x61, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x67, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0x81, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x6B, 0xB7, 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, -0x00, 0x04, 0x06, 0x05, 0x04, 0x02, 0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, -0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, -0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, 0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, -0x00, 0x18, 0x22, 0x21, 0x20, 0x18, 0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, -0x20, 0x08, 0x00, 0x20, 0x22, 0x21, 0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, -0x22, 0x20, 0x18, 0x08, 0x00, 0x20, 0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, -0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, -0x10, 0x00, 0x00, 0x30, 0x31, 0x20, 0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, -0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, -0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, -0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, -0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, 0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, -0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, -0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, -0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, -0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, -0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, -0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, -0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, -0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, -0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, -0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, -0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, -0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, -0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, -0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, -0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, -0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, -0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, -0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, -0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, -0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, -0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, -0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, -0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, -0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, -0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, -0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, -0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, -0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, -0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, -0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, -0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, -0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, -0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, -0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, -0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, -0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, -0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, -0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, -0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, -0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, -0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, -0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, -0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, -0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0xFB, 0x90, 0x93, 0x63, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, -0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xF0, 0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0xF0, -0x0B, 0x90, 0x93, 0x40, 0xF0, 0x04, 0x70, 0x03, 0x02, 0x44, 0xF0, 0x43, 0x66, 0x10, 0x90, 0x93, -0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0xE0, 0x54, 0x0F, 0xFF, 0x90, -0x93, 0x58, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0xF5, 0x49, -0xE4, 0x1B, 0x80, 0x56, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, -0x58, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x04, 0x2F, 0xF5, -0x49, 0xE4, 0xFB, 0x80, 0x35, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x13, -0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, -0xFB, 0x80, 0x17, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, -0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, -0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, -0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x12, 0x9B, 0x79, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x22, 0xE4, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x41, 0xF0, 0xF5, 0x66, 0x22, 0x22, 0xE4, 0xFF, -0x02, 0x4E, 0x27, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0xFB, 0x90, 0x93, 0x5D, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x62, 0x64, 0x01, -0x60, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x65, 0x14, 0x60, 0x2B, 0x24, 0xFD, 0x60, 0x27, 0x24, 0x02, -0x24, 0xFB, 0x50, 0x02, 0x80, 0x21, 0x90, 0x93, 0x40, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, -0xE0, 0x60, 0x14, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x08, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, -0xF0, 0x7B, 0x01, 0x80, 0x02, 0x7B, 0x01, 0xEB, 0x70, 0x03, 0x02, 0x46, 0x78, 0x43, 0x66, 0x10, -0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, 0xE0, 0x54, 0x0F, -0xFF, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0x80, -0x2D, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, -0xFE, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x08, -0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3A, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0x80, -0x2D, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, -0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, -0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, -0xE5, 0x63, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x93, 0x13, 0xE0, 0xFF, 0x90, 0x93, 0x58, 0xE0, 0xD3, -0x9F, 0x40, 0x08, 0x90, 0x93, 0x14, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0x14, 0xF0, -0x90, 0x93, 0x58, 0xE0, 0x90, 0x93, 0x13, 0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x46, 0xE4, -0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, -0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, 0x4A, 0x65, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x55, 0x80, 0x09, 0x43, 0x66, 0x01, 0x12, 0x51, 0x48, 0x90, -0x93, 0x51, 0x74, 0x01, 0xF0, 0x12, 0x9B, 0x79, 0x22, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0xE5, 0x65, -0x70, 0x03, 0x02, 0x47, 0x32, 0x90, 0x93, 0x5A, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, -0xE5, 0x66, 0x54, 0x07, 0x60, 0x03, 0x02, 0x47, 0x32, 0x02, 0x47, 0x2F, 0x90, 0x93, 0x41, 0xE0, -0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x36, -0xE0, 0x54, 0x0F, 0xB5, 0x07, 0x0A, 0x90, 0x93, 0x39, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, -0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, -0x90, 0x93, 0x58, 0xE0, 0xB5, 0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, -0x03, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, -0x93, 0x63, 0x74, 0x5A, 0xF0, 0x90, 0x93, 0x63, 0xE0, 0xFF, 0x90, 0x93, 0x48, 0xE0, 0x2F, 0xFF, -0xE4, 0x33, 0xFE, 0x90, 0x93, 0x41, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, -0x40, 0x0D, 0xE5, 0x62, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, -0x52, 0x17, 0x22, 0xE4, 0xF5, 0x66, 0xF5, 0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, -0x59, 0xF0, 0x90, 0x93, 0x55, 0xF0, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x93, 0x57, 0x04, 0xF0, 0x90, -0x93, 0x40, 0xF0, 0xE4, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x93, 0x4F, 0x74, -0x05, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x4D, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, -0x93, 0x48, 0xF0, 0x90, 0x93, 0x4B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x45, 0x74, 0x14, 0xF0, 0x90, -0x93, 0x50, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x43, 0xF0, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x93, -0xB2, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x93, 0x5C, 0xF0, 0x90, 0x93, 0x58, 0xF0, 0x90, 0x93, -0x3D, 0xF0, 0x90, 0x93, 0x56, 0xF0, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x93, 0x44, 0xF0, 0x90, 0x93, -0x51, 0xF0, 0x90, 0x93, 0x4A, 0xF0, 0x90, 0x93, 0x46, 0xF0, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x93, -0x49, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, -0x36, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x93, 0x39, 0xF0, 0x22, 0xEF, 0x60, 0x5F, 0xAF, 0x05, -0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x93, -0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x30, 0xE0, 0x6B, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xE0, 0x25, 0xE0, 0x25, -0xE0, 0xFF, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, -0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xAF, 0x05, 0x74, -0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x19, -0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, -0xE0, 0x0C, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x22, 0x90, -0x93, 0x15, 0xE0, 0x30, 0xE0, 0x22, 0x90, 0x93, 0x26, 0xE0, 0x60, 0x09, 0x90, 0x01, 0xB9, 0x74, -0x40, 0xF0, 0x02, 0x49, 0x29, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x02, 0x80, 0x2F, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x67, 0x80, 0x5D, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, -0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, -0xB9, 0x74, 0x02, 0xF0, 0x80, 0x53, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, -0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x42, 0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, -0x08, 0xF0, 0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, -0x28, 0x90, 0x93, 0x42, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, -0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, -0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, -0x00, 0x22, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0xE0, -0x54, 0xC0, 0x70, 0x18, 0x90, 0x93, 0x51, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x14, 0x12, 0x52, 0x17, 0x80, 0x0F, 0x90, 0x93, 0x3D, 0xE0, -0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x5D, 0xE0, 0x30, -0xE6, 0x1B, 0x43, 0x66, 0x01, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, -0x0C, 0x60, 0x13, 0x12, 0x51, 0x48, 0x80, 0x0E, 0x12, 0x50, 0x77, 0x80, 0x09, 0x90, 0x93, 0x51, -0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x5D, 0xE0, 0x30, -0xE7, 0x2A, 0x43, 0x66, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, -0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x93, -0x5A, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, -0x8E, 0x25, 0x8F, 0x26, 0xAD, 0x26, 0xAC, 0x25, 0xAF, 0x24, 0x12, 0x47, 0xEB, 0xAF, 0x26, 0xAE, -0x25, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, -0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x8F, 0x68, 0x8D, 0x69, 0xE5, 0x68, 0x54, 0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, -0xE5, 0x68, 0x30, 0xE2, 0x30, 0xE5, 0x63, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0xA1, 0xE5, -0x63, 0x30, 0xE3, 0x10, 0xE5, 0x68, 0x20, 0xE3, 0x0B, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x53, 0x12, -0x51, 0xD4, 0x80, 0x4E, 0xE5, 0x63, 0x20, 0xE3, 0x49, 0xE5, 0x68, 0x30, 0xE3, 0x44, 0xAF, 0x69, -0x12, 0x51, 0x86, 0x80, 0x3D, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x68, 0x20, -0xE3, 0x09, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x2A, 0x12, 0x51, 0xD4, 0xE5, 0x63, 0x54, 0x0F, 0xFF, -0xBF, 0x04, 0x0E, 0xE5, 0x68, 0x20, 0xE2, 0x09, 0x12, 0x48, 0x8F, 0xEF, 0x60, 0x14, 0x12, 0x51, -0x1F, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4B, 0xF7, 0xEF, 0x60, 0x03, 0x12, -0x52, 0x04, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x02, 0x4B, 0x35, 0x02, 0x52, 0xF4, 0xE4, 0x93, 0xA3, -0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, -0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, -0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, -0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4F, 0x75, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, -0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, -0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, -0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, -0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x7D, -0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, 0x01, 0x36, -0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, -0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x4A, 0x65, 0x90, 0x06, -0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, -0x74, 0x7B, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, -0x03, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, -0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4F, 0x28, 0xE5, 0x62, 0x20, 0xE0, -0x05, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0x22, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x10, 0x12, 0x51, -0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x5C, 0xE5, 0x14, -0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x50, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, -0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x3F, 0x90, 0x02, 0x87, 0xE0, 0x60, -0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x31, 0x90, 0x01, 0xAF, 0xE0, 0x60, 0x02, 0x80, -0x07, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, -0x90, 0x93, 0x43, 0xE0, 0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, -0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, -0x7F, 0x00, 0x22, 0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, 0x64, -0x02, 0x60, 0x06, 0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, 0x40, -0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x93, 0x57, 0xF0, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x07, 0x90, -0x93, 0x57, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x93, 0x40, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xEF, 0xF0, -0x90, 0x93, 0x42, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x58, -0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, -0x02, 0xF0, 0x53, 0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, -0x03, 0x12, 0x49, 0x32, 0x22, 0x90, 0x93, 0xB1, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, -0x90, 0x93, 0xB1, 0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0x7D, 0x40, 0x7F, 0x93, 0x12, 0x54, -0x0A, 0x90, 0x00, 0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x28, -0xE0, 0x54, 0xFC, 0xFD, 0x7F, 0x28, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, -0x7F, 0x08, 0x12, 0x54, 0x0A, 0x7F, 0x01, 0x12, 0x4E, 0x81, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, -0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, -0x54, 0x0A, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x54, 0x0A, 0x7F, 0x14, -0x7E, 0x00, 0x02, 0x3B, 0x09, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x93, 0x1A, 0xE0, -0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x49, 0x12, -0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, -0x93, 0x55, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x52, -0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, 0xD3, -0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, -0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, -0x22, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xC8, 0x12, 0x44, 0xF1, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, -0x12, 0x1E, 0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, -0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, -0x1F, 0x0F, 0xFD, 0xE4, 0xFF, 0x12, 0x50, 0x39, 0x80, 0x29, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x50, 0x39, 0x1F, 0x80, 0x14, 0x90, -0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x50, -0x39, 0xE4, 0xFF, 0x12, 0x4B, 0x7A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x24, -0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, -0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x27, 0x74, 0xFF, 0xF0, 0x12, 0x5E, -0x42, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x1F, 0x12, 0x49, -0xD0, 0x90, 0x05, 0x22, 0xE5, 0x27, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, 0x01, -0x12, 0x58, 0x1F, 0x12, 0x49, 0xD0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x8F, 0x6C, 0xE4, 0x90, 0x94, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, -0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6C, 0x60, 0x3E, 0xC3, 0x90, 0x94, 0x45, 0xE0, 0x94, -0x88, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, -0x22, 0x90, 0x94, 0x44, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, -0x3B, 0x09, 0xD3, 0x90, 0x94, 0x45, 0xE0, 0x94, 0x32, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x00, 0x40, -0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, 0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, -0x7F, 0x20, 0x12, 0x54, 0x0A, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, -0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, -0x28, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x54, 0x0A, -0xE4, 0xFF, 0x12, 0x4E, 0x81, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, -0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x54, 0x0A, 0xE4, 0xFF, 0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, -0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, -0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, -0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, 0x4E, 0xE0, 0x9D, 0x90, 0x93, 0x4D, -0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xA3, 0xE0, -0x90, 0x05, 0x58, 0xF0, 0x22, 0x48, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x48, 0x93, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0x9F, 0x00, 0x41, -0x93, 0xAE, 0x00, 0x41, 0x93, 0x94, 0x00, 0x41, 0x94, 0x4C, 0x00, 0x41, 0x93, 0x13, 0x00, 0x41, -0x93, 0x14, 0x00, 0x41, 0x92, 0x69, 0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, 0x41, -0x94, 0x3D, 0x00, 0x41, 0x94, 0x4A, 0x00, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0x56, 0x74, 0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x94, 0x31, 0x12, -0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x94, 0x31, 0x12, -0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, -0x7E, 0x08, 0x12, 0x34, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, -0x02, 0x80, 0x35, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x2E, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, -0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x9B, 0x79, 0x90, 0x93, 0x59, 0xE0, -0x60, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0D, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, -0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, -0x24, 0x02, 0x70, 0x32, 0x80, 0x0A, 0x90, 0x93, 0x57, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x40, 0xF0, -0xE4, 0x90, 0x93, 0x5C, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x50, 0xE0, 0x90, 0x93, 0x57, -0xF0, 0x80, 0x05, 0x90, 0x93, 0x57, 0xED, 0xF0, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, 0xF0, -0x90, 0x93, 0x5C, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, -0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, -0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, -0xF0, 0x90, 0x93, 0x52, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x0C, 0x50, 0x03, 0x12, -0x4A, 0x65, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, -0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x3E, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, -0xFF, 0x74, 0x40, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, -0xF9, 0x90, 0x93, 0x54, 0xF0, 0xEE, 0x90, 0x93, 0x53, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x93, -0xB0, 0xE0, 0x90, 0x94, 0x35, 0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0xB0, 0xE0, 0x90, 0x94, 0x35, -0x60, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, -0x01, 0x10, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x35, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x55, 0x6B, 0x90, -0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x5E, 0x42, 0xEF, 0x70, -0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x12, 0x54, -0x62, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x90, 0x93, 0x46, 0xE0, 0x70, 0x1A, 0x90, 0x04, -0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, 0x1F, 0x8E, 0x6A, -0x8F, 0x6B, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x16, 0x90, -0x93, 0x4A, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x44, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, -0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, -0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x0C, -0x22, 0x90, 0x94, 0x4D, 0xEF, 0xF0, 0x12, 0x98, 0x8F, 0x90, 0x94, 0x4D, 0xE0, 0x60, 0x05, 0x90, -0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, -0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, -0x02, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x05, -0x7F, 0x01, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0xE5, 0x64, 0x30, 0xE6, -0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, -0x53, 0x64, 0xBF, 0x22, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0xE5, 0x12, 0x4E, 0xD9, -0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x7D, 0x01, 0xAF, 0x64, 0x02, 0x4A, 0x69, 0x90, 0x02, -0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, 0x43, -0xF7, 0x52, 0x49, 0x00, 0x40, 0x52, 0x71, 0x00, 0x80, 0x52, 0x9C, 0x01, 0x00, 0x52, 0xB0, 0x02, -0x00, 0x52, 0xC8, 0x04, 0x00, 0x00, 0x00, 0x52, 0xE5, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, 0xFF, -0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, 0xCE, -0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x80, -0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, 0x2D, -0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x07, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, 0xFE, -0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, 0x35, -0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, 0x2D, -0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, 0xFF, -0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, 0x00, -0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x21, 0xF0, -0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x75, 0xF0, 0xA3, 0xF0, 0xF1, 0x9F, 0x75, 0x8E, 0x02, -0xB1, 0x34, 0xF1, 0xBF, 0x90, 0x93, 0xB1, 0xEF, 0xF0, 0xF1, 0xA7, 0x90, 0x93, 0xB3, 0xEF, 0xF0, -0x12, 0x60, 0x3E, 0x90, 0x93, 0x95, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x14, 0xF5, 0x09, -0xF5, 0x62, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x88, 0x65, -0x12, 0x47, 0x33, 0x12, 0x37, 0x1C, 0xF1, 0xB3, 0x71, 0xE1, 0x12, 0x60, 0x02, 0xF1, 0xD2, 0xF1, -0x98, 0x12, 0x60, 0x20, 0x12, 0x44, 0xFD, 0x12, 0x60, 0xAC, 0xB1, 0x1C, 0x90, 0x93, 0x77, 0xE5, -0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x52, 0x75, 0xE8, 0x03, -0x43, 0xA8, 0x85, 0x12, 0x96, 0x00, 0xD2, 0xAF, 0x51, 0xEA, 0x12, 0x60, 0x56, 0x90, 0x93, 0x75, -0xE0, 0x64, 0x01, 0xF0, 0x24, 0xF4, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, 0xA3, 0xF0, 0xE5, 0x14, -0x30, 0xE0, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0xFE, 0xB1, 0x44, 0xD2, 0xAF, 0xE5, 0x14, 0x30, 0xE4, -0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xEF, 0xD2, 0xAF, 0x12, 0x6F, 0xBB, 0xE5, 0x14, 0x30, 0xE6, 0x0A, -0xC2, 0xAF, 0x53, 0x14, 0xBF, 0xD2, 0xAF, 0x12, 0x80, 0x62, 0xE5, 0x14, 0x30, 0xE7, 0x09, 0xC2, -0xAF, 0x53, 0x14, 0x7F, 0xD2, 0xAF, 0xB1, 0xD2, 0xC2, 0xAF, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0xBF, -0x01, 0x0D, 0x90, 0x93, 0x43, 0x74, 0x01, 0xF0, 0x51, 0x17, 0xE4, 0x90, 0x93, 0x43, 0xF0, 0xD2, -0xAF, 0x90, 0x01, 0xBD, 0xE5, 0x63, 0xF0, 0x90, 0x93, 0x59, 0xE0, 0x90, 0x01, 0xBC, 0xF0, 0x80, -0x8C, 0x90, 0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x91, 0x0A, 0x7D, 0xFF, 0x7F, 0x55, 0x91, 0x0A, -0x7D, 0xFF, 0x7F, 0x56, 0x91, 0x0A, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x91, 0x52, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x91, 0x0A, 0xE4, 0xFD, 0x7F, 0x51, 0x91, 0x0A, 0xE4, -0xFD, 0x7F, 0x52, 0x91, 0x0A, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0x90, 0x00, 0x02, 0xE0, 0x44, -0x01, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xF2, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x00, 0x00, 0x90, 0x93, 0xF6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x02, -0xE0, 0x54, 0xFE, 0xF0, 0x91, 0x52, 0x91, 0x4B, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x90, -0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, -0xF0, 0x90, 0x93, 0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x3D, -0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x56, 0xF0, 0xFF, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, -0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, 0xEC, 0x54, 0xFD, 0xFC, 0x90, 0x93, -0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, -0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x22, 0xE4, 0xFF, 0x11, -0xEB, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xF6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, -0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xF6, 0xB1, 0x67, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, -0x93, 0x51, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x94, 0x3E, 0xE0, -0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x94, 0x40, 0xF0, 0x90, 0x94, 0x3E, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, -0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, -0x7F, 0x80, 0x81, 0x0A, 0xE4, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x6B, 0x12, 0x73, 0x5E, 0xEF, 0xB4, -0x02, 0x14, 0x90, 0x94, 0x4A, 0xE0, 0x64, 0x04, 0x60, 0x07, 0x43, 0x14, 0x01, 0xE0, 0x04, 0xF0, -0x22, 0xE4, 0x90, 0x94, 0x4A, 0xF0, 0x22, 0x7F, 0x70, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, 0xEE, 0x44, 0xF0, 0xA3, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, -0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEE, 0xF0, 0x12, 0x1E, 0xF6, -0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, 0x12, 0x97, 0x34, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x90, 0x93, 0x04, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x16, 0xEF, 0x7B, 0x01, 0xB4, 0x01, -0x06, 0x7A, 0x93, 0x79, 0x0B, 0x80, 0x04, 0x7A, 0x93, 0x79, 0x07, 0x7F, 0x80, 0x7E, 0x08, 0xB1, -0x6B, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x40, 0xEF, 0x60, 0x4E, 0x90, 0x92, -0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, -0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, -0xFA, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0xD0, 0x01, 0xD0, 0x02, 0xD1, 0x31, 0x90, 0x92, 0x69, -0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, -0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x10, 0x12, 0x43, 0xC8, 0x90, 0x92, -0x68, 0xE0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0xF1, 0x40, 0xEF, 0x70, 0x02, 0xC1, 0xEC, 0x90, -0x94, 0x10, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, -0x7A, 0x01, 0x79, 0xA0, 0xD1, 0xF1, 0x90, 0x94, 0x13, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, -0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, -0x23, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0xD1, 0xF1, 0x90, 0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, -0x93, 0xB1, 0xE0, 0x64, 0x01, 0x70, 0x48, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, -0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x20, 0xD1, 0xF1, 0x90, 0x94, -0x13, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, -0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x22, 0xD1, -0xF1, 0x90, 0x93, 0x95, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, -0x92, 0x68, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x94, -0x0A, 0x12, 0x43, 0xC8, 0xAB, 0x20, 0xAA, 0x21, 0xA9, 0x22, 0x90, 0x94, 0x0D, 0x12, 0x43, 0xC8, -0xAF, 0x23, 0x15, 0x23, 0xEF, 0x60, 0x1E, 0x90, 0x94, 0x0D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, -0xB1, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x94, 0x0A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, -0x12, 0x42, 0x53, 0x80, 0xDB, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x94, 0x39, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, -0xF0, 0x90, 0x94, 0x39, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, -0x90, 0x94, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0x3B, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, -0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x3B, 0xE4, 0x75, 0xF0, 0x01, 0x12, -0x42, 0x87, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, 0x7F, 0x01, 0x22, 0x8F, 0x82, -0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0x20, 0xF0, 0x22, 0x90, -0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, -0x7F, 0x01, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0x90, -0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, 0x02, 0x22, 0x7F, -0x00, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, -0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, -0xC4, 0x74, 0xE7, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, -0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, -0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, -0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, -0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, -0x54, 0xEF, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, -0x62, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x67, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x54, 0x3F, 0x25, -0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x68, 0xF0, 0x90, -0x93, 0x67, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xE4, 0xFF, 0x90, 0x94, 0x1C, 0xEF, 0xF0, 0xA3, 0xED, -0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, -0x21, 0xF0, 0xD1, 0x3C, 0xBF, 0x01, 0x02, 0x11, 0xEC, 0x90, 0x94, 0x21, 0xE0, 0x90, 0x05, 0x22, -0xF0, 0x80, 0x02, 0x11, 0xEC, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0xAC, 0xE0, -0xFF, 0x7D, 0x01, 0x11, 0x1F, 0x90, 0x94, 0x1F, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, -0x94, 0x1C, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x94, 0x2B, 0xF0, 0xEF, 0x60, 0x10, -0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0E, -0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, -0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x11, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, 0x16, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x16, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0xAE, 0x05, 0x74, 0x22, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEB, 0xF0, 0x90, 0x94, 0x2B, 0xE0, 0xFF, 0x74, 0x23, 0x2E, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x12, 0x9B, 0xA7, 0x90, 0x93, 0x27, 0xE0, -0x64, 0x01, 0x60, 0x02, 0x41, 0xAE, 0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x18, 0xE0, 0xC3, 0x13, -0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0xA3, -0xE0, 0x90, 0x93, 0x63, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x63, 0xE0, 0x24, 0x03, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x27, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, -0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, -0x90, 0x93, 0x16, 0xE0, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xB9, -0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, -0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x06, 0xF0, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0xA1, 0xAC, 0x90, 0x93, -0x27, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x61, 0x8D, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, -0x3F, 0x30, 0xE0, 0x08, 0xD1, 0x3C, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x62, 0xE4, 0xFF, 0xD1, 0xE6, -0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x1F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, -0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x90, 0x93, 0x63, 0xF0, 0x90, -0x93, 0x1A, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x16, 0xE0, 0x24, 0x03, 0xFF, -0x90, 0x93, 0x63, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0xFF, 0x90, 0x93, 0x64, -0xE0, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x63, 0x74, 0x05, 0xF0, 0xE4, 0xFF, 0xD1, 0x83, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, -0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, -0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x20, 0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, -0x65, 0x60, 0x0D, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0xC1, 0x36, 0x90, 0x93, 0x27, -0xE0, 0x64, 0x03, 0x60, 0x02, 0x81, 0xE1, 0x7F, 0x01, 0xD1, 0xE6, 0x90, 0x93, 0x19, 0xE0, 0xFF, -0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x98, 0x8F, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0x81, 0x3D, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x90, 0x93, 0x29, -0xE0, 0xD3, 0x9F, 0x40, 0x4D, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, -0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0x17, 0xE0, 0xD3, 0x9D, -0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0x93, 0x66, 0xF0, 0x80, -0x06, 0x90, 0x93, 0x66, 0x74, 0x03, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x66, 0xE0, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, -0x80, 0x24, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x22, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, -0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x1D, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x27, 0xF0, -0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x29, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, -0x90, 0x93, 0x65, 0xE0, 0xFF, 0x90, 0x93, 0x17, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, -0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x63, -0x74, 0x05, 0xF0, 0x7F, 0x01, 0xD1, 0x83, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, -0xE0, 0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0x93, 0x1A, 0xE0, -0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x02, 0x80, 0x0F, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x08, 0xE5, 0x65, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, -0x69, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, -0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x51, 0x48, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, -0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x7F, 0x01, 0xC1, -0x38, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xA1, 0xB2, 0xF5, 0x48, 0x75, 0x49, 0x03, -0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, -0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, -0x90, 0x93, 0x17, 0xE0, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xB9, -0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, -0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x07, 0xF0, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x90, 0x05, 0x22, 0xE4, -0xF0, 0x22, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x3B, 0x90, 0x93, 0x19, 0xE0, -0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xD1, 0x3C, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x62, -0xE4, 0xFF, 0xD1, 0xE6, 0xD1, 0x83, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, -0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x20, 0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, -0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, -0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x22, 0x90, 0x05, 0x22, 0x74, -0xFF, 0xF0, 0xE4, 0x90, 0x94, 0x48, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, -0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, -0x94, 0x49, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0x48, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, -0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x94, 0x48, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, -0x87, 0x80, 0xC6, 0x90, 0x94, 0x2C, 0xEF, 0xF0, 0x12, 0x9D, 0x50, 0x90, 0x93, 0x18, 0xE0, 0xFF, -0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x08, 0x90, 0x94, 0x2C, 0xE0, 0xFF, 0x12, 0x50, 0xEB, 0x90, -0x94, 0x2D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x90, 0x94, 0x2C, 0xE0, 0xB4, 0x01, 0x10, -0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x80, 0x0A, -0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x94, 0x2D, 0x12, 0x1F, 0xD5, -0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x2D, 0x12, 0x55, 0x67, 0x90, 0x94, 0x2C, -0xE0, 0x90, 0x93, 0x26, 0xF0, 0x22, 0xEF, 0x64, 0x03, 0x60, 0x02, 0xE1, 0xB4, 0x90, 0x94, 0x02, -0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x30, 0xE0, 0x30, 0x90, 0x94, 0x06, 0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0xA3, -0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x41, 0x90, 0x94, 0x02, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, -0x74, 0x55, 0xF0, 0x80, 0x2D, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x17, 0x90, -0x94, 0x02, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, -0xF0, 0xA3, 0x74, 0x5A, 0x80, 0x05, 0x90, 0x94, 0x06, 0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x94, 0x02, 0xE0, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x94, 0x03, 0xE0, 0x90, 0x06, -0xC1, 0xF0, 0x90, 0x94, 0x04, 0xE0, 0x90, 0x06, 0xC2, 0xF0, 0x90, 0x94, 0x05, 0xE0, 0x90, 0x06, -0xC3, 0xF0, 0x90, 0x94, 0x06, 0xE0, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x94, 0x07, 0xE0, 0x90, 0x06, -0xC5, 0xF0, 0x90, 0x94, 0x08, 0xE0, 0x90, 0x06, 0xC6, 0xF0, 0x90, 0x94, 0x09, 0xE0, 0x90, 0x06, -0xC7, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, -0x17, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEF, 0x90, -0x06, 0xCC, 0xB4, 0x01, 0x03, 0xE4, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x57, 0xE7, 0xBF, -0x01, 0x0F, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x1F, 0x90, 0x04, 0x1F, 0x74, 0x20, -0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, 0xE0, 0x02, -0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90, 0x01, 0x30, -0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B, 0xF0, 0x22, -0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x43, 0x32, 0x20, 0x90, -0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, 0x22, 0x90, 0x93, -0xB3, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, -0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, -0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, -0x79, 0xE0, 0x94, 0x88, 0x90, 0x93, 0x78, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, -0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x78, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, -0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x78, 0xE0, -0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x01, 0xE0, -0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, -0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, -0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, -0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, -0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x93, 0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, -0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07, 0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3C, 0x90, 0x93, -0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D, 0xF0, 0x79, 0x40, 0x90, 0x93, 0x5D, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0x9F, -0xF0, 0x22, 0x90, 0x93, 0x9F, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0C, 0xE4, 0xF0, -0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x5F, 0xCC, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, -0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, -0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x4B, 0xF0, 0x74, 0x61, -0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28, 0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, -0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0, 0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, -0x02, 0x61, 0x45, 0x90, 0x01, 0x34, 0x74, 0x01, 0xF0, 0x85, 0xD1, 0x0A, 0x85, 0xD3, 0x0C, 0x85, -0xD4, 0x0D, 0x85, 0xD5, 0x0E, 0x85, 0xD6, 0x0F, 0x85, 0xD7, 0x10, 0x85, 0xD9, 0x11, 0x85, 0xD2, -0x0B, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x0A, 0x75, 0x23, 0x08, 0xFB, 0x7A, 0x93, -0x79, 0xA0, 0x12, 0x56, 0xF1, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, -0xC4, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x70, 0x02, 0x41, 0xF0, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x41, 0xF0, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, -0x93, 0xA2, 0xE0, 0x54, 0x3F, 0xF5, 0x4E, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, -0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, -0x87, 0xE5, 0x4E, 0xD3, 0x94, 0x04, 0x40, 0x03, 0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, -0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, -0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, -0x9C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xA1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, -0x2F, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, -0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFF, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x67, 0xAF, 0x4D, 0x12, 0x7A, 0xA1, 0x80, 0x60, -0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x53, 0x90, 0x93, 0xA4, -0xE0, 0x54, 0x1F, 0xFF, 0xFD, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, -0xF5, 0x83, 0xE4, 0x8D, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFE, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0xEE, 0x54, 0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, -0x12, 0x7A, 0x3D, 0x80, 0x1B, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, -0x04, 0x30, 0xE0, 0xB4, 0x01, 0x0A, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, -0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x46, 0x90, 0x93, 0x59, 0xE0, 0x60, 0x37, 0x90, -0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, -0x70, 0x2D, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, -0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, -0x90, 0x93, 0x55, 0xF0, 0x80, 0x09, 0x12, 0x51, 0xBB, 0xBF, 0x01, 0x03, 0x12, 0x52, 0x17, 0x90, -0x94, 0x4B, 0xE0, 0x04, 0xF0, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0xE7, 0x90, 0x01, 0x34, 0x74, -0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, 0x0B, 0x75, -0x4F, 0x88, 0x75, 0x50, 0x0F, 0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, 0x75, 0x50, 0x08, -0x75, 0x51, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x12, 0x90, 0x04, 0x7E, 0xE0, 0x55, -0x51, 0xF5, 0x13, 0x65, 0x12, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x12, 0x75, 0xF0, 0x08, 0xA4, 0x25, -0x4F, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x15, 0x2F, -0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x15, -0x75, 0x23, 0x08, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x97, 0x12, 0x56, 0xF1, 0x90, 0x93, 0x97, 0xE0, -0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0x6A, 0xE5, 0x12, 0x24, 0x01, -0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, 0x12, 0x90, -0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x13, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, -0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x14, 0x10, -0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, -0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x54, 0x1F, 0x90, -0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x54, 0x52, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x06, -0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x81, 0xF1, 0x90, 0x93, 0xB2, -0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, -0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x12, 0x45, 0x09, 0x90, -0x93, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xE6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, -0x12, 0x50, 0xEB, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0xFF, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9F, 0x40, 0x30, 0xE0, 0x54, 0xFE, -0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x90, 0x93, 0x32, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, -0xC9, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2E, 0x12, 0x43, 0x84, 0x90, 0x81, -0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x80, 0x1C, 0x90, 0x93, 0x2D, -0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0xFE, -0x25, 0xE0, 0x4F, 0xF0, 0x80, 0x03, 0x12, 0x6B, 0x40, 0x12, 0x6B, 0x09, 0x90, 0x93, 0xB2, 0xE4, -0xF0, 0xE5, 0x2E, 0x30, 0xE1, 0x45, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x43, 0x14, 0x40, 0x12, -0x9D, 0xA9, 0x11, 0xDC, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x1D, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, -0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, -0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, 0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, -0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x43, -0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x12, 0x4C, 0x73, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x34, 0x90, -0x93, 0x57, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x57, 0xE0, 0x90, -0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, -0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x40, -0xE0, 0x14, 0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x62, -0x64, 0x01, 0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, -0x74, 0x02, 0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, -0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, -0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, 0x60, 0x1C, -0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x5A, 0xE4, 0xF0, -0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2E, 0x30, 0xE5, -0x25, 0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x1A, 0xE5, 0x65, 0x60, 0x16, -0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x08, 0x12, 0x51, -0x48, 0x80, 0x03, 0x12, 0x50, 0x77, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, -0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, 0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, 0x66, 0x54, -0x07, 0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2F, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x37, 0x74, 0x02, -0xF0, 0x12, 0x4F, 0xFA, 0x74, 0x4B, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, -0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, -0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x5D, 0xE0, 0x54, 0xF0, -0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x15, 0x90, 0x94, -0x19, 0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x5D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x94, 0x16, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, -0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x92, 0x69, 0xE0, 0x70, 0x06, 0xA3, -0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, -0x12, 0x57, 0x40, 0xEF, 0x60, 0x72, 0x12, 0x55, 0xD2, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x90, -0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xA8, 0x01, -0xFC, 0x7D, 0x01, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x7E, 0x00, 0x7F, 0x02, 0x12, 0x1E, 0xD0, -0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, -0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0x19, 0x12, 0x43, 0xA8, 0x8B, 0x20, -0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, -0x0F, 0xF5, 0x23, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x56, 0xF1, 0x90, 0x92, 0x6A, 0xE0, -0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0x90, -0x93, 0x63, 0xE0, 0x54, 0xF0, 0x44, 0x05, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x65, -0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x65, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, -0x79, 0x63, 0xC1, 0x89, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x07, 0xF0, 0x54, -0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x6E, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, -0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0xC1, 0x89, 0xAD, 0x07, 0x90, 0x93, 0x6C, -0xE0, 0x54, 0xF0, 0x44, 0x09, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x6E, 0xEF, 0xF0, -0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, -0xC1, 0x89, 0x90, 0x93, 0x8F, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x92, 0xE0, 0x54, 0xF0, 0x44, 0x02, -0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, 0x93, 0x8F, 0x12, 0x43, 0xA8, 0x90, 0x94, 0x19, 0x12, -0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x92, 0xC1, 0x89, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, -0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x7D, 0xDA, 0x90, 0x01, 0xC4, -0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, -0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, -0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, -0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, -0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, -0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, -0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, -0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, -0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, -0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, -0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, 0x56, -0x00, 0x90, 0x01, 0xC4, 0x74, 0x81, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, -0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, -0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3C, -0x74, 0x01, 0xF0, 0xE5, 0x34, 0x30, 0xE1, 0x10, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, -0x15, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x46, 0x79, 0xE5, 0x34, 0x30, 0xE2, 0x36, 0x90, 0x01, 0x3C, -0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x45, -0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, -0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x55, 0xE4, 0xF0, -0x12, 0x52, 0x17, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0x90, 0x06, -0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, -0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, -0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x52, 0xE4, 0xF0, 0x12, 0x52, 0x17, 0xE5, 0x34, -0x30, 0xE4, 0x34, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x30, 0xE0, 0x24, -0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x07, 0x78, 0x74, 0x01, -0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, -0x34, 0x30, 0x80, 0x03, 0x12, 0x59, 0x97, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, 0x74, -0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x83, -0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, 0x64, 0xF0, 0x12, 0x51, 0xEC, 0x12, 0x52, 0x17, 0xE5, -0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, -0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, 0xAE, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, -0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x06, 0x90, -0x01, 0x3E, 0x74, 0x01, 0xF0, 0xE5, 0x36, 0x30, 0xE1, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, -0xE5, 0x36, 0x30, 0xE3, 0x08, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xD1, 0x50, 0xE5, 0x36, 0x30, -0xE4, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x76, 0x90, 0x01, 0x3E, -0x74, 0x04, 0xF0, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE7, 0x13, 0x74, 0x80, 0xF0, 0x90, 0x07, 0x95, -0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x8F, -0xE0, 0x30, 0xE6, 0x12, 0x74, 0x40, 0xF0, 0x90, 0x07, 0x7C, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x07, -0x80, 0xE0, 0xFF, 0x12, 0x67, 0x3D, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE5, 0x14, 0x74, 0x20, 0xF0, -0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, 0x01, -0xF0, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE2, 0x0D, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, -0x7F, 0x01, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE0, 0x07, 0x74, 0x01, 0xF0, 0xFF, -0x12, 0x55, 0xB2, 0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, -0x30, 0xE6, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, -0x3E, 0x74, 0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, -0x14, 0x80, 0xE5, 0x37, 0x30, 0xE4, 0x1C, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x44, 0x24, -0x90, 0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x71, -0x40, 0x71, 0x09, 0x74, 0x81, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, -0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, -0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x94, 0x3E, 0xE0, 0x30, 0xE0, 0x2F, -0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x94, 0x3D, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, -0x94, 0x40, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x3D, 0xF0, 0x90, 0x94, 0x40, 0xE0, 0xFF, 0x90, -0x94, 0x3F, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x44, 0xFE, 0xE4, 0x90, 0x94, 0x40, 0xF0, 0x22, -0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x6F, 0x7F, 0x01, 0x12, 0x5E, 0xE6, 0x90, 0x93, 0x19, 0xE0, -0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x98, 0x8F, 0x7F, 0x01, 0x12, 0x5E, 0x83, -0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x29, 0x90, 0x93, 0x15, 0xE0, 0xC4, -0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, 0xE0, -0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, -0x0C, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x4C, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, 0x74, 0x6F, 0xF0, -0x80, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, -0x05, 0x7F, 0x01, 0x12, 0x55, 0xB2, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, -0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, -0xC0, 0x06, 0xC0, 0x07, 0x53, 0x91, 0xBF, 0x90, 0xFD, 0x68, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x35, -0x90, 0x93, 0x94, 0xE0, 0x70, 0x16, 0x90, 0x00, 0x2E, 0xE0, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x00, -0x2D, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x94, 0x74, 0x01, 0xF0, 0x90, 0xFD, 0x60, 0xE0, -0x54, 0x3F, 0xD3, 0x94, 0x09, 0x50, 0x03, 0x12, 0x99, 0xED, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x0E, -0x60, 0x02, 0x81, 0xB8, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, -0x02, 0x81, 0xB8, 0x90, 0xFD, 0x62, 0xE0, 0x54, 0xC0, 0xFE, 0x90, 0x07, 0x90, 0xE0, 0x54, 0x3F, -0x4E, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x07, 0x91, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x07, -0x92, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x07, 0x93, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x01, 0xF0, -0xEF, 0x20, 0xE0, 0x44, 0x90, 0x93, 0x04, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x19, 0x90, -0x07, 0x78, 0x12, 0x58, 0x7F, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x49, 0x90, -0x07, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x80, 0x40, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, -0xE0, 0x11, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, -0x44, 0x01, 0xF0, 0x90, 0x07, 0x78, 0x80, 0x14, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x54, -0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x12, 0x58, 0x7F, 0x80, 0x0C, 0xE0, 0x44, 0x10, 0xF0, -0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x0F, 0x0A, 0x90, -0xFD, 0x62, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD1, 0xBF, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x15, 0x70, -0x76, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6A, 0xF0, 0xE0, 0x30, 0xE6, 0x1C, 0xF4, 0x54, 0x3F, -0x04, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9F, 0x90, 0x93, 0x69, 0xF0, -0xD3, 0x94, 0x3F, 0x40, 0x20, 0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, 0x54, -0x3F, 0xFF, 0x90, 0x93, 0x6A, 0xE0, 0x54, 0x3F, 0x2F, 0x90, 0x93, 0x69, 0xF0, 0xD3, 0x94, 0x3F, -0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0x93, 0x69, 0xE0, 0xFF, 0x90, 0x01, 0xE7, 0xF0, 0xEF, 0x54, -0x30, 0xC4, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x69, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, -0x93, 0x6B, 0xF0, 0x90, 0x00, 0x2E, 0xF0, 0xEE, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x93, 0x10, 0xE0, -0x54, 0x0F, 0x4F, 0x90, 0x00, 0x2D, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x16, 0x08, 0x90, 0xFD, -0x62, 0xE0, 0xFF, 0x12, 0x67, 0x64, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x21, 0x08, 0x90, 0xFD, 0x62, -0xE0, 0xFF, 0x12, 0x67, 0x8B, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x22, 0x02, 0xD1, 0x6E, 0x90, 0xFD, -0x60, 0xE0, 0x64, 0x23, 0x70, 0x7B, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x2C, 0x30, 0xE0, 0x05, -0x74, 0x01, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE1, 0x5B, 0x90, 0x93, -0x2D, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x60, 0x7E, 0x08, 0x12, -0x2C, 0x6E, 0x90, 0x93, 0x32, 0x12, 0x1F, 0xC9, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x7F, 0x70, 0x7E, -0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x2E, 0x12, 0x1F, 0xC9, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, -0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x01, 0xBE, 0xE0, 0x04, -0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x2D, 0x30, 0xE2, 0x08, 0xE0, 0x54, 0x1F, 0x44, 0x20, -0xF0, 0x80, 0x06, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0xFF, 0x12, 0x9A, -0x59, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x24, 0x02, 0xD1, 0x96, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x25, -0x13, 0x90, 0xFD, 0x62, 0xE0, 0x60, 0x0D, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, -0x24, 0x74, 0x04, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x26, 0x05, 0x7F, 0x01, 0x12, 0x9A, 0xF5, -0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x30, 0x07, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0xD1, 0xEA, 0x90, 0xFD, -0x68, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, -0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, -0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, 0x93, 0x1C, 0xE0, -0xC3, 0x13, 0x30, 0xE0, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x00, -0x75, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0x74, -0x03, 0xF0, 0x7F, 0x02, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0xE4, 0xF0, 0x90, 0x00, -0x75, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0D, 0xF0, 0x54, -0x0F, 0x44, 0x10, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x7B, 0x01, 0x7A, 0x93, -0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x66, 0x89, 0xAE, -0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x04, 0xF0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, -0x93, 0x6E, 0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, -0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x66, 0x89, 0xAC, 0x07, 0x90, 0x93, 0xD9, 0xE0, -0x44, 0x0F, 0xF0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x93, 0xDB, 0xEC, 0xF0, 0x60, 0x32, 0x90, -0xFD, 0x63, 0xE0, 0x90, 0x93, 0xDC, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0x93, 0xDD, 0xF0, 0x90, -0xFD, 0x64, 0xE0, 0x90, 0x93, 0xDE, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xDF, 0xF0, 0x90, -0xFD, 0x66, 0xE0, 0x90, 0x93, 0xE0, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0xE1, 0xF0, 0x80, -0x11, 0x90, 0x93, 0xDC, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xDB, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, -0x79, 0xD9, 0x02, 0x66, 0x89, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1E, 0xF6, 0x90, -0x93, 0x83, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x1F, 0x0F, 0x90, 0x93, 0x85, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x86, -0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x87, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, -0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x15, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x7F, 0x30, 0x12, -0x96, 0xD8, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0x7D, 0x01, 0xE4, 0x80, 0x07, 0x90, 0x93, 0x83, 0xE0, -0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0xEA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, -0xFD, 0x70, 0x03, 0x02, 0x71, 0x06, 0x90, 0x94, 0x4C, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, -0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x03, -0x02, 0x70, 0xFF, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x43, 0x9C, -0xE0, 0x90, 0x93, 0x79, 0xF0, 0x75, 0x20, 0x01, 0x75, 0x21, 0x93, 0x75, 0x22, 0x79, 0x75, 0x23, -0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7A, 0x12, 0x56, 0xF1, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x94, 0x4C, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, 0x02, 0x90, -0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, -0x02, 0x90, 0x00, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x4C, 0xE0, -0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0x90, 0x94, -0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7E, 0xF0, -0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x7F, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, -0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, -0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, -0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, -0x7B, 0x31, 0x0B, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x90, 0x94, 0x4C, 0xE0, 0xFE, 0x74, 0x01, 0xA8, -0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x94, -0x4C, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, -0xCC, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x02, 0x6F, 0xCC, 0x90, -0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x80, 0x12, 0x43, -0xC8, 0xEF, 0x12, 0x43, 0xD1, 0x71, 0xAF, 0x01, 0x71, 0xA6, 0x02, 0x71, 0xF7, 0x03, 0x72, 0x00, -0x05, 0x72, 0x09, 0x06, 0x73, 0x4B, 0x07, 0x72, 0x11, 0x0B, 0x72, 0x1A, 0x10, 0x72, 0x22, 0x11, -0x72, 0x2A, 0x12, 0x72, 0x32, 0x16, 0x72, 0x3C, 0x17, 0x72, 0x46, 0x18, 0x72, 0x50, 0x19, 0x73, -0x17, 0x1B, 0x73, 0x20, 0x1C, 0x72, 0x59, 0x1D, 0x72, 0x63, 0x1E, 0x72, 0x6E, 0x21, 0x72, 0x77, -0x22, 0x72, 0x80, 0x23, 0x72, 0x89, 0x24, 0x72, 0x92, 0x25, 0x72, 0x9B, 0x26, 0x72, 0xA4, 0x27, -0x72, 0xAD, 0x28, 0x72, 0xB6, 0x29, 0x71, 0xB8, 0x2D, 0x71, 0xC1, 0x2E, 0x72, 0xBF, 0x2F, 0x73, -0x29, 0x30, 0x72, 0xD0, 0x32, 0x72, 0xC7, 0x33, 0x71, 0xD3, 0x34, 0x72, 0xD9, 0x36, 0x72, 0xE2, -0x37, 0x72, 0xEB, 0x38, 0x72, 0xF3, 0x3A, 0x71, 0xCA, 0x3B, 0x72, 0xFC, 0x3E, 0x73, 0x05, 0x3F, -0x73, 0x0E, 0x41, 0x73, 0x32, 0x46, 0x71, 0xDC, 0x47, 0x71, 0xEE, 0x48, 0x71, 0xE5, 0x49, 0x73, -0x3B, 0x4B, 0x00, 0x00, 0x73, 0x44, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8B, 0x7D, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8B, 0x83, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8C, -0x64, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8C, 0xAC, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, -0x02, 0x8C, 0xE5, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0x17, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x02, 0x8D, 0x1D, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0xDD, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0xD0, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0xEE, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0x5F, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x81, -0x1C, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0xAC, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, -0x61, 0x4C, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x61, 0x52, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, -0x61, 0x58, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x01, 0x80, 0x2F, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x7F, 0x02, 0x80, 0x25, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x03, 0x80, 0x1B, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x18, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE4, -0xFF, 0x80, 0x08, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x04, 0x02, 0x8E, 0x36, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x50, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x69, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x82, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x8F, 0x9B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xB4, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x8F, 0xCD, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xE6, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x02, 0x8F, 0xFF, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x18, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0x81, 0x0D, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x40, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x59, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x90, 0x72, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x25, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x61, 0xEB, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x37, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x02, 0x96, 0x63, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0x7C, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0xB7, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0xA4, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0x8B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x99, 0xB9, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x6F, 0x55, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x97, 0x22, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x05, 0x7F, 0x0B, -0x80, 0x10, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0A, 0x7D, 0x01, 0x7F, 0x0D, 0x80, 0x04, 0x7D, 0x03, -0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x41, 0x12, 0x43, 0xC8, 0xE4, -0xFE, 0x90, 0x00, 0xA3, 0xE0, 0x54, 0xF8, 0x44, 0x05, 0xF0, 0x90, 0x00, 0xA0, 0xE0, 0x54, 0x0F, -0x64, 0x04, 0x70, 0x5A, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x49, 0x90, 0xFD, 0x50, 0xEF, 0xF0, -0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0x94, 0x41, 0x12, 0x43, 0xA8, 0x8E, 0x82, -0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, -0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0F, 0x74, 0x52, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0x90, 0xFD, 0x58, 0x74, 0x01, -0xF0, 0xFF, 0x80, 0x12, 0x90, 0x01, 0x43, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, 0x08, 0x90, 0x01, -0x42, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, -0x23, 0x71, 0x62, 0xEF, 0xB4, 0x03, 0x05, 0x7F, 0xFF, 0x12, 0x9A, 0x59, 0x22, 0x12, 0x1E, 0xF6, -0xFF, 0xE9, 0x24, 0x01, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x04, 0x61, 0x62, 0x90, 0x00, 0x04, 0x12, -0x1F, 0x0F, 0xFF, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, -0x90, 0x93, 0x83, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x85, 0x12, -0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x88, -0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, -0x89, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, -0xAD, 0x82, 0xAC, 0x83, 0x90, 0x93, 0x8A, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, -0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0xC8, 0x90, -0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x0F, 0xFF, 0x90, 0x93, -0x8C, 0x12, 0x43, 0xA8, 0xEF, 0x12, 0x42, 0x53, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x8C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0xEF, 0x12, -0x42, 0x65, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, -0x93, 0x8A, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, -0x8D, 0x82, 0x8C, 0x83, 0xA3, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFE, 0x90, 0x93, 0x83, 0xE0, 0xFF, -0x24, 0xC2, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFE, -0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, -0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, 0x75, 0xF0, -0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x8F, 0x57, 0xEF, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, 0x57, 0x75, 0xF0, -0x02, 0xA4, 0x24, 0x02, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, -0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, 0x85, 0x83, 0x5D, -0x8F, 0x5E, 0xE5, 0x57, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0x75, -0x5F, 0x01, 0xF5, 0x60, 0x89, 0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, -0x83, 0xE0, 0x12, 0x43, 0xD1, 0x75, 0xAA, 0x00, 0x75, 0xBF, 0x01, 0x75, 0xD4, 0x02, 0x75, 0xE9, -0x03, 0x76, 0x12, 0x04, 0x76, 0x27, 0x05, 0x76, 0x3C, 0x06, 0x76, 0x62, 0x0C, 0x76, 0x8F, 0x0D, -0x76, 0xBC, 0x0E, 0x76, 0xE9, 0x0F, 0x00, 0x00, 0x77, 0x1D, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, -0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, -0x74, 0x10, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, -0xE1, 0x1D, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, -0x0F, 0xF0, 0xA3, 0x74, 0xF5, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xE1, 0x1D, 0x90, 0x04, 0x47, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, -0x04, 0x46, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, -0x04, 0x45, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, 0xE1, 0x14, 0x90, -0x04, 0x4B, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4A, 0xE0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x49, 0xE0, -0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x59, 0x82, -0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, -0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, -0xF0, 0x90, 0x04, 0x50, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, -0x60, 0xA9, 0x61, 0x12, 0x1E, 0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, -0xAB, 0x5A, 0xE5, 0x5C, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, -0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, 0x82, 0x85, 0x58, -0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xE0, 0xFE, 0xEF, -0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xC0, 0x83, 0xC0, -0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, -0xD0, 0x83, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x4C, 0x90, 0x93, 0x8F, 0x74, 0x0B, 0xF0, 0x90, 0x93, 0x8F, -0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x78, 0x63, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, -0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, -0x0A, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x8F, 0xE0, 0x14, -0xF0, 0x80, 0xBA, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x47, 0x90, 0x93, 0x8F, 0x74, 0x0F, 0xF0, 0x90, 0x93, 0x8F, -0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, -0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, -0x8F, 0xE0, 0xA3, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0x8F, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, -0x93, 0x90, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, 0x8F, 0xE0, -0xFF, 0xC3, 0x94, 0x10, 0x40, 0x02, 0x21, 0x1C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, -0x93, 0x8F, 0xE0, 0x80, 0x63, 0x90, 0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x57, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, -0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, -0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, -0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, -0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0x90, 0x93, 0x90, 0xE0, -0xFF, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, 0x90, 0x93, -0x91, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xEE, 0xF0, -0xE5, 0x57, 0xC3, 0x94, 0x20, 0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, -0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, -0x34, 0x04, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x91, 0xE0, 0xA3, 0xF0, 0x80, -0x37, 0x80, 0x2D, 0x74, 0x27, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, -0x90, 0x93, 0x90, 0xE0, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x92, 0xEE, 0xF0, 0x80, -0x17, 0x90, 0x93, 0x91, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, 0x80, 0x08, -0x90, 0x93, 0x90, 0xE0, 0x90, 0x93, 0x92, 0xF0, 0x90, 0x93, 0x92, 0xE0, 0xFD, 0xAF, 0x57, 0x31, -0xF4, 0x90, 0x93, 0x92, 0xE0, 0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, -0x83, 0xEF, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x8A, 0x83, -0x74, 0x03, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x02, 0xF0, -0x22, 0xEF, 0xD3, 0x94, 0x03, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, -0x8A, 0x83, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, 0x20, 0x50, -0x0E, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, 0x29, 0x74, -0x27, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0xCC, 0xEF, 0xF0, -0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0xCD, 0xF0, 0x7B, 0x01, -0x7A, 0x93, 0x79, 0xCC, 0x7D, 0x02, 0x71, 0xB9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, -0x53, 0xE5, 0x53, 0x54, 0x1F, 0x90, 0x93, 0x5F, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x88, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x60, 0x74, 0x01, 0xF0, 0xEB, 0xC3, -0x94, 0x01, 0x40, 0x02, 0x80, 0x3B, 0x90, 0x93, 0x5D, 0xE0, 0x25, 0x55, 0xFF, 0xA3, 0xF0, 0xA3, -0xE0, 0x90, 0x41, 0xA4, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x13, 0x74, 0x01, 0x25, 0x52, 0xF5, -0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x21, 0xF4, 0x90, 0x93, -0x5E, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEF, 0xF0, -0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x62, 0xF0, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, -0x93, 0x61, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, -0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x5D, -0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, -0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFF, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, -0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x0D, -0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, 0x93, 0x62, -0xE0, 0xFF, 0x90, 0x93, 0x61, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, 0x61, 0xE0, -0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, -0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, -0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, -0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, -0x90, 0x93, 0x61, 0xE0, 0xFD, 0x31, 0xF4, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, -0x12, 0x90, 0x04, 0x30, 0xE0, 0x70, 0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0x04, -0xCF, 0x04, 0xF0, 0x90, 0x93, 0x61, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x94, 0x22, 0x12, 0x43, 0xC8, 0x90, 0x94, 0x25, 0xE0, 0x54, 0xF0, 0x44, 0x06, 0xFF, 0xF0, -0xED, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x94, 0x22, 0x12, -0x43, 0xA8, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x25, 0x12, 0x66, -0x89, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, -0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x80, -0x11, 0x74, 0x27, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, -0x88, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x8B, 0xF0, 0x75, 0xF0, 0x09, -0xEC, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x8D, 0xF0, 0x75, 0xF0, 0x09, 0xEC, -0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x8E, 0xF0, 0xEC, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8F, 0xCB, -0xF0, 0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, -0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x91, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, 0xC6, 0x2C, 0xF5, -0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, 0x90, 0x93, 0x8E, -0xE0, 0x90, 0x93, 0x8B, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0xED, 0x70, 0x02, 0xA1, 0x70, 0x90, 0x93, -0x8C, 0xED, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x8B, 0xE0, 0x90, 0x93, -0x88, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x14, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x70, 0x02, 0xA1, 0x70, -0x90, 0x93, 0x8B, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0xA1, 0x70, 0xE4, 0x90, 0x93, 0x8A, -0xF0, 0xEF, 0x14, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0xFD, 0x90, 0x93, 0x89, 0xE0, -0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, 0xFF, 0x74, 0x01, -0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, -0x93, 0x91, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x89, 0xE0, 0xFF, -0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8F, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, -0x60, 0x1A, 0x90, 0x93, 0x89, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, -0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0x6F, 0x60, 0x08, 0x90, 0x93, 0x89, 0xE0, -0x14, 0xF0, 0x80, 0x83, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xC3, 0x9F, 0x50, -0x0F, 0x90, 0x93, 0x89, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x93, 0x8D, 0xE0, 0x90, 0x93, 0x88, 0xF0, -0x90, 0x93, 0x88, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, -0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, -0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, -0xFF, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x93, 0x88, 0xE0, 0xFD, 0x31, 0xF4, 0x90, 0x93, 0x88, 0xE0, 0xFF, -0x22, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, 0xF0, 0xFD, -0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x0F, -0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, -0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x4D, 0xF0, -0x22, 0xAD, 0x07, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x88, -0xE0, 0xF9, 0x54, 0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, -0xE0, 0xFF, 0x90, 0x93, 0x8B, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, -0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8C, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xED, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, -0x8E, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, 0x25, 0xE0, 0x24, 0x34, 0xF5, -0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, 0x25, 0xE0, -0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xEE, 0xC3, -0x9F, 0x40, 0x02, 0xE1, 0x5E, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, 0x8B, 0xE0, -0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xE1, 0x98, 0xEE, 0xC3, 0x94, 0x10, -0x40, 0x21, 0xEE, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, -0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8C, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, -0x4E, 0x70, 0x27, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, 0x74, 0x01, 0x7E, -0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, -0x8E, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x8A, 0xE0, 0xB4, 0x11, -0x0D, 0x90, 0x93, 0x8D, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x93, 0x8A, 0x74, 0x17, 0xF0, 0x90, 0x93, -0x8A, 0xE0, 0xFF, 0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, 0x8C, 0xE0, 0x30, -0xE0, 0x06, 0x90, 0x93, 0x8A, 0x74, 0x18, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x90, 0x93, 0x89, 0xF0, -0x90, 0x93, 0x88, 0xF0, 0x80, 0x42, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, 0xC1, 0xBC, 0x90, 0x93, -0x8B, 0xE0, 0xFC, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, -0x9C, 0xE0, 0xB4, 0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x89, 0xE0, 0x44, 0x40, 0x90, -0x93, 0x88, 0xF0, 0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x25, 0xE0, 0x24, -0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, -0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, -0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, -0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, 0x93, 0x89, 0xE0, -0xD3, 0x9C, 0x40, 0x5E, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x89, 0xEF, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0xFC, 0xA3, -0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, -0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, -0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, -0x04, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, -0x90, 0x93, 0x88, 0xE0, 0x44, 0x80, 0xFD, 0x12, 0x79, 0xF4, 0x90, 0x93, 0x88, 0xE0, 0x44, 0x80, -0xFF, 0x22, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, -0x03, 0x02, 0x88, 0x64, 0xEF, 0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, 0x90, 0x89, -0x01, 0xE0, 0xFF, 0x90, 0x8F, 0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, -0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, -0x88, 0x5B, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, -0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x88, 0x5B, 0x90, 0x93, 0x78, -0xE0, 0x94, 0x20, 0x40, 0x09, 0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x88, 0x64, 0x90, 0x93, -0x78, 0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, 0x5A, 0x01, -0xF5, 0x5B, 0x89, 0x5C, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, -0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x93, 0x7D, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0, -0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7F, -0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, -0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x79, 0xF0, -0x80, 0x14, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, -0x54, 0x3F, 0x90, 0x93, 0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, 0xF0, 0x90, -0x93, 0x78, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x82, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, -0x40, 0x02, 0x61, 0xF9, 0x90, 0x93, 0x82, 0xE0, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0x9F, 0x40, 0x13, -0x90, 0x93, 0x82, 0xE0, 0x90, 0x93, 0x7A, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, 0x93, 0x79, 0xF0, -0xEF, 0x4E, 0xF0, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0x90, 0x41, 0x18, 0x93, 0xFE, 0x90, 0x93, 0x78, -0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, -0x90, 0x40, 0xE0, 0x80, 0x07, 0x90, 0x93, 0x7A, 0xE0, 0x90, 0x40, 0xFC, 0x93, 0x90, 0x93, 0x81, -0xF0, 0x90, 0x93, 0x81, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x56, 0xF9, 0x74, 0x40, 0x35, 0xF0, -0xFA, 0x7B, 0xFF, 0x8B, 0x57, 0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x78, 0xE0, 0x25, 0xE0, 0x24, -0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7B, 0xCF, -0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, -0x12, 0x42, 0x9D, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, -0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, -0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, -0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, -0xA9, 0x59, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, -0x5C, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, -0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x03, 0x12, -0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x06, 0x12, 0x42, -0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, -0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, -0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, -0x90, 0x00, 0x05, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, 0xE0, 0xFC, 0xA3, 0xE0, -0xFD, 0x12, 0x1F, 0x3C, 0xD3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x40, -0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0xF0, 0x80, 0x07, 0xE4, 0x90, 0x93, -0x7B, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x78, 0xE0, -0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, -0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, 0x61, 0xC8, 0x90, -0x93, 0x78, 0xE0, 0xFF, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0x74, -0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, 0x40, 0x03, 0xEF, -0x80, 0x1C, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0xFE, 0x74, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x90, -0x93, 0x83, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, 0x23, 0x90, 0x93, -0x78, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x01, -0x40, 0x0F, 0x74, 0xC6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x14, 0xF0, 0x80, -0x0F, 0x90, 0x93, 0x78, 0xE0, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, -0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x60, -0x02, 0xE1, 0x09, 0x12, 0x7E, 0x01, 0xE1, 0x09, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x6C, -0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC3, 0x90, -0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x40, 0x02, 0xE1, 0x09, 0x90, 0x93, 0x78, -0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x7B, 0xF6, 0xE1, 0x09, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xA1, 0xD7, 0x90, -0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x19, 0x40, 0x3D, -0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x11, 0x40, 0x2E, 0x80, -0x1F, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x0A, -0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x0D, -0x90, 0x8E, 0xC5, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, 0x90, 0x93, 0x78, -0xE0, 0xFE, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x87, 0xF0, -0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30, 0x50, -0x0A, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x74, 0x67, 0x2F, 0xA1, 0x82, 0x90, 0x8E, 0xC5, 0xE0, 0x64, -0x01, 0x60, 0x02, 0xA1, 0x77, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xEE, 0x24, 0x05, 0xFB, -0xE4, 0x33, 0xFA, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, -0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x78, 0xE0, 0xFE, 0xEF, -0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, 0x93, 0x78, 0xE0, -0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0x6F, -0x60, 0x56, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, -0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x93, 0x87, 0x74, 0x05, 0xF0, 0x80, 0x11, 0xEF, 0xD3, -0x94, 0x39, 0x90, 0x93, 0x87, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, -0x93, 0x78, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, -0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x24, -0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x80, 0x2F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, 0xF5, -0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x90, 0x93, 0x78, 0xE0, -0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7A, 0xE0, 0xFE, -0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEE, 0xF0, -0x90, 0x93, 0x87, 0xE0, 0xFE, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xEE, -0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x11, 0xE4, -0x90, 0x93, 0x87, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, -0x90, 0x93, 0x87, 0xE0, 0xFD, 0xE1, 0x06, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xE1, 0x09, 0x90, 0x93, -0x7B, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xE1, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, 0xE0, 0xFC, -0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x85, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, -0x78, 0xE0, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x87, 0xF0, -0xE4, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0xD3, 0x94, 0x04, 0x50, 0x47, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, -0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xDC, 0x93, 0xFF, 0x7E, 0x00, 0x12, 0x1F, 0x3C, -0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x85, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0xD3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x50, 0x08, 0x90, 0x93, -0x84, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x93, 0x84, 0xE0, 0xC3, 0x13, 0xF0, 0x90, 0x93, 0x87, -0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x93, 0x84, 0xE0, 0x70, 0x5D, 0x90, 0x93, 0x87, 0x04, 0xF0, -0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x87, -0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x87, 0x74, 0x01, 0xF0, 0x80, -0x3C, 0x80, 0x35, 0x90, 0x93, 0x87, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, 0x84, 0xE0, 0xFF, -0x70, 0x08, 0x90, 0x93, 0x87, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, 0x87, 0xB4, 0x01, -0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x80, 0xE0, 0x94, 0x03, -0x90, 0x93, 0x7F, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0xD3, 0x90, 0x93, -0x80, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x7F, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x87, -0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFD, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC4, 0xF5, 0x82, 0xE4, -0x34, 0x8C, 0xF5, 0x83, 0xED, 0xF0, 0x12, 0x7D, 0xC1, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, 0x74, 0x67, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x78, 0xE0, -0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7F, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, 0x93, 0x78, 0xE0, -0xFD, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, -0xD3, 0x9F, 0xEA, 0x9E, 0x50, 0x1C, 0x90, 0x93, 0x7F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, -0x80, 0x14, 0x90, 0x93, 0x78, 0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, -0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x84, 0xF5, -0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, 0xFF, 0x9D, 0xFB, -0x74, 0xFF, 0x9C, 0xFA, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x78, 0xE0, 0x50, 0x13, 0x25, 0xE0, -0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, 0x42, 0x87, 0x80, -0x10, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, -0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x04, 0xE4, -0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, -0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, -0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, -0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, -0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, -0xF0, 0x02, 0x80, 0x67, 0x22, 0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0xF0, 0xF0, 0xA3, -0x74, 0x0F, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, -0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE4, 0xF0, -0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, 0x90, 0x89, 0x01, -0x04, 0xF0, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, -0x02, 0x41, 0x5E, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, -0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, -0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, -0x84, 0x08, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE4, 0xF0, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x07, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0xE4, 0xF0, 0x90, 0x8E, 0x04, 0xF0, 0x90, 0x41, 0x92, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x90, -0x41, 0x5A, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, -0x90, 0x93, 0x78, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, -0x01, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x74, -0xC2, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, 0x75, 0xF0, 0x09, 0xED, -0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, -0x8A, 0x84, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, -0x8A, 0x88, 0x12, 0x43, 0x9C, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x89, 0x12, -0x43, 0x9C, 0xE4, 0xF0, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x01, 0xA7, 0x22, 0x12, -0x1E, 0xF6, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x74, -0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, 0x40, 0x0A, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, -0x0F, 0xFF, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFD, 0xAF, -0x06, 0x02, 0x74, 0x30, 0x12, 0x1E, 0xF6, 0x90, 0x89, 0x01, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, -0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, 0x94, 0x40, 0x40, 0x02, -0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x83, 0xF0, 0xEE, 0xA3, -0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, -0xE0, 0x90, 0x93, 0x85, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xEC, -0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, -0x93, 0x89, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x8B, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xEC, 0xF0, -0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, -0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x02, 0x67, 0xB2, 0x12, 0x1E, 0xF6, -0xF5, 0x62, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, -0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x59, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, -0x90, 0x93, 0x3C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x01, 0x90, 0x93, 0x3D, -0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, -0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x44, 0xF0, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, -0x93, 0x4A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, 0x01, 0x90, 0x93, 0x46, -0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, -0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x49, 0xF0, 0xE0, 0x70, 0x38, 0x90, 0x93, 0x47, -0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, -0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, -0x03, 0x00, 0x90, 0x93, 0x86, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, -0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x3D, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x12, 0x4D, 0xC1, 0x90, 0x93, 0x59, 0xE0, 0x90, 0x01, 0xE6, 0xF0, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, 0xE0, 0x25, 0x12, 0x1E, -0xF6, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x4B, 0xF0, 0xEF, -0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x45, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, -0x50, 0xF0, 0x22, 0x90, 0x93, 0x48, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4B, 0x74, 0x05, 0xF0, 0x90, -0x93, 0x45, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x50, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x30, -0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, -0xFF, 0x90, 0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x4F, 0x74, 0x05, -0xF0, 0x90, 0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xA3, 0xE0, -0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x4C, 0xF0, 0x60, 0x20, 0x90, 0x93, -0x15, 0xE0, 0x20, 0xE0, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x3D, 0xE0, -0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x51, 0x69, 0x90, 0x93, -0x4C, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x02, 0x43, 0xC8, 0x12, 0x1E, 0xF6, -0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xFF, -0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x70, 0xFF, 0x90, 0x93, 0x36, 0xE0, 0x54, -0x8F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x00, 0x03, -0x12, 0x1F, 0x0F, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x3A, -0xF0, 0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, -0xD3, 0x94, 0x20, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x01, 0xF0, 0x80, 0x57, 0xEF, 0xD3, 0x94, -0x40, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x02, 0xF0, 0x80, 0x49, 0xEF, 0xD3, 0x94, 0x60, 0x50, -0x08, 0x90, 0x93, 0x37, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, -0x93, 0x37, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, 0x94, 0xA0, 0x50, 0x08, 0x90, 0x93, 0x37, -0x74, 0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x06, -0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, 0x37, 0x50, 0x05, 0x74, 0x07, 0xF0, 0x80, -0x03, 0x74, 0x08, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x90, 0x93, 0x3B, 0xF0, 0x22, 0x12, 0x1E, 0xF6, -0x60, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x02, -0x09, 0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, 0xA8, 0xF0, 0x90, -0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xA9, 0xF0, 0x90, 0x00, 0x02, 0x12, -0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAA, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, -0xED, 0x2F, 0x90, 0x93, 0xAB, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xAE, 0x05, 0xED, -0x2F, 0x90, 0x93, 0xAC, 0xF0, 0x22, 0xEF, 0x70, 0x21, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x14, 0x90, -0x00, 0x40, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x01, -0xF0, 0x80, 0x07, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x6A, 0x12, -0x1E, 0xF6, 0x90, 0x00, 0x01, 0x30, 0xE0, 0x2E, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC0, 0xF0, 0x90, -0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, -0x06, 0xC2, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC3, 0xF0, 0x90, 0x06, 0xCC, -0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x2C, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC5, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC6, -0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, -0x01, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x02, 0xF0, 0xEF, 0xB4, 0x02, 0x11, 0x12, 0x1E, 0xF6, -0x90, 0x06, 0xC8, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC9, 0xF0, 0xEF, 0xB4, -0x03, 0x11, 0x12, 0x1E, 0xF6, 0x90, 0x06, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0x06, 0xCB, 0xF0, 0xEF, 0x64, 0x04, 0x70, 0x1F, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x07, 0x83, 0x30, -0xE0, 0x06, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0x6F, 0xF0, 0xEF, 0x30, 0xE1, 0x07, -0x90, 0x07, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0x90, 0x92, 0x6B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0x90, 0x92, 0x6C, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6D, 0xF0, 0x90, -0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x73, 0x5E, 0xEF, 0xB4, 0x02, 0x03, 0x43, 0x14, 0x01, 0x22, -0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, -0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x17, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, -0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x18, 0x02, -0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x19, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, -0x1A, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, -0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1B, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, -0x01, 0x7F, 0x1C, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, -0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x1D, 0x02, 0x73, 0x62, 0x90, -0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, -0xA8, 0x7D, 0x01, 0x7F, 0x1E, 0x02, 0x73, 0x62, 0x12, 0x1E, 0xF6, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, -0x78, 0x18, 0x12, 0x1F, 0xB6, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0x0B, -0x12, 0x43, 0x84, 0xEC, 0x54, 0x03, 0xFC, 0x12, 0x43, 0x59, 0x90, 0x93, 0x07, 0x02, 0x1F, 0xC9, -0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, -0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1F, 0x02, 0x73, 0x62, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, -0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x20, 0x02, -0x73, 0x62, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xBC, 0xF0, 0xEF, 0x30, 0xE0, 0x5C, -0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x4E, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x52, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, -0x0F, 0x90, 0xFD, 0x53, 0xF0, 0xA3, 0xE4, 0xF0, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x90, 0xFD, 0x55, -0x30, 0xE0, 0x05, 0x74, 0xA0, 0xF0, 0x80, 0x03, 0x74, 0xC0, 0xF0, 0x90, 0xFD, 0x56, 0x74, 0x10, -0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, -0xFD, 0x58, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x00, 0x02, 0x12, -0x1F, 0x0F, 0xFE, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, -0xFE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFC, 0x74, 0x20, 0x2F, 0xFF, 0xE4, 0x3E, -0xFE, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0xEE, 0xF9, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x02, 0xF0, 0x90, -0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xEC, 0xC3, 0x99, 0x50, 0x43, 0xEC, 0x70, -0x04, 0x7D, 0x04, 0x80, 0x02, 0xE4, 0xFD, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x07, 0xAF, 0x05, 0x31, -0x79, 0x0D, 0x80, 0xF3, 0x0C, 0x90, 0xFD, 0x10, 0xE0, 0x04, 0xF0, 0xEC, 0xB5, 0x01, 0xDA, 0xE4, -0xFD, 0xED, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0xC3, 0xEF, 0x9B, 0x74, -0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x07, 0xAF, 0x05, 0x31, 0x79, 0x0D, 0x80, 0xE3, 0x0C, 0x80, -0xB8, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x81, 0x12, 0x54, 0x0A, 0x90, 0x01, 0xBD, -0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, 0x08, -0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0xF1, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, -0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x51, 0xF0, 0xEF, 0x75, -0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x52, -0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x90, 0xFD, 0x53, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x54, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, -0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x55, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, -0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x56, 0xF0, 0xEF, 0x75, 0xF0, -0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x57, 0xF0, -0xA3, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0xFE, 0x10, 0x60, 0x05, 0xE0, 0x44, 0x01, -0xF0, 0x22, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, -0x87, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, -0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, -0x54, 0x04, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xE0, -0x54, 0xEF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, -0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFC, -0x54, 0x80, 0xFF, 0x90, 0x93, 0x15, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, -0x0F, 0xFD, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xED, 0x54, 0x02, -0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFD, 0x54, 0x04, 0xFF, -0x90, 0x93, 0x18, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x18, 0xE0, 0x54, -0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, -0x1F, 0x0F, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x04, -0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, -0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, -0x80, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xE0, 0x54, -0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x19, -0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0xEC, 0x20, -0xE0, 0x02, 0x81, 0xB1, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x93, -0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, -0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x16, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, -0x17, 0xF0, 0x80, 0x4E, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, -0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x93, 0x16, 0x50, 0x05, 0x74, -0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x16, 0x74, 0x2A, 0xF0, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x93, -0x17, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x17, 0x74, -0x2A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3D, 0x90, 0x93, -0x16, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x1E, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, -0x93, 0x17, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x20, 0xF0, 0x90, 0x93, 0x16, 0xE0, 0xC3, -0x13, 0x90, 0x93, 0x21, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x22, 0xF0, 0x90, -0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, 0xE4, 0x90, 0x93, 0x11, 0xF0, -0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xC4, 0x13, 0x13, 0x54, -0x03, 0x20, 0xE0, 0x14, 0x12, 0x1E, 0xF6, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, -0x01, 0x80, 0x02, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, -0xE0, 0x18, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x75, 0x64, 0x04, -0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, -0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x80, 0x2B, 0x90, -0x93, 0x1D, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x80, 0x1C, 0x90, 0x93, -0x1D, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x93, 0x27, 0x74, 0x02, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0x1D, -0xE0, 0xB4, 0x07, 0x06, 0x90, 0x93, 0x27, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x80, -0x64, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, -0x90, 0x93, 0x83, 0x30, 0xE0, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, 0x07, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0xB1, 0x4D, 0x90, 0x00, 0x40, 0x74, 0x20, 0xF0, 0x90, 0x93, -0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, -0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0x83, 0x12, 0x55, 0x67, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, -0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0x93, 0x26, -0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0x93, -0x04, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x55, 0xB2, 0x90, 0x93, 0x04, 0xE0, -0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x5E, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x15, -0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x93, 0x26, -0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, -0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, -0x18, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xEF, -0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, -0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, 0x28, 0x74, 0x02, 0xF0, -0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, -0xA3, 0xF0, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x93, -0x23, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x29, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFD, -0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, -0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x22, -0x90, 0x93, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, -0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, 0x1F, 0xD5, 0x20, 0x08, 0x30, 0x70, 0x90, 0x93, 0x0B, -0x12, 0x1F, 0xD5, 0xC0, 0x08, 0x30, 0x70, 0xE4, 0x90, 0x93, 0x11, 0xF0, 0xA3, 0xF0, 0x43, 0xE8, -0x04, 0x90, 0xFD, 0x68, 0x74, 0x02, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x07, -0x83, 0xE4, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x04, 0x64, 0xE4, 0xF0, 0x90, 0x00, -0x40, 0x74, 0x20, 0xF0, 0xB1, 0x4D, 0x90, 0x93, 0x2C, 0x74, 0x01, 0xF0, 0x7D, 0x04, 0x7F, 0x02, -0x02, 0x3A, 0xAD, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, -0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x24, 0x02, 0x73, 0x62, 0x12, 0x1E, 0xF6, 0xFF, -0x54, 0x01, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, -0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, -0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, -0x1F, 0x0F, 0x90, 0x93, 0x1B, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x26, 0x02, 0x73, 0x62, -0x12, 0x1E, 0xF6, 0x90, 0x93, 0xB0, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0x8A, 0x12, 0x43, 0xC8, 0xE4, 0xFE, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x2F, 0x90, 0xFD, -0x50, 0xEF, 0xF0, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x8E, -0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, -0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xAE, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0x93, 0xAF, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x46, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, -0xC0, 0x60, 0x43, 0xC3, 0x90, 0x94, 0x47, 0xE0, 0x94, 0x88, 0x90, 0x94, 0x46, 0xE0, 0x94, 0x13, -0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x46, 0xE4, -0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x94, -0x47, 0xE0, 0x94, 0x64, 0x90, 0x94, 0x46, 0xE0, 0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, -0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0x90, 0x93, 0xE2, 0x12, 0x1F, 0xC9, 0x90, -0x93, 0xE6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, -0x93, 0xE6, 0x12, 0x43, 0x90, 0xD3, 0x12, 0x43, 0x73, 0x50, 0x41, 0x90, 0x93, 0xE6, 0x12, 0x43, -0x84, 0xA9, 0x07, 0x90, 0x93, 0xE2, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, -0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x7B, 0x01, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, -0x1B, 0x90, 0x93, 0xE6, 0x12, 0x43, 0x84, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, -0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0xE6, 0x12, 0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xE6, 0x02, -0x43, 0x84, 0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, -0xB8, 0x12, 0x43, 0x90, 0xC3, 0x12, 0x43, 0x73, 0x90, 0x93, 0xB4, 0x60, 0x68, 0x12, 0x43, 0x84, -0x12, 0x2C, 0x6E, 0x90, 0x93, 0xC0, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x84, 0x12, -0x97, 0x89, 0x90, 0x93, 0xC4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x84, 0x12, 0x43, -0x66, 0x90, 0x93, 0xC0, 0x12, 0x43, 0x90, 0x12, 0x43, 0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, -0xC0, 0x07, 0x90, 0x93, 0xC4, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xBC, 0x12, 0x43, 0x84, -0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, -0x90, 0x93, 0xC8, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, -0x90, 0x93, 0xC8, 0x80, 0x0A, 0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xBC, 0x12, -0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xEA, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, -0x90, 0x93, 0xEE, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, -0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, -0x74, 0x03, 0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x14, 0x12, 0x51, 0xBB, 0xBF, 0x01, 0x0B, 0x90, -0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x2D, -0xE0, 0x20, 0xE0, 0x24, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x1E, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, -0x93, 0x5B, 0xE0, 0x60, 0x13, 0x90, 0x93, 0xEE, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7B, -0x01, 0x7A, 0x93, 0x79, 0xEE, 0x12, 0x55, 0x67, 0x12, 0x54, 0x4B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x4E, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, -0x47, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, -0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x52, 0x90, 0x94, 0x4E, 0xE0, 0xFD, 0x74, 0x01, -0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, -0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, -0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4C, 0x90, 0x94, 0x4E, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, -0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, -0x62, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x52, 0x90, 0x94, 0x4E, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, -0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, -0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, -0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x12, -0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x94, 0x3E, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xE0, 0x30, 0xE0, -0x03, 0x12, 0x44, 0xFE, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x30, -0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x94, 0x3F, 0xF0, 0x22, 0x90, 0x93, 0x6C, -0xE0, 0x54, 0xF0, 0x44, 0x0A, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x90, 0xFD, -0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, -0x64, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, -0x60, 0xE0, 0x90, 0x93, 0x6C, 0x30, 0xE6, 0x08, 0xE0, 0x54, 0x0F, 0x44, 0x50, 0xF0, 0x80, 0x16, -0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0x73, 0xF0, 0x90, 0xFD, -0x67, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, -0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x66, 0x89, 0xAD, 0x07, 0x90, 0x93, 0xFA, 0xE0, 0x54, -0xF0, 0x44, 0x0C, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0xFC, 0xF0, 0x90, -0xFD, 0x63, 0xE0, 0x90, 0x93, 0xFD, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0xFE, 0xF0, 0x90, -0xFD, 0x65, 0xE0, 0x90, 0x93, 0xFF, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x94, 0x00, 0xF0, 0x90, -0xFD, 0x67, 0xE0, 0x90, 0x94, 0x01, 0xF0, 0xED, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0xFA, 0xE0, 0x54, -0x0F, 0x44, 0x20, 0xF0, 0x80, 0x3C, 0xED, 0xB4, 0x04, 0x0B, 0x90, 0x93, 0xFA, 0xE0, 0x54, 0x0F, -0x44, 0x60, 0xF0, 0x80, 0x2D, 0xED, 0xF4, 0x70, 0x29, 0x90, 0x93, 0xFA, 0xE0, 0x54, 0x0F, 0x44, -0x60, 0xF0, 0x90, 0x93, 0x2C, 0xE0, 0x60, 0x08, 0x90, 0x93, 0xFC, 0x74, 0x01, 0xF0, 0x80, 0x05, -0xE4, 0x90, 0x93, 0xFC, 0xF0, 0xE4, 0x90, 0x93, 0xFD, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xFC, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, -0x79, 0xFA, 0x02, 0x66, 0x89, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0E, 0xF0, -0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, -0x93, 0x70, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, -0x93, 0x72, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0x73, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, -0x93, 0x74, 0xF0, 0xED, 0xB4, 0x01, 0x11, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, -0x90, 0x93, 0x6E, 0x74, 0x01, 0xF0, 0x80, 0x13, 0xED, 0xB4, 0x02, 0x0F, 0x90, 0x93, 0x6C, 0xE0, -0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x93, 0x6E, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x6C, 0xE0, 0xFF, -0xC4, 0x54, 0x0F, 0x60, 0x13, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, -0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x12, 0x66, 0x89, 0x22, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x27, 0x90, -0x93, 0x4A, 0xE0, 0x70, 0x21, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, -0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x44, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, -0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x20, 0xE0, 0x02, 0xA1, 0x4F, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x01, 0x70, 0x39, 0x90, 0x06, 0x92, -0xE0, 0x20, 0xE2, 0x06, 0x90, 0x94, 0x4B, 0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, -0x90, 0x93, 0x29, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x4B, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFF, -0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0x3A, 0xE4, 0x90, 0x93, 0x1D, 0xF0, -0x90, 0x93, 0x27, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x04, 0x70, 0x3A, 0x90, 0x06, -0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x94, 0x4B, 0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, -0xF0, 0x90, 0x93, 0x29, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x4B, 0xF0, 0x90, 0x93, 0x20, 0xE0, -0xFF, 0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0x3A, 0xE4, 0x90, 0x93, 0x1D, -0xF0, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x06, 0x60, 0x02, -0x81, 0xFE, 0x90, 0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, -0x90, 0x93, 0x27, 0x30, 0xE0, 0x4E, 0xA1, 0x4C, 0x90, 0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, -0x30, 0xE0, 0x45, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, -0x0F, 0x30, 0xE0, 0x02, 0xA1, 0x0D, 0x90, 0x93, 0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, -0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, -0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x90, 0x93, 0x27, -0x40, 0x02, 0xA1, 0x4C, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, -0x12, 0x4E, 0x27, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, -0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, -0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, -0x12, 0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, -0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x58, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, -0x1D, 0xE0, 0x64, 0x07, 0x70, 0x49, 0x90, 0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0x93, 0x27, -0x80, 0x3A, 0x90, 0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x27, 0x80, 0x23, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, -0x01, 0x12, 0x4E, 0x27, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, -0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x22, -0xEF, 0x64, 0x01, 0x70, 0x3C, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, -0x07, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x22, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, -0xE0, 0x0D, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x24, 0x80, 0x0E, 0x90, -0x93, 0x18, 0xE0, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x02, 0x80, 0x14, 0x74, 0x09, 0xF0, -0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, -0x04, 0x74, 0x03, 0xF0, 0x22, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, -0x15, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x4B, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x30, 0xE0, 0x2A, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x21, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, -0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x1D, 0x74, -0x01, 0xF0, 0xE4, 0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, -0x90, 0x93, 0x5D, 0xE0, 0xFF, 0x90, 0x93, 0x16, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, -0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x63, -0x74, 0x05, 0xF0, 0x90, 0x93, 0x26, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, -0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x15, 0xE0, -0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, -0x30, 0xE0, 0x03, 0x12, 0x51, 0x48, 0xE4, 0x90, 0x94, 0x4B, 0xF0, 0x22, 0x85, 0xD2, -}; - - - -u8 Rtl8723UFwUMCBCutImgArrayWithBT[Rtl8723UUMCBCutImgArrayWithBTLength] = { -0x02, 0x23, 0x02, 0x00, 0x21, 0x00, 0x00, 0x00, 0x03, 0x28, 0x14, 0x04, 0x16, 0x5E, 0x01, 0x00, -0x73, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4A, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x61, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x67, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0x82, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x6B, 0xB8, 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, -0x00, 0x04, 0x06, 0x05, 0x04, 0x02, 0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, -0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, -0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, 0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, -0x00, 0x18, 0x22, 0x21, 0x20, 0x18, 0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, -0x20, 0x08, 0x00, 0x20, 0x22, 0x21, 0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, -0x22, 0x20, 0x18, 0x08, 0x00, 0x20, 0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, -0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, -0x10, 0x00, 0x00, 0x30, 0x31, 0x20, 0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, -0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, -0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, -0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, -0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, 0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, -0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, -0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, -0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, -0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, -0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, -0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, -0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, -0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, -0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, -0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, -0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, -0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, -0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, -0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, -0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, -0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, -0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, -0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, -0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, -0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, -0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, -0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, -0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, -0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, -0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, -0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, -0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, -0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, -0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, -0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, -0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, -0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, -0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, -0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, -0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, -0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, -0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, -0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, -0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, -0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, -0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, -0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, -0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, -0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0xFB, 0x90, 0x93, 0x63, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, -0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xF0, 0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0xF0, -0x0B, 0x90, 0x93, 0x40, 0xF0, 0x04, 0x70, 0x03, 0x02, 0x44, 0xF0, 0x43, 0x66, 0x10, 0x90, 0x93, -0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0xE0, 0x54, 0x0F, 0xFF, 0x90, -0x93, 0x58, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0xF5, 0x49, -0xE4, 0x1B, 0x80, 0x56, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, -0x58, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x04, 0x2F, 0xF5, -0x49, 0xE4, 0xFB, 0x80, 0x35, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x13, -0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, -0xFB, 0x80, 0x17, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, -0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, -0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, -0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x12, 0x9B, 0x40, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x22, 0xE4, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x41, 0xF0, 0xF5, 0x66, 0x22, 0x22, 0xE4, 0xFF, -0x02, 0x4E, 0x27, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0xFB, 0x90, 0x93, 0x5D, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x62, 0x64, 0x01, -0x60, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x65, 0x14, 0x60, 0x2B, 0x24, 0xFD, 0x60, 0x27, 0x24, 0x02, -0x24, 0xFB, 0x50, 0x02, 0x80, 0x21, 0x90, 0x93, 0x40, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, -0xE0, 0x60, 0x14, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x08, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, -0xF0, 0x7B, 0x01, 0x80, 0x02, 0x7B, 0x01, 0xEB, 0x70, 0x03, 0x02, 0x46, 0x78, 0x43, 0x66, 0x10, -0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, 0xE0, 0x54, 0x0F, -0xFF, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0x80, -0x2D, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, -0xFE, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x08, -0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3A, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0x80, -0x2D, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, -0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, -0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, -0xE5, 0x63, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x93, 0x13, 0xE0, 0xFF, 0x90, 0x93, 0x58, 0xE0, 0xD3, -0x9F, 0x40, 0x08, 0x90, 0x93, 0x14, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0x14, 0xF0, -0x90, 0x93, 0x58, 0xE0, 0x90, 0x93, 0x13, 0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x46, 0xE4, -0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, -0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, 0x4A, 0x65, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x55, 0x80, 0x09, 0x43, 0x66, 0x01, 0x12, 0x51, 0x48, 0x90, -0x93, 0x51, 0x74, 0x01, 0xF0, 0x12, 0x9B, 0x40, 0x22, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0xE5, 0x65, -0x70, 0x03, 0x02, 0x47, 0x32, 0x90, 0x93, 0x5A, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, -0xE5, 0x66, 0x54, 0x07, 0x60, 0x03, 0x02, 0x47, 0x32, 0x02, 0x47, 0x2F, 0x90, 0x93, 0x41, 0xE0, -0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x36, -0xE0, 0x54, 0x0F, 0xB5, 0x07, 0x0A, 0x90, 0x93, 0x39, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, -0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, -0x90, 0x93, 0x58, 0xE0, 0xB5, 0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, -0x03, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, -0x93, 0x63, 0x74, 0x5A, 0xF0, 0x90, 0x93, 0x63, 0xE0, 0xFF, 0x90, 0x93, 0x48, 0xE0, 0x2F, 0xFF, -0xE4, 0x33, 0xFE, 0x90, 0x93, 0x41, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, -0x40, 0x0D, 0xE5, 0x62, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, -0x52, 0x17, 0x22, 0xE4, 0xF5, 0x66, 0xF5, 0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, -0x59, 0xF0, 0x90, 0x93, 0x55, 0xF0, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x93, 0x57, 0x04, 0xF0, 0x90, -0x93, 0x40, 0xF0, 0xE4, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x93, 0x4F, 0x74, -0x05, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x4D, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, -0x93, 0x48, 0xF0, 0x90, 0x93, 0x4B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x45, 0x74, 0x14, 0xF0, 0x90, -0x93, 0x50, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x43, 0xF0, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x93, -0xB2, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x93, 0x5C, 0xF0, 0x90, 0x93, 0x58, 0xF0, 0x90, 0x93, -0x3D, 0xF0, 0x90, 0x93, 0x56, 0xF0, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x93, 0x44, 0xF0, 0x90, 0x93, -0x51, 0xF0, 0x90, 0x93, 0x4A, 0xF0, 0x90, 0x93, 0x46, 0xF0, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x93, -0x49, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, -0x36, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x93, 0x39, 0xF0, 0x22, 0xEF, 0x60, 0x5F, 0xAF, 0x05, -0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x93, -0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x30, 0xE0, 0x6B, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xE0, 0x25, 0xE0, 0x25, -0xE0, 0xFF, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, -0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xAF, 0x05, 0x74, -0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x19, -0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, -0xE0, 0x0C, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x22, 0x90, -0x93, 0x15, 0xE0, 0x30, 0xE0, 0x22, 0x90, 0x93, 0x26, 0xE0, 0x60, 0x09, 0x90, 0x01, 0xB9, 0x74, -0x40, 0xF0, 0x02, 0x49, 0x29, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x02, 0x80, 0x2F, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x67, 0x80, 0x5D, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, -0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, -0xB9, 0x74, 0x02, 0xF0, 0x80, 0x53, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, -0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x42, 0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, -0x08, 0xF0, 0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, -0x28, 0x90, 0x93, 0x42, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, -0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, -0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, -0x00, 0x22, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0xE0, -0x54, 0xC0, 0x70, 0x18, 0x90, 0x93, 0x51, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x14, 0x12, 0x52, 0x17, 0x80, 0x0F, 0x90, 0x93, 0x3D, 0xE0, -0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x5D, 0xE0, 0x30, -0xE6, 0x1B, 0x43, 0x66, 0x01, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, -0x0C, 0x60, 0x13, 0x12, 0x51, 0x48, 0x80, 0x0E, 0x12, 0x50, 0x77, 0x80, 0x09, 0x90, 0x93, 0x51, -0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x5D, 0xE0, 0x30, -0xE7, 0x2A, 0x43, 0x66, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, -0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x93, -0x5A, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, -0x8E, 0x25, 0x8F, 0x26, 0xAD, 0x26, 0xAC, 0x25, 0xAF, 0x24, 0x12, 0x47, 0xEB, 0xAF, 0x26, 0xAE, -0x25, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, -0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x8F, 0x68, 0x8D, 0x69, 0xE5, 0x68, 0x54, 0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, -0xE5, 0x68, 0x30, 0xE2, 0x30, 0xE5, 0x63, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0xA1, 0xE5, -0x63, 0x30, 0xE3, 0x10, 0xE5, 0x68, 0x20, 0xE3, 0x0B, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x53, 0x12, -0x51, 0xD4, 0x80, 0x4E, 0xE5, 0x63, 0x20, 0xE3, 0x49, 0xE5, 0x68, 0x30, 0xE3, 0x44, 0xAF, 0x69, -0x12, 0x51, 0x86, 0x80, 0x3D, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x68, 0x20, -0xE3, 0x09, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x2A, 0x12, 0x51, 0xD4, 0xE5, 0x63, 0x54, 0x0F, 0xFF, -0xBF, 0x04, 0x0E, 0xE5, 0x68, 0x20, 0xE2, 0x09, 0x12, 0x48, 0x8F, 0xEF, 0x60, 0x14, 0x12, 0x51, -0x1F, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4B, 0xF7, 0xEF, 0x60, 0x03, 0x12, -0x52, 0x04, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x02, 0x4B, 0x35, 0x02, 0x52, 0xF4, 0xE4, 0x93, 0xA3, -0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, -0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, -0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, -0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4F, 0x75, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, -0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, -0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, -0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, -0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x7D, -0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, 0x01, 0x36, -0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, -0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x4A, 0x65, 0x90, 0x06, -0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, -0x74, 0x7B, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, -0x03, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, -0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4F, 0x28, 0xE5, 0x62, 0x20, 0xE0, -0x05, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0x22, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x10, 0x12, 0x51, -0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x5C, 0xE5, 0x14, -0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x50, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, -0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x3F, 0x90, 0x02, 0x87, 0xE0, 0x60, -0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x31, 0x90, 0x01, 0xAF, 0xE0, 0x60, 0x02, 0x80, -0x07, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, -0x90, 0x93, 0x43, 0xE0, 0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, -0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, -0x7F, 0x00, 0x22, 0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, 0x64, -0x02, 0x60, 0x06, 0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, 0x40, -0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x93, 0x57, 0xF0, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x07, 0x90, -0x93, 0x57, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x93, 0x40, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xEF, 0xF0, -0x90, 0x93, 0x42, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x58, -0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, -0x02, 0xF0, 0x53, 0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, -0x03, 0x12, 0x49, 0x32, 0x22, 0x90, 0x93, 0xB1, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, -0x90, 0x93, 0xB1, 0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0x7D, 0x40, 0x7F, 0x93, 0x12, 0x54, -0x0A, 0x90, 0x00, 0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x28, -0xE0, 0x54, 0xFC, 0xFD, 0x7F, 0x28, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, -0x7F, 0x08, 0x12, 0x54, 0x0A, 0x7F, 0x01, 0x12, 0x4E, 0x81, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, -0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, -0x54, 0x0A, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x54, 0x0A, 0x7F, 0x14, -0x7E, 0x00, 0x02, 0x3B, 0x09, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x93, 0x1A, 0xE0, -0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x49, 0x12, -0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, -0x93, 0x55, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x52, -0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, 0xD3, -0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, -0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, -0x22, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xC8, 0x12, 0x44, 0xF1, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, -0x12, 0x1E, 0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, -0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, -0x1F, 0x0F, 0xFD, 0xE4, 0xFF, 0x12, 0x50, 0x39, 0x80, 0x29, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x50, 0x39, 0x1F, 0x80, 0x14, 0x90, -0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x50, -0x39, 0xE4, 0xFF, 0x12, 0x4B, 0x7A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x24, -0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, -0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x27, 0x74, 0xFF, 0xF0, 0x12, 0x5E, -0x42, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x1F, 0x12, 0x49, -0xD0, 0x90, 0x05, 0x22, 0xE5, 0x27, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, 0x01, -0x12, 0x58, 0x1F, 0x12, 0x49, 0xD0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x8F, 0x6C, 0xE4, 0x90, 0x94, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, -0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6C, 0x60, 0x3E, 0xC3, 0x90, 0x94, 0x45, 0xE0, 0x94, -0x88, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, -0x22, 0x90, 0x94, 0x44, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, -0x3B, 0x09, 0xD3, 0x90, 0x94, 0x45, 0xE0, 0x94, 0x32, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x00, 0x40, -0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, 0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, -0x7F, 0x20, 0x12, 0x54, 0x0A, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, -0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, -0x28, 0x12, 0x54, 0x0A, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x54, 0x0A, -0xE4, 0xFF, 0x12, 0x4E, 0x81, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, -0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x54, 0x0A, 0xE4, 0xFF, 0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, -0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, -0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, -0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, 0x4E, 0xE0, 0x9D, 0x90, 0x93, 0x4D, -0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xA3, 0xE0, -0x90, 0x05, 0x58, 0xF0, 0x22, 0x48, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x48, 0x93, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0x9F, 0x00, 0x41, -0x93, 0xAE, 0x00, 0x41, 0x93, 0x94, 0x00, 0x41, 0x94, 0x4C, 0x00, 0x41, 0x93, 0x13, 0x00, 0x41, -0x93, 0x14, 0x00, 0x41, 0x92, 0x69, 0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, 0x41, -0x94, 0x3D, 0x00, 0x41, 0x94, 0x4A, 0x00, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0x56, 0x74, 0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x94, 0x31, 0x12, -0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x94, 0x31, 0x12, -0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, -0x7E, 0x08, 0x12, 0x34, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, -0x02, 0x80, 0x35, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x2E, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, -0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x9B, 0x40, 0x90, 0x93, 0x59, 0xE0, -0x60, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0D, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, -0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, -0x24, 0x02, 0x70, 0x32, 0x80, 0x0A, 0x90, 0x93, 0x57, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x40, 0xF0, -0xE4, 0x90, 0x93, 0x5C, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x50, 0xE0, 0x90, 0x93, 0x57, -0xF0, 0x80, 0x05, 0x90, 0x93, 0x57, 0xED, 0xF0, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, 0xF0, -0x90, 0x93, 0x5C, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, -0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, -0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, -0xF0, 0x90, 0x93, 0x52, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x0C, 0x50, 0x03, 0x12, -0x4A, 0x65, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, -0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x3E, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, -0xFF, 0x74, 0x40, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, -0xF9, 0x90, 0x93, 0x54, 0xF0, 0xEE, 0x90, 0x93, 0x53, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x93, -0xB0, 0xE0, 0x90, 0x94, 0x35, 0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0xB0, 0xE0, 0x90, 0x94, 0x35, -0x60, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, -0x01, 0x10, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x35, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x55, 0x6B, 0x90, -0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x5E, 0x42, 0xEF, 0x70, -0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x12, 0x54, -0x62, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x90, 0x93, 0x46, 0xE0, 0x70, 0x1A, 0x90, 0x04, -0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, 0x1F, 0x8E, 0x6A, -0x8F, 0x6B, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x16, 0x90, -0x93, 0x4A, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x44, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, -0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, -0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x0C, -0x22, 0x90, 0x94, 0x4D, 0xEF, 0xF0, 0x12, 0x98, 0x56, 0x90, 0x94, 0x4D, 0xE0, 0x60, 0x05, 0x90, -0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, -0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, -0x02, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x05, -0x7F, 0x01, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0xE5, 0x64, 0x30, 0xE6, -0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, -0x53, 0x64, 0xBF, 0x22, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0xE5, 0x12, 0x4E, 0xD9, -0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x7D, 0x01, 0xAF, 0x64, 0x02, 0x4A, 0x69, 0x90, 0x02, -0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, 0x43, -0xF7, 0x52, 0x49, 0x00, 0x40, 0x52, 0x71, 0x00, 0x80, 0x52, 0x9C, 0x01, 0x00, 0x52, 0xB0, 0x02, -0x00, 0x52, 0xC8, 0x04, 0x00, 0x00, 0x00, 0x52, 0xE5, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, 0xFF, -0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, 0xCE, -0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x80, -0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, 0x2D, -0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x07, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, 0xFE, -0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, 0x35, -0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, 0x2D, -0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, 0xFF, -0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, 0x00, -0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x21, 0xF0, -0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x75, 0xF0, 0xA3, 0xF0, 0xF1, 0x9F, 0x75, 0x8E, 0x02, -0xB1, 0x34, 0xF1, 0xBF, 0x90, 0x93, 0xB1, 0xEF, 0xF0, 0xF1, 0xA7, 0x90, 0x93, 0xB3, 0xEF, 0xF0, -0x12, 0x60, 0x3E, 0x90, 0x93, 0x95, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x14, 0xF5, 0x09, -0xF5, 0x62, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x88, 0x77, -0x12, 0x47, 0x33, 0x12, 0x37, 0x1C, 0xF1, 0xB3, 0x71, 0xE1, 0x12, 0x60, 0x02, 0xF1, 0xD2, 0xF1, -0x98, 0x12, 0x60, 0x20, 0x12, 0x44, 0xFD, 0x12, 0x60, 0xAC, 0xB1, 0x1C, 0x90, 0x93, 0x77, 0xE5, -0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x52, 0x75, 0xE8, 0x03, -0x43, 0xA8, 0x85, 0x12, 0x96, 0x12, 0xD2, 0xAF, 0x51, 0xEA, 0x12, 0x60, 0x56, 0x90, 0x93, 0x75, -0xE0, 0x64, 0x01, 0xF0, 0x24, 0xF4, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, 0xA3, 0xF0, 0xE5, 0x14, -0x30, 0xE0, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0xFE, 0xB1, 0x44, 0xD2, 0xAF, 0xE5, 0x14, 0x30, 0xE4, -0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xEF, 0xD2, 0xAF, 0x12, 0x6F, 0xCE, 0xE5, 0x14, 0x30, 0xE6, 0x0A, -0xC2, 0xAF, 0x53, 0x14, 0xBF, 0xD2, 0xAF, 0x12, 0x80, 0x74, 0xE5, 0x14, 0x30, 0xE7, 0x09, 0xC2, -0xAF, 0x53, 0x14, 0x7F, 0xD2, 0xAF, 0xB1, 0xD2, 0xC2, 0xAF, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0xBF, -0x01, 0x0D, 0x90, 0x93, 0x43, 0x74, 0x01, 0xF0, 0x51, 0x17, 0xE4, 0x90, 0x93, 0x43, 0xF0, 0xD2, -0xAF, 0x90, 0x01, 0xBD, 0xE5, 0x63, 0xF0, 0x90, 0x93, 0x59, 0xE0, 0x90, 0x01, 0xBC, 0xF0, 0x80, -0x8C, 0x90, 0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x91, 0x0A, 0x7D, 0xFF, 0x7F, 0x55, 0x91, 0x0A, -0x7D, 0xFF, 0x7F, 0x56, 0x91, 0x0A, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x91, 0x52, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x91, 0x0A, 0xE4, 0xFD, 0x7F, 0x51, 0x91, 0x0A, 0xE4, -0xFD, 0x7F, 0x52, 0x91, 0x0A, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0x90, 0x00, 0x02, 0xE0, 0x44, -0x01, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xF2, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x00, 0x00, 0x90, 0x93, 0xF6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x02, -0xE0, 0x54, 0xFE, 0xF0, 0x91, 0x52, 0x91, 0x4B, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x90, -0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, -0xF0, 0x90, 0x93, 0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x3D, -0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x56, 0xF0, 0xFF, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, -0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, 0xEC, 0x54, 0xFD, 0xFC, 0x90, 0x93, -0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, -0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x22, 0xE4, 0xFF, 0x11, -0xEB, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xF6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, -0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xF6, 0xB1, 0x67, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, -0x93, 0x51, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x94, 0x3E, 0xE0, -0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x94, 0x40, 0xF0, 0x90, 0x94, 0x3E, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, -0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, -0x7F, 0x80, 0x81, 0x0A, 0xE4, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x6B, 0x12, 0x73, 0x70, 0xEF, 0xB4, -0x02, 0x14, 0x90, 0x94, 0x4A, 0xE0, 0x64, 0x04, 0x60, 0x07, 0x43, 0x14, 0x01, 0xE0, 0x04, 0xF0, -0x22, 0xE4, 0x90, 0x94, 0x4A, 0xF0, 0x22, 0x7F, 0x70, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, 0xEE, 0x44, 0xF0, 0xA3, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, -0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEE, 0xF0, 0x12, 0x1E, 0xF6, -0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, 0x12, 0x96, 0xFC, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x90, 0x93, 0x04, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x16, 0xEF, 0x7B, 0x01, 0xB4, 0x01, -0x06, 0x7A, 0x93, 0x79, 0x0B, 0x80, 0x04, 0x7A, 0x93, 0x79, 0x07, 0x7F, 0x80, 0x7E, 0x08, 0xB1, -0x6B, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x40, 0xEF, 0x60, 0x4E, 0x90, 0x92, -0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, -0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, -0xFA, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0xD0, 0x01, 0xD0, 0x02, 0xD1, 0x31, 0x90, 0x92, 0x69, -0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, -0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x10, 0x12, 0x43, 0xC8, 0x90, 0x92, -0x68, 0xE0, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0xF1, 0x40, 0xEF, 0x70, 0x02, 0xC1, 0xEC, 0x90, -0x94, 0x10, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, -0x7A, 0x01, 0x79, 0xA0, 0xD1, 0xF1, 0x90, 0x94, 0x13, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, -0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, -0x23, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0xD1, 0xF1, 0x90, 0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, -0x93, 0xB1, 0xE0, 0x64, 0x01, 0x70, 0x48, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, -0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x20, 0xD1, 0xF1, 0x90, 0x94, -0x13, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, -0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x22, 0xD1, -0xF1, 0x90, 0x93, 0x95, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, -0x92, 0x68, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x94, -0x0A, 0x12, 0x43, 0xC8, 0xAB, 0x20, 0xAA, 0x21, 0xA9, 0x22, 0x90, 0x94, 0x0D, 0x12, 0x43, 0xC8, -0xAF, 0x23, 0x15, 0x23, 0xEF, 0x60, 0x1E, 0x90, 0x94, 0x0D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, -0xB1, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x94, 0x0A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, -0x12, 0x42, 0x53, 0x80, 0xDB, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x94, 0x39, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, -0xF0, 0x90, 0x94, 0x39, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, -0x90, 0x94, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0x3B, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, -0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x3B, 0xE4, 0x75, 0xF0, 0x01, 0x12, -0x42, 0x87, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, 0x7F, 0x01, 0x22, 0x8F, 0x82, -0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0x20, 0xF0, 0x22, 0x90, -0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, -0x7F, 0x01, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0x90, -0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, 0x02, 0x22, 0x7F, -0x00, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, -0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, -0xC4, 0x74, 0xE7, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, -0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, -0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, -0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, -0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, -0x54, 0xEF, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, -0x62, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x67, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x54, 0x3F, 0x25, -0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x68, 0xF0, 0x90, -0x93, 0x67, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xE4, 0xFF, 0x90, 0x94, 0x1C, 0xEF, 0xF0, 0xA3, 0xED, -0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, -0x21, 0xF0, 0xD1, 0x3C, 0xBF, 0x01, 0x02, 0x11, 0xEC, 0x90, 0x94, 0x21, 0xE0, 0x90, 0x05, 0x22, -0xF0, 0x80, 0x02, 0x11, 0xEC, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0xAC, 0xE0, -0xFF, 0x7D, 0x01, 0x11, 0x1F, 0x90, 0x94, 0x1F, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, -0x94, 0x1C, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x94, 0x2B, 0xF0, 0xEF, 0x60, 0x10, -0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0E, -0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, -0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x11, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, 0x16, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x16, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0xAE, 0x05, 0x74, 0x22, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEB, 0xF0, 0x90, 0x94, 0x2B, 0xE0, 0xFF, 0x74, 0x23, 0x2E, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x12, 0x9B, 0x6E, 0x90, 0x93, 0x27, 0xE0, -0x64, 0x01, 0x60, 0x02, 0x41, 0xAE, 0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x18, 0xE0, 0xC3, 0x13, -0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0xA3, -0xE0, 0x90, 0x93, 0x63, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x63, 0xE0, 0x24, 0x03, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x27, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, -0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, -0x90, 0x93, 0x16, 0xE0, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xB9, -0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, -0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x06, 0xF0, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0xA1, 0xAC, 0x90, 0x93, -0x27, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x61, 0x8D, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, -0x3F, 0x30, 0xE0, 0x08, 0xD1, 0x3C, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x62, 0xE4, 0xFF, 0xD1, 0xE6, -0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x1F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, -0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x90, 0x93, 0x63, 0xF0, 0x90, -0x93, 0x1A, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x16, 0xE0, 0x24, 0x03, 0xFF, -0x90, 0x93, 0x63, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0xFF, 0x90, 0x93, 0x64, -0xE0, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x63, 0x74, 0x05, 0xF0, 0xE4, 0xFF, 0xD1, 0x83, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, -0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, -0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x20, 0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, -0x65, 0x60, 0x0D, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0xC1, 0x36, 0x90, 0x93, 0x27, -0xE0, 0x64, 0x03, 0x60, 0x02, 0x81, 0xE1, 0x7F, 0x01, 0xD1, 0xE6, 0x90, 0x93, 0x19, 0xE0, 0xFF, -0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x98, 0x56, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0x81, 0x3D, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x90, 0x93, 0x29, -0xE0, 0xD3, 0x9F, 0x40, 0x4D, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, -0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0x17, 0xE0, 0xD3, 0x9D, -0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0x93, 0x66, 0xF0, 0x80, -0x06, 0x90, 0x93, 0x66, 0x74, 0x03, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x66, 0xE0, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, -0x80, 0x24, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x22, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, -0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x1D, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x27, 0xF0, -0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x29, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, -0x90, 0x93, 0x65, 0xE0, 0xFF, 0x90, 0x93, 0x17, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, -0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x63, -0x74, 0x05, 0xF0, 0x7F, 0x01, 0xD1, 0x83, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, -0xE0, 0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0x93, 0x1A, 0xE0, -0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x02, 0x80, 0x0F, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x08, 0xE5, 0x65, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, -0x69, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, -0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x51, 0x48, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, -0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x7F, 0x01, 0xC1, -0x38, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xA1, 0xB2, 0xF5, 0x48, 0x75, 0x49, 0x03, -0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, -0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, -0x90, 0x93, 0x17, 0xE0, 0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xB9, -0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, -0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, -0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x07, 0xF0, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x3B, 0x90, 0x05, 0x22, 0xE4, -0xF0, 0x22, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x3B, 0x90, 0x93, 0x19, 0xE0, -0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xD1, 0x3C, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x62, -0xE4, 0xFF, 0xD1, 0xE6, 0xD1, 0x83, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, -0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, -0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x20, 0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, -0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, -0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x22, 0x90, 0x05, 0x22, 0x74, -0xFF, 0xF0, 0xE4, 0x90, 0x94, 0x48, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, -0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, -0x94, 0x49, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0x48, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, -0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x94, 0x48, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, -0x87, 0x80, 0xC6, 0x90, 0x94, 0x2C, 0xEF, 0xF0, 0x12, 0x9D, 0x17, 0x90, 0x93, 0x18, 0xE0, 0xFF, -0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x08, 0x90, 0x94, 0x2C, 0xE0, 0xFF, 0x12, 0x50, 0xEB, 0x90, -0x94, 0x2D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x90, 0x94, 0x2C, 0xE0, 0xB4, 0x01, 0x10, -0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x80, 0x0A, -0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x94, 0x2D, 0x12, 0x1F, 0xD5, -0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x2D, 0x12, 0x55, 0x67, 0x90, 0x94, 0x2C, -0xE0, 0x90, 0x93, 0x26, 0xF0, 0x22, 0xEF, 0x64, 0x03, 0x60, 0x02, 0xE1, 0xB4, 0x90, 0x94, 0x02, -0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x30, 0xE0, 0x30, 0x90, 0x94, 0x06, 0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0xA3, -0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x41, 0x90, 0x94, 0x02, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, -0x74, 0x55, 0xF0, 0x80, 0x2D, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x17, 0x90, -0x94, 0x02, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, -0xF0, 0xA3, 0x74, 0x5A, 0x80, 0x05, 0x90, 0x94, 0x06, 0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x94, 0x02, 0xE0, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x94, 0x03, 0xE0, 0x90, 0x06, -0xC1, 0xF0, 0x90, 0x94, 0x04, 0xE0, 0x90, 0x06, 0xC2, 0xF0, 0x90, 0x94, 0x05, 0xE0, 0x90, 0x06, -0xC3, 0xF0, 0x90, 0x94, 0x06, 0xE0, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x94, 0x07, 0xE0, 0x90, 0x06, -0xC5, 0xF0, 0x90, 0x94, 0x08, 0xE0, 0x90, 0x06, 0xC6, 0xF0, 0x90, 0x94, 0x09, 0xE0, 0x90, 0x06, -0xC7, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, -0x17, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEF, 0x90, -0x06, 0xCC, 0xB4, 0x01, 0x03, 0xE4, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x57, 0xE7, 0xBF, -0x01, 0x0F, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x1F, 0x90, 0x04, 0x1F, 0x74, 0x20, -0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, 0xE0, 0x02, -0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90, 0x01, 0x30, -0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B, 0xF0, 0x22, -0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x43, 0x32, 0x20, 0x90, -0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, 0x22, 0x90, 0x93, -0xB3, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, -0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, -0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, -0x79, 0xE0, 0x94, 0x88, 0x90, 0x93, 0x78, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, -0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x78, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, -0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x78, 0xE0, -0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x01, 0xE0, -0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, -0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, -0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, -0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, -0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x93, 0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, -0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07, 0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3C, 0x90, 0x93, -0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D, 0xF0, 0x79, 0x40, 0x90, 0x93, 0x5D, 0xE0, 0xFE, 0xA3, -0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0x9F, -0xF0, 0x22, 0x90, 0x93, 0x9F, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0C, 0xE4, 0xF0, -0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x5F, 0xCC, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, -0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, -0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x4B, 0xF0, 0x74, 0x61, -0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28, 0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, -0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0, 0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, -0x02, 0x61, 0x45, 0x90, 0x01, 0x34, 0x74, 0x01, 0xF0, 0x85, 0xD1, 0x0A, 0x85, 0xD3, 0x0C, 0x85, -0xD4, 0x0D, 0x85, 0xD5, 0x0E, 0x85, 0xD6, 0x0F, 0x85, 0xD7, 0x10, 0x85, 0xD9, 0x11, 0x85, 0xD2, -0x0B, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x0A, 0x75, 0x23, 0x08, 0xFB, 0x7A, 0x93, -0x79, 0xA0, 0x12, 0x56, 0xF1, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, -0xC4, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x70, 0x02, 0x41, 0xF0, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x41, 0xF0, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, -0x93, 0xA2, 0xE0, 0x54, 0x3F, 0xF5, 0x4E, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, -0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, -0x87, 0xE5, 0x4E, 0xD3, 0x94, 0x04, 0x40, 0x03, 0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, -0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, -0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, -0x9C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xA1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, -0x2F, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, -0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFF, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x67, 0xAF, 0x4D, 0x12, 0x7A, 0xB3, 0x80, 0x60, -0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x53, 0x90, 0x93, 0xA4, -0xE0, 0x54, 0x1F, 0xFF, 0xFD, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, -0xF5, 0x83, 0xE4, 0x8D, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFE, 0xC4, 0x13, 0x13, -0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0xEE, 0x54, 0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, -0x12, 0x7A, 0x4F, 0x80, 0x1B, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, -0x04, 0x30, 0xE0, 0xB4, 0x01, 0x0A, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, -0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x46, 0x90, 0x93, 0x59, 0xE0, 0x60, 0x37, 0x90, -0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, -0x70, 0x2D, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, -0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, -0x90, 0x93, 0x55, 0xF0, 0x80, 0x09, 0x12, 0x51, 0xBB, 0xBF, 0x01, 0x03, 0x12, 0x52, 0x17, 0x90, -0x94, 0x4B, 0xE0, 0x04, 0xF0, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0xE7, 0x90, 0x01, 0x34, 0x74, -0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, 0x0B, 0x75, -0x4F, 0x88, 0x75, 0x50, 0x0F, 0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, 0x75, 0x50, 0x08, -0x75, 0x51, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x12, 0x90, 0x04, 0x7E, 0xE0, 0x55, -0x51, 0xF5, 0x13, 0x65, 0x12, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x12, 0x75, 0xF0, 0x08, 0xA4, 0x25, -0x4F, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x15, 0x2F, -0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x15, -0x75, 0x23, 0x08, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x97, 0x12, 0x56, 0xF1, 0x90, 0x93, 0x97, 0xE0, -0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0x6A, 0xE5, 0x12, 0x24, 0x01, -0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, 0x12, 0x90, -0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x13, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, -0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x14, 0x10, -0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, -0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x54, 0x1F, 0x90, -0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x54, 0x52, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x06, -0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x81, 0xF1, 0x90, 0x93, 0xB2, -0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, -0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x12, 0x45, 0x09, 0x90, -0x93, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xE6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, -0x12, 0x50, 0xEB, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, -0x54, 0x07, 0xFF, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9F, 0x40, 0x30, 0xE0, 0x54, 0xFE, -0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x90, 0x93, 0x32, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, -0xC9, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2E, 0x12, 0x43, 0x84, 0x90, 0x81, -0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x80, 0x1C, 0x90, 0x93, 0x2D, -0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0xFE, -0x25, 0xE0, 0x4F, 0xF0, 0x80, 0x03, 0x12, 0x6B, 0x41, 0x12, 0x6B, 0x0A, 0x90, 0x93, 0xB2, 0xE4, -0xF0, 0xE5, 0x2E, 0x30, 0xE1, 0x45, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x43, 0x14, 0x40, 0x12, -0x9D, 0x70, 0x11, 0xDC, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x1D, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, -0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, -0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, 0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, -0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x43, -0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x12, 0x4C, 0x73, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x34, 0x90, -0x93, 0x57, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x57, 0xE0, 0x90, -0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, -0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x40, -0xE0, 0x14, 0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x62, -0x64, 0x01, 0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, -0x74, 0x02, 0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, -0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, -0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, 0x60, 0x1C, -0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x5A, 0xE4, 0xF0, -0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2E, 0x30, 0xE5, -0x25, 0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x1A, 0xE5, 0x65, 0x60, 0x16, -0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x08, 0x12, 0x51, -0x48, 0x80, 0x03, 0x12, 0x50, 0x77, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, -0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, 0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, 0x66, 0x54, -0x07, 0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2F, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x37, 0x74, 0x02, -0xF0, 0x12, 0x4F, 0xFA, 0x74, 0x4B, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, -0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, -0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x5D, 0xE0, 0x54, 0xF0, -0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x15, 0x90, 0x94, -0x19, 0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x5D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x94, 0x16, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, -0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x92, 0x69, 0xE0, 0x70, 0x06, 0xA3, -0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, -0x12, 0x57, 0x40, 0xEF, 0x60, 0x72, 0x12, 0x55, 0xD2, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x90, -0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xA8, 0x01, -0xFC, 0x7D, 0x01, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x7E, 0x00, 0x7F, 0x02, 0x12, 0x1E, 0xD0, -0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, -0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0x19, 0x12, 0x43, 0xA8, 0x8B, 0x20, -0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, -0x0F, 0xF5, 0x23, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x56, 0xF1, 0x90, 0x92, 0x6A, 0xE0, -0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0x90, -0x93, 0x63, 0xE0, 0x54, 0xF0, 0x44, 0x05, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x65, -0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x65, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, -0x79, 0x63, 0xC1, 0x89, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x09, 0xF0, 0x54, -0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x6E, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, -0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0xC1, 0x89, 0x90, 0x93, 0x8F, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x92, 0xE0, 0x54, 0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, -0x93, 0x8F, 0x12, 0x43, 0xA8, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, -0x92, 0xC1, 0x89, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0D, 0xF0, 0x54, 0x0F, 0x44, 0x10, -0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, -0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0xC1, 0x89, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, -0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x7D, 0xDB, 0x90, 0x01, -0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, -0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, -0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, -0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, -0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, -0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, -0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, -0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, -0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, -0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, -0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, -0x56, 0x00, 0x90, 0x01, 0xC4, 0x74, 0x82, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, -0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, -0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34, 0x30, 0xE0, 0x06, 0x90, 0x01, -0x3C, 0x74, 0x01, 0xF0, 0xE5, 0x34, 0x30, 0xE1, 0x10, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x46, 0x79, 0xE5, 0x34, 0x30, 0xE2, 0x36, 0x90, 0x01, -0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, -0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x55, 0xE4, -0xF0, 0x12, 0x52, 0x17, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0x90, -0x06, 0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, -0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, -0x06, 0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x52, 0xE4, 0xF0, 0x12, 0x52, 0x17, 0xE5, -0x34, 0x30, 0xE4, 0x34, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x30, 0xE0, -0x24, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x07, 0x78, 0x74, -0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, -0x12, 0x34, 0x30, 0x80, 0x03, 0x12, 0x59, 0x97, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, -0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, -0x83, 0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, 0x64, 0xF0, 0x12, 0x51, 0xEC, 0x12, 0x52, 0x17, -0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, -0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, 0xAE, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, -0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x06, -0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0xE5, 0x36, 0x30, 0xE1, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x02, -0xF0, 0xE5, 0x36, 0x30, 0xE3, 0x08, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xD1, 0x43, 0xE5, 0x36, -0x30, 0xE4, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x76, 0x90, 0x01, -0x3E, 0x74, 0x04, 0xF0, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE7, 0x13, 0x74, 0x80, 0xF0, 0x90, 0x07, -0x95, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, -0x8F, 0xE0, 0x30, 0xE6, 0x12, 0x74, 0x40, 0xF0, 0x90, 0x07, 0x7C, 0xE0, 0xB4, 0x06, 0x08, 0x90, -0x07, 0x80, 0xE0, 0xFF, 0x12, 0x67, 0x3D, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE5, 0x14, 0x74, 0x20, -0xF0, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, -0x01, 0xF0, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE2, 0x0D, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, -0xF0, 0x7F, 0x01, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE0, 0x07, 0x74, 0x01, 0xF0, -0xFF, 0x12, 0x55, 0xB2, 0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, -0x36, 0x30, 0xE6, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, -0x01, 0x3E, 0x74, 0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, -0x43, 0x14, 0x80, 0xE5, 0x37, 0x30, 0xE4, 0x1C, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x44, -0x24, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, -0x71, 0x41, 0x71, 0x0A, 0x74, 0x82, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, -0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, -0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x94, 0x3E, 0xE0, 0x30, 0xE0, -0x2F, 0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x94, 0x3D, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, -0x90, 0x94, 0x40, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x3D, 0xF0, 0x90, 0x94, 0x40, 0xE0, 0xFF, -0x90, 0x94, 0x3F, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x44, 0xFE, 0xE4, 0x90, 0x94, 0x40, 0xF0, -0x22, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x6F, 0x7F, 0x01, 0x12, 0x5E, 0xE6, 0x90, 0x93, 0x19, -0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x98, 0x56, 0x7F, 0x01, 0x12, 0x5E, -0x83, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x29, 0x90, 0x93, 0x15, 0xE0, -0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, -0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, -0x7F, 0x0C, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x4C, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, 0x74, 0x6F, -0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, -0xE0, 0x05, 0x7F, 0x01, 0x12, 0x55, 0xB2, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, -0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, -0x05, 0xC0, 0x06, 0xC0, 0x07, 0x53, 0x91, 0xBF, 0x90, 0xFD, 0x68, 0xE0, 0x20, 0xE0, 0x02, 0xC1, -0x28, 0x90, 0x93, 0x94, 0xE0, 0x70, 0x16, 0x90, 0x00, 0x2E, 0xE0, 0x90, 0x93, 0x0F, 0xF0, 0x90, -0x00, 0x2D, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x94, 0x74, 0x01, 0xF0, 0x90, 0xFD, 0x60, -0xE0, 0x54, 0x3F, 0xD3, 0x94, 0x09, 0x50, 0x03, 0x12, 0x99, 0xB4, 0x90, 0xFD, 0x60, 0xE0, 0x64, -0x0E, 0x60, 0x02, 0x81, 0xB9, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, -0xE0, 0x02, 0x81, 0xB9, 0x90, 0xFD, 0x62, 0xE0, 0x54, 0xC0, 0xFE, 0x90, 0x07, 0x90, 0xE0, 0x54, -0x3F, 0x4E, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x07, 0x91, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, -0x07, 0x92, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x07, 0x93, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x01, -0xF0, 0xEF, 0x20, 0xE0, 0x44, 0x90, 0x93, 0x04, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x19, -0x90, 0x07, 0x78, 0x12, 0x58, 0x7F, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x49, -0x90, 0x07, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x80, 0x40, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, -0x30, 0xE0, 0x11, 0xE4, 0xFF, 0x12, 0x55, 0xB2, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, -0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, 0x78, 0x80, 0x14, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, -0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x12, 0x58, 0x7F, 0x80, 0x0C, 0xE0, 0x44, 0x10, -0xF0, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x0F, 0x0A, -0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD1, 0x89, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x15, -0x70, 0x76, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6A, 0xF0, 0xE0, 0x30, 0xE6, 0x1C, 0xF4, 0x54, -0x3F, 0x04, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9F, 0x90, 0x93, 0x69, -0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x20, 0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, -0x54, 0x3F, 0xFF, 0x90, 0x93, 0x6A, 0xE0, 0x54, 0x3F, 0x2F, 0x90, 0x93, 0x69, 0xF0, 0xD3, 0x94, -0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0x93, 0x69, 0xE0, 0xFF, 0x90, 0x01, 0xE7, 0xF0, 0xEF, -0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x69, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, -0x90, 0x93, 0x6B, 0xF0, 0x90, 0x00, 0x2E, 0xF0, 0xEE, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x93, 0x10, -0xE0, 0x54, 0x0F, 0x4F, 0x90, 0x00, 0x2D, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x21, 0x08, 0x90, -0xFD, 0x62, 0xE0, 0xFF, 0x12, 0x67, 0x64, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x22, 0x02, 0xD1, 0x61, -0x90, 0xFD, 0x60, 0xE0, 0x64, 0x23, 0x70, 0x7B, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x2C, 0x30, -0xE0, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE1, 0x5B, -0x90, 0x93, 0x2D, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x60, 0x7E, -0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x32, 0x12, 0x1F, 0xC9, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x7F, -0x70, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x2E, 0x12, 0x1F, 0xC9, 0x90, 0x81, 0x57, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x01, 0xBE, -0xE0, 0x04, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x2D, 0x30, 0xE2, 0x08, 0xE0, 0x54, 0x1F, -0x44, 0x20, 0xF0, 0x80, 0x06, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0xFF, -0x12, 0x9A, 0x20, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x24, 0x03, 0x12, 0x67, 0xB3, 0x90, 0xFD, 0x60, -0xE0, 0xB4, 0x25, 0x13, 0x90, 0xFD, 0x62, 0xE0, 0x60, 0x0D, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x01, -0xF0, 0x90, 0x93, 0x24, 0x74, 0x04, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x26, 0x05, 0x7F, 0x01, -0x12, 0x9A, 0xBC, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x30, 0x07, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0xD1, -0xB4, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, -0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, -0xD0, 0xE0, 0x32, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, -0x93, 0x1C, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, -0x22, 0x90, 0x00, 0x75, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, -0xFE, 0x13, 0x74, 0x03, 0xF0, 0x7F, 0x02, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0xE4, -0xF0, 0x90, 0x00, 0x75, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xAE, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, -0xF0, 0x44, 0x04, 0xF0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x6E, 0xEE, 0xF0, 0xA3, 0xED, -0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, -0x6C, 0x02, 0x66, 0x89, 0xAC, 0x07, 0x90, 0x93, 0xD9, 0xE0, 0x44, 0x0F, 0xF0, 0x54, 0x0F, 0x44, -0x70, 0xF0, 0x90, 0x93, 0xDB, 0xEC, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0xDC, -0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0x93, 0xDD, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0xDE, -0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xDF, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0xE0, -0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0xE1, 0xF0, 0x80, 0x11, 0x90, 0x93, 0xDC, 0xED, 0xF0, -0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, -0x79, 0xDB, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0xD9, 0x02, 0x66, 0x89, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x83, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x1F, 0x0F, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x85, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x86, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, -0x0F, 0x90, 0x93, 0x87, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, -0x14, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x7F, 0x30, 0xF1, 0x84, 0x90, 0x93, 0x83, 0xE0, 0xFB, -0x7D, 0x01, 0xE4, 0x80, 0x07, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xD1, 0xB4, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x8A, 0x12, 0x43, -0xC8, 0xE4, 0xFE, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x2F, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0xEE, -0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x8E, 0x82, 0x75, 0x83, 0x00, -0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, -0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x78, 0xF0, 0x90, -0x93, 0x78, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x71, 0x18, 0x90, 0x94, 0x4C, 0xE0, 0xFF, 0x74, 0x01, -0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, -0x5D, 0x70, 0x02, 0x21, 0x11, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, -0x43, 0x9C, 0xE0, 0x90, 0x93, 0x79, 0xF0, 0x75, 0x20, 0x01, 0x75, 0x21, 0x93, 0x75, 0x22, 0x79, -0x75, 0x23, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7A, 0x12, 0x56, 0xF1, 0x90, 0x93, 0x7A, 0xE0, -0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x94, 0x4C, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, -0x02, 0x90, 0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4C, 0xE0, -0x75, 0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, -0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, -0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x7E, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x7F, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, -0xE0, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, -0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, -0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0x7B, 0x31, 0x1D, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x90, 0x94, 0x4C, 0xE0, 0xFE, 0x74, -0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, 0x78, 0xF0, -0x90, 0x94, 0x4C, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, -0x90, 0x01, 0xCC, 0xF0, 0x90, 0x94, 0x4C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x02, 0x6F, -0xDF, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x80, -0x12, 0x43, 0xC8, 0xEF, 0x12, 0x43, 0xD1, 0x71, 0xC1, 0x01, 0x71, 0xB8, 0x02, 0x72, 0x09, 0x03, -0x72, 0x12, 0x05, 0x72, 0x1B, 0x06, 0x73, 0x5D, 0x07, 0x72, 0x23, 0x0B, 0x72, 0x2C, 0x10, 0x72, -0x34, 0x11, 0x72, 0x3C, 0x12, 0x72, 0x44, 0x16, 0x72, 0x4E, 0x17, 0x72, 0x58, 0x18, 0x72, 0x62, -0x19, 0x73, 0x29, 0x1B, 0x73, 0x32, 0x1C, 0x72, 0x6B, 0x1D, 0x72, 0x75, 0x1E, 0x72, 0x80, 0x21, -0x72, 0x89, 0x22, 0x72, 0x92, 0x23, 0x72, 0x9B, 0x24, 0x72, 0xA4, 0x25, 0x72, 0xAD, 0x26, 0x72, -0xB6, 0x27, 0x72, 0xBF, 0x28, 0x72, 0xC8, 0x29, 0x71, 0xCA, 0x2D, 0x71, 0xD3, 0x2E, 0x72, 0xD1, -0x2F, 0x73, 0x3B, 0x30, 0x72, 0xE2, 0x32, 0x72, 0xD9, 0x33, 0x71, 0xE5, 0x34, 0x72, 0xEB, 0x36, -0x72, 0xF4, 0x37, 0x72, 0xFD, 0x38, 0x73, 0x05, 0x3A, 0x71, 0xDC, 0x3B, 0x73, 0x0E, 0x3E, 0x73, -0x17, 0x3F, 0x73, 0x20, 0x41, 0x73, 0x44, 0x46, 0x71, 0xEE, 0x47, 0x72, 0x00, 0x48, 0x71, 0xF7, -0x49, 0x73, 0x4D, 0x4B, 0x00, 0x00, 0x73, 0x56, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8B, -0x8F, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8B, 0x95, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, -0x02, 0x8C, 0x76, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8C, 0xBE, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x02, 0x8C, 0xF7, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0x29, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0x2F, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0xEF, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0xE2, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x8E, 0x00, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0x71, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x81, 0x2E, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0xBE, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x61, 0x5E, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x61, 0x64, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x61, 0x6A, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x01, 0x80, 0x2F, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x7F, 0x02, 0x80, 0x25, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x03, -0x80, 0x1B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x2A, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0xE4, 0xFF, 0x80, 0x08, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x04, 0x02, 0x8E, 0x48, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x62, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x8F, 0x7B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x94, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x8F, 0xAD, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xC6, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x02, 0x8F, 0xDF, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xF8, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x11, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, -0x2A, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x81, 0x1F, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x90, 0x52, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x6B, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x90, 0x84, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x37, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x61, 0xFD, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x49, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0x75, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0x8E, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x96, 0xC9, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x8A, 0xB6, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0x9D, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x99, 0x80, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x6F, 0x1F, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x02, 0x96, 0xEA, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x05, -0x7F, 0x0B, 0x80, 0x10, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0A, 0x7D, 0x01, 0x7F, 0x0D, 0x80, 0x04, -0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x41, 0x12, 0x43, -0xC8, 0xE4, 0xFE, 0x90, 0x00, 0xA3, 0xE0, 0x54, 0xF8, 0x44, 0x05, 0xF0, 0x90, 0x00, 0xA0, 0xE0, -0x54, 0x0F, 0x64, 0x04, 0x70, 0x5A, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x49, 0x90, 0xFD, 0x50, -0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0x94, 0x41, 0x12, 0x43, 0xA8, -0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0F, 0x74, 0x52, -0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0x90, 0xFD, 0x58, -0x74, 0x01, 0xF0, 0xFF, 0x80, 0x12, 0x90, 0x01, 0x43, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, 0x08, -0x90, 0x01, 0x42, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x83, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, -0x01, 0x7F, 0x23, 0x71, 0x74, 0xEF, 0xB4, 0x03, 0x05, 0x7F, 0xFF, 0x12, 0x9A, 0x20, 0x22, 0x12, -0x1E, 0xF6, 0xFF, 0xE9, 0x24, 0x01, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x04, 0x61, 0x74, 0x90, 0x00, -0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, -0xAF, 0x06, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, -0x93, 0x88, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x86, 0x12, -0x43, 0x9C, 0xAD, 0x82, 0xAC, 0x83, 0x90, 0x93, 0x8A, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, -0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x0F, 0xFF, -0x90, 0x93, 0x8C, 0x12, 0x43, 0xA8, 0xEF, 0x12, 0x42, 0x53, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x8C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, -0xEF, 0x12, 0x42, 0x65, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, -0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, -0x1E, 0xF6, 0x8D, 0x82, 0x8C, 0x83, 0xA3, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFE, 0x90, 0x93, 0x83, -0xE0, 0xFF, 0x24, 0xC2, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x84, -0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x75, 0xF0, -0x09, 0xEF, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, -0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x8F, 0x57, 0xEF, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, 0x57, -0x75, 0xF0, 0x02, 0xA4, 0x24, 0x02, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, -0x89, 0x5C, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, 0x85, -0x83, 0x5D, 0x8F, 0x5E, 0xE5, 0x57, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, -0xF0, 0x75, 0x5F, 0x01, 0xF5, 0x60, 0x89, 0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, -0x89, 0xF5, 0x83, 0xE0, 0x12, 0x43, 0xD1, 0x75, 0xBC, 0x00, 0x75, 0xD1, 0x01, 0x75, 0xE6, 0x02, -0x75, 0xFB, 0x03, 0x76, 0x24, 0x04, 0x76, 0x39, 0x05, 0x76, 0x4E, 0x06, 0x76, 0x74, 0x0C, 0x76, -0xA1, 0x0D, 0x76, 0xCE, 0x0E, 0x76, 0xFB, 0x0F, 0x00, 0x00, 0x77, 0x2F, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, -0x3C, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, -0xF0, 0xA3, 0x74, 0x10, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, -0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x57, -0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, -0x8F, 0xF0, 0xE1, 0x2F, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF5, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x57, -0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, -0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xE1, 0x2F, 0x90, 0x04, 0x47, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, -0x53, 0x90, 0x04, 0x46, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, -0x65, 0x90, 0x04, 0x45, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, 0xE1, -0x26, 0x90, 0x04, 0x4B, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, -0x4A, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, -0x49, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, -0x4F, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, 0x85, -0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, -0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, 0x85, -0x58, 0x83, 0xF0, 0x90, 0x04, 0x50, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, -0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x12, 0x1E, 0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, -0x42, 0x53, 0xAB, 0x5A, 0xE5, 0x5C, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, 0xC0, -0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, 0x01, -0x12, 0x1F, 0x0F, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, 0x82, -0x85, 0x58, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xE0, -0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xC0, -0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, -0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x4C, 0x90, 0x93, 0x8F, 0x74, 0x0B, 0xF0, 0x90, -0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x78, 0x75, 0x74, 0x01, 0x7E, 0x00, -0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, -0x4E, 0x60, 0x0A, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x8F, -0xE0, 0x14, 0xF0, 0x80, 0xBA, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x47, 0x90, 0x93, 0x8F, 0x74, 0x0F, 0xF0, 0x90, -0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, -0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, -0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, -0x90, 0x93, 0x8F, 0xE0, 0xA3, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0x8F, 0xE0, 0x14, 0xF0, 0x80, 0xBF, -0xE4, 0x90, 0x93, 0x90, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, -0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, 0x02, 0x21, 0x2E, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, -0x06, 0x90, 0x93, 0x8F, 0xE0, 0x80, 0x63, 0x90, 0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, -0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, -0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, -0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0x80, -0x09, 0x90, 0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0x90, 0x93, -0x90, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, -0x90, 0x93, 0x91, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, -0xEE, 0xF0, 0xE5, 0x57, 0xC3, 0x94, 0x20, 0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, -0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, -0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x91, 0xE0, 0xA3, -0xF0, 0x80, 0x37, 0x80, 0x2D, 0x74, 0x27, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0xE0, 0xFF, 0x90, 0x93, 0x90, 0xE0, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x92, 0xEE, -0xF0, 0x80, 0x17, 0x90, 0x93, 0x91, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, -0x80, 0x08, 0x90, 0x93, 0x90, 0xE0, 0x90, 0x93, 0x92, 0xF0, 0x90, 0x93, 0x92, 0xE0, 0xFD, 0xAF, -0x57, 0x51, 0x06, 0x90, 0x93, 0x92, 0xE0, 0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, -0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, -0x8A, 0x83, 0x74, 0x03, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, -0x02, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x03, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, 0x22, -0xE4, 0x90, 0x8A, 0x83, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, -0x20, 0x50, 0x0E, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, -0x29, 0x74, 0x27, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0xCC, -0xEF, 0xF0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0xCD, 0xF0, -0x7B, 0x01, 0x7A, 0x93, 0x79, 0xCC, 0x7D, 0x02, 0x71, 0xCB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, -0x52, 0x8D, 0x53, 0xE5, 0x53, 0x54, 0x1F, 0x90, 0x93, 0x5F, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x60, 0x74, 0x01, 0xF0, -0xEB, 0xC3, 0x94, 0x01, 0x40, 0x02, 0x80, 0x3B, 0x90, 0x93, 0x5D, 0xE0, 0x25, 0x55, 0xFF, 0xA3, -0xF0, 0xA3, 0xE0, 0x90, 0x41, 0xA4, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x13, 0x74, 0x01, 0x25, -0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x41, 0x06, -0x90, 0x93, 0x5E, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, -0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x62, 0xF0, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, -0x1F, 0x90, 0x93, 0x61, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, -0x04, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, -0x40, 0x5D, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x89, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xEF, 0xF0, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, -0x40, 0x0D, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, -0x93, 0x62, 0xE0, 0xFF, 0x90, 0x93, 0x61, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, -0x61, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, -0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, -0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, -0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0xAF, 0x05, 0x90, 0x93, 0x61, 0xE0, 0xFD, 0x51, 0x06, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, -0x03, 0x60, 0x12, 0x90, 0x04, 0x30, 0xE0, 0x70, 0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, -0x90, 0x04, 0xCF, 0x04, 0xF0, 0x90, 0x93, 0x61, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x90, 0x94, 0x22, 0x12, 0x43, 0xC8, 0x90, 0x94, 0x25, 0xE0, 0x54, 0xF0, 0x44, 0x06, -0xFF, 0xF0, 0xED, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x94, -0x22, 0x12, 0x43, 0xA8, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x25, -0x12, 0x66, 0x89, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, 0x13, -0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, -0xF0, 0x80, 0x11, 0x74, 0x27, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, -0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x8B, 0xF0, 0x75, -0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x8D, 0xF0, 0x75, 0xF0, -0x09, 0xEC, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x8E, 0xF0, 0xEC, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, -0x8F, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, -0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x91, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, 0xC6, -0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, 0x90, -0x93, 0x8E, 0xE0, 0x90, 0x93, 0x8B, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0xED, 0x70, 0x02, 0xA1, 0x82, -0x90, 0x93, 0x8C, 0xED, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x8B, 0xE0, -0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x14, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x70, 0x02, -0xA1, 0x82, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0xA1, 0x82, 0xE4, 0x90, -0x93, 0x8A, 0xF0, 0xEF, 0x14, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0xFD, 0x90, 0x93, -0x89, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, 0xFF, -0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0xFF, 0x90, 0x93, 0x91, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x89, -0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, -0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8F, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, -0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x93, 0x89, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x8A, 0xE0, -0x04, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0x6F, 0x60, 0x08, 0x90, 0x93, -0x89, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xC3, -0x9F, 0x50, 0x0F, 0x90, 0x93, 0x89, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x93, 0x8D, 0xE0, 0x90, 0x93, -0x88, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, -0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, -0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, -0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, -0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x93, 0x88, 0xE0, 0xFD, 0x51, 0x06, 0x90, 0x93, 0x88, -0xE0, 0xFF, 0x22, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, -0xF0, 0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, -0x54, 0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, -0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, -0x4D, 0xF0, 0x22, 0xAD, 0x07, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x11, 0x74, 0x27, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x90, -0x93, 0x88, 0xE0, 0xF9, 0x54, 0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, -0x43, 0x9C, 0xE0, 0xFF, 0x90, 0x93, 0x8B, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, -0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8C, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, -0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, -0x90, 0x93, 0x8E, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, 0x25, 0xE0, 0x24, -0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, -0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, -0xEE, 0xC3, 0x9F, 0x40, 0x02, 0xE1, 0x70, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, -0x8B, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xE1, 0xAA, 0xEE, 0xC3, -0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8C, 0xE0, 0x5E, 0xFE, 0xA3, -0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, 0x74, -0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, -0x90, 0x93, 0x8E, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x8A, 0xE0, -0xB4, 0x11, 0x0D, 0x90, 0x93, 0x8D, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x93, 0x8A, 0x74, 0x17, 0xF0, -0x90, 0x93, 0x8A, 0xE0, 0xFF, 0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, 0x8C, -0xE0, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x8A, 0x74, 0x18, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x90, 0x93, -0x89, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x42, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, 0xC1, 0xCE, -0x90, 0x93, 0x8B, 0xE0, 0xFC, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, -0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x89, 0xE0, 0x44, -0x40, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x25, -0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, -0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, -0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, -0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, 0x93, -0x89, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x89, 0xEF, 0xF0, 0x90, 0x93, 0x88, 0xF0, -0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, -0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, -0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, -0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, -0xAF, 0x05, 0x90, 0x93, 0x88, 0xE0, 0x44, 0x80, 0xFD, 0x12, 0x7A, 0x06, 0x90, 0x93, 0x88, 0xE0, -0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, -0x40, 0x40, 0x03, 0x02, 0x88, 0x76, 0xEF, 0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, -0x90, 0x89, 0x01, 0xE0, 0xFF, 0x90, 0x8F, 0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, -0x78, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, -0x03, 0x02, 0x88, 0x6D, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x88, 0x6D, 0x90, -0x93, 0x78, 0xE0, 0x94, 0x20, 0x40, 0x09, 0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x88, 0x76, -0x90, 0x93, 0x78, 0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, -0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, -0x87, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x93, 0x7D, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, -0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, -0x93, 0x7F, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, -0x13, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, -0x79, 0xF0, 0x80, 0x14, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, -0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, -0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x82, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, -0x94, 0x05, 0x40, 0x02, 0x81, 0x0B, 0x90, 0x93, 0x82, 0xE0, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0x9F, -0x40, 0x13, 0x90, 0x93, 0x82, 0xE0, 0x90, 0x93, 0x7A, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, 0x93, -0x79, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0x90, 0x41, 0x18, 0x93, 0xFE, 0x90, -0x93, 0x78, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, -0x06, 0xEF, 0x90, 0x40, 0xE0, 0x80, 0x07, 0x90, 0x93, 0x7A, 0xE0, 0x90, 0x40, 0xFC, 0x93, 0x90, -0x93, 0x81, 0xF0, 0x90, 0x93, 0x81, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x56, 0xF9, 0x74, 0x40, -0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x8B, 0x57, 0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x78, 0xE0, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, -0x7B, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, -0xA9, 0x5C, 0x12, 0x42, 0x9D, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, -0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, -0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, 0xFD, -0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, -0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, -0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, -0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x06, -0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, -0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, -0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, -0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, -0xA9, 0x59, 0x90, 0x00, 0x05, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, 0xE0, 0xFC, -0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0xD3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, -0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0xF0, 0x80, 0x07, 0xE4, -0x90, 0x93, 0x7B, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, -0x78, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, -0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, 0x61, -0xDA, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, -0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, 0x40, -0x03, 0xEF, 0x80, 0x1C, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, -0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, -0x9E, 0x90, 0x93, 0x83, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, 0x23, -0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, -0x94, 0x01, 0x40, 0x0F, 0x74, 0xC6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x14, -0xF0, 0x80, 0x0F, 0x90, 0x93, 0x78, 0xE0, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0x60, 0x02, 0xE1, 0x1B, 0x12, 0x7E, 0x13, 0xE1, 0x1B, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, -0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, -0xC3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x40, 0x02, 0xE1, 0x1B, 0x90, -0x93, 0x78, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x7C, 0x08, 0xE1, 0x1B, 0x90, 0x93, 0x78, 0xE0, 0xFF, -0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xA1, -0xE9, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x19, -0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x11, 0x40, -0x2E, 0x80, 0x1F, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, -0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x03, -0x40, 0x0D, 0x90, 0x8E, 0xC5, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, 0x90, -0x93, 0x78, 0xE0, 0xFE, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, -0x87, 0xF0, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, -0x30, 0x50, 0x0A, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x74, 0x67, 0x2F, 0xA1, 0x94, 0x90, 0x8E, 0xC5, -0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x89, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xEE, 0x24, -0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, -0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x78, 0xE0, -0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, -0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, 0x93, -0x78, 0xE0, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x7A, -0xE0, 0x6F, 0x60, 0x56, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, -0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x93, 0x87, 0x74, 0x05, 0xF0, 0x80, 0x11, -0xEF, 0xD3, 0x94, 0x39, 0x90, 0x93, 0x87, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, -0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, -0xFE, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x78, -0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x80, 0x2F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, -0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x90, 0x93, -0x78, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7A, -0xE0, 0xFE, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0xEE, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFE, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, -0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, -0x11, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0xE4, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFD, 0xE1, 0x18, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xE1, 0x1B, -0x90, 0x93, 0x7B, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xE1, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, -0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x85, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x93, 0x78, 0xE0, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, -0x87, 0xF0, 0xE4, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0xD3, 0x94, 0x04, 0x50, -0x47, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, 0xF0, -0x83, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xDC, 0x93, 0xFF, 0x7E, 0x00, 0x12, -0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x85, 0xE0, 0xFE, -0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x50, 0x08, -0x90, 0x93, 0x84, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x93, 0x84, 0xE0, 0xC3, 0x13, 0xF0, 0x90, -0x93, 0x87, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x93, 0x84, 0xE0, 0x70, 0x5D, 0x90, 0x93, 0x87, -0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x70, 0x08, 0x90, -0x93, 0x87, 0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x87, 0x74, 0x01, -0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, 0x93, 0x87, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, 0x84, -0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x87, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, 0x87, -0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x80, 0xE0, -0x94, 0x03, 0x90, 0x93, 0x7F, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0xD3, -0x90, 0x93, 0x80, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x7F, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, -0x93, 0x87, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFD, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC4, 0xF5, -0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xED, 0xF0, 0x12, 0x7D, 0xD3, 0x90, 0x93, 0x78, 0xE0, 0xFF, -0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, 0x74, -0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, 0x93, -0x78, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7F, -0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, 0x93, -0x78, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFA, -0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, 0x50, 0x1C, 0x90, 0x93, 0x7F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, -0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, -0x42, 0x87, 0x80, 0x14, 0x90, 0x93, 0x78, 0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, -0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, 0x24, -0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, 0xFF, -0x9D, 0xFB, 0x74, 0xFF, 0x9C, 0xFA, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x78, 0xE0, 0x50, 0x13, -0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, 0x42, -0x87, 0x80, 0x10, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, -0xF0, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, 0xAB, -0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, -0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, -0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, -0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, -0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, -0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x78, -0xE0, 0x04, 0xF0, 0x02, 0x80, 0x79, 0x22, 0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0xF0, -0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, -0xFF, 0xC3, 0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, -0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, 0x90, -0x89, 0x01, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, -0x40, 0x40, 0x02, 0x41, 0x70, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0xE4, -0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, -0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, -0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE4, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, -0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, 0x2F, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, -0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8E, 0x04, 0xF0, 0x90, 0x41, 0x92, 0x93, 0xFE, 0x74, 0x01, 0x93, -0xFF, 0x90, 0x41, 0x5A, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, -0x13, 0xFF, 0x90, 0x93, 0x78, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, -0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, 0x12, 0x43, -0x9C, 0x74, 0x01, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0x74, 0x01, -0xF0, 0x74, 0xC2, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, 0x75, 0xF0, -0x09, 0xED, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x09, -0xED, 0x90, 0x8A, 0x84, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, 0xF0, 0x09, -0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, -0x89, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x01, 0xB9, -0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, -0x40, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, 0x90, 0x00, 0x04, -0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0xFD, 0xAF, 0x06, 0x02, 0x74, 0x42, 0x12, 0x1E, 0xF6, 0x90, 0x89, 0x01, 0xF0, 0x22, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, 0x94, 0x40, -0x40, 0x02, 0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x83, 0xF0, -0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, -0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x85, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x74, 0xFF, -0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, -0xE0, 0x90, 0x93, 0x89, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x8B, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, -0xEC, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x02, 0x67, 0x8B, 0x12, -0x1E, 0xF6, 0xF5, 0x62, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x83, 0x12, -0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x83, 0x12, -0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x59, 0xF0, 0x90, 0x00, 0x03, 0x12, -0x1F, 0x0F, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x01, 0x90, -0x93, 0x3D, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x00, 0x04, 0x12, -0x1F, 0x0F, 0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x44, 0xF0, 0xEF, 0x13, 0x13, 0x13, 0x54, -0x01, 0x90, 0x93, 0x4A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, 0x01, 0x90, -0x93, 0x46, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x00, 0x04, 0x12, -0x1F, 0x0F, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x49, 0xF0, 0xE0, 0x70, 0x38, 0x90, -0x93, 0x47, 0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x03, 0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, -0x00, 0x00, 0x03, 0x00, 0x90, 0x93, 0x86, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, -0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x3D, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, -0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x4D, 0xC1, 0x90, 0x93, 0x59, 0xE0, 0x90, 0x01, 0xE6, -0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, 0xE0, 0x25, -0x12, 0x1E, 0xF6, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x4B, -0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x45, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, -0x90, 0x93, 0x50, 0xF0, 0x22, 0x90, 0x93, 0x48, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4B, 0x74, 0x05, -0xF0, 0x90, 0x93, 0x45, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x50, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x1E, -0xF6, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, -0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x4F, -0x74, 0x05, 0xF0, 0x90, 0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4D, 0xE0, -0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x4C, 0xF0, 0x60, 0x20, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, -0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x51, 0x69, -0x90, 0x93, 0x4C, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x02, 0x43, 0xC8, 0x12, -0x1E, 0xF6, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, -0x0F, 0xFF, 0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x70, 0xFF, 0x90, 0x93, 0x36, -0xE0, 0x54, 0x8F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x38, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, -0x93, 0x3A, 0xF0, 0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0xFF, 0xD3, 0x94, 0x20, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x01, 0xF0, 0x80, 0x57, 0xEF, -0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x02, 0xF0, 0x80, 0x49, 0xEF, 0xD3, 0x94, -0x60, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0xEF, 0xD3, 0x94, 0x80, 0x50, -0x08, 0x90, 0x93, 0x37, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, 0x94, 0xA0, 0x50, 0x08, 0x90, -0x93, 0x37, 0x74, 0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, 0x50, 0x08, 0x90, 0x93, 0x37, -0x74, 0x06, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, 0x37, 0x50, 0x05, 0x74, 0x07, -0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x90, 0x93, 0x3B, 0xF0, 0x22, 0x12, -0x1E, 0xF6, 0x60, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, -0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, 0xA8, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xA9, 0xF0, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAA, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, -0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAB, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xAE, -0x05, 0xED, 0x2F, 0x90, 0x93, 0xAC, 0xF0, 0x22, 0xEF, 0x70, 0x21, 0x12, 0x1E, 0xF6, 0x30, 0xE0, -0x14, 0x90, 0x00, 0x40, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x07, 0x78, 0xE0, -0x44, 0x01, 0xF0, 0x80, 0x07, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x64, 0x01, 0x70, -0x6A, 0x12, 0x1E, 0xF6, 0x90, 0x00, 0x01, 0x30, 0xE0, 0x2E, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC0, -0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, -0x0F, 0x90, 0x06, 0xC2, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC3, 0xF0, 0x90, -0x06, 0xCC, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x2C, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC4, 0xF0, 0x90, -0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC5, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, -0x06, 0xC6, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x06, 0xCC, -0xE0, 0x44, 0x01, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x02, 0xF0, 0xEF, 0xB4, 0x02, 0x11, 0x12, -0x1E, 0xF6, 0x90, 0x06, 0xC8, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC9, 0xF0, -0xEF, 0xB4, 0x03, 0x11, 0x12, 0x1E, 0xF6, 0x90, 0x06, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0x90, 0x06, 0xCB, 0xF0, 0xEF, 0x64, 0x04, 0x70, 0x1F, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x07, -0x83, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0x6F, 0xF0, 0xEF, 0x30, -0xE1, 0x07, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, -0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0x90, 0x92, 0x6B, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6C, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6D, -0xF0, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x73, 0x70, 0xEF, 0xB4, 0x02, 0x03, 0x43, 0x14, -0x01, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x17, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, -0x18, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, -0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x19, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, -0x01, 0x7F, 0x1A, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, -0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1B, 0x02, 0x73, 0x74, 0x90, -0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, -0xA8, 0x7D, 0x01, 0x7F, 0x1C, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x1D, 0x02, 0x73, -0x74, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, -0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1E, 0x02, 0x73, 0x74, 0x12, 0x1E, 0xF6, 0xFF, 0xE4, 0xFC, -0xFD, 0xFE, 0x78, 0x18, 0x12, 0x1F, 0xB6, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, -0x93, 0x0B, 0x12, 0x43, 0x84, 0xEC, 0x54, 0x03, 0xFC, 0x12, 0x43, 0x59, 0x90, 0x93, 0x07, 0x02, -0x1F, 0xC9, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1F, 0x02, 0x73, 0x74, 0x90, 0x93, 0x83, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, -0x20, 0x02, 0x73, 0x74, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xBC, 0xF0, 0xEF, 0x30, -0xE0, 0x5C, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x4E, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, -0x74, 0x06, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x52, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x53, 0xF0, 0xA3, 0xE4, 0xF0, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x90, -0xFD, 0x55, 0x30, 0xE0, 0x05, 0x74, 0xA0, 0xF0, 0x80, 0x03, 0x74, 0xC0, 0xF0, 0x90, 0xFD, 0x56, -0x74, 0x10, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, -0xF0, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x7C, 0x00, 0x24, 0x00, 0xFF, -0xEC, 0x3E, 0xFE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFC, 0x74, 0x20, 0x2F, 0xFF, -0xE4, 0x3E, 0xFE, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0xEE, 0xF9, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x02, -0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xEC, 0xC3, 0x99, 0x50, 0x43, -0xEC, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x02, 0xE4, 0xFD, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x07, 0xAF, -0x05, 0x31, 0x8B, 0x0D, 0x80, 0xF3, 0x0C, 0x90, 0xFD, 0x10, 0xE0, 0x04, 0xF0, 0xEC, 0xB5, 0x01, -0xDA, 0xE4, 0xFD, 0xED, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0xC3, 0xEF, -0x9B, 0x74, 0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x07, 0xAF, 0x05, 0x31, 0x8B, 0x0D, 0x80, 0xE3, -0x0C, 0x80, 0xB8, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x81, 0x12, 0x54, 0x0A, 0x90, -0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x30, -0xE0, 0x08, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0xF1, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, -0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, 0xEF, 0x75, 0xF0, -0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x51, 0xF0, -0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, -0xFD, 0x52, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x90, 0xFD, 0x53, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x54, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x55, 0xF0, 0xEF, 0x75, 0xF0, 0x08, -0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x56, 0xF0, 0xEF, -0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, -0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0xFE, 0x10, 0x60, 0x05, 0xE0, -0x44, 0x01, 0xF0, 0x22, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x15, -0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, -0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x10, -0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x15, -0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x12, 0x1E, -0xF6, 0xFC, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x15, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x03, -0x12, 0x1F, 0x0F, 0xFD, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xED, -0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFD, 0x54, -0x04, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x10, 0xFF, 0xE0, 0x54, -0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x18, -0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, -0x03, 0x12, 0x1F, 0x0F, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, -0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xDF, 0x4E, -0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, -0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, -0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x04, 0xFE, 0x90, -0x93, 0x19, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, -0xEC, 0x20, 0xE0, 0x02, 0x81, 0xC3, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x25, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x16, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0x90, 0x93, 0x17, 0xF0, 0x80, 0x4E, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, -0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x93, 0x16, 0x50, -0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x16, 0x74, 0x2A, 0xF0, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, -0x90, 0x93, 0x17, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, -0x17, 0x74, 0x2A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3D, -0x90, 0x93, 0x16, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x1E, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, -0xF0, 0x90, 0x93, 0x17, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x20, 0xF0, 0x90, 0x93, 0x16, -0xE0, 0xC3, 0x13, 0x90, 0x93, 0x21, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x22, -0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, 0xE4, 0x90, 0x93, -0x11, 0xF0, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x20, 0xE0, 0x14, 0x12, 0x1E, 0xF6, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, -0x04, 0x7F, 0x01, 0x80, 0x02, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, -0x0F, 0x30, 0xE0, 0x18, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x75, -0x64, 0x04, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, -0x03, 0xF0, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x80, -0x2B, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x80, 0x1C, -0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x93, 0x27, 0x74, 0x02, 0xF0, 0x80, 0x0D, 0x90, -0x93, 0x1D, 0xE0, 0xB4, 0x07, 0x06, 0x90, 0x93, 0x27, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x1D, -0xF0, 0x80, 0x64, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x90, 0x93, 0x83, 0x30, 0xE0, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, -0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0xB1, 0x5F, 0x90, 0x00, 0x40, 0x74, 0x20, 0xF0, -0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x13, 0x13, 0x13, 0x54, -0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x7B, -0x01, 0x7A, 0x93, 0x79, 0x83, 0x12, 0x55, 0x67, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x00, -0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, -0x93, 0x26, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, -0x90, 0x93, 0x04, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x55, 0xB2, 0x90, 0x93, -0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x5E, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0x93, 0x15, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0x90, -0x93, 0x26, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, -0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, -0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, -0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, 0x28, 0x74, -0x02, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, -0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, -0x90, 0x93, 0x23, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x29, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x1C, 0xE0, -0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, -0xFB, 0xF0, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xE1, -0xF0, 0x22, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, -0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, 0x1F, 0xD5, 0x20, 0x08, 0x30, 0x70, 0x90, -0x93, 0x0B, 0x12, 0x1F, 0xD5, 0xC0, 0x08, 0x30, 0x70, 0xE4, 0x90, 0x93, 0x11, 0xF0, 0xA3, 0xF0, -0x43, 0xE8, 0x04, 0x90, 0xFD, 0x68, 0x74, 0x02, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x44, 0x10, 0xF0, -0x90, 0x07, 0x83, 0xE4, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x04, 0x64, 0xE4, 0xF0, -0x90, 0x00, 0x40, 0x74, 0x20, 0xF0, 0xB1, 0x5F, 0x90, 0x93, 0x2C, 0x74, 0x01, 0xF0, 0x7D, 0x04, -0x7F, 0x02, 0x02, 0x3A, 0xAD, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, -0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x24, 0x02, 0x73, 0x74, 0x12, 0x1E, -0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, -0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x1A, -0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x90, 0x00, -0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x1B, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, -0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x26, 0x02, -0x73, 0x74, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xB0, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xAE, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0xAF, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x46, -0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, 0x60, 0x43, 0xC3, 0x90, 0x94, 0x47, 0xE0, -0x94, 0x88, 0x90, 0x94, 0x46, 0xE0, 0x94, 0x13, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, -0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x46, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, -0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x94, 0x47, 0xE0, 0x94, 0x64, 0x90, 0x94, 0x46, 0xE0, -0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, -0x22, 0x90, 0x93, 0xE2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xE6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, -0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xE6, 0x12, 0x43, 0x90, 0xD3, 0x12, 0x43, -0x73, 0x50, 0x41, 0x90, 0x93, 0xE6, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xE2, 0x12, 0x43, -0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x7B, 0x01, -0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, 0x1B, 0x90, 0x93, 0xE6, 0x12, 0x43, 0x84, 0xEF, -0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0xE6, 0x12, -0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xE6, 0x02, 0x43, 0x84, 0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, -0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x90, 0xC3, 0x12, 0x43, 0x73, -0x90, 0x93, 0xB4, 0x60, 0x67, 0x12, 0x43, 0x84, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xC0, 0x12, 0x1F, -0xC9, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x84, 0xF1, 0x51, 0x90, 0x93, 0xC4, 0x12, 0x1F, 0xC9, 0x90, -0x93, 0xB8, 0x12, 0x43, 0x84, 0x12, 0x43, 0x66, 0x90, 0x93, 0xC0, 0x12, 0x43, 0x90, 0x12, 0x43, -0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xC4, 0x12, 0x43, 0x84, 0xA9, -0x07, 0x90, 0x93, 0xBC, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, 0xD0, 0x02, -0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, 0x90, 0x93, 0xC8, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, -0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xC8, 0x80, 0x0A, 0x12, 0x43, 0x84, 0xC0, -0x06, 0xC0, 0x07, 0x90, 0x93, 0xBC, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0xD0, -0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xEA, -0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xEE, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, -0x00, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x93, -0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x14, -0x12, 0x51, 0xBB, 0xBF, 0x01, 0x0B, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, -0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x2D, 0xE0, 0x20, 0xE0, 0x24, 0x90, 0x93, 0x47, 0xE0, 0x60, -0x1E, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x13, 0x90, 0x93, 0xEE, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xEE, 0x12, 0x55, 0x67, 0x12, -0x54, 0x4B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, -0x4E, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x47, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, -0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x52, -0x90, 0x94, 0x4E, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, -0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4C, 0x90, -0x94, 0x4E, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, -0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x52, 0x90, 0x94, -0x4E, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, -0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, -0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x94, 0x3E, 0xE0, -0x54, 0xFE, 0x4F, 0xF0, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x44, 0xFE, 0x90, 0x93, 0x83, 0x12, 0x43, -0xA8, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0x94, 0x3F, 0xF0, 0x22, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0A, 0xF0, 0x90, 0xFD, 0x60, -0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0xFD, 0x63, -0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x90, 0xFD, 0x65, -0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x93, 0x6C, 0x30, 0xE6, 0x08, 0xE0, -0x54, 0x0F, 0x44, 0x50, 0xF0, 0x80, 0x16, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0xFD, 0x66, -0xE0, 0x90, 0x93, 0x73, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x66, 0x89, -0xAD, 0x07, 0x90, 0x93, 0xFA, 0xE0, 0x54, 0xF0, 0x44, 0x0C, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, -0x62, 0xE0, 0x90, 0x93, 0xFC, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0xFD, 0xF0, 0x90, 0xFD, -0x64, 0xE0, 0x90, 0x93, 0xFE, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xFF, 0xF0, 0x90, 0xFD, -0x66, 0xE0, 0x90, 0x94, 0x00, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x94, 0x01, 0xF0, 0xED, 0xB4, -0x02, 0x0B, 0x90, 0x93, 0xFA, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x80, 0x3C, 0xED, 0xB4, 0x04, -0x0B, 0x90, 0x93, 0xFA, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x80, 0x2D, 0xED, 0xF4, 0x70, 0x29, -0x90, 0x93, 0xFA, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x90, 0x93, 0x2C, 0xE0, 0x60, 0x08, 0x90, -0x93, 0xFC, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0xFC, 0xF0, 0xE4, 0x90, 0x93, 0xFD, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xFC, 0x90, -0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0xFA, 0x02, 0x66, 0x89, 0xAD, 0x07, 0x90, 0x93, -0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0E, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, -0x6F, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, -0x71, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, -0x73, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0xED, 0xB4, 0x01, 0x11, 0x90, 0x93, -0x6C, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x6E, 0x74, 0x01, 0xF0, 0x80, 0x13, 0xED, -0xB4, 0x02, 0x0F, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x93, 0x6E, 0x74, -0x02, 0xF0, 0x90, 0x93, 0x6C, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x13, 0x7B, 0x01, 0x7A, 0x93, -0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x12, 0x66, 0x89, 0x22, -0x90, 0x93, 0x47, 0xE0, 0x60, 0x27, 0x90, 0x93, 0x4A, 0xE0, 0x70, 0x21, 0x90, 0x93, 0x18, 0xE0, -0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x44, -0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, -0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xA1, 0x16, 0x90, 0x93, 0x1D, 0xE0, -0x64, 0x01, 0x70, 0x39, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x94, 0x4B, 0xE0, 0x60, -0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x29, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, -0x4B, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, -0xA1, 0x01, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, 0x27, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, -0xE0, 0x64, 0x04, 0x70, 0x3A, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x94, 0x4B, 0xE0, -0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x29, 0xE0, 0x04, 0xF0, 0xE4, 0x90, -0x94, 0x4B, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, -0x02, 0xA1, 0x01, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x22, 0x90, -0x93, 0x1D, 0xE0, 0x64, 0x06, 0x60, 0x02, 0x81, 0xC5, 0x90, 0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x0F, -0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x27, 0x30, 0xE0, 0x4E, 0xA1, 0x13, 0x90, -0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, -0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0x81, 0xD4, 0x90, 0x93, 0x2A, -0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, -0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, -0x64, 0x80, 0x94, 0x80, 0x90, 0x93, 0x27, 0x40, 0x02, 0xA1, 0x13, 0x74, 0x02, 0xF0, 0x22, 0x90, -0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x27, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, -0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, -0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, -0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, -0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x58, 0x90, 0x07, -0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x07, 0x70, 0x49, 0x90, 0x93, 0x2A, -0xE0, 0xB4, 0x04, 0x05, 0x90, 0x93, 0x27, 0x80, 0x3A, 0x90, 0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, -0x3F, 0x30, 0xE0, 0x0C, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x27, 0x80, 0x23, -0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x27, 0x90, 0x93, 0x2A, 0xE0, 0x04, -0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, -0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x3C, 0x90, 0x93, 0x15, 0xE0, -0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x22, 0x90, -0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, -0x78, 0x30, 0xE0, 0x24, 0x80, 0x0E, 0x90, 0x93, 0x18, 0xE0, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, -0xE0, 0x02, 0x80, 0x14, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x13, -0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x03, 0xF0, 0x22, 0x74, 0x01, 0xF0, 0x22, -0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x12, 0x90, 0x93, -0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2A, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x21, -0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x06, 0x92, -0x74, 0x04, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, -0x27, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x5D, 0xE0, 0xFF, 0x90, 0x93, 0x16, 0xE0, -0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, -0x27, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x26, 0x74, 0x01, 0xF0, -0x90, 0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x05, -0x22, 0xE4, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, -0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x51, 0x48, 0xE4, 0x90, 0x94, -0x4B, 0xF0, 0x22, 0x00, 0x8C, 0xC1, -}; - - -u8 Rtl8723UFwUMCBCutImgArrayWithoutBT[Rtl8723UUMCBCutImgArrayWithoutBTLength] = { -0x02, 0x23, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x02, 0x01, 0x10, 0x06, 0xE0, 0x4A, 0x01, 0x00, -0x03, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4A, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x59, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x61, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x61, 0xDA, 0x00, 0x00, -0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, 0x00, 0x04, 0x06, 0x05, 0x04, 0x02, -0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, 0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, -0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, -0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x18, 0x22, 0x21, 0x20, 0x18, -0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, 0x20, 0x08, 0x00, 0x20, 0x22, 0x21, -0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, 0x22, 0x20, 0x18, 0x08, 0x00, 0x20, -0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, 0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, -0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, 0x10, 0x00, 0x00, 0x30, 0x31, 0x20, -0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, -0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, -0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, -0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, -0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, -0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, -0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, -0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, -0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, -0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, -0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, -0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, -0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, -0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, 0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, -0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, -0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, -0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, 0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, -0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, -0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, -0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, -0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, -0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, -0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, -0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, -0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, -0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, -0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, -0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, -0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, -0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, -0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, -0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, -0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, -0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, -0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, -0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, -0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, -0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, -0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, -0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, -0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, -0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, -0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, -0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, -0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, -0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, -0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, -0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, -0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0x90, 0x93, 0x07, 0xF0, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xDD, -0x90, 0x93, 0x51, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x60, -0x03, 0x02, 0x44, 0xDD, 0x02, 0x44, 0xDA, 0x90, 0x93, 0x38, 0xE0, 0x04, 0xF0, 0x53, 0x66, 0xEF, -0x90, 0x93, 0x4F, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0x30, 0xE0, 0x3A, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x0F, 0xB5, 0x07, -0x0A, 0x90, 0x93, 0x30, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, 0x90, 0x93, 0x2D, 0xE0, 0xC4, -0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x4F, 0xE0, 0xB5, -0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x2D, -0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x07, 0x74, 0x5A, 0xF0, -0x90, 0x93, 0x07, 0xE0, 0xFF, 0x90, 0x93, 0x3F, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, -0x38, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x0D, 0xE5, 0x62, 0xB4, -0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x51, 0x9C, 0x22, 0xEF, 0x60, -0x0F, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, -0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x02, -0x55, 0xE5, 0x22, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0xA3, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0xAB, 0xE5, 0x62, 0x64, -0x01, 0x60, 0x03, 0x02, 0x46, 0xAB, 0xE5, 0x65, 0x14, 0x60, 0x29, 0x24, 0xFD, 0x60, 0x25, 0x24, -0x02, 0x24, 0xFB, 0x50, 0x02, 0x80, 0x23, 0x90, 0x93, 0x37, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, -0xA3, 0xE0, 0x60, 0x16, 0x90, 0x93, 0x37, 0xE0, 0x70, 0x0A, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x93, -0x37, 0xF0, 0x80, 0x00, 0x90, 0x93, 0x01, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, -0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x91, -0xEF, 0x70, 0x04, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x93, 0x01, 0xE0, 0x70, 0x03, 0x02, 0x46, 0x9B, -0x43, 0x66, 0x10, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, -0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, -0x93, 0x2E, 0x80, 0x2D, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, -0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, -0x98, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x31, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x2E, 0xE0, 0x80, 0x2D, 0x90, 0x93, 0x4F, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, -0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, -0x48, 0x90, 0x93, 0x4F, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x04, -0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, -0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, -0x12, 0x48, 0xF4, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x93, 0x2B, 0xE0, 0xFF, 0x90, 0x93, -0x4F, 0xE0, 0xD3, 0x9F, 0x40, 0x08, 0x90, 0x93, 0x2C, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, -0x93, 0x2C, 0xF0, 0x90, 0x93, 0x4F, 0xE0, 0x90, 0x93, 0x2B, 0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, -0x40, 0x46, 0xE4, 0xF0, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x4D, 0xE0, 0x70, 0x03, -0x12, 0x4F, 0x63, 0x90, 0x93, 0x50, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, 0x48, 0xF0, 0xE4, 0xF5, -0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, -0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x4C, 0x80, 0x09, 0x43, 0x66, 0x01, 0x12, -0x51, 0x2B, 0x90, 0x93, 0x48, 0x74, 0x01, 0xF0, 0x12, 0x51, 0x4C, 0x90, 0x93, 0x98, 0xE0, 0x30, -0xE0, 0x09, 0x12, 0x67, 0x4A, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x07, -0xF0, 0xA3, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x47, 0xA2, -0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x47, 0xA2, 0x90, 0x93, 0x07, 0x04, 0xF0, 0xE4, 0x90, -0x93, 0x37, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, -0x90, 0x93, 0x07, 0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x04, 0x90, 0x93, 0x07, 0xF0, -0x90, 0x93, 0x07, 0xE0, 0x70, 0x03, 0x02, 0x47, 0xA2, 0x43, 0x66, 0x10, 0x90, 0x93, 0x2D, 0xE0, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x32, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, -0xE0, 0xD3, 0x9F, 0x50, 0x09, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x2E, 0xE0, 0x80, 0x4A, 0xE4, 0xF5, -0x48, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, -0x03, 0xA4, 0xFF, 0x90, 0x93, 0x2E, 0xE0, 0x04, 0x2F, 0x80, 0x2D, 0x90, 0x93, 0x4F, 0xE0, 0x64, -0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, -0x46, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0x14, 0x75, 0xF0, 0x03, -0xA4, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, -0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, -0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x12, 0x51, 0x4C, 0x90, 0x05, 0x22, -0xE4, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x09, 0x12, 0x67, 0x4A, 0x90, 0x05, 0x22, 0x74, -0xFF, 0xF0, 0x22, 0xE4, 0xF5, 0x66, 0xF5, 0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, -0x50, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x93, 0x49, 0xF0, 0x90, 0x93, 0x4E, 0x04, 0xF0, 0x90, -0x93, 0x37, 0xF0, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x93, 0x46, 0x74, -0x05, 0xF0, 0xE4, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x93, 0x44, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, -0x93, 0x3F, 0xF0, 0x90, 0x93, 0x42, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x3C, 0x74, 0x14, 0xF0, 0x90, -0x93, 0x47, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x93, 0x33, 0xF0, 0x90, 0x93, -0x71, 0xF0, 0x90, 0x93, 0x43, 0xF0, 0x90, 0x93, 0x53, 0xF0, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x93, -0x34, 0xF0, 0x90, 0x93, 0x4D, 0xF0, 0x90, 0x93, 0x3E, 0xF0, 0x90, 0x93, 0x3B, 0xF0, 0x90, 0x93, -0x48, 0xF0, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x3D, 0xF0, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x93, -0x40, 0xF0, 0x90, 0x93, 0x70, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, -0x2D, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x93, 0x30, 0xF0, 0x22, 0x8E, 0x69, 0x8F, 0x6A, 0xAD, -0x6A, 0xAC, 0x69, 0xAF, 0x68, 0x12, 0x44, 0xDE, 0xAF, 0x6A, 0xAE, 0x69, 0x90, 0x04, 0x80, 0xE0, -0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, -0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, -0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, -0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, -0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, -0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, -0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, -0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, -0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x6C, 0x8D, 0x6D, 0xE5, -0x6C, 0x54, 0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x6C, 0x30, 0xE2, 0x30, -0xE5, 0x63, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0x69, 0xE5, 0x63, 0x30, 0xE3, 0x10, 0xE5, -0x6C, 0x20, 0xE3, 0x0B, 0x12, 0x4D, 0x9D, 0xEF, 0x60, 0x53, 0x12, 0x51, 0x05, 0x80, 0x4E, 0xE5, -0x63, 0x20, 0xE3, 0x49, 0xE5, 0x6C, 0x30, 0xE3, 0x44, 0xAF, 0x6D, 0x12, 0x50, 0x8A, 0x80, 0x3D, -0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x6C, 0x20, 0xE3, 0x09, 0x12, 0x4D, 0x9D, -0xEF, 0x60, 0x2A, 0x12, 0x51, 0x05, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, 0xE5, 0x6C, -0x20, 0xE2, 0x09, 0x12, 0x4B, 0x16, 0xEF, 0x60, 0x14, 0x12, 0x50, 0xB3, 0xE5, 0x63, 0x54, 0x0F, -0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4C, 0x72, 0xEF, 0x60, 0x03, 0x12, 0x51, 0xB0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x01, 0xF0, 0xE0, -0x54, 0xC0, 0x70, 0x11, 0x90, 0x93, 0x48, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, -0x12, 0x51, 0x9C, 0x80, 0x0F, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x4D, 0xE0, 0x70, -0x03, 0x12, 0x4F, 0x63, 0x90, 0x93, 0x01, 0xE0, 0x30, 0xE6, 0x15, 0x43, 0x66, 0x01, 0x90, 0x93, -0x50, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x51, 0x2B, 0x80, 0x0E, 0x12, 0x4F, 0x1D, 0x80, 0x09, -0x90, 0x93, 0x48, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x93, -0x01, 0xE0, 0x30, 0xE7, 0x23, 0x43, 0x66, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x42, 0xE0, 0xF5, -0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, -0xF0, 0x90, 0x93, 0x51, 0x74, 0x01, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, 0xEF, 0x64, 0x01, 0x70, -0x48, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, -0x01, 0x36, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, -0x3A, 0x3F, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x48, 0xF0, -0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x67, 0x4A, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, -0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B, 0xF0, 0xA3, -0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, -0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x06, -0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4E, 0x3E, 0xE5, 0x62, 0x20, 0xE0, 0x05, 0xE4, 0x90, 0x93, -0x39, 0xF0, 0x22, 0x02, 0x4A, 0xD1, 0x02, 0x52, 0xA5, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, -0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, -0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, -0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, -0x80, 0x90, 0x4F, 0xE3, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, -0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, -0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, -0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, -0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, -0xB9, 0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, -0x02, 0xF0, 0x80, 0x53, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, 0x01, 0xB9, -0x74, 0x04, 0xF0, 0x80, 0x42, 0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, -0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x28, 0x90, -0x93, 0x39, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, 0x93, 0x43, -0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, -0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, -0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, 0x64, 0x02, 0x60, 0x06, -0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, 0x37, 0xF0, 0x90, 0x06, -0xAA, 0xE0, 0x90, 0x93, 0x4E, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x70, 0x07, 0x90, 0x93, 0x4E, 0xE0, -0xFF, 0x80, 0x05, 0x90, 0x93, 0x37, 0xE0, 0xFF, 0x90, 0x93, 0x37, 0xEF, 0xF0, 0x90, 0x93, 0x39, -0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x05, -0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x53, -0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x49, -0x82, 0x22, 0x90, 0x93, 0x70, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, 0x90, 0x93, 0x70, -0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0x7D, 0x40, 0x7F, 0x93, 0x12, 0x53, 0xB6, 0x90, 0x00, -0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x28, 0xE0, 0x54, 0xFC, -0xFD, 0x7F, 0x28, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, -0x53, 0xB6, 0x7F, 0x01, 0x12, 0x4D, 0x45, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, 0xFD, 0xE4, 0xFF, -0x12, 0x53, 0xB6, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, 0x53, 0xB6, 0x90, -0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x53, 0xB6, 0x7F, 0x14, 0x7E, 0x00, 0x02, -0x3B, 0x09, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, -0x80, 0x54, 0xE5, 0x18, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x48, 0xE5, 0x64, -0x54, 0x0F, 0xD3, 0x94, 0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x37, 0x90, -0x02, 0x87, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x29, 0x90, 0x02, 0x86, -0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, 0x90, 0x93, 0x3A, 0xE0, -0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, -0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, -0x93, 0x21, 0x12, 0x43, 0xC8, 0x12, 0x51, 0xC3, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x12, 0x1E, -0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, 0x70, 0x44, -0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0xFD, 0xE4, 0xFF, 0x12, 0x4F, 0xA5, 0x80, 0x29, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x4F, 0xA5, 0x1F, 0x80, 0x14, 0x90, 0x93, 0x21, -0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x4F, 0xA5, 0xE4, -0xFF, 0x12, 0x4A, 0x0C, 0x22, 0x8F, 0x70, 0xE4, 0x90, 0x93, 0xE3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, -0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x70, 0x60, 0x3E, 0xC3, 0x90, -0x93, 0xE4, 0xE0, 0x94, 0x88, 0x90, 0x93, 0xE3, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, -0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0xE3, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, -0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0xE4, 0xE0, 0x94, 0x32, 0x90, 0x93, 0xE3, -0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x12, 0x51, 0x83, -0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, 0x93, 0x4C, -0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x49, 0xE0, 0x60, -0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x04, -0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, -0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, -0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x20, 0x12, 0x53, 0xB6, 0x7F, 0xF4, 0x7E, 0x01, 0x12, -0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, 0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x53, 0xB6, 0x90, 0x00, -0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, 0x28, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, -0xFD, 0x7F, 0x08, 0x12, 0x53, 0xB6, 0xE4, 0xFF, 0x12, 0x4D, 0x45, 0x7F, 0x64, 0x7E, 0x00, 0x12, -0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, 0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x53, 0xB6, 0xE4, 0xFF, -0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, 0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, -0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, 0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, -0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, 0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, -0x45, 0xE0, 0x9D, 0x90, 0x93, 0x44, 0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x93, 0x44, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, -0xC0, 0xD0, 0x8F, 0x68, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x6B, -0x74, 0xFF, 0xF0, 0x12, 0x8A, 0x65, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0x69, 0xE0, 0xFF, 0x7D, 0x01, -0x12, 0x58, 0x95, 0x12, 0x48, 0x5B, 0x90, 0x05, 0x22, 0xE5, 0x6B, 0xF0, 0x80, 0x0D, 0x90, 0x93, -0x69, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x95, 0x12, 0x48, 0x5B, 0x90, 0x04, 0x1F, 0x74, 0x20, -0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x3D, 0x90, -0x93, 0x50, 0xE0, 0x60, 0x27, 0x12, 0x48, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, -0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, -0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x22, 0xE5, 0x63, 0x54, 0x0F, -0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x22, 0x90, 0x01, 0x5F, -0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, -0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, -0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x49, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, -0xC3, 0x94, 0x0C, 0x50, 0x0D, 0x12, 0x48, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x03, 0x12, -0x67, 0x4A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x4D, 0x74, 0x01, 0xF0, -0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xD3, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xD3, -0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x93, 0xD3, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xD3, -0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, 0x24, 0x02, 0x70, 0x32, -0x80, 0x0A, 0x90, 0x93, 0x4E, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x37, 0xF0, 0xE4, 0x90, 0x93, 0x53, -0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x47, 0xE0, 0x90, 0x93, 0x4E, 0xF0, 0x80, 0x05, 0x90, -0x93, 0x4E, 0xED, 0xF0, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x93, 0x37, 0xF0, 0x90, 0x93, 0x53, 0x74, -0x01, 0xF0, 0x22, 0x48, 0x93, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x93, -0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0x5E, 0x00, 0x41, 0x93, 0x6D, -0x00, 0x41, 0x93, 0xE9, 0x00, 0x41, 0x93, 0x2B, 0x00, 0x41, 0x93, 0x2C, 0x00, 0x41, 0x92, 0x69, -0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, 0x41, 0x93, 0xDF, 0x00, 0x00, 0x90, 0x01, -0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x93, -0x35, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, 0xFF, 0x74, 0x40, 0x7E, 0x00, -0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x90, 0x93, 0x4B, 0xF0, -0xEE, 0x90, 0x93, 0x4A, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x93, 0x6F, 0xE0, 0x90, 0x93, 0xD7, -0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0x6F, 0xE0, 0x90, 0x93, 0xD7, 0x60, 0x09, 0x12, 0x1F, 0xD5, -0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x01, 0x10, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0xD7, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x56, 0x9D, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, -0xF0, 0xEF, 0x60, 0x0A, 0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x8B, 0x53, 0x63, -0xF0, 0x43, 0x63, 0x0C, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x07, 0x90, 0x05, 0x27, 0xE0, 0x54, -0x7F, 0xF0, 0x22, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, -0x8A, 0x65, 0xEF, 0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, -0x3A, 0x93, 0x12, 0x54, 0x14, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0xE5, 0x64, 0x30, 0xE6, -0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, -0x53, 0x64, 0xBF, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x83, 0xE0, 0x30, 0xE0, -0x03, 0x75, 0x64, 0x02, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, -0x05, 0x7F, 0x01, 0x12, 0x4E, 0x8B, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x90, 0x93, 0x98, 0xE0, -0x30, 0xE0, 0x07, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x3D, 0xE0, 0x70, -0x1A, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0x68, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, -0x95, 0x8E, 0x6E, 0x8F, 0x6F, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x3E, 0xE0, -0x60, 0x16, 0x90, 0x93, 0x41, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x3B, 0xE0, 0x90, 0x07, 0x78, 0x60, -0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0xEA, 0xEF, 0xF0, 0x12, 0x56, -0x14, 0x90, 0x93, 0xEA, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, -0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, -0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x98, 0xE0, -0x30, 0xE0, 0x05, 0xAF, 0x64, 0x02, 0x5F, 0x72, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, 0xF4, 0x22, -0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0x02, 0x12, 0x4D, 0xEF, 0x53, 0x63, 0xF0, 0x43, -0x63, 0x02, 0x22, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x38, 0xF0, 0xF5, 0x66, 0x22, 0x90, -0x02, 0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, -0x43, 0xF7, 0x51, 0xFA, 0x00, 0x40, 0x52, 0x22, 0x00, 0x80, 0x52, 0x4D, 0x01, 0x00, 0x52, 0x61, -0x02, 0x00, 0x52, 0x79, 0x04, 0x00, 0x00, 0x00, 0x52, 0x96, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, -0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, -0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0x80, 0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, -0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, -0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, -0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, -0x35, 0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, -0x2D, 0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, -0xFF, 0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, -0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1F, -0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x0C, 0xF0, 0xA3, 0xF0, 0x12, 0x60, 0xFB, 0x75, -0x8E, 0x02, 0x91, 0xE6, 0x12, 0x60, 0x52, 0x90, 0x93, 0x70, 0xEF, 0xF0, 0x12, 0x60, 0x65, 0x90, -0x93, 0x72, 0xEF, 0xF0, 0x12, 0x60, 0x71, 0x90, 0x93, 0x54, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, -0xF5, 0x18, 0xF5, 0x0D, 0xF5, 0x62, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, -0xF0, 0x12, 0x7E, 0x58, 0x12, 0x47, 0xA3, 0x12, 0x37, 0x1C, 0x7F, 0x03, 0x12, 0x88, 0x1B, 0x71, -0x8D, 0x12, 0x60, 0x16, 0x12, 0x60, 0x89, 0x12, 0x60, 0x9E, 0x12, 0x60, 0x34, 0x12, 0x45, 0x02, -0x12, 0x61, 0x03, 0x91, 0xCE, 0x90, 0x93, 0x0E, 0xE5, 0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, -0xE0, 0x44, 0x40, 0xF0, 0x71, 0xFE, 0x75, 0xE8, 0x03, 0x43, 0xA8, 0x85, 0xD2, 0xAF, 0x12, 0x82, -0xBB, 0x51, 0x9B, 0x12, 0x60, 0xA5, 0x90, 0x93, 0x0C, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xA5, 0x90, -0x01, 0xC4, 0xF0, 0x74, 0x52, 0xA3, 0xF0, 0xE5, 0x18, 0x30, 0xE4, 0x0A, 0xC2, 0xAF, 0x53, 0x18, -0xEF, 0xD2, 0xAF, 0x12, 0x67, 0x8F, 0xE5, 0x18, 0x30, 0xE6, 0x0A, 0xC2, 0xAF, 0x53, 0x18, 0xBF, -0xD2, 0xAF, 0x12, 0x76, 0x54, 0xE5, 0x18, 0x30, 0xE7, 0x0A, 0xC2, 0xAF, 0x53, 0x18, 0x7F, 0xD2, -0xAF, 0x12, 0x82, 0x61, 0xC2, 0xAF, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0xBF, 0x01, 0x0D, 0x90, 0x93, -0x3A, 0x74, 0x01, 0xF0, 0x31, 0x9C, 0xE4, 0x90, 0x93, 0x3A, 0xF0, 0xD2, 0xAF, 0x90, 0x01, 0xBD, -0xE5, 0x63, 0xF0, 0x90, 0x93, 0x50, 0xE0, 0x90, 0x01, 0xBC, 0xF0, 0x80, 0x99, 0x90, 0x01, 0x3C, -0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, -0xF0, 0xFD, 0x7F, 0x54, 0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x55, 0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x56, -0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, -0x83, 0x00, 0xED, 0xF0, 0x71, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xFD, 0x7F, 0x50, 0x71, 0xB6, 0xE4, 0xFD, 0x7F, 0x51, 0x71, 0xB6, 0xE4, 0xFD, 0x7F, 0x52, 0x71, -0xB6, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xF0, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, -0x22, 0x74, 0xFF, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xB4, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xB8, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, -0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x71, 0xFE, 0x71, 0xF7, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, -0xF0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, -0x44, 0x20, 0xF0, 0x90, 0x93, 0x41, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, -0x93, 0x34, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x4D, 0xF0, 0xFF, 0x7E, 0x08, 0x12, 0x2C, 0x6E, -0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0xEC, 0x54, 0xFD, 0xFC, -0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, -0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x22, 0xE4, -0xFF, 0x11, 0x56, 0x90, 0x93, 0x52, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xB8, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB8, 0xD1, 0x99, 0x90, 0x07, 0x78, 0x74, 0x01, -0xF0, 0x90, 0x93, 0x48, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, -0xE0, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x93, 0xE2, 0xF0, 0x90, 0x93, 0xE0, 0xE0, 0x54, 0x7F, -0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x6C, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, -0x80, 0xFD, 0x7F, 0x80, 0x61, 0xB6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x8A, 0x65, 0xEF, -0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x91, 0x14, 0x90, 0x93, 0x9F, 0x74, 0x02, 0xF0, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x9F, 0xE0, 0x90, 0x93, 0xEB, 0xF0, -0x6F, 0x70, 0x02, 0xA1, 0xDC, 0xEF, 0x14, 0x60, 0x3B, 0x14, 0x60, 0x5F, 0x14, 0x70, 0x02, 0xA1, -0xB6, 0x24, 0x03, 0x60, 0x02, 0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x03, 0x04, 0xD1, 0xE4, -0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x02, 0x04, 0xD1, 0xFC, 0xA1, 0xDC, 0x90, 0x93, 0xEB, -0xE0, 0xB4, 0x04, 0x04, 0xF1, 0x00, 0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0x64, 0x01, 0x70, 0x7C, -0xD1, 0xE6, 0x80, 0x78, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x03, 0x04, 0xF1, 0x35, 0x80, 0x6C, -0xEF, 0xB4, 0x02, 0x04, 0xF1, 0x04, 0x80, 0x64, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x04, 0x04, -0xF1, 0x1A, 0x80, 0x58, 0xEF, 0x70, 0x55, 0xD1, 0x01, 0x80, 0x51, 0x90, 0x93, 0xEB, 0xE0, 0xB4, -0x03, 0x04, 0xF1, 0x25, 0x80, 0x46, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x01, 0x04, 0x91, 0xF6, 0x80, -0x3B, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x04, 0x04, 0xF1, 0x11, 0x80, 0x30, 0x90, 0x93, 0xEB, 0xE0, -0x70, 0x2A, 0xB1, 0xE1, 0x80, 0x26, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x01, 0x04, 0xB1, 0xE5, -0x80, 0x1A, 0xEF, 0xB4, 0x02, 0x04, 0xB1, 0xFD, 0x80, 0x12, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, -0x04, 0x05, 0x12, 0x44, 0xFF, 0x80, 0x05, 0xEF, 0x70, 0x02, 0xB1, 0xF9, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD1, 0x01, 0x81, 0xF6, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, -0xBF, 0xF0, 0x90, 0x93, 0x9F, 0x74, 0x03, 0xF0, 0x22, 0xD1, 0x01, 0x80, 0xE8, 0xD1, 0x14, 0x80, -0xE4, 0x90, 0x01, 0x3E, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, 0x90, 0x93, 0x9F, -0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xAC, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xB0, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, -0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x41, 0xE0, -0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x0A, 0x31, 0x83, -0xEF, 0x64, 0x01, 0x60, 0x03, 0x12, 0x4F, 0x63, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x1C, 0x7F, 0x01, -0x11, 0x56, 0x90, 0x93, 0x52, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xB0, 0x12, 0x1F, 0xD5, 0x00, 0x00, -0x03, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB0, 0xD1, 0x99, 0x71, 0xF7, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x90, 0x93, 0xEC, 0xEF, 0xF0, 0xD1, 0x14, 0x90, 0x93, 0xEC, 0xE0, 0x60, 0x05, 0x90, 0x05, -0x22, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x22, 0x7F, 0x70, 0x7E, 0x08, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, 0xEE, 0x44, 0xF0, 0xA3, -0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, -0x0F, 0x90, 0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEE, 0xF0, 0x12, -0x1E, 0xF6, 0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, 0x12, 0x88, 0x6C, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x35, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x3A, 0x3F, 0x90, 0x05, 0x27, -0xE4, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x93, 0x9F, 0xF0, 0x22, 0xF1, 0x04, 0x80, 0xE6, -0xF1, 0x1A, 0x80, 0xE2, 0xD1, 0x14, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x9F, 0x04, 0xF0, -0x22, 0x91, 0x14, 0x90, 0x93, 0x9F, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, -0x93, 0x9F, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x0E, 0x90, 0x93, -0x9F, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, -0xF0, 0x90, 0x93, 0x9F, 0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0xED, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x46, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, -0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x71, 0xFE, -0x90, 0x93, 0xED, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, -0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, -0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4B, 0x90, -0x93, 0xED, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, -0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, 0xF0, 0x71, 0xFE, 0x90, 0x93, 0xED, -0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, -0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, -0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x8B, 0x21, 0x8A, 0x22, 0x89, 0x23, 0x90, 0x93, 0xBC, 0x12, 0x43, 0xC8, 0xAB, 0x24, 0xAA, 0x25, -0xA9, 0x26, 0x90, 0x93, 0xBF, 0x12, 0x43, 0xC8, 0xAF, 0x27, 0x15, 0x27, 0xEF, 0x60, 0x1E, 0x90, -0x93, 0xBF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x93, 0xBC, -0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, 0x12, 0x42, 0x53, 0x80, 0xDB, 0xAB, 0x21, 0xAA, -0x22, 0xA9, 0x23, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x01, 0xC4, 0x74, 0x48, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, -0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, -0xC7, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x11, 0x48, 0xBF, 0x01, 0x0F, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x95, 0x90, 0x04, -0x1F, 0x74, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, -0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, -0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, -0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, -0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, -0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13, -0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x93, 0x01, -0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07, -0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3B, 0x90, 0x93, 0x01, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D, -0xF0, 0x79, 0x40, 0x90, 0x93, 0x01, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0, -0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0x5E, 0xF0, 0x22, 0x90, 0x93, 0x5E, 0xE0, 0x04, -0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0B, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x02, -0x11, 0x80, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, -0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, -0x90, 0x01, 0xC4, 0x74, 0x63, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28, -0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0, -0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x61, 0x57, 0x90, 0x01, 0x34, 0x74, 0x01, -0xF0, 0x85, 0xD1, 0x0E, 0x85, 0xD3, 0x10, 0x85, 0xD4, 0x11, 0x85, 0xD5, 0x12, 0x85, 0xD6, 0x13, -0x85, 0xD7, 0x14, 0x85, 0xD9, 0x15, 0x85, 0xD2, 0x0F, 0x75, 0x24, 0x00, 0x75, 0x25, 0x00, 0x75, -0x26, 0x0E, 0x75, 0x27, 0x08, 0xFB, 0x7A, 0x93, 0x79, 0x5F, 0x12, 0x57, 0xF9, 0x90, 0x93, 0x60, -0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x70, 0x02, -0x61, 0x08, 0x90, 0x93, 0x60, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, -0x61, 0x08, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, 0x93, 0x61, 0xE0, 0x54, 0x3F, 0xF5, 0x4E, 0x90, -0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, -0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xE5, 0x4E, 0xD3, 0x94, 0x04, 0x40, 0x03, -0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, -0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x63, 0xE0, 0x54, -0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, -0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, -0x60, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2F, 0x90, 0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, -0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, -0x12, 0x42, 0x87, 0x90, 0x93, 0x62, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, -0x67, 0xAF, 0x4D, 0x12, 0x71, 0x11, 0x80, 0x60, 0x90, 0x93, 0x60, 0xE0, 0xFF, 0xC4, 0x13, 0x13, -0x54, 0x03, 0x30, 0xE0, 0x53, 0x90, 0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, 0xFD, 0xE5, 0x4D, 0x25, -0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8D, 0xF0, 0x12, 0x42, 0x87, -0x90, 0x93, 0x62, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0xEE, 0x54, -0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, 0x12, 0x70, 0xAD, 0x80, 0x1B, 0x90, 0x01, 0x02, -0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, 0x0A, 0xE4, 0xF0, -0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, -0x46, 0x90, 0x93, 0x50, 0xE0, 0x60, 0x37, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, -0x04, 0xF0, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, -0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, -0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x80, 0x09, 0x12, 0x51, -0x83, 0xBF, 0x01, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0xF9, 0x90, 0x01, -0x34, 0x74, 0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, -0x0B, 0x75, 0x4F, 0x88, 0x75, 0x50, 0x0F, 0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, 0x75, -0x50, 0x08, 0x75, 0x51, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x16, 0x90, 0x04, 0x7E, -0xE0, 0x55, 0x51, 0xF5, 0x17, 0x65, 0x16, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x16, 0x75, 0xF0, 0x08, -0xA4, 0x25, 0x4F, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, -0x19, 0x2F, 0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x24, 0x00, 0x75, 0x25, 0x00, 0x75, -0x26, 0x19, 0x75, 0x27, 0x08, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x56, 0x12, 0x57, 0xF9, 0x90, 0x93, -0x56, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0x9F, 0xE5, 0x16, -0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, -0x16, 0x90, 0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x17, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, -0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, -0x18, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, -0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x53, -0xCB, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x53, 0xFE, 0x80, 0xFE, 0xE5, 0x2C, 0x30, -0xE6, 0x06, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x30, 0xE0, 0x52, 0x90, 0x93, 0x71, -0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x93, 0x6E, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, -0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x9E, 0xE0, -0x30, 0xE0, 0x0D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x06, 0x90, 0x93, 0xA0, 0x74, 0x01, 0xF0, -0x90, 0x93, 0x98, 0xE0, 0xFF, 0x30, 0xE0, 0x0D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x06, 0x90, -0x93, 0x9A, 0x74, 0x01, 0xF0, 0x12, 0x45, 0x09, 0xF1, 0xBF, 0x90, 0x93, 0x71, 0xE4, 0xF0, 0xE5, -0x2E, 0x30, 0xE1, 0x7D, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, -0x05, 0x61, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xF5, 0x0A, 0xEC, 0x3E, 0xF5, 0x09, 0x90, 0x05, 0x22, -0xE0, 0xB4, 0xFF, 0x06, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x01, -0xE4, 0xF0, 0x43, 0x18, 0x40, 0x11, 0xF5, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0C, 0xE4, 0xFF, -0xD1, 0x91, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x53, 0xE0, 0x60, 0x1D, -0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, -0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, -0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, -0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x7B, 0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x62, 0xE0, -0xFE, 0x90, 0x05, 0x61, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xF5, 0x0C, 0xEC, 0x3E, 0xF5, 0x0B, 0xD3, -0xE5, 0x0C, 0x95, 0x0A, 0xE5, 0x0B, 0x95, 0x09, 0x40, 0x06, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, -0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0D, 0x90, 0x93, 0x39, 0xE4, 0xF0, 0x90, 0x93, 0x99, 0xE0, -0x64, 0x06, 0x60, 0x3D, 0x12, 0x4B, 0x90, 0x90, 0x93, 0x53, 0xE0, 0x60, 0x34, 0x90, 0x93, 0x4E, -0xE0, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x05, 0x73, -0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, 0x01, 0x7F, -0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x37, 0xE0, 0x14, -0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x62, 0x64, 0x01, -0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, -0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x42, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, -0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, 0x90, -0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, 0x60, 0x1C, 0x90, 0x01, -0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x51, 0xE4, 0xF0, 0x53, 0x66, -0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2E, 0x30, 0xE5, 0x1F, 0x90, -0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x14, 0xE5, 0x65, 0x60, 0x10, 0x90, 0x93, -0x50, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x51, 0x2B, 0x80, 0x03, 0x12, 0x4F, 0x1D, 0xE5, 0x2E, -0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, -0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2F, -0x30, 0xE1, 0x18, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x08, -0x90, 0x93, 0x9D, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x12, 0x4E, 0xD6, 0x74, 0x63, 0x04, 0x90, 0x01, -0xC4, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, -0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, -0x32, 0x8F, 0x71, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, -0x93, 0x01, 0xE0, 0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, -0x00, 0x79, 0x19, 0x90, 0x93, 0xCB, 0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x01, 0xD3, 0x10, -0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, 0xFF, -0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x92, -0x69, 0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, 0xFF, -0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0x12, 0x81, 0x51, 0xEF, 0x60, 0x72, 0x12, 0x82, 0x61, 0x90, 0x01, -0x3F, 0x74, 0x02, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6B, 0xF9, 0x74, -0x92, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xA8, 0x7E, 0x00, -0x7F, 0x02, 0x12, 0x1E, 0xD0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6D, 0xF9, -0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xCB, -0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xA8, 0x12, -0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x27, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x57, -0xF9, 0x90, 0x92, 0x6A, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xAE, 0x07, 0xE4, 0xFF, 0xD1, 0x91, 0xEF, 0x60, 0x19, 0x90, 0x93, 0x98, 0xE0, 0xC4, -0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0D, 0xAF, 0x06, 0x7D, 0x01, 0x12, 0x48, 0xF4, 0x12, 0x67, -0x4A, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x26, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x29, -0xE0, 0x54, 0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, 0x93, 0x26, 0x12, 0x43, -0xA8, 0x90, 0x93, 0xCB, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x29, 0xC1, 0xBE, 0x90, -0x93, 0xE0, 0xE0, 0x30, 0xE0, 0x2F, 0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x93, 0xDF, 0xE0, 0x04, -0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x93, 0xE2, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0xDF, 0xF0, -0x90, 0x93, 0xE2, 0xE0, 0xFF, 0x90, 0x93, 0xE1, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x8A, 0xA6, -0xE4, 0x90, 0x93, 0xE2, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, -0xEF, 0x30, 0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, -0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, -0x2B, 0x90, 0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, -0xE5, 0x2B, 0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, -0x43, 0x32, 0x20, 0x90, 0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, -0xF0, 0x22, 0x90, 0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, -0x02, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, 0x7F, 0x01, -0x22, 0x90, 0x93, 0x72, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, -0xFD, 0x7F, 0x33, 0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, -0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, -0x64, 0x74, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, -0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, 0x10, -0xE0, 0x94, 0x88, 0x90, 0x93, 0x0F, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, -0x80, 0xF0, 0x22, 0x90, 0x93, 0x0F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, -0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0x10, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x0F, 0xE0, 0x94, -0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, -0x01, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, -0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, -0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, -0x04, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, -0xC0, 0x06, 0xC0, 0x07, 0x7D, 0x33, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x61, 0xFF, 0xA3, 0xF0, -0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, -0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, -0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, -0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, -0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, -0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, -0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, -0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, -0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, -0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, -0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, 0x56, 0x00, 0x90, 0x01, 0xC4, 0x74, 0xDA, 0xF0, -0x74, 0x61, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, -0xE0, 0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, -0x37, 0xE5, 0x34, 0x30, 0xE0, 0x1A, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x98, 0xE0, -0x30, 0xE0, 0x0D, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0xE5, 0x34, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x44, 0x24, 0xE5, 0x34, -0x30, 0xE2, 0x36, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, -0x75, 0x48, 0x00, 0x90, 0x93, 0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, -0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, -0x08, 0x90, 0x93, 0x4C, 0xE4, 0xF0, 0x12, 0x51, 0x9C, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, -0x3C, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, -0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x49, 0xE4, -0xF0, 0x12, 0x51, 0x9C, 0xE5, 0x34, 0x30, 0xE4, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0xE5, -0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, 0x90, -0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, 0x64, -0xF0, 0x12, 0x50, 0xDC, 0x12, 0x51, 0x9C, 0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, 0x74, -0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x6D, -0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, -0x04, 0xF0, 0xE5, 0x36, 0x20, 0xE0, 0x02, 0x61, 0xAF, 0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0x90, -0x93, 0x9E, 0xE0, 0x30, 0xE0, 0x13, 0xA3, 0xE0, 0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x5E, -0x91, 0xEF, 0x60, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x11, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x5F, -0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x60, 0x3B, 0x91, 0x86, 0x90, 0x93, 0x99, 0xE0, 0xFF, 0x64, -0x06, 0x60, 0x30, 0xEF, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x04, -0xE4, 0xFF, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, -0x93, 0x99, 0xE0, 0xB4, 0x02, 0x04, 0x7F, 0x01, 0x91, 0xDA, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, -0xF4, 0xF1, 0x4A, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x75, 0x48, 0x00, 0x75, 0x49, 0x03, 0xE4, -0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0xE5, -0x36, 0x30, 0xE1, 0x3C, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0x30, 0xE0, -0x13, 0xA3, 0xE0, 0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x05, 0x7F, -0x02, 0x12, 0x55, 0x11, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x15, 0x12, 0x89, 0xF6, 0x90, 0x93, -0x99, 0xE0, 0x64, 0x06, 0x60, 0x0A, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x02, 0x91, 0xA8, -0xE5, 0x36, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xE5, 0x36, 0x30, 0xE4, 0x06, -0x90, 0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x04, -0xF0, 0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, 0x30, 0xE6, -0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, 0x3E, 0x74, -0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, 0x18, 0x80, -0xE5, 0x37, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x46, 0xAC, 0x90, 0x93, -0x4E, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x12, 0x5F, 0xBF, -0x74, 0xDA, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, -0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, -0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x98, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x30, 0xE0, 0x0A, 0xA3, 0xE0, 0x64, 0x06, 0x60, 0x04, 0x7F, 0x06, 0x91, 0xDA, 0x90, 0x93, 0x99, -0xE0, 0x64, 0x06, 0x60, 0x02, 0xF1, 0x29, 0x22, 0x90, 0x93, 0x39, 0xE0, 0x60, 0x16, 0x90, 0x93, -0x99, 0xE0, 0x70, 0x04, 0x7F, 0x05, 0x80, 0x1F, 0x90, 0x93, 0x99, 0xE0, 0x64, 0x01, 0x70, 0x19, -0x7F, 0x02, 0x80, 0x13, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x08, 0x90, -0x93, 0x99, 0xE0, 0x70, 0x04, 0x7F, 0x04, 0x91, 0xDA, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, -0xD0, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xC1, 0xAC, 0xEF, 0x12, 0x43, 0xD1, 0x65, -0x08, 0x00, 0x65, 0x43, 0x01, 0x65, 0x8A, 0x02, 0x65, 0xC5, 0x03, 0x65, 0xFE, 0x04, 0x66, 0x37, -0x05, 0x66, 0x73, 0x06, 0x00, 0x00, 0x66, 0xAC, 0xEE, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, -0x81, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xFF, 0xB4, 0x05, 0x04, 0xD1, 0xBB, 0xC1, 0xAC, 0xEF, -0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x06, -0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xD1, -0xF0, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, -0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, -0xD1, 0xE6, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, -0xC1, 0xAC, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xD1, 0xB1, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, -0x64, 0x02, 0x60, 0x02, 0xC1, 0xAC, 0xD1, 0xC5, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, -0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, -0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, 0xD1, 0xE6, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xFE, -0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, 0x80, 0x08, 0xEE, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0xD1, -0xB1, 0xF1, 0x1C, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, -0x81, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, -0x70, 0x04, 0xD1, 0xE6, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, -0xD1, 0xD0, 0x80, 0x06, 0xEE, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xF1, 0x05, 0xC1, 0xAC, 0x90, 0x93, -0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, 0xD1, 0xD0, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, -0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0x90, -0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0xF0, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, -0x02, 0xD1, 0xBB, 0xD1, 0xFB, 0x80, 0x75, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, -0xFF, 0xD1, 0xD0, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, -0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0xD1, -0xF0, 0x80, 0x0C, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x05, 0x7F, 0x01, 0x12, 0x56, 0x81, 0xF1, -0x0F, 0x80, 0x39, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, -0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, -0xD1, 0xE6, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x06, 0xE4, 0xFF, 0xD1, 0xB1, 0x80, -0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xF1, 0x36, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x12, 0x51, 0x69, 0x90, 0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x90, 0x93, 0x99, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x99, 0x04, 0xF0, 0x22, -0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, -0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x51, 0x05, 0x90, 0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, -0x7F, 0x01, 0x12, 0x50, 0x8A, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x22, 0x12, 0x54, 0x0E, 0x90, 0x93, -0x99, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x50, 0xB3, 0x90, 0x93, 0x99, 0x74, 0x03, 0xF0, 0x22, 0x90, -0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, -0xFF, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x93, 0x9D, 0xE0, 0xB4, 0x01, 0x05, -0xE4, 0xF0, 0x12, 0x4E, 0xD6, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x06, 0xF0, 0x22, 0x90, 0x93, 0x99, 0xE0, 0x64, 0x06, -0x60, 0x3C, 0xE5, 0x63, 0x54, 0x0F, 0x14, 0x60, 0x2E, 0x14, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x0E, -0x24, 0xF8, 0x70, 0x2A, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x90, 0x05, 0x22, 0xF0, 0x22, 0x90, 0x93, -0x99, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x99, 0x74, 0x03, 0xF0, -0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x0F, 0xF0, -0x90, 0x93, 0x0F, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x68, 0xDA, 0x90, 0x93, 0xE9, 0xE0, 0xFF, 0x74, -0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, -0xEF, 0x5D, 0x70, 0x03, 0x02, 0x68, 0xD3, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, -0xD0, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x75, 0x24, 0x01, 0x75, 0x25, 0x93, 0x75, -0x26, 0x10, 0x75, 0x27, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x11, 0x12, 0x57, 0xF9, 0x90, 0x93, -0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0xE9, 0x30, 0xE0, 0x59, 0xE0, -0x75, 0xF0, 0x02, 0x90, 0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x12, 0xF0, 0x90, 0x93, -0xE9, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x13, 0xF0, -0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x14, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x15, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, -0x9C, 0xE0, 0x90, 0x93, 0x16, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, -0x43, 0x9C, 0xE0, 0x90, 0x93, 0x12, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, -0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x13, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, -0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x14, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, -0x01, 0x7A, 0x93, 0x79, 0x12, 0x11, 0xDF, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x90, 0x93, 0xE9, 0xE0, -0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, -0x0F, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, -0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, -0x02, 0x67, 0xA0, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, -0x93, 0x17, 0x12, 0x43, 0xC8, 0xEF, 0x12, 0x43, 0xD1, 0x69, 0x2E, 0x01, 0x69, 0x26, 0x02, 0x69, -0x73, 0x03, 0x69, 0x7C, 0x05, 0x69, 0x85, 0x06, 0x69, 0xC8, 0x07, 0x69, 0x8D, 0x08, 0x69, 0x96, -0x0B, 0x69, 0x9F, 0x1B, 0x69, 0xA7, 0x1C, 0x69, 0x37, 0x2D, 0x69, 0x40, 0x2E, 0x69, 0xAF, 0x30, -0x69, 0x52, 0x34, 0x69, 0x49, 0x3B, 0x69, 0x5A, 0x47, 0x69, 0x6B, 0x48, 0x69, 0x63, 0x49, 0x69, -0xB8, 0x4B, 0x00, 0x00, 0x69, 0xC1, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xB9, 0x90, 0x93, -0x17, 0x12, 0x43, 0xA8, 0x02, 0x82, 0xC7, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x83, 0xA8, -0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x83, 0xF0, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, -0x84, 0x29, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xBF, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, -0x02, 0x84, 0x54, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xD5, 0x90, 0x93, 0x17, 0x12, 0x43, -0xA8, 0xE1, 0xCD, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x85, 0x14, 0x90, 0x93, 0x17, 0x12, -0x43, 0xA8, 0x02, 0x80, 0x54, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x80, 0x3C, 0x90, 0x93, 0x17, -0x12, 0x43, 0xA8, 0x02, 0x85, 0x5C, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x80, 0x80, 0x90, -0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xC5, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xA1, 0x90, -0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0xAB, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x88, -0x5A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, -0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0x90, 0x93, 0x1A, -0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x00, -0x04, 0x12, 0x1F, 0x0F, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, 0x20, 0xF0, 0x90, -0x93, 0x1A, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAD, 0x82, 0xAC, -0x83, 0x90, 0x93, 0x21, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, -0xF9, 0x74, 0x8A, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1C, 0x12, -0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x23, 0x12, 0x43, -0xA8, 0xEF, 0x12, 0x42, 0x53, 0x90, 0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, -0x0F, 0xFF, 0x90, 0x93, 0x23, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x90, -0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x21, 0xE0, -0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0x8D, 0x82, 0x8C, -0x83, 0xA3, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0xFF, 0x24, 0xC2, 0xF5, -0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFE, 0x75, 0xF0, 0x09, -0xEF, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8B, -0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, -0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x8F, 0x57, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, -0xE4, 0x34, 0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, 0x57, 0x75, 0xF0, 0x02, 0xA4, 0x24, -0x02, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0x75, 0xF0, 0x09, -0xE5, 0x57, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, 0x85, 0x83, 0x5D, 0x8F, 0x5E, 0xE5, -0x57, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0x75, 0x5F, 0x01, 0xF5, -0x60, 0x89, 0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x12, -0x43, 0xD1, 0x6B, 0x57, 0x00, 0x6B, 0x6C, 0x01, 0x6B, 0x81, 0x02, 0x6B, 0x96, 0x03, 0x6B, 0xBF, -0x04, 0x6B, 0xD4, 0x05, 0x6B, 0xE9, 0x06, 0x6C, 0x0F, 0x0C, 0x6C, 0x3C, 0x0D, 0x6C, 0x69, 0x0E, -0x6C, 0x96, 0x0F, 0x00, 0x00, 0x6C, 0xCA, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80, -0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, -0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, -0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, -0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, 0x81, 0xCA, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, -0x74, 0xF5, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x81, 0xCA, 0x90, -0x04, 0x47, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x46, 0xE0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x45, 0xE0, -0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, 0x81, 0xC1, 0x90, 0x04, 0x4B, 0xE0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4A, 0xE0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x49, 0xE0, 0x85, 0x59, 0x82, -0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, -0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, -0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, -0x12, 0x42, 0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, -0x12, 0x42, 0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, -0x50, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, -0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, -0x12, 0x1E, 0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0xAB, 0x5A, 0xE5, -0x5C, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, -0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x5F, 0xD0, -0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xC0, 0x83, -0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, -0xD0, 0x83, 0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, -0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, -0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, -0xE0, 0x4E, 0x60, 0x4B, 0x90, 0x93, 0x26, 0x74, 0x0B, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, -0x94, 0x00, 0x50, 0x02, 0xC1, 0x0F, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, -0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, -0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x0A, 0x90, 0x93, 0x26, -0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x26, 0xE0, 0x14, 0xF0, 0x80, 0xBB, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, -0x4E, 0x60, 0x47, 0x90, 0x93, 0x26, 0x74, 0x0F, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, -0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, -0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x26, 0xE0, 0xA3, 0xF0, -0x80, 0x0D, 0x90, 0x93, 0x26, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, -0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x26, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, 0x10, -0x40, 0x02, 0xC1, 0xC8, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, -0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, -0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, 0x93, 0x26, 0xE0, 0x80, -0x63, 0x90, 0x93, 0x26, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, -0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, -0x26, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, -0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, -0x4E, 0x60, 0x08, 0x90, 0x93, 0x26, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, 0x93, 0x26, 0xE0, 0x04, -0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x28, 0xF0, 0x90, 0x93, 0x27, 0xE0, 0xFF, 0x75, 0xF0, 0x09, -0xE5, 0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, 0x90, 0x93, 0x28, 0xE0, 0xFE, 0x75, -0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xE5, 0x57, 0xC3, 0x94, -0x20, 0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, -0x9F, 0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, -0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x28, 0xE0, 0xA3, 0xF0, 0x80, 0x37, 0x80, 0x2D, 0x74, -0x27, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x27, 0xE0, -0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x29, 0xEE, 0xF0, 0x80, 0x17, 0x90, 0x93, 0x28, -0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x27, 0xE0, -0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, 0x29, 0xE0, 0xFD, 0xAF, 0x57, 0x12, 0x70, 0x63, 0x90, 0x93, -0x29, 0xE0, 0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, -0x90, 0x93, 0x27, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x03, 0xF0, -0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3, -0x94, 0x03, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x8A, 0x83, 0xF0, -0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x80, 0xC4, 0x13, -0x13, 0x13, 0x54, 0x01, 0xFD, 0xAF, 0x06, 0x21, 0xDD, 0x12, 0x1E, 0xF6, 0xF5, 0x62, 0x22, 0x90, -0x93, 0x1A, 0x02, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0x90, 0x89, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, -0x90, 0x93, 0x6F, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x60, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, -0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xCE, -0x12, 0x43, 0xC8, 0x90, 0x93, 0xD1, 0xE0, 0x54, 0xF0, 0x44, 0x06, 0xFF, 0xF0, 0xED, 0x54, 0x0F, -0xC4, 0x54, 0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x93, 0xCE, 0x12, 0x43, 0xA8, 0x90, -0x93, 0xCB, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xD1, 0x12, 0x5E, 0xBE, 0xD0, 0xD0, -0x92, 0xAF, 0x22, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, -0xF0, 0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, -0x54, 0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, -0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, -0x4D, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x0E, -0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, 0x2A, 0x74, 0x27, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0x8B, 0xEF, 0xF0, 0x24, -0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x8C, 0xF0, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0x8B, 0x7D, 0x02, 0x12, 0x6F, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, -0x53, 0xE5, 0x53, 0x54, 0x1F, 0x90, 0x93, 0x03, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x88, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x93, 0x04, 0x74, 0x01, 0xF0, 0xEB, 0xC3, -0x94, 0x01, 0x40, 0x02, 0x80, 0x3B, 0x90, 0x93, 0x01, 0xE0, 0x25, 0x55, 0xFF, 0xA3, 0xF0, 0xA3, -0xE0, 0x90, 0x41, 0x9E, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x13, 0x74, 0x01, 0x25, 0x52, 0xF5, -0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x01, 0x63, 0x90, 0x93, -0x02, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEF, 0xF0, -0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, -0x06, 0xF0, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, -0x93, 0x05, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, -0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x5D, -0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, -0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x25, -0xE0, 0x25, 0xE0, 0xFF, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, -0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x0D, -0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, 0x93, 0x06, -0xE0, 0xFF, 0x90, 0x93, 0x05, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, 0x05, 0xE0, -0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, -0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, -0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, -0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, -0x90, 0x93, 0x05, 0xE0, 0xFD, 0x11, 0x63, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, -0x12, 0x90, 0x04, 0x30, 0xE0, 0x70, 0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0x04, -0xCF, 0x04, 0xF0, 0x90, 0x93, 0x05, 0xE0, 0xFF, 0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, -0x13, 0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, -0x1F, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, -0x7F, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x22, 0xF0, -0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x24, 0xF0, 0x75, -0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x25, 0xF0, 0xEC, -0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, -0x93, 0x26, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, -0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x28, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, -0xC6, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, -0x90, 0x93, 0x25, 0xE0, 0x90, 0x93, 0x22, 0xF0, 0x90, 0x93, 0x1F, 0xF0, 0xED, 0x70, 0x02, 0x61, -0xA3, 0x90, 0x93, 0x23, 0xED, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x22, -0xE0, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0x14, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0x70, -0x02, 0x61, 0xA3, 0x90, 0x93, 0x22, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0x61, 0xA3, 0xE4, -0x90, 0x93, 0x21, 0xF0, 0xEF, 0x14, 0x90, 0x93, 0x20, 0xF0, 0x90, 0x93, 0x24, 0xE0, 0xFD, 0x90, -0x93, 0x20, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, -0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, -0xF9, 0xFF, 0x90, 0x93, 0x28, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, -0x20, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, -0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x26, 0xE0, 0x5E, 0xFE, 0xA3, -0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x93, 0x20, 0xE0, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x21, -0xE0, 0x04, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0x6F, 0x60, 0x08, 0x90, -0x93, 0x20, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, 0x93, 0x23, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, -0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x93, 0x20, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x93, 0x24, 0xE0, 0x90, -0x93, 0x1F, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, -0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, -0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, -0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x93, 0x1F, 0xE0, 0xFD, 0x11, 0x63, 0x90, 0x93, -0x1F, 0xE0, 0xFF, 0x22, 0xAD, 0x07, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x11, 0x74, -0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x1F, 0xF0, -0x90, 0x93, 0x1F, 0xE0, 0xF9, 0x54, 0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, -0x12, 0x43, 0x9C, 0xE0, 0xFF, 0x90, 0x93, 0x22, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, -0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x23, 0xCB, 0xF0, 0xA3, 0xEB, -0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, -0xE0, 0x90, 0x93, 0x25, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFE, 0x25, 0xE0, -0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, -0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, -0xF0, 0xEE, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0x51, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x74, 0x28, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x93, 0x21, 0xF0, 0x90, -0x93, 0x22, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xA1, 0x8B, 0xEE, -0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, -0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x23, 0xE0, 0x5E, 0xFE, -0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x21, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, -0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0xFF, 0x90, 0x93, 0x25, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x21, -0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x93, 0x24, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x93, 0x21, 0x74, 0x17, -0xF0, 0x90, 0x93, 0x21, 0xE0, 0xFF, 0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, -0x23, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x21, 0x74, 0x18, 0xF0, 0x90, 0x93, 0x21, 0xE0, 0x90, -0x93, 0x20, 0xF0, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x42, 0x90, 0x93, 0x21, 0xE0, 0x04, 0xF0, 0x81, -0xAF, 0x90, 0x93, 0x22, 0xE0, 0xFC, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, -0x8A, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x20, 0xE0, -0x44, 0x40, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x93, 0x20, 0xE0, 0xFF, -0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, -0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, -0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, -0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, -0x93, 0x20, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90, 0x93, 0x22, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x20, 0xEF, 0xF0, 0x90, 0x93, 0x1F, -0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, -0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, -0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, -0xF0, 0xAF, 0x05, 0x90, 0x93, 0x1F, 0xE0, 0x44, 0x80, 0xFD, 0x11, 0x63, 0x90, 0x93, 0x1F, 0xE0, -0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, 0x94, -0x40, 0x40, 0x03, 0x02, 0x7E, 0x57, 0xEF, 0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, -0x90, 0x89, 0x01, 0xE0, 0xFF, 0x90, 0x8F, 0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, -0x0F, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, -0x03, 0x02, 0x7E, 0x4E, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, -0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x7E, 0x4E, 0x90, -0x93, 0x0F, 0xE0, 0x94, 0x20, 0x40, 0x09, 0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x7E, 0x57, -0x90, 0x93, 0x0F, 0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, -0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, -0x87, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x93, 0x14, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, -0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, -0x93, 0x16, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, -0x13, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, -0x10, 0xF0, 0x80, 0x14, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, -0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x10, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, -0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x19, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, -0x94, 0x05, 0x40, 0x03, 0x02, 0x79, 0xEC, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x90, 0x93, 0x11, 0xE0, -0x9F, 0x40, 0x13, 0x90, 0x93, 0x19, 0xE0, 0x90, 0x93, 0x11, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, -0x93, 0x10, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0x93, 0x11, 0xE0, 0xFF, 0x90, 0x41, 0x12, 0x93, 0xFE, -0x90, 0x93, 0x0F, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, -0x40, 0x06, 0xEF, 0x90, 0x40, 0xDA, 0x80, 0x07, 0x90, 0x93, 0x11, 0xE0, 0x90, 0x40, 0xF6, 0x93, -0x90, 0x93, 0x18, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x50, 0xF9, 0x74, -0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x8B, 0x57, 0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x0F, 0xE0, -0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, -0x93, 0x12, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x9D, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, -0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, -0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, -0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, -0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, -0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, -0x06, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, -0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, -0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, -0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, -0x58, 0xA9, 0x59, 0x90, 0x00, 0x05, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x14, 0xE0, -0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0xD3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, -0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0xF0, 0x80, 0x07, -0xE4, 0x90, 0x93, 0x12, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x12, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, -0x93, 0x0F, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, -0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x10, 0xE0, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, -0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, -0x21, 0xBB, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, -0xE0, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, -0x40, 0x03, 0xEF, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, -0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, -0xC3, 0x9E, 0x90, 0x93, 0x1A, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, -0x23, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, -0xD3, 0x94, 0x01, 0x40, 0x0F, 0x74, 0xC6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, -0x14, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, -0x83, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, -0x83, 0xE0, 0x60, 0x02, 0x81, 0xFC, 0x12, 0x73, 0xF4, 0x81, 0xFC, 0x90, 0x93, 0x10, 0xE0, 0x25, -0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, -0xFF, 0xC3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0x40, 0x02, 0x81, 0xFC, -0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x72, 0x29, 0x81, 0xFC, 0x90, 0x93, 0x0F, 0xE0, -0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, -0x61, 0xCA, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, -0x19, 0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, 0x11, -0x40, 0x2E, 0x80, 0x1F, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x11, 0xE0, -0xC3, 0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, -0x03, 0x40, 0x0D, 0x90, 0x8E, 0xC5, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, -0x90, 0x93, 0x0F, 0xE0, 0xFE, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, -0x93, 0x1E, 0xF0, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, -0x94, 0x30, 0x50, 0x0A, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x74, 0x67, 0x2F, 0x61, 0x75, 0x90, 0x8E, -0xC5, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x6A, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x06, 0xF5, 0x82, -0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xEE, -0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, -0xE0, 0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x0F, -0xE0, 0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, -0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, -0x93, 0x0F, 0xE0, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, -0x11, 0xE0, 0x6F, 0x60, 0x56, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, -0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x93, 0x1E, 0x74, 0x05, 0xF0, 0x80, -0x11, 0xEF, 0xD3, 0x94, 0x39, 0x90, 0x93, 0x1E, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, -0x01, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0xFE, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, -0x0F, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x80, 0x2F, 0x90, 0x93, 0x0F, 0xE0, 0xFF, -0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x90, -0x93, 0x0F, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, -0x11, 0xE0, 0xFE, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, -0x83, 0xEE, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFE, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, -0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, -0x01, 0x11, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, -0x83, 0xE4, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFD, 0x81, 0xF9, 0xEC, 0x64, 0x06, 0x60, 0x02, 0x81, -0xFC, 0x90, 0x93, 0x12, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xDB, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, -0x14, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x1C, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, -0x93, 0x1E, 0xF0, 0xE4, 0x90, 0x93, 0x1B, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0xD3, 0x94, 0x04, -0x50, 0x47, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, -0xF0, 0x83, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xD6, 0x93, 0xFF, 0x7E, 0x00, -0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x1C, 0xE0, -0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0x50, -0x08, 0x90, 0x93, 0x1B, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x93, 0x1B, 0xE0, 0xC3, 0x13, 0xF0, -0x90, 0x93, 0x1E, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x93, 0x1B, 0xE0, 0x70, 0x5D, 0x90, 0x93, -0x1E, 0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0x70, 0x08, -0x90, 0x93, 0x1E, 0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x1E, 0x74, -0x01, 0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, 0x93, 0x1E, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, -0x1B, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x1E, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, -0x1E, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x17, -0xE0, 0x94, 0x03, 0x90, 0x93, 0x16, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x1E, 0xF0, -0xD3, 0x90, 0x93, 0x17, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x16, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, -0x90, 0x93, 0x1E, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFD, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC4, -0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xED, 0xF0, 0x12, 0x70, 0x23, 0x90, 0x93, 0x0F, 0xE0, -0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, -0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, -0x93, 0x0F, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, -0x16, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, -0x93, 0x0F, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, -0xFA, 0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, 0x50, 0x1C, 0x90, 0x93, 0x16, 0xE0, 0xFE, 0xA3, 0xE0, -0xFF, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, -0x12, 0x42, 0x87, 0x80, 0x14, 0x90, 0x93, 0x0F, 0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x25, 0xE0, -0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, -0xFF, 0x9D, 0xFB, 0x74, 0xFF, 0x9C, 0xFA, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, -0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x0F, 0xE0, 0x50, -0x13, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, -0x42, 0x87, 0x80, 0x10, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, -0xFF, 0xF0, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, -0x00, 0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, -0x1F, 0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x25, -0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, -0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, -0x0F, 0xE0, 0x04, 0xF0, 0x02, 0x76, 0x59, 0x22, 0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, -0xF0, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, -0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, -0x83, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, -0x90, 0x89, 0x01, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, -0x94, 0x40, 0x40, 0x03, 0x02, 0x80, 0x53, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, -0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, -0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, -0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, -0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, -0xA3, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, -0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8E, 0x04, 0xF0, 0x90, 0x41, 0x8C, 0x93, 0xFE, 0x74, -0x01, 0x93, 0xFF, 0x90, 0x41, 0x54, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, -0xFE, 0xEF, 0x13, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, -0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, -0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, -0x74, 0x01, 0xF0, 0x74, 0xC2, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, -0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, -0xF0, 0x09, 0xED, 0x90, 0x8A, 0x84, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, -0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, -0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x04, 0xF0, -0x02, 0x7E, 0x9A, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x90, 0x00, 0x02, -0x12, 0x1F, 0x0F, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, -0x22, 0xEF, 0xB4, 0x40, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, -0x94, 0x40, 0x40, 0x02, 0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, -0x1A, 0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, -0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x1C, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, -0x74, 0xFF, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, -0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x20, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, -0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x22, 0xF0, 0xEE, 0xA3, -0xF0, 0xA3, 0xEC, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x1A, 0x02, 0x5F, -0x97, 0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x93, 0xDB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x93, 0xDB, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, -0xC3, 0x90, 0x93, 0xDE, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0xDD, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, -0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xDD, 0xE4, 0x75, 0xF0, 0x01, -0x12, 0x42, 0x87, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, 0x7F, 0x01, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x68, 0xE0, -0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x31, 0x51, 0xEF, 0x70, 0x02, 0x41, -0x5C, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x75, 0x27, 0x02, -0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x57, 0xF9, 0x90, 0x93, 0xC5, 0x12, 0x43, 0xA8, 0x8B, -0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, -0x54, 0x0F, 0xF5, 0x27, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0x12, 0x57, 0xF9, 0x90, 0x01, 0xAF, -0x74, 0xFF, 0xF0, 0x90, 0x93, 0x70, 0xE0, 0x64, 0x01, 0x70, 0x4A, 0x90, 0x93, 0xC2, 0x12, 0x43, -0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x75, 0x27, 0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x20, -0x12, 0x57, 0xF9, 0x90, 0x93, 0xC5, 0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, -0x93, 0xC2, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x27, 0x7B, 0x01, -0x7A, 0xFD, 0x79, 0x22, 0x12, 0x57, 0xF9, 0x90, 0x93, 0x54, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, -0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, -0x24, 0x6B, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, -0xF0, 0x0F, 0xA4, 0x24, 0x6D, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x90, 0x93, 0xC5, 0x12, 0x43, -0xC8, 0xD0, 0x01, 0xD0, 0x02, 0x31, 0x9F, 0x90, 0x92, 0x69, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, -0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, -0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, -0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, -0x1A, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, -0x1A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x50, 0xF0, 0x90, 0x00, -0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x33, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, -0x01, 0x90, 0x93, 0x34, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x3E, 0xF0, 0x90, 0x00, -0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x3B, 0xF0, 0xEF, 0x13, 0x13, -0x13, 0x54, 0x01, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, -0x01, 0x90, 0x93, 0x3D, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x00, -0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x40, 0xF0, 0xE0, 0x70, -0x38, 0x90, 0x93, 0x3E, 0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0x56, 0x90, 0x93, 0x1D, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0x56, 0x90, 0x93, 0x1D, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x90, 0x93, 0x1D, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, -0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x34, 0xE0, 0x70, 0x03, 0x12, -0x4F, 0x63, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x4C, 0xDF, 0x90, 0x93, 0x50, 0xE0, 0x90, -0x01, 0xE6, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, -0xE0, 0x25, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x3F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0x93, 0x42, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x00, 0x03, 0x12, -0x1F, 0x0F, 0x90, 0x93, 0x47, 0xF0, 0x22, 0x90, 0x93, 0x3F, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x42, -0x74, 0x05, 0xF0, 0x90, 0x93, 0x3C, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x47, 0x74, 0x05, 0xF0, 0x22, -0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x46, 0xF0, 0x90, 0x00, -0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x44, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, -0x93, 0x46, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x44, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, -0x44, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x43, 0xF0, -0x60, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, -0x93, 0x4D, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x63, 0x12, 0x51, 0x4C, 0x90, 0x93, 0x43, 0xE0, 0x90, -0x01, 0xE7, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x2D, 0xE0, 0x54, -0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xFF, 0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, -0x70, 0xFF, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x8F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0x90, 0x93, 0x2F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x30, 0xF0, 0x90, 0x00, -0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, -0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xD3, 0x94, 0x20, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, -0x01, 0xF0, 0x80, 0x57, 0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x02, 0xF0, -0x80, 0x49, 0xEF, 0xD3, 0x94, 0x60, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x03, 0xF0, 0x80, 0x3B, -0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, -0x94, 0xA0, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, -0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x06, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, -0x2E, 0x50, 0x05, 0x74, 0x07, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x93, 0x2E, 0xE0, 0x90, -0x93, 0x32, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, -0x2E, 0x90, 0x93, 0x67, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, -0x68, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x69, 0xF0, 0x90, -0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x6A, 0xF0, 0x90, 0x00, 0x04, 0x12, -0x1F, 0x0F, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x6B, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, -0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xC8, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x12, 0x1E, -0xF6, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xC1, 0xB6, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, -0xF6, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0x93, 0x9E, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, -0x01, 0xFF, 0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x08, 0xFD, 0xEF, -0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x93, 0x9E, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, -0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0x93, -0x9E, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xC1, 0xA2, -0x90, 0x93, 0x1D, 0x74, 0x21, 0xF0, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, -0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x9E, 0xE0, 0xFD, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x60, -0x31, 0xEF, 0x54, 0x04, 0xFF, 0xED, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, -0xE0, 0x15, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x3A, 0x93, 0x90, 0x93, -0x1D, 0xE0, 0x44, 0x08, 0xF0, 0x80, 0x0B, 0xE4, 0x90, 0x93, 0xA0, 0xF0, 0x7D, 0x40, 0xFF, 0x12, -0x3A, 0x22, 0x90, 0x93, 0x9E, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, -0x93, 0x1D, 0xE0, 0x44, 0x12, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, -0xE0, 0x44, 0x14, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, -0x93, 0x1D, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, -0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x1D, 0xE0, 0x90, 0x05, 0x27, -0xF0, 0x90, 0x93, 0x9F, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x11, 0x90, 0x93, 0x9E, 0xE0, -0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x0E, 0x7F, 0x01, 0x12, 0x5E, -0x91, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x55, 0x11, 0x7F, 0x02, 0x02, -0x88, 0x14, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0xE4, 0xFF, 0x12, 0x55, -0x11, 0x7F, 0x03, 0x02, 0x88, 0x14, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, -0x54, 0x02, 0xFE, 0x90, 0x93, 0x98, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x01, 0xFF, -0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, -0x4D, 0xFF, 0x90, 0x93, 0x98, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, -0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x93, 0x98, 0xF0, -0xEE, 0x54, 0x04, 0xFE, 0xEF, 0x54, 0xFB, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xE1, 0xC7, 0x90, 0x93, -0x1D, 0x74, 0x31, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x15, 0x90, -0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x3A, 0x93, 0x90, 0x93, 0x1D, 0xE0, 0x44, -0x08, 0xF0, 0x80, 0x0B, 0xE4, 0x90, 0x93, 0x9A, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x3A, 0x22, 0x90, -0x93, 0x98, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, -0x44, 0x02, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, 0x44, 0x04, -0xF0, 0x90, 0x93, 0x1D, 0xE0, 0x54, 0x0E, 0x60, 0x0C, 0x90, 0x01, 0x3E, 0x74, 0x03, 0xF0, 0xFD, -0x7F, 0x02, 0x12, 0x3A, 0xAD, 0x90, 0x93, 0x1D, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0x93, 0x98, -0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x64, 0x06, 0x60, 0x33, -0x7F, 0x06, 0x12, 0x64, 0xDA, 0x80, 0x2C, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, -0x99, 0xE0, 0xB4, 0x06, 0x1B, 0x7F, 0x01, 0x12, 0x64, 0xDA, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, -0x60, 0x09, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, 0xF4, 0x80, 0x05, 0x12, 0x64, 0xA8, 0x80, 0x03, -0x12, 0x67, 0x4A, 0x7F, 0x01, 0x80, 0x4D, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, -0xF0, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x3A, 0x3F, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x06, 0x02, 0x80, -0x1B, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, -0x04, 0xE4, 0xFF, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, -0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x05, 0x7F, 0x01, 0x12, 0x64, 0xDA, 0x12, 0x67, 0x29, 0x12, -0x51, 0x9C, 0x7F, 0x03, 0x11, 0x1B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0xEF, 0x64, 0x01, -0x60, 0x04, 0xEF, 0xB4, 0x03, 0x15, 0x90, 0x93, 0x9E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, -0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xED, 0x64, 0x02, 0x60, 0x04, -0xED, 0xB4, 0x03, 0x15, 0x90, 0x93, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x6D, -0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x6E, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xE5, -0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, 0x60, 0x43, 0xC3, 0x90, 0x93, 0xE6, 0xE0, -0x94, 0x88, 0x90, 0x93, 0xE5, 0xE0, 0x94, 0x13, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, -0xF0, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xE5, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, -0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0xE6, 0xE0, 0x94, 0x64, 0x90, 0x93, 0xE5, 0xE0, -0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, -0x22, 0x90, 0x93, 0xA4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xA8, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, -0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x90, 0xD3, 0x12, 0x43, -0x73, 0x50, 0x41, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xA4, 0x12, 0x43, -0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x7B, 0x01, -0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, 0x1B, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x84, 0xEF, -0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0xA8, 0x12, -0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xA8, 0x02, 0x43, 0x84, 0x90, 0x93, 0x73, 0x12, 0x1F, 0xC9, -0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0x77, 0x12, 0x43, 0x90, 0xC3, 0x12, 0x43, 0x73, -0x90, 0x93, 0x73, 0x60, 0x67, 0x12, 0x43, 0x84, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x7F, 0x12, 0x1F, -0xC9, 0x90, 0x93, 0x77, 0x12, 0x43, 0x84, 0x11, 0xC1, 0x90, 0x93, 0x83, 0x12, 0x1F, 0xC9, 0x90, -0x93, 0x77, 0x12, 0x43, 0x84, 0x12, 0x43, 0x66, 0x90, 0x93, 0x7F, 0x12, 0x43, 0x90, 0x12, 0x43, -0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x83, 0x12, 0x43, 0x84, 0xA9, -0x07, 0x90, 0x93, 0x7B, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, 0xD0, 0x02, -0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, 0x90, 0x93, 0x87, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0x73, -0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x87, 0x80, 0x0A, 0x12, 0x43, 0x84, 0xC0, -0x06, 0xC0, 0x07, 0x90, 0x93, 0x7B, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0xD0, -0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x9F, 0x74, -0x04, 0xF0, 0x22, 0x12, 0x56, 0x01, 0x80, 0xEE, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x05, -0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x9F, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x56, 0x14, 0x90, -0x93, 0x9F, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x3C, 0x90, 0x01, 0x57, 0xE4, -0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x51, 0xE0, 0x60, 0x07, 0xE4, 0xF0, 0x53, -0x66, 0xFD, 0x80, 0x24, 0x90, 0x93, 0x38, 0xE0, 0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, 0x3F, -0xE0, 0xFF, 0x90, 0x93, 0x38, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0xE5, 0x62, 0xB4, 0x01, 0x09, 0x90, -0x93, 0x39, 0xE0, 0x70, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x5B, 0xE0, 0x60, 0x10, 0x90, 0x01, -0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x01, -0x5F, 0xE0, 0x60, 0x10, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, -0x90, 0x93, 0x49, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xE7, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, -0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, -0x22, 0xD3, 0x90, 0x93, 0xE8, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0xE7, 0xE0, 0x94, 0x03, 0x40, 0x03, -0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x93, 0xE7, 0xE4, 0x75, 0xF0, -0x01, 0x12, 0x42, 0x87, 0x80, 0xC6, 0xE4, 0xFF, 0x02, 0x4E, 0x8B, 0x90, 0x93, 0x1A, 0x12, 0x43, -0xC8, 0x12, 0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x93, 0xE0, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xE0, -0x30, 0xE0, 0x02, 0x51, 0xA6, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xC3, 0x13, -0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0xE1, 0xF0, 0x22, 0x7E, 0xBF, -}; - -#ifdef CONFIG_MP_INCLUDED//BT_MP 16980 const u1Byte Rtl8723EFwBTImgArray[Rtl8723EBTImgArrayLength] = { -u8 Rtl8723EFwBTImgArray[Rtl8723EBTImgArrayLength] = { -0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x4E,0xB2,0xCF,0xF7,0x12,0x6B,0x6B,0xEB, -0x4F,0xB4,0x60,0xCA,0x4C,0xB2,0x68,0xF1,0x1A,0x6B,0x4E,0xB5,0x60,0xCA,0x4B,0xB2, -0x00,0x68,0x0A,0x6E,0x00,0x18,0x2E,0x2E,0x00,0xC2,0x44,0xB7,0x4A,0xB2,0x4B,0xB3, -0xE8,0x4F,0x00,0xC2,0xC0,0xF0,0x58,0x9F,0x40,0xF0,0x0C,0xC7,0x4A,0xB0,0x6D,0xEA, -0xC0,0xF0,0x58,0xDF,0x45,0xF1,0x09,0x6A,0x00,0xF1,0x50,0xCF,0x0E,0xF0,0x1D,0x6A, -0x80,0xF1,0x62,0xA7,0x43,0xDF,0x42,0xB2,0x00,0x69,0x25,0xDF,0x44,0xDF,0x68,0x32, -0x69,0xE2,0x40,0xB3,0x44,0x32,0x26,0xDF,0x27,0xDF,0x28,0xDF,0x29,0xDF,0x40,0xCB, -0x90,0x67,0xB1,0x67,0x30,0x6E,0x00,0x18,0x64,0x2E,0x04,0xD7,0x01,0x6A,0x4B,0xEA, -0x47,0xD8,0x3A,0xB3,0x40,0x98,0x3A,0xB4,0xB1,0x67,0x6D,0xEA,0x40,0xD8,0x0A,0x6B, -0x08,0x6A,0x6C,0xC0,0x0C,0x6E,0x00,0x18,0x64,0x2E,0x4D,0xC0,0x27,0xB3,0x02,0x6C, -0x8B,0xEC,0x40,0x9B,0x03,0x6B,0x6B,0xEB,0x8C,0xEA,0x6C,0xEA,0x05,0x6B,0x6B,0xEB, -0x6C,0xEA,0x22,0xB3,0x40,0xDB,0x22,0xB3,0x40,0x9B,0x8C,0xEA,0x40,0xDB,0x04,0x97, -0x0E,0xF0,0x1D,0x6A,0x2C,0xB3,0x43,0xDF,0x2A,0xB2,0x60,0xDA,0x2C,0xB3,0x2B,0xB2, -0x60,0xDA,0x2D,0xB3,0x2B,0xB2,0x60,0xDA,0x2D,0xB3,0x2C,0xB2,0x60,0xDA,0x2E,0xB3, -0x2C,0xB2,0x60,0xDA,0x2E,0xB3,0x2D,0xB2,0x60,0xDA,0x2F,0xB3,0x2D,0xB2,0x60,0xDA, -0x2F,0xB3,0x2E,0xB2,0x60,0xDA,0x30,0xB3,0x2E,0xB2,0x60,0xDA,0x30,0xB3,0x2F,0xB2, -0x60,0xDA,0x31,0xB3,0x2F,0xB2,0x60,0xDA,0x30,0xB2,0x32,0xB3,0x20,0xCA,0x30,0xB2, -0x60,0xDA,0x31,0xB2,0x08,0xF1,0x11,0x6B,0x6B,0xEB,0x20,0xCA,0x2F,0xB2,0x60,0xCA, -0x2F,0xB2,0x20,0xDA,0x2F,0xB2,0x80,0x18,0x43,0x36,0x20,0xDA,0x08,0x97,0x07,0x91, -0x06,0x90,0x00,0xEF,0x05,0x63,0x00,0x00,0xF4,0x00,0x11,0x80,0xF0,0x00,0x11,0x80, -0xD0,0x04,0x11,0x80,0xD2,0x04,0x11,0x80,0xCA,0xA0,0x11,0x80,0xCC,0xA0,0x11,0x80, -0xC4,0xF5,0x04,0x80,0xD6,0xA0,0x11,0x80,0x00,0x00,0x00,0x18,0x58,0xC5,0xC8,0x19, -0x14,0xA1,0x11,0x80,0xD8,0xA0,0x11,0x80,0x00,0x00,0x00,0x70,0x08,0xA1,0x11,0x80, -0xBC,0x00,0x11,0x80,0xA1,0xA9,0x10,0x80,0x44,0x00,0x11,0x80,0x21,0xA3,0x10,0x80, -0x4C,0x05,0x11,0x80,0x25,0xAD,0x10,0x80,0x44,0x05,0x11,0x80,0x3D,0xCD,0x10,0x80, -0x58,0x09,0x11,0x80,0x11,0xD1,0x10,0x80,0x3C,0x00,0x11,0x80,0x6D,0xA6,0x10,0x80, -0xA0,0x05,0x11,0x80,0x41,0xAA,0x10,0x80,0x5C,0x05,0x11,0x80,0x61,0xD7,0x10,0x80, -0x90,0x06,0x11,0x80,0x45,0xC9,0x10,0x80,0xEC,0x04,0x11,0x80,0xAD,0xAE,0x10,0x80, -0x6C,0x06,0x11,0x80,0x45,0xD0,0x10,0x80,0x16,0xA1,0x11,0x80,0xD4,0x04,0x11,0x80, -0xB1,0xCE,0x10,0x80,0xC8,0xA0,0x11,0x80,0x18,0xA1,0x11,0x80,0x1C,0xA1,0x11,0x80, -0x20,0xA1,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x04,0x67,0x2F,0x24, -0x80,0x98,0x00,0x6A,0x00,0xF4,0x24,0x98,0xBD,0x67,0x00,0xF4,0x44,0xD8,0xE1,0xF7, -0x1F,0x6A,0x4C,0xEC,0x00,0x18,0x2A,0xDF,0x10,0x4D,0x12,0x2A,0x5D,0x67,0x68,0xAA, -0xFF,0xF7,0x1F,0x6A,0x4C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32, -0x6B,0xE2,0x0E,0xB3,0x48,0x32,0x69,0xE2,0xE0,0xF0,0x4B,0xA2,0x01,0x72,0x0A,0x60, -0x0B,0xB2,0xB0,0x67,0x00,0x18,0xE0,0x1D,0x83,0x9A,0x07,0x2A,0x00,0x18,0x6A,0x1E, -0x11,0x67,0x04,0x10,0x00,0x18,0x7B,0x57,0x90,0x67,0x11,0x67,0xD1,0x29,0x08,0x97, -0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0x9C,0x31,0x11,0x80, -0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x0A,0xD4,0xFF,0x6C,0x8C,0xEE,0x04,0x76, -0x04,0xD6,0x34,0x61,0x1F,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA, -0x01,0x72,0x2C,0x61,0x0A,0x93,0x40,0xA3,0x8C,0xEA,0x03,0x72,0x27,0x61,0x22,0xA3, -0x8C,0xE9,0x24,0x29,0x44,0xA3,0x03,0xA3,0x8C,0xEA,0x40,0x32,0x8C,0xE8,0x00,0x1C, -0xDD,0x31,0x4D,0xE8,0x14,0xB3,0x1A,0x65,0x40,0xAB,0x0E,0xEA,0x14,0x2A,0x13,0xB2, -0x98,0x67,0x00,0x9A,0x20,0xDA,0x12,0xB2,0x20,0xDA,0x08,0xF1,0x11,0x6A,0x4B,0xEA, -0x00,0x1C,0xE5,0x31,0x40,0xCB,0x00,0x18,0xA9,0x1D,0x01,0x6C,0x07,0x20,0x80,0x18, -0x79,0x28,0x90,0x67,0x03,0x10,0x00,0x1C,0xE5,0x31,0x98,0x67,0x0A,0x94,0x00,0x18, -0xBD,0x89,0x04,0x95,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x00,0x00, -0x6C,0x1D,0x11,0x80,0x18,0xA1,0x11,0x80,0x1C,0xA1,0x11,0x80,0x20,0xA1,0x11,0x80, -0x03,0xB2,0x01,0x6B,0x40,0x9A,0x52,0x32,0x20,0xE8,0x6C,0xEA,0x50,0x60,0x00,0xB0, -0x03,0xB2,0x01,0x6B,0x40,0x9A,0x4A,0x32,0x20,0xE8,0x6C,0xEA,0x50,0x60,0x00,0xB0, -0xF3,0x63,0x18,0x62,0x17,0xD1,0x16,0xD0,0x7D,0x67,0x00,0x6A,0x20,0xF0,0x50,0xC3, -0xB4,0xB3,0x9D,0x67,0x00,0x69,0x58,0xAB,0x40,0xF0,0x48,0xCC,0x20,0xF0,0x5A,0xA3, -0x20,0xF0,0x79,0xA3,0x40,0x32,0x4D,0xEB,0xAF,0xB2,0x0D,0xD3,0x01,0x6B,0x40,0x9A, -0x0F,0xD2,0xAE,0xB2,0x40,0x9A,0x0E,0xD2,0xAD,0xB2,0x00,0x9A,0xAD,0xB2,0x40,0x9A, -0x10,0xD2,0x0E,0x92,0x6C,0xEA,0x3A,0x22,0xBD,0x67,0x83,0x67,0x30,0x4D,0x00,0x6E, -0x00,0x18,0x71,0x23,0x23,0x67,0x02,0x2A,0x03,0x69,0x26,0x11,0x9D,0x67,0x20,0xF0, -0x70,0xA4,0x0F,0x94,0xFF,0x6A,0x4C,0xEB,0x80,0xF7,0x82,0x32,0x2C,0xEA,0x4E,0xEB, -0xA2,0xB4,0x1B,0x2B,0xA0,0xB2,0x4D,0xE8,0x40,0x9C,0x56,0x32,0x2C,0xEA,0x02,0x2A, -0x9F,0xB2,0x4D,0xE8,0x7D,0x67,0x40,0xF0,0x68,0xAB,0x01,0xF0,0x00,0x6A,0x05,0x69, -0x6C,0xEA,0xFF,0xF7,0x1F,0x6B,0x6C,0xEA,0x04,0x22,0x00,0x18,0xA4,0x1D,0x0D,0x94, -0x0D,0x10,0x00,0x18,0xA9,0x1D,0x0D,0x94,0x09,0x10,0x96,0xB2,0x4C,0xE8,0x40,0x9C, -0x56,0x32,0x2C,0xEA,0x02,0x2A,0x94,0xB2,0x4C,0xE8,0x09,0x69,0x0E,0x94,0x01,0x6F, -0x86,0x32,0xEC,0xEA,0x41,0x22,0x8D,0xB3,0x40,0x9B,0x56,0x32,0xEC,0xEA,0x3C,0x22, -0xBD,0x67,0x10,0x6A,0xC7,0x67,0x02,0x6C,0x30,0x4D,0x14,0xD7,0x00,0x18,0x71,0x23, -0x4D,0xE9,0x14,0x97,0x06,0x2A,0x20,0x6A,0x4D,0xE9,0xFF,0xF7,0x1F,0x6C,0x8C,0xE9, -0xDB,0x10,0x0F,0x94,0x5D,0x67,0x20,0xF0,0x70,0xA2,0x40,0xF7,0x82,0x32,0xEC,0xEA, -0x4E,0xEB,0x7E,0xB2,0x80,0x9A,0x19,0x2B,0x7D,0xB2,0x4D,0xE8,0x44,0x67,0xEC,0xEA, -0x02,0x2A,0x79,0xB2,0x4D,0xE8,0x7D,0x67,0x40,0xF0,0x68,0xAB,0x01,0xF0,0x00,0x6A, -0xFF,0xF7,0x1F,0x6C,0x6C,0xEA,0x8C,0xEA,0x04,0x22,0x00,0x18,0xA4,0x1D,0x0D,0x94, -0x0B,0x10,0x00,0x18,0xA9,0x1D,0x0D,0x94,0x07,0x10,0x73,0xB2,0x4C,0xE8,0x44,0x67, -0xEC,0xEA,0x02,0x2A,0x6F,0xB2,0x4C,0xE8,0x0E,0x93,0x01,0x6C,0x6A,0x32,0x8C,0xEA, -0x41,0x22,0x6A,0xB3,0x40,0x9B,0x0F,0x6B,0x46,0xEC,0x6C,0xEA,0x03,0x72,0x3A,0x60, -0xFF,0x6A,0xBD,0x67,0x01,0x4A,0x04,0x6C,0x30,0x4D,0x02,0x6E,0x00,0x18,0x71,0x23, -0x4D,0xE9,0x03,0x2A,0x00,0xF2,0x00,0x6A,0x45,0x10,0x9D,0x67,0x20,0xF0,0x50,0xA4, -0x5E,0xB3,0x80,0x9B,0x13,0x22,0x61,0xB2,0x03,0x6B,0x4D,0xE8,0x82,0x32,0x4A,0x32, -0x6C,0xEA,0x01,0x72,0x04,0x60,0x96,0x32,0x01,0x6C,0x8C,0xEA,0x02,0x2A,0x5C,0xB2, -0x4D,0xE8,0x00,0xF4,0x00,0x6A,0x4D,0xE9,0x01,0x6B,0x12,0x10,0x5A,0xB2,0x03,0x6B, -0x4C,0xE8,0x82,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x60,0x96,0x32,0x01,0x6B, -0x6C,0xEA,0x02,0x2A,0x55,0xB2,0x4C,0xE8,0x01,0xF0,0x00,0x6A,0x4D,0xE9,0x00,0x6B, -0x50,0xB2,0x60,0xC2,0x0E,0x94,0x01,0x6B,0x8E,0x32,0x6C,0xEA,0x18,0x22,0x47,0xB2, -0x40,0x9A,0x46,0xEB,0x0F,0x6B,0x6C,0xEA,0x03,0x72,0x11,0x60,0xBD,0x67,0x02,0xF0, -0x00,0x6A,0x08,0x6C,0x30,0x4D,0x03,0x6E,0x00,0x18,0x71,0x23,0x4D,0xE9,0x07,0x2A, -0x04,0xF0,0x00,0x6A,0x4D,0xE9,0xFF,0xF7,0x1F,0x6A,0x4C,0xE9,0x4D,0x10,0x44,0xB2, -0x3E,0xB3,0x0C,0xEA,0x6E,0xEA,0x11,0x2A,0x38,0xB2,0x0F,0x6B,0x40,0x9A,0x46,0x32, -0x6C,0xEA,0x01,0x72,0x0A,0x61,0x80,0x18,0xC0,0x28,0x00,0x65,0x06,0x22,0x80,0x6A, -0x4D,0xE9,0x39,0xB2,0x4C,0xE8,0x39,0xB2,0x4C,0xE8,0xC0,0xF5,0x02,0x32,0x01,0x6B, -0x6C,0xEA,0x0C,0x22,0x2D,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA, -0x01,0x72,0x04,0x61,0x2B,0xB2,0x4C,0xE8,0x2B,0xB2,0x4C,0xE8,0x04,0x6A,0x2C,0xEA, -0x08,0x2A,0x2D,0xB2,0x4C,0xE8,0x2D,0xB2,0x4C,0xE8,0x26,0xB2,0x4C,0xE8,0x26,0xB2, -0x4C,0xE8,0x2C,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x0C,0x2A,0x1F,0xB2,0x03,0x6B, -0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x61,0x1F,0xB2,0x4D,0xE8, -0x1F,0xB2,0x4D,0xE8,0x24,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x03,0x2A,0x00,0x18, -0xBB,0x30,0x00,0x6C,0x12,0xB2,0x00,0xDA,0x05,0x6A,0x10,0x94,0x04,0xD2,0x0C,0x0A, -0x05,0xD2,0x0E,0x93,0x0F,0x92,0x0A,0xD4,0xFA,0x6D,0x04,0x6C,0x21,0xF3,0x1F,0x6E, -0xA1,0xF1,0x1A,0x6F,0x06,0xD1,0x09,0xD0,0x07,0xD2,0x20,0x18,0x1B,0x32,0x08,0xD3, -0x18,0x97,0x17,0x91,0x16,0x90,0x00,0xEF,0x0D,0x63,0x00,0x00,0x41,0x00,0x00,0x00, -0xDC,0x00,0x11,0x80,0x44,0xA0,0x00,0xB0,0x40,0x60,0x00,0xB0,0x40,0xA0,0x00,0xB0, -0x50,0xA0,0x00,0xB0,0x00,0x00,0x80,0x00,0x6C,0x1D,0x11,0x80,0x00,0x00,0x40,0x00, -0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xBF,0xFF,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00, -0x17,0x00,0x11,0x80,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xEF,0xFF,0x00,0x00,0xA0,0x00, -0x00,0x00,0xC0,0x00,0x00,0x00,0x30,0x00,0x01,0x6D,0xA4,0xEC,0x07,0xB2,0x06,0xB4, -0x60,0x9C,0x40,0x9A,0x6E,0xEA,0xAC,0xEA,0x02,0x2A,0xAE,0xEB,0x60,0xDC,0x20,0xE8, -0x00,0x65,0x00,0x00,0x3C,0x60,0x00,0xB0,0x50,0x60,0x00,0xB0,0xF8,0x63,0x0E,0x62, -0x0D,0xD1,0x0C,0xD0,0x6A,0xB2,0x01,0x6F,0x20,0x9A,0x2A,0x65,0x36,0x36,0xEC,0xEE, -0x0B,0x2E,0x68,0xB4,0x03,0x6B,0x6B,0xEB,0x40,0x9C,0x6C,0xEA,0x40,0xDC,0x66,0xB4, -0x02,0x6B,0x40,0x9C,0x6D,0xEA,0x40,0xDC,0x64,0xB2,0x00,0x6B,0x0A,0xD3,0xA3,0x67, -0x60,0x9A,0x63,0xB2,0x40,0x9A,0x0A,0x65,0x62,0xB2,0x00,0x9A,0x51,0x67,0xEC,0xEA, -0x10,0x22,0x80,0xF7,0x62,0x32,0x88,0x67,0x8E,0xEA,0xEC,0xEA,0x01,0x5A,0xA7,0x67, -0x08,0x60,0x5D,0xB2,0x03,0x6D,0x4D,0xE8,0x03,0x2E,0x5C,0xB2,0x07,0x6D,0x4D,0xE8, -0x0A,0xD7,0x29,0x67,0xC0,0x99,0x01,0x6C,0xD6,0x32,0x8C,0xEA,0x1E,0x22,0x08,0x6A, -0x4D,0xED,0x02,0x32,0x52,0x32,0x8C,0xEA,0xFF,0xF7,0x1F,0x6F,0x16,0x22,0x28,0x67, -0x26,0x32,0x40,0xF7,0x62,0x33,0x4E,0xEB,0x8C,0xEB,0x83,0xEB,0x0E,0x60,0x10,0x6A, -0x4D,0xED,0x4E,0xB2,0xEC,0xED,0x4D,0xE8,0x46,0x67,0x8C,0xEA,0x05,0x2A,0x4A,0xB2, -0x4D,0xE8,0x20,0x6A,0x4D,0xED,0xEC,0xED,0x0A,0xD4,0x68,0x67,0x6A,0x32,0x01,0x6E, -0xCC,0xEA,0x16,0x22,0x40,0x6A,0x29,0x67,0x4D,0xED,0x80,0x99,0x44,0xB2,0x03,0x6B, -0x4D,0xE8,0x82,0x32,0x4A,0x32,0x6C,0xEA,0xCA,0xEA,0x03,0x60,0x96,0x32,0xCC,0xEA, -0x07,0x2A,0x80,0x6A,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x4C,0xED,0x3D,0xB2,0x4D,0xE8, -0x02,0x6A,0xAC,0xEA,0x08,0x2A,0x3C,0xB2,0x4C,0xE8,0x3C,0xB2,0x4C,0xE8,0x3C,0xB2, -0x4C,0xE8,0x3C,0xB2,0x4C,0xE8,0x3C,0xB2,0x0C,0xEA,0x07,0x22,0x36,0xB2,0x01,0x6B, -0x4C,0xE8,0x36,0xB2,0x4C,0xE8,0x39,0xB2,0x60,0xC2,0x29,0xB3,0x03,0x69,0x40,0x9B, -0x42,0x32,0x4A,0x32,0x2C,0xEA,0x01,0x72,0x04,0x61,0x31,0xB2,0x4C,0xE8,0x2E,0xB2, -0x4C,0xE8,0x33,0xB2,0x88,0x67,0x06,0xD5,0x07,0xD4,0xFA,0x6D,0x04,0x6C,0x01,0xF4, -0x00,0x6E,0xA1,0xF1,0x19,0x6F,0x04,0xD1,0x05,0xD2,0x20,0x18,0x1B,0x32,0x08,0xD0, -0x0A,0x92,0x12,0x22,0x2B,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x0B,0x2A,0x18,0xB3, -0x40,0x9B,0x42,0x32,0x4A,0x32,0x2C,0xEA,0x01,0x72,0x04,0x61,0x1C,0xB2,0x4D,0xE8, -0x1C,0xB2,0x4D,0xE8,0x17,0xB2,0x00,0xDA,0x23,0xB2,0x01,0x6C,0xA0,0x9A,0xBE,0x32, -0x8C,0xEA,0x17,0x22,0x40,0xF5,0x02,0x32,0x8C,0xEA,0x07,0x22,0x1B,0xB2,0x00,0x6B, -0x80,0xC2,0x1E,0xB2,0x60,0xC2,0x1E,0xB2,0x60,0xC2,0xA2,0x32,0x8C,0xEA,0x05,0x22, -0x00,0x18,0xA5,0x23,0x00,0x65,0x19,0xB3,0x40,0xC3,0x14,0xB2,0x00,0x18,0x04,0x24, -0x80,0xA2,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0x6C,0x1D,0x11,0x80, -0x30,0x60,0x00,0xB0,0x34,0x60,0x00,0xB0,0x44,0xA0,0x00,0xB0,0x50,0x60,0x00,0xB0, -0x40,0xA0,0x00,0xB0,0x00,0x00,0x80,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00, -0x00,0x00,0x10,0x00,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0x7F,0xFF, -0xFF,0xFF,0xBF,0xFF,0x00,0x00,0x30,0x00,0x17,0x00,0x11,0x80,0xFC,0xA5,0x10,0x80, -0x00,0x00,0xC0,0x00,0x54,0x45,0x11,0x80,0x16,0x00,0x11,0x80,0x18,0x00,0x11,0x80, -0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x34,0xB2,0x00,0x6E,0x01,0x6B,0x20,0x6C, -0xFF,0xF7,0x1F,0x6D,0x0A,0x65,0xE6,0x67,0x06,0x67,0x4B,0x65,0x2C,0x65,0x6D,0x65, -0x2D,0xB1,0xC8,0x32,0x15,0xE1,0x10,0x27,0x68,0x67,0x69,0xE2,0x80,0x9A,0x6A,0x67, -0x64,0xEF,0x86,0xEF,0x80,0xDD,0x41,0x9A,0xFF,0x4B,0x29,0x67,0x6C,0xEA,0xEF,0xE1, -0x44,0xEB,0x4D,0xEC,0x80,0xDD,0x04,0x10,0x68,0x67,0x69,0xE2,0x40,0x9A,0x40,0xDD, -0x01,0x4E,0xFF,0x69,0x2C,0xEE,0x10,0x76,0x11,0x61,0x88,0x67,0x1E,0xB5,0x01,0x4F, -0x60,0x9C,0x2C,0xEF,0x4A,0x67,0x44,0xEF,0x11,0xE5,0xFF,0x4A,0xA9,0x67,0x4C,0xEB, -0xEB,0xE5,0x64,0xEA,0x40,0x9C,0x00,0x6E,0x6D,0xEA,0x40,0xDC,0x04,0x48,0x4B,0x67, -0x4C,0xE8,0x00,0xF4,0x01,0x58,0xCC,0x61,0x13,0xB4,0xFF,0x6E,0x55,0x6D,0x00,0xF4, -0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x0F,0xB4,0xFF,0x6E,0x00,0x6D,0x00,0xF5, -0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x0B,0xB4,0xFF,0x6E,0xB1,0x67,0x00,0xF6, -0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x07,0xB4,0xFF,0x6E,0x0F,0x6D,0x00,0xF7, -0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF, -0x04,0x63,0x00,0x00,0x00,0xF8,0x10,0x80,0xDC,0xF4,0x04,0x80,0xFD,0x63,0x05,0x62, -0x04,0xD0,0x11,0xB2,0x00,0x68,0xEE,0x6C,0x00,0xDA,0x10,0xB2,0x07,0x6D,0x00,0xDA, -0x00,0x18,0x9A,0x33,0x00,0x65,0x0E,0xB4,0x4A,0xF5,0x16,0x6B,0x6B,0xEB,0xFF,0xF7, -0x1F,0x6A,0x01,0x48,0x4C,0xE8,0x00,0xF4,0x00,0x58,0x60,0xCC,0xFA,0x61,0x07,0xB2, -0x03,0x6B,0x05,0x97,0x60,0xDA,0x04,0x90,0x03,0xB2,0x01,0x6B,0x60,0xDA,0x00,0xEF, -0x03,0x63,0x00,0x00,0x10,0xA3,0x00,0xB0,0x20,0xA3,0x00,0xB0,0xF0,0x00,0x00,0xB6, -0xFD,0x63,0x04,0x62,0x17,0xB3,0x16,0xB2,0x80,0x18,0x53,0x2A,0x60,0xDA,0x16,0xB3, -0x16,0xB2,0x21,0xB4,0x04,0x97,0x52,0xDB,0x15,0xB2,0x55,0xDB,0x15,0xB2,0x49,0xDB, -0x15,0xB2,0x4C,0xDB,0x15,0xB2,0x4F,0xDB,0x15,0xB2,0x46,0xDB,0x15,0xB2,0x5B,0xDB, -0x15,0xB2,0x40,0xDB,0x15,0xB2,0x58,0xDB,0x16,0xB3,0x15,0xB2,0x60,0xDA,0xC0,0xF0, -0x50,0x9C,0x40,0x6B,0x6D,0xEA,0xC0,0xF0,0x50,0xDC,0x14,0xB3,0x49,0x9C,0x6D,0xEA, -0x13,0xB3,0x6D,0xEA,0x49,0xDC,0x00,0xEF,0x03,0x63,0x00,0x00,0xCC,0x2C,0x11,0x80, -0xB9,0xAD,0x10,0x80,0xB8,0x95,0x11,0x80,0x45,0xD4,0x10,0x80,0xB9,0xAF,0x10,0x80, -0x4D,0xB0,0x10,0x80,0x51,0xB1,0x10,0x80,0x95,0xD0,0x10,0x80,0x01,0xD1,0x10,0x80, -0x01,0xC8,0x10,0x80,0x0D,0xD0,0x10,0x80,0x35,0xC9,0x10,0x80,0x3C,0x1C,0x11,0x80, -0x61,0xA2,0x10,0x80,0xDC,0x00,0x11,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x00, -0xF6,0x63,0x12,0x62,0x11,0xD1,0x10,0xD0,0x14,0xD4,0x16,0xD6,0x80,0xAC,0xFF,0xF7, -0x1F,0x6B,0x8C,0xEB,0x7F,0xF4,0x08,0x73,0x47,0x60,0x7F,0xF4,0x08,0x6A,0x62,0xEA, -0x0E,0x61,0x3F,0xF4,0x00,0x73,0x35,0x60,0x3F,0xF4,0x00,0x6A,0x42,0xEB,0x20,0xF1, -0x04,0x61,0x7F,0xF4,0x06,0x6A,0x42,0xEB,0x00,0xF1,0x1F,0x61,0x0F,0x10,0x7F,0xF4, -0x0A,0x73,0x5C,0x60,0x7F,0xF4,0x0A,0x6A,0x42,0xEB,0x34,0x61,0x5F,0xF5,0x00,0x73, -0x5E,0x60,0x5F,0xF5,0x03,0x73,0x00,0xF1,0x02,0x60,0x0F,0x11,0xFF,0xF7,0x1F,0x6A, -0x8C,0xEA,0x7F,0xF4,0x06,0x72,0x03,0x61,0x88,0xB2,0x00,0x6B,0x60,0xDA,0x88,0xB2, -0x0F,0x6B,0x40,0x9A,0x46,0x32,0x6C,0xEA,0x03,0x72,0x04,0x61,0x85,0xB2,0x60,0x9A, -0x85,0xB2,0x60,0xDA,0x86,0xB3,0x85,0xB2,0x60,0xDA,0x87,0xB3,0x85,0xB2,0x60,0xDA, -0xFF,0x17,0x7E,0xB2,0x85,0xB3,0x40,0x9A,0x6E,0xEA,0xE0,0xF0,0x0E,0x2A,0x14,0x92, -0x63,0xA2,0x83,0xB2,0x60,0xC2,0xE1,0x10,0x14,0x94,0x82,0xB2,0x63,0xA4,0x80,0xF1, -0x61,0xC2,0xDB,0x10,0x14,0x93,0x80,0xB1,0xFF,0xF7,0x1F,0x6C,0x43,0xA3,0x44,0x33, -0x4D,0xE3,0x6C,0x33,0x4D,0xE3,0x40,0x99,0x68,0x30,0x8C,0xE8,0x4F,0xEA,0x03,0x22, -0x00,0x18,0xFD,0x1D,0x91,0x67,0x0F,0x20,0x00,0x18,0x40,0xA4,0x00,0x65,0x77,0xB6, -0x00,0x6A,0x01,0x6C,0xB1,0x67,0xE2,0x67,0x00,0x18,0xF3,0x1D,0x04,0xD2,0x80,0x99, -0x00,0x18,0x0C,0x1E,0xB0,0x67,0x72,0xB2,0x00,0xCA,0xB7,0x10,0x14,0x93,0x00,0x6E, -0x43,0xA3,0x01,0x22,0x01,0x6E,0x6B,0xB2,0x80,0xF1,0xD1,0xC2,0xAE,0x10,0x14,0x94, -0x14,0x93,0x61,0xF3,0x06,0x6D,0x85,0xA4,0x0E,0xD4,0x48,0xA3,0x27,0xA3,0xFF,0xF7, -0x1F,0x6C,0x40,0x32,0x4D,0xE9,0x00,0x6A,0x45,0xC3,0x4A,0xC3,0x8C,0xE9,0x00,0x18, -0x9A,0x33,0x22,0x6C,0x5F,0xB0,0xF3,0x6A,0xFF,0xF7,0x1F,0x6B,0x20,0xF0,0xBF,0xA0, -0x24,0x6C,0xA0,0x35,0x4D,0xED,0x00,0x18,0x9A,0x33,0x6C,0xED,0x40,0xF0,0x41,0xA0, -0x40,0xF0,0xA0,0xA0,0x26,0x6C,0x40,0x32,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18, -0x9A,0x33,0x4C,0xED,0xEB,0xF0,0x12,0x6D,0x00,0x18,0x9A,0x33,0x28,0x6C,0x93,0xF7, -0x1A,0x6D,0x00,0x18,0x9A,0x33,0x2A,0x6C,0x00,0x18,0xEE,0x33,0x01,0x6C,0x7D,0x21, -0xFF,0xF7,0x1F,0x6B,0x51,0x67,0x6C,0xE9,0x00,0xF4,0x01,0x59,0x02,0x61,0x00,0xF4, -0x00,0x6A,0xFF,0xF7,0x1F,0x69,0x4C,0xE9,0x0E,0x92,0xFF,0x6C,0xFF,0x4A,0x8C,0xEA, -0x04,0x5A,0x28,0x61,0x47,0xB0,0x00,0x6A,0x7D,0x67,0x06,0xD2,0x0C,0xCB,0xE0,0xF7, -0x1F,0x6A,0x4C,0xE9,0x44,0xB3,0x06,0x92,0x80,0xF4,0x20,0x34,0x01,0x6D,0x6C,0xEA, -0x8D,0xEA,0x06,0xD2,0x00,0x6C,0x41,0xB2,0x04,0xD4,0x05,0xD4,0x9D,0x67,0x18,0x4C, -0xC5,0x67,0x00,0x6F,0x07,0xD2,0x3F,0x10,0xE0,0xF7,0x1F,0x6A,0x8C,0xEA,0x88,0x67, -0x80,0xF4,0x40,0x32,0x8C,0xEB,0x4D,0xEB,0x38,0xB2,0xFF,0x6D,0xEC,0xED,0x60,0xDE, -0x41,0xDE,0x2B,0x10,0x0E,0x92,0x00,0x6D,0x91,0x67,0x40,0x33,0x34,0xB2,0x25,0x67, -0x41,0xE3,0x7D,0x67,0x18,0x4B,0x30,0xB2,0x8B,0x65,0x32,0xB3,0x0A,0x65,0xFF,0xF7, -0x1F,0x6A,0x6B,0x65,0xFF,0x6B,0x4A,0x65,0x2B,0x65,0x6C,0x67,0xAC,0x32,0x79,0xE2, -0x20,0xDE,0x00,0xF1,0x01,0x5C,0x00,0xCE,0x21,0xDE,0x60,0x9E,0xE1,0x45,0xD4,0x61, -0x48,0x67,0x6C,0xEA,0xA9,0x67,0x6B,0x67,0x6D,0xEA,0x80,0x4C,0xEC,0xED,0x40,0xDE, -0x80,0x4C,0x4A,0x67,0x04,0x5D,0x4C,0xEC,0xE8,0x61,0x00,0x6F,0x9D,0x67,0x04,0xD7, -0x05,0xD7,0x18,0x4C,0x01,0x6E,0x00,0x18,0xF7,0x33,0x00,0x65,0x0E,0x10,0x02,0x6C, -0x01,0x6D,0x00,0x18,0x1C,0x80,0x00,0x6E,0x08,0x10,0x14,0x93,0x16,0x92,0x80,0xAB, -0x00,0x18,0xFA,0x8B,0xA0,0xA2,0x01,0x6A,0x01,0x10,0x00,0x6A,0x12,0x97,0x11,0x91, -0x10,0x90,0x00,0xEF,0x0A,0x63,0x00,0x00,0x38,0x91,0x10,0x80,0x6C,0x1D,0x11,0x80, -0x2C,0x00,0x00,0xB5,0x48,0x91,0x10,0x80,0x44,0x91,0x10,0x80,0x32,0x97,0x79,0x23, -0x78,0xA0,0x00,0xB0,0x01,0x00,0xA5,0x01,0xAE,0x23,0x87,0x54,0xD0,0x00,0x11,0x80, -0xDC,0x00,0x11,0x80,0x88,0x07,0x11,0x80,0x01,0x91,0x02,0x80,0x14,0xA1,0x11,0x80, -0x00,0xF8,0x10,0x80,0xFF,0xFF,0x03,0xE0,0x00,0x00,0x00,0x80,0x00,0xFB,0x10,0x80, -0x00,0x00,0x00,0x04,0x03,0xB2,0x00,0x6B,0x60,0xDA,0x20,0xE8,0x00,0x65,0x00,0x00, -0x04,0x60,0x00,0xB0,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x40,0xAC,0x01,0xF4, -0x03,0x72,0x2C,0x61,0x80,0x18,0x53,0x2A,0x00,0x69,0x80,0x18,0x45,0x2B,0x00,0x65, -0x16,0xB2,0x08,0xF1,0x11,0x6B,0x6B,0xEB,0x60,0xCA,0x15,0xB2,0x91,0x67,0x20,0xDA, -0x14,0xB2,0x20,0x18,0x83,0x39,0x20,0xDA,0x14,0xB2,0x15,0xB0,0xB1,0x67,0x80,0xF1, -0x62,0xA2,0x90,0x67,0x30,0x6E,0x68,0x32,0x69,0xE2,0x0F,0xB3,0x44,0x32,0x00,0x18, -0x64,0x2E,0x40,0xCB,0x01,0x6A,0x4B,0xEA,0x47,0xD8,0x0E,0xB3,0x40,0x98,0x0E,0xB4, -0xB1,0x67,0x6D,0xEA,0x40,0xD8,0x00,0x18,0x64,0x2E,0x0C,0x6E,0x06,0x97,0x05,0x91, -0x04,0x90,0x00,0x6A,0x00,0xEF,0x04,0x63,0x18,0xA1,0x11,0x80,0x1C,0xA1,0x11,0x80, -0x20,0xA1,0x11,0x80,0x14,0xA1,0x11,0x80,0xDC,0x00,0x11,0x80,0xD8,0xA0,0x11,0x80, -0x00,0x00,0x00,0x70,0x08,0xA1,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0, -0xFF,0xF7,0x1F,0x6A,0xCC,0xEA,0x02,0x74,0x0A,0xD4,0x0B,0xD5,0x0D,0xD7,0x04,0xD2, -0x0D,0x61,0x33,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72, -0x05,0x61,0x30,0xB3,0x40,0x9B,0xC0,0xF7,0x42,0x32,0xFC,0x2A,0x0A,0x93,0x04,0x73, -0x3A,0x61,0x0B,0x95,0xFF,0x6C,0x44,0x67,0x60,0xA5,0x6C,0xEA,0x10,0x72,0x0A,0x61, -0x42,0xA5,0x8C,0xEA,0x02,0x72,0x06,0x61,0x27,0xB2,0x00,0x18,0xE0,0x1D,0x81,0x9A, -0x00,0x6A,0x3E,0x10,0xFF,0x6A,0x6C,0xEA,0x02,0x72,0x01,0x6D,0x04,0x60,0x22,0x72, -0x02,0x60,0x2F,0x72,0x20,0x61,0xFF,0x6C,0x44,0x67,0x6C,0xEA,0x2F,0x72,0x01,0x6A, -0x03,0x60,0x0B,0x93,0x42,0xA3,0x8C,0xEA,0xFF,0x6E,0x6F,0x42,0xCC,0xEB,0xCA,0xEB, -0x12,0x60,0xE6,0x67,0x01,0x68,0x0B,0x92,0x06,0x4D,0xCC,0xED,0xB1,0xE2,0x42,0xA4, -0xCC,0xEA,0x03,0x5A,0x01,0x61,0x02,0xC4,0xFF,0x4B,0xEC,0xEB,0xFF,0x6E,0x08,0x4D, -0xCA,0xEB,0xEC,0xED,0xF0,0x61,0x00,0x1C,0xDD,0x31,0x00,0x65,0x0F,0xB1,0x02,0x67, -0x40,0xA1,0x05,0x22,0x00,0x18,0x43,0x30,0x00,0x65,0x00,0x6A,0x40,0xC1,0x00,0x1C, -0xE5,0x31,0x90,0x67,0x0A,0x94,0x0B,0x95,0x04,0x96,0x00,0x18,0xCA,0x1E,0x0D,0x97, -0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x00,0x00,0x6C,0x1D,0x11,0x80, -0x1C,0xA3,0x00,0xB0,0x9C,0x31,0x11,0x80,0x17,0x00,0x11,0x80,0xFD,0x63,0x04,0x62, -0x09,0xB2,0x0F,0x6B,0x40,0x9A,0x46,0x32,0x6C,0xEA,0x01,0x72,0x07,0x61,0x80,0x18, -0xC0,0x28,0x00,0x65,0x03,0x22,0x00,0x18,0xA2,0x31,0x00,0x65,0x04,0x97,0x00,0xEF, -0x03,0x63,0x00,0x00,0x6C,0x1D,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0, -0xFF,0xF7,0x1F,0x69,0x8C,0xE9,0x24,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x4C,0x32, -0x18,0xB3,0x2B,0xE2,0x48,0x32,0x61,0xE2,0x5C,0x98,0x4F,0xEA,0x05,0x22,0x01,0x6A, -0x00,0x6B,0x20,0xF2,0x5E,0xC0,0x1E,0x10,0x00,0x18,0x41,0x5E,0x91,0x67,0x04,0xD2, -0x0C,0x6B,0x18,0x2A,0x5F,0x98,0x41,0xA2,0x44,0x72,0x14,0x60,0x00,0x18,0xA5,0x5E, -0x91,0x67,0x06,0x22,0x00,0x18,0x69,0x5E,0x91,0x67,0x1F,0x6B,0x0B,0x22,0x05,0x10, -0x00,0x18,0x80,0x49,0x91,0x67,0x62,0x67,0x05,0x10,0x91,0x67,0x20,0x18,0x13,0x26, -0x0E,0x6D,0x04,0x93,0x08,0x97,0x07,0x91,0x06,0x90,0x43,0x67,0x00,0xEF,0x05,0x63, -0x48,0x60,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x03,0x44,0x90,0x67, -0x00,0x18,0xF2,0x5A,0x0B,0xD5,0x22,0x67,0x1A,0x65,0x1E,0x2A,0xBD,0x67,0x90,0x67, -0x00,0x18,0x07,0xDF,0x10,0x4D,0x7D,0x67,0x48,0xAB,0x0B,0x93,0xFF,0xF7,0x1F,0x6D, -0x40,0xCB,0x65,0x67,0x4C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32, -0x6B,0xE2,0x09,0xB3,0x48,0x32,0x69,0xE2,0x20,0xF2,0x3E,0xC2,0x5D,0x67,0x88,0xAA, -0x80,0x18,0xB6,0x2B,0xAC,0xEC,0x1A,0x65,0x08,0x97,0x07,0x91,0x06,0x90,0x58,0x67, -0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0, -0x20,0xB0,0x00,0x6A,0x04,0xD2,0x40,0x98,0x01,0x69,0xC0,0xF6,0x42,0x32,0x2C,0xEA, -0x09,0x22,0x00,0x18,0x4F,0x9A,0x06,0xD4,0x04,0xD1,0x40,0x98,0x1A,0xB3,0x6C,0xEA, -0x40,0xD8,0x06,0x94,0x44,0xAC,0xFF,0xF7,0x1F,0x6B,0x06,0x72,0x19,0x61,0x40,0x9C, -0x17,0x2A,0x45,0xAC,0x6C,0xEA,0x17,0x2A,0x41,0x9C,0x82,0x67,0x42,0x32,0x42,0x32, -0x6C,0xEA,0x01,0xF0,0x0B,0x72,0x6C,0xEC,0x04,0x61,0x80,0x18,0xB6,0x2B,0x00,0x65, -0x0A,0x10,0x01,0xF0,0x05,0x72,0x07,0x61,0x00,0x18,0x2C,0x48,0x00,0x65,0x03,0x10, -0x00,0x18,0x74,0x56,0x00,0x65,0x04,0x92,0x05,0x22,0x06,0xB2,0x07,0xB4,0x60,0x9A, -0x8D,0xEB,0x60,0xDA,0x0A,0x97,0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0x00,0x00, -0x54,0x45,0x11,0x80,0xFF,0xFF,0xFF,0xF7,0x00,0x00,0x00,0x08,0xF8,0x63,0x0E,0x62, -0x0D,0xD1,0x0C,0xD0,0x39,0xB2,0x03,0x6E,0x40,0x9A,0x42,0x32,0x4A,0x32,0xCC,0xEA, -0x01,0x72,0x61,0x61,0x44,0xAC,0xFF,0xF7,0x1F,0x69,0x07,0x72,0x11,0x61,0x60,0x9C, -0xFF,0x6E,0x40,0xA3,0x03,0x72,0x57,0x61,0x42,0xA3,0xCC,0xEA,0x54,0x2A,0x43,0xA3, -0x64,0xA3,0xCC,0xEA,0xCC,0xEB,0x60,0x33,0x6D,0xEA,0x2D,0xB3,0x40,0xCB,0x4B,0x10, -0x08,0x72,0x49,0x61,0xA0,0x9C,0x60,0x9D,0x62,0x32,0x5A,0x32,0xCC,0xEA,0x2C,0x22, -0xE1,0xF7,0x1F,0x6A,0x4C,0xEB,0x1C,0x73,0x27,0x61,0x26,0xB2,0x00,0x18,0xE0,0x1D, -0x83,0x9A,0x00,0x18,0x6A,0x1E,0x00,0x65,0x23,0xB2,0x60,0xF1,0x47,0xA2,0x18,0x2A, -0x22,0xB2,0x11,0x67,0xFF,0x6C,0x40,0xAA,0x1F,0x4C,0x4C,0xE8,0xFF,0xF7,0x0F,0x6A, -0x4C,0xE8,0x00,0x18,0x9A,0x33,0xB0,0x67,0x00,0x18,0xE2,0xBF,0x00,0x65,0x10,0x6A, -0x4D,0xE8,0xB0,0x67,0xFF,0x6C,0x1F,0x4C,0x00,0x18,0x9A,0x33,0x2C,0xED,0x1E,0x10, -0x00,0x18,0xF7,0x4F,0x33,0x6C,0x1A,0x10,0x66,0x6A,0x7D,0x67,0x50,0xCB,0x14,0xB2, -0xFD,0x67,0x06,0xD5,0x80,0x9A,0x00,0x6D,0x04,0x06,0x24,0x4F,0xA9,0xE7,0x40,0xA2, -0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x06,0x95,0x07,0x96,0x00,0x18, -0x40,0x1E,0x08,0x97,0x03,0x10,0x00,0x18,0x64,0x8B,0x00,0x65,0x0E,0x97,0x0D,0x91, -0x0C,0x90,0x00,0xEF,0x08,0x63,0x00,0x00,0x6C,0x1D,0x11,0x80,0x18,0xA1,0x11,0x80, -0x9C,0x31,0x11,0x80,0x48,0x5C,0x11,0x80,0x1E,0x01,0x00,0xB6,0x84,0x21,0x11,0x80, -0xFD,0x63,0x04,0x62,0x17,0xB2,0x03,0x6B,0xC4,0x67,0x40,0x9A,0x42,0x32,0x4A,0x32, -0x6C,0xEA,0x01,0x72,0x1E,0x61,0x44,0xAC,0x66,0x72,0x1B,0x61,0xA0,0x9C,0xE1,0xF7, -0x1F,0x6A,0xFF,0xF7,0x1F,0x6B,0x80,0x9D,0x4C,0xEC,0x0F,0xB2,0x40,0xAA,0x6C,0xEA, -0x4E,0xEC,0x0F,0x2C,0x0D,0xB3,0x00,0x6A,0x00,0xF4,0x44,0xDD,0x40,0x9B,0x02,0x2A, -0xA0,0xDB,0x04,0x10,0x0A,0xB2,0x40,0x9A,0x00,0xF4,0xA4,0xDA,0x08,0xB2,0xA0,0xDA, -0x03,0x10,0x00,0x18,0x18,0x58,0x86,0x67,0x04,0x97,0x00,0xEF,0x03,0x63,0x00,0x00, -0x6C,0x1D,0x11,0x80,0x18,0xA1,0x11,0x80,0x1C,0xA1,0x11,0x80,0x20,0xA1,0x11,0x80, -0xFD,0x63,0x05,0x62,0x04,0xD0,0x0B,0xB0,0xE3,0xF7,0x1F,0x6B,0x7C,0x6C,0x40,0x98, -0x01,0x6D,0x56,0x32,0x6C,0xEA,0x69,0x98,0x58,0xEB,0x12,0xEA,0x00,0x18,0xEB,0x9F, -0x4A,0xD8,0x6B,0x98,0x05,0x97,0x4D,0xE3,0x6B,0xD8,0x04,0x90,0x00,0xEF,0x03,0x63, -0xD8,0xA0,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0x3B,0xB0,0xBD,0x67, -0x10,0x4D,0x90,0xA0,0x4F,0xA0,0x80,0x34,0x4D,0xEC,0x4E,0xA0,0x80,0x34,0x00,0x18, -0x3A,0xBA,0x4D,0xEC,0x7D,0x67,0x48,0xAB,0x8F,0xA0,0xFD,0x67,0x4C,0xCB,0x49,0xAB, -0x4D,0xCB,0x6A,0xAB,0x03,0x6A,0x4C,0xEB,0x4E,0xA0,0x48,0x32,0x4D,0xEB,0x80,0x32, -0x48,0x32,0x4D,0xEB,0x50,0xA0,0x6E,0xCF,0x70,0x80,0x48,0x32,0x9A,0x34,0x4D,0xEC, -0x00,0x53,0x8F,0xCF,0x05,0x60,0x09,0xF4,0x00,0x6A,0x8D,0xEA,0x4F,0xCF,0x06,0x10, -0x0A,0xF0,0x00,0x6A,0x4B,0xEA,0x8D,0xEA,0x7D,0x67,0x4F,0xCB,0x9D,0x67,0x10,0x4C, -0xFF,0xF7,0x1F,0x6F,0x0F,0x6A,0x00,0x6E,0x2C,0x65,0x0F,0x65,0x01,0x69,0x4A,0x65, -0x89,0x67,0xC4,0x30,0x89,0xE0,0x84,0xAA,0x00,0x6D,0xE8,0x67,0x65,0x67,0xEC,0xEC, -0x44,0x67,0x47,0xEB,0x2C,0xEA,0x07,0x22,0xEA,0x67,0x6B,0xE7,0xF1,0x67,0xE4,0xEA, -0xED,0xED,0x48,0x67,0x4C,0xED,0x01,0x4B,0xFF,0x6F,0xEC,0xEB,0x10,0x5B,0xF0,0x61, -0x01,0x4E,0x69,0x67,0xEC,0xEE,0x69,0xE0,0x04,0x5E,0xA4,0xCA,0xE1,0x61,0xFD,0x67, -0xCC,0xAF,0x51,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x5D,0x67,0xCD,0xAA,0x50,0x6C, -0x00,0x18,0x01,0xA0,0x01,0x6D,0x7D,0x67,0xCE,0xAB,0x4F,0x6C,0x00,0x18,0x01,0xA0, -0x01,0x6D,0xFD,0x67,0xCF,0xAF,0x4E,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x0A,0x97, -0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0xD8,0xA0,0x11,0x80,0xFB,0x63,0x08,0x62, -0x07,0xD1,0x06,0xD0,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6B, -0x04,0xD3,0x6C,0xEA,0xFF,0x6B,0x02,0x4B,0x6B,0xEB,0x6C,0xEA,0xFF,0x6B,0x01,0x4B, -0xC2,0x67,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x51,0xB1,0x52,0xB3, -0x07,0x68,0x41,0x99,0x51,0xB4,0x01,0x6D,0x4E,0x32,0x0C,0xEA,0x69,0xE2,0x60,0xA2, -0x40,0x99,0x0C,0xEB,0x40,0xF6,0x60,0x33,0x8C,0xEA,0x6D,0xEA,0x57,0x6C,0x00,0x18, -0xEB,0x9F,0x40,0xD9,0x04,0x93,0x57,0x6C,0x01,0x6D,0x4C,0xEB,0x71,0x6A,0x04,0xD3, -0x4B,0xEA,0x4C,0xEB,0x40,0x99,0xC3,0x67,0x40,0xF6,0x42,0x32,0x0C,0xEA,0x50,0x32, -0x00,0x18,0x01,0xA0,0x4D,0xEE,0x40,0x99,0x01,0x6B,0x03,0x67,0x6C,0xEA,0x06,0x22, -0x41,0x99,0x80,0x6B,0x6C,0xEA,0x01,0x5A,0x18,0x67,0x02,0x48,0x56,0x6C,0x00,0x18, -0xEB,0x9F,0x01,0x6D,0x00,0x36,0x37,0xB0,0xFF,0xF7,0x1F,0x69,0x1C,0xF0,0x00,0x6B, -0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x60,0x98,0xE3,0xF7,0x1F,0x6C,0xD8,0x36,0x76,0x33, -0x8C,0xEB,0x6D,0xEE,0xFB,0xF7,0x1F,0x6B,0x6C,0xEE,0x4D,0xEE,0x56,0x6C,0x00,0x18, -0x01,0xA0,0x01,0x6D,0x47,0xA0,0xC6,0xA0,0x58,0x6C,0x40,0x32,0x4D,0xEE,0x00,0x18, -0x01,0xA0,0x01,0x6D,0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xC8,0xA0,0x04,0x6B, -0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x03,0x6B,0x6C,0xEE,0x4D,0xEE,0x59,0x6C,0x00,0x18, -0x01,0xA0,0x01,0x6D,0x80,0x18,0x7D,0x2C,0x00,0x65,0x40,0x98,0xC0,0xF7,0x42,0x32, -0x24,0x22,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x81,0x6B,0x2C,0xEA,0x6B,0xEB, -0x6C,0xEA,0xC2,0x67,0x80,0x6B,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D, -0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x4C,0xE9,0xE0,0xF1,0x1D,0x6A,0x4B,0xEA, -0x4C,0xE9,0x45,0xA0,0xFF,0x6B,0xD1,0x67,0x6C,0xEA,0x48,0x32,0xE0,0xF1,0x1C,0x6B, -0x6C,0xEA,0x59,0x6C,0x01,0x6D,0x4D,0xEE,0x0B,0x10,0x57,0x6C,0x00,0x18,0xEB,0x9F, -0x01,0x6D,0x4C,0xE9,0x81,0x6A,0x4B,0xEA,0xD1,0x67,0x57,0x6C,0x01,0x6D,0x4C,0xEE, -0x00,0x18,0x01,0xA0,0x00,0x65,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63, -0xD8,0xA0,0x11,0x80,0x78,0xDB,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0xFB,0x63,0x08,0x62, -0x07,0xD1,0x06,0xD0,0x0F,0xB1,0xFF,0x68,0x8C,0xE8,0x47,0x99,0x4F,0xEA,0x04,0x22, -0x87,0x41,0x00,0x18,0xFD,0x1D,0x15,0x4C,0x0E,0x20,0x0B,0xB6,0x00,0x68,0xA7,0x41, -0x01,0x6C,0x15,0x4D,0xF0,0x67,0x00,0x18,0xF3,0x1D,0x04,0xD0,0x87,0x99,0x00,0x18, -0x0C,0x1E,0x14,0x6D,0x10,0xC9,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63, -0xD8,0xA0,0x11,0x80,0x85,0xB5,0x10,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0, -0x00,0x6C,0x02,0xF0,0x00,0x6E,0x00,0x18,0x01,0xA0,0xA4,0x67,0x2D,0xB2,0x3C,0x6C, -0x00,0x6D,0xC0,0x9A,0x7F,0x6A,0xFF,0xF7,0x1F,0x68,0x80,0xF4,0xC2,0x36,0x4C,0xEE, -0xC4,0x36,0xFF,0x6A,0x01,0x4E,0x4C,0xEE,0x00,0x18,0x01,0xA0,0xC0,0x36,0x57,0x6C, -0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x01,0xF6,0x01,0x69,0x2B,0xE9,0xC2,0x67, -0x2C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F, -0x01,0x6D,0x0C,0xEA,0x2C,0xEA,0x01,0xF6,0x00,0x6B,0xC2,0x67,0x6D,0xEE,0x57,0x6C, -0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA, -0x03,0x69,0x2B,0xE9,0xC2,0x67,0x2C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D, -0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x2C,0xEA,0x02,0x6B,0xC2,0x67, -0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F, -0x01,0x6D,0x4C,0xE8,0xD0,0x67,0x2C,0xEE,0x01,0x6D,0x00,0x18,0x01,0xA0,0x57,0x6C, -0x80,0x18,0x1B,0x2D,0x01,0x6C,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63, -0xD8,0xA0,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x1A,0xB2,0x06,0xD4,0x47,0x9A, -0x8E,0xEA,0x05,0x22,0x8F,0xEA,0x03,0x22,0x00,0x18,0xFD,0x1D,0x06,0x04,0x15,0xB0, -0x42,0x6B,0x41,0x98,0x6C,0xEA,0x6A,0xEA,0x08,0x60,0x47,0x98,0x4F,0xEA,0x1C,0x22, -0x87,0x40,0x00,0x18,0xFD,0x1D,0x15,0x4C,0x17,0x10,0x7D,0x6C,0x00,0x18,0xEB,0x9F, -0x01,0x6D,0x02,0x6E,0x4C,0xEE,0x04,0x26,0x50,0xA8,0x01,0x4A,0x50,0xC8,0x0C,0x10, -0x86,0x67,0x00,0x18,0x01,0xA0,0xA6,0x67,0x49,0x98,0x01,0x4A,0x80,0x18,0x70,0x2C, -0x49,0xD8,0x80,0x18,0x2E,0x2D,0x00,0x65,0x05,0x97,0x04,0x90,0x00,0xEF,0x03,0x63, -0xD8,0xA0,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x00,0x6C,0xC4,0x67,0x00,0x18, -0x01,0xA0,0xA4,0x67,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E, -0x4C,0xEE,0xFF,0x6A,0x04,0x4A,0x4B,0xEA,0x4C,0xEE,0x01,0x6D,0x00,0x18,0x01,0xA0, -0x57,0x6C,0x0A,0xB0,0x41,0x6B,0x6B,0xEB,0x41,0x98,0x00,0x6C,0x6C,0xEA,0x80,0x18, -0x1B,0x2D,0x41,0xD8,0x80,0x18,0x70,0x2C,0x00,0x65,0x00,0x6A,0x49,0xC0,0x05,0x97, -0x04,0x90,0x00,0xEF,0x03,0x63,0x00,0x00,0xD8,0xA0,0x11,0x80,0xFD,0x63,0x04,0x62, -0x80,0x18,0xBB,0x2C,0x00,0x65,0x0D,0xB3,0x00,0x6A,0x59,0x6C,0x4B,0xDB,0x49,0xDB, -0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x00,0xF2,0x01,0x6A, -0x4B,0xEA,0x59,0x6C,0x01,0x6D,0x00,0x18,0x01,0xA0,0x4C,0xEE,0x80,0x18,0x2E,0x2D, -0x00,0x65,0x04,0x97,0x00,0xEF,0x03,0x63,0xD8,0xA0,0x11,0x80,0xFD,0x63,0x04,0x62, -0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x02,0xF1, -0x01,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x00,0x6C, -0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x06,0xB4,0x41,0x6B,0x6B,0xEB,0x41,0x9C, -0x04,0x97,0x6C,0xEA,0x41,0xDC,0x00,0x6A,0x49,0xC4,0x00,0xEF,0x03,0x63,0x00,0x00, -0xD8,0xA0,0x11,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x80,0x18,0xBB,0x2C, -0x00,0x65,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x69,0x02,0xF0, -0x01,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x02,0xF0,0x00,0x68,0xC2,0x67,0x0D,0xEE, -0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D, -0x2C,0xEA,0x00,0xF2,0x01,0x6B,0x6B,0xEB,0xC2,0x67,0x6C,0xEE,0x59,0x6C,0x00,0x18, -0x01,0xA0,0x01,0x6D,0x00,0x6C,0xD0,0x67,0x00,0x18,0x01,0xA0,0xA4,0x67,0x28,0xB2, -0x03,0x6C,0x00,0x6D,0x00,0x9A,0x07,0x6A,0x00,0xF7,0x02,0x30,0x00,0x18,0xEB,0x9F, -0x4C,0xE8,0x2C,0xEA,0x1F,0xF4,0x01,0x6B,0x6B,0xEB,0x6C,0xEA,0x21,0xB3,0x05,0x48, -0x1F,0xF4,0x00,0x6C,0x61,0xE0,0x20,0xF1,0x7A,0xA0,0xC2,0x67,0x00,0x6D,0x60,0x33, -0x68,0x33,0x8C,0xEB,0x6D,0xEE,0x00,0x18,0x01,0xA0,0x03,0x6C,0x18,0xB3,0x7F,0x6A, -0x3C,0x6C,0xC0,0x9B,0x00,0x6D,0x01,0x68,0x80,0xF4,0xC2,0x36,0x4C,0xEE,0xC4,0x36, -0xFF,0x6A,0x06,0x4E,0x4C,0xEE,0x00,0x18,0x01,0xA0,0xC0,0x36,0x57,0x6C,0x00,0x18, -0xEB,0x9F,0x01,0x6D,0x02,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0xC2,0x67,0x0D,0xEE, -0xB0,0x67,0x00,0x18,0x01,0xA0,0x57,0x6C,0xB0,0x67,0x00,0x18,0xEB,0x9F,0x57,0x6C, -0x02,0x6E,0x4C,0xE9,0xCB,0xEE,0xB0,0x67,0x2C,0xEE,0x00,0x18,0x01,0xA0,0x57,0x6C, -0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63,0x00,0x00,0xD8,0xA0,0x11,0x80, -0xDC,0x00,0x11,0x80,0xFD,0x63,0x04,0x62,0x7F,0xF7,0x0F,0x6D,0x00,0x18,0x5D,0xBA, -0x5E,0x6C,0x0E,0xB2,0xFF,0xF6,0x1F,0x6D,0x00,0x18,0x5D,0xBA,0x81,0xA2,0xFF,0x6D, -0xD8,0x6C,0x00,0x18,0x9A,0x33,0x08,0x4D,0xFF,0x6C,0x09,0x4C,0x00,0x18,0x9A,0x33, -0x00,0x6D,0x07,0xB4,0x41,0x6B,0x6B,0xEB,0x41,0x9C,0x04,0x97,0x6C,0xEA,0x41,0xDC, -0x00,0x6A,0x49,0xC4,0x00,0xEF,0x03,0x63,0x30,0xF4,0x04,0x80,0xD8,0xA0,0x11,0x80, -0xF7,0x63,0x10,0x62,0x0F,0xD1,0x0E,0xD0,0x72,0xB5,0x73,0xB3,0x07,0x6C,0xC0,0x9D, -0xFF,0xF7,0x1F,0x6F,0xC0,0x32,0x58,0x32,0x80,0xF5,0x42,0x31,0x41,0x9D,0x4E,0x32, -0x8C,0xEA,0x69,0xE2,0x60,0xA2,0x6D,0xB2,0x8C,0xEB,0x40,0xF6,0x60,0x33,0xCC,0xEA, -0x6D,0xEA,0x40,0xF6,0x42,0x33,0x40,0xDD,0xFF,0x6E,0x8C,0xEB,0x61,0x21,0x51,0x67, -0xEC,0xE9,0x00,0xF4,0x01,0x59,0x02,0x61,0x00,0xF4,0x00,0x6A,0x27,0x67,0x4C,0xE9, -0x4F,0x43,0xCC,0xEA,0x04,0x5A,0x23,0x61,0x61,0xB0,0x00,0x6F,0x5D,0x67,0x06,0xD7, -0x0C,0xCA,0x06,0x92,0x5F,0xB3,0x80,0xF4,0x20,0x34,0x01,0x6D,0x6C,0xEA,0x8D,0xEA, -0x06,0xD2,0x5D,0xB2,0x9D,0x67,0x18,0x4C,0xC5,0x67,0x07,0xD2,0x04,0xD7,0x05,0xD7, -0x3C,0x10,0xE0,0xF7,0x1F,0x6A,0x4C,0xEB,0x49,0x67,0x80,0xF4,0x60,0x33,0xCC,0xEA, -0x6D,0xEA,0x40,0xDC,0x54,0xB2,0xFF,0x6D,0xEC,0xED,0x41,0xDC,0x28,0x10,0x53,0xB2, -0x60,0x33,0x00,0x6D,0x41,0xE3,0x5D,0x67,0x18,0x4A,0xAA,0x65,0x4D,0xB2,0x71,0x67, -0x0D,0x65,0x2A,0x65,0x4E,0xB2,0x6F,0x65,0x4E,0x65,0x8A,0x65,0xAC,0x32,0xCD,0x67, -0xD1,0xE2,0x48,0x67,0x40,0xDC,0x00,0xF1,0x01,0x5B,0x00,0xCC,0x41,0xDC,0xC0,0x9C, -0xE1,0x45,0xD7,0x61,0x49,0x67,0xCC,0xEA,0xAC,0x67,0xAD,0xEA,0xAA,0x67,0x80,0x4B, -0xEC,0xED,0x80,0x4B,0xCB,0x67,0x04,0x5D,0x40,0xDC,0xCC,0xEB,0xE7,0x61,0x00,0x6F, -0x9D,0x67,0x04,0xD7,0x05,0xD7,0x18,0x4C,0x01,0x6E,0x00,0x18,0xF7,0x33,0x00,0x65, -0x34,0xB2,0xC4,0x6C,0xA0,0x9A,0x7F,0x6A,0x80,0xF4,0xA2,0x35,0x4C,0xED,0xA0,0x32, -0x00,0x18,0x9A,0x33,0x4D,0xED,0x5E,0x6C,0x00,0x18,0x78,0xBA,0x60,0x6D,0x35,0xB2, -0x35,0xB0,0x2C,0xB3,0x81,0xA2,0x01,0xF4,0x00,0x6D,0x09,0xE4,0x40,0xAA,0x4C,0xED, -0x40,0x9B,0x0F,0x6B,0x46,0x32,0x6C,0xEA,0x40,0x32,0x50,0x32,0x4D,0xED,0x00,0x18, -0x9A,0x33,0x2D,0xED,0x2D,0xB2,0x23,0xB6,0xEE,0xF1,0x1F,0x6D,0x21,0xA2,0x60,0x9E, -0x01,0xE1,0x40,0xA8,0x07,0x68,0x91,0x67,0x4C,0xED,0x01,0x6A,0x6C,0xEA,0x00,0xF7, -0x62,0x33,0x0C,0xEB,0x40,0x32,0x5C,0x32,0x60,0x33,0x64,0x33,0x4D,0xED,0x00,0x18, -0x9A,0x33,0x6D,0xED,0x17,0xB2,0x01,0x6C,0xA0,0x9A,0x00,0xF7,0xA2,0x35,0x00,0x18, -0x68,0x91,0x0C,0xED,0x13,0xB3,0x01,0x6C,0xA0,0x9B,0x00,0xF7,0xA2,0x35,0x00,0x18, -0x82,0x91,0x0C,0xED,0x5E,0x6C,0x00,0x18,0x78,0xBA,0x90,0x6D,0xFF,0x6D,0x91,0x67, -0x00,0x18,0x78,0xBA,0x01,0x4D,0xFF,0x6C,0x09,0x4C,0x00,0x18,0x9A,0x33,0x03,0x6D, -0xFF,0x6D,0xD8,0x6C,0x00,0x18,0x9A,0x33,0x08,0x4D,0xFE,0xF7,0x1F,0x6D,0x00,0x18, -0x5D,0xBA,0x5E,0x6C,0x10,0x97,0x0F,0x91,0x0E,0x90,0x00,0xEF,0x09,0x63,0x00,0x00, -0xD8,0xA0,0x11,0x80,0x80,0xDB,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0x00,0xF8,0x10,0x80, -0xFF,0xFF,0x03,0xE0,0x00,0x00,0x00,0x80,0x00,0xFB,0x10,0x80,0x00,0x00,0x00,0x04, -0x38,0xF4,0x04,0x80,0x00,0x00,0x00,0xB6,0x30,0xF4,0x04,0x80,0xE0,0x63,0x3F,0x62, -0x3E,0xD0,0x0F,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x00,0x68, -0x7D,0x67,0x04,0xF0,0x1F,0x6A,0x9D,0x67,0x12,0xC3,0x48,0xCB,0x00,0x18,0xEC,0xC6, -0x10,0x4C,0x08,0xB4,0x04,0x63,0x41,0x6B,0x41,0x9C,0x09,0xC4,0x3F,0x97,0x3E,0x90, -0x6B,0xEB,0x6C,0xEA,0x41,0xDC,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80, -0xD8,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x18,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18, -0x64,0x2E,0x08,0x6E,0x16,0xB5,0x17,0xB3,0x07,0x6E,0x41,0x9D,0x16,0xB4,0x4E,0x32, -0xCC,0xEA,0x69,0xE2,0x40,0xA2,0x60,0x9D,0xCC,0xEA,0x40,0xF6,0x40,0x32,0x8C,0xEB, -0x4D,0xEB,0x9D,0x67,0x04,0xF0,0x1E,0x6A,0x60,0xDD,0x48,0xCC,0x03,0x6A,0x52,0xC4, -0x80,0xF4,0x62,0x32,0x7F,0x6C,0x8C,0xEA,0x9D,0x67,0x53,0xC4,0x62,0x32,0x40,0xF6, -0x62,0x33,0xCC,0xEB,0x75,0xC4,0x54,0xC4,0x00,0x18,0xAA,0xC6,0x10,0x4C,0x04,0x63, -0x3E,0x97,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0xD8,0xA0,0x11,0x80, -0x70,0xDB,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0xE0,0x63,0x3E,0x62,0x3D,0xD1,0x3C,0xD0, -0x11,0xB4,0xFB,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x7D,0x67,0x04,0xF0, -0x1F,0x6A,0x48,0xCB,0x0D,0xB2,0x0E,0xB0,0x00,0x69,0xA1,0xF1,0x48,0xAA,0x9D,0x67, -0x32,0xC3,0x49,0xD8,0x00,0x18,0xEC,0xC6,0x10,0x4C,0x41,0x98,0x41,0x6B,0x6B,0xEB, -0x05,0x63,0x6C,0xEA,0x29,0xC0,0x41,0xD8,0x3E,0x97,0x3D,0x91,0x3C,0x90,0x00,0xEF, -0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0x58,0x46,0x11,0x80,0xD8,0xA0,0x11,0x80, -0xE0,0x63,0x3E,0x62,0x0E,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E, -0x7D,0x67,0x04,0xF0,0x1D,0x6A,0x48,0xCB,0x01,0x6A,0x52,0xC3,0x09,0xB2,0x7F,0x6B, -0x9D,0x67,0x40,0x9A,0x10,0x4C,0x80,0xF4,0x42,0x32,0x6C,0xEA,0x7D,0x67,0x00,0x18, -0x7C,0xC6,0x53,0xC3,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x76,0x5D,0x11,0x80, -0xD8,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x24,0xB4,0xFC,0x63,0x08,0x6E,0x00,0x18, -0x64,0x2E,0x00,0x6D,0x7D,0x67,0x04,0xF0,0x0D,0x6A,0x48,0xCB,0x19,0x6A,0x00,0x6C, -0x52,0xC3,0x60,0x6A,0x4B,0xEA,0x53,0xC3,0x94,0xC3,0x55,0xC3,0x96,0xC3,0x97,0xC3, -0x98,0xC3,0x1B,0xB3,0xBD,0x67,0x9F,0xC5,0x54,0xA3,0x20,0xF0,0x80,0xC5,0x20,0xF0, -0x82,0xC5,0x59,0xC5,0x55,0xA3,0x20,0xF0,0x84,0xC5,0x20,0xF0,0x85,0xC5,0x5A,0xC5, -0x56,0xA3,0x20,0xF0,0x87,0xC5,0x20,0xF0,0x89,0xC5,0x5B,0xC5,0x57,0xA3,0x5C,0xC5, -0x58,0xA3,0x5D,0xC5,0x59,0xA3,0x5E,0xC5,0x02,0x6A,0x20,0xF0,0x41,0xC5,0x20,0xF0, -0x43,0xC5,0x1E,0x6A,0x20,0xF0,0x46,0xC5,0x12,0x6A,0x20,0xF0,0x48,0xC5,0x20,0xF0, -0x4A,0xC5,0x20,0xF0,0x8B,0xC5,0x9D,0x67,0x00,0x18,0xFC,0xC2,0x10,0x4C,0x04,0x63, -0x3E,0x97,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0xD8,0xA0,0x11,0x80, -0xE0,0x63,0x3E,0x62,0x1A,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E, -0x7D,0x67,0x04,0xF0,0x06,0x6A,0x48,0xCB,0x0F,0x6A,0x9D,0x67,0x52,0xC3,0x00,0x6A, -0x54,0xC4,0x56,0xC4,0x57,0xC4,0x58,0xC4,0x59,0xC4,0x5A,0xC4,0x5B,0xC4,0x5C,0xC4, -0x5D,0xC4,0x5E,0xC4,0x5F,0xC4,0x07,0x6A,0x20,0x6B,0x20,0xF0,0x40,0xC4,0x03,0x6A, -0x73,0xC4,0x75,0xC4,0x20,0xF0,0x41,0xC4,0x00,0x18,0xA8,0xC1,0x10,0x4C,0x7D,0x67, -0x04,0xF0,0x0A,0x6A,0x48,0xCB,0x9D,0x67,0x01,0x6A,0x52,0xC3,0x53,0xC3,0x00,0x18, -0x5E,0xC2,0x10,0x4C,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x76,0x5D,0x11,0x80, -0xE0,0x63,0x3E,0x62,0xFB,0x63,0x7D,0x67,0x00,0xF4,0x06,0x6A,0x48,0xCB,0x03,0x6A, -0x52,0xC3,0x13,0x6A,0x55,0xC3,0x26,0xB2,0x6D,0xA2,0x08,0x73,0x22,0x60,0x70,0x32, -0x69,0xE2,0x24,0xB6,0x48,0x32,0x6B,0xE2,0x48,0x32,0xD1,0xE2,0x20,0xF1,0x4F,0xA4, -0x01,0x6D,0xAC,0xEA,0x16,0x22,0x00,0xF1,0x52,0xAE,0x47,0xEB,0xAC,0xEA,0x11,0x22, -0x20,0xF1,0x6C,0xAC,0xFF,0xF7,0x1F,0x6A,0x9D,0x67,0x4C,0xEB,0x5D,0x67,0x73,0xC2, -0xBD,0x67,0x62,0x32,0x7D,0x67,0x54,0xC3,0x00,0xF1,0x18,0x4D,0x00,0x18,0xD2,0x48, -0x10,0x4C,0x13,0xB2,0x6C,0xA2,0x0A,0x73,0x1D,0x60,0x64,0x32,0x69,0xE2,0x4C,0x32, -0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x10,0xB3,0x48,0x32,0x71,0xE2,0xE0,0xF0,0x4B,0xA4, -0xFF,0x6B,0x6C,0xEA,0x01,0x72,0x0E,0x61,0x60,0xF2,0x7C,0xAC,0x5D,0x67,0x9D,0x67, -0x73,0xC2,0xBD,0x67,0x62,0x32,0x7D,0x67,0x54,0xC3,0x00,0xF1,0x18,0x4D,0x00,0x18, -0xD2,0x48,0x10,0x4C,0x05,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0xD8,0xA0,0x11,0x80, -0x58,0x46,0x11,0x80,0x48,0x60,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x12,0xB0, -0x00,0x6A,0xFF,0x6D,0xC0,0xF1,0x46,0xC0,0xC0,0xF1,0x5A,0xC0,0x03,0x6A,0xC0,0xF1, -0x58,0xC0,0x0E,0xB2,0x02,0x6B,0xAC,0xEC,0xC0,0xF1,0x65,0xC0,0xC0,0xF1,0x64,0xC0, -0xC0,0xF1,0x79,0xC0,0x40,0xF1,0x9E,0xC0,0x60,0xC2,0x00,0x18,0xEB,0xA4,0xAC,0xEC, -0x20,0xF1,0x8E,0x40,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x05,0x97,0x04,0x90, -0x00,0xEF,0x03,0x63,0x48,0x5C,0x11,0x80,0xBD,0x5B,0x11,0x80,0xE0,0x63,0x3E,0x62, -0x3D,0xD1,0x3C,0xD0,0xF5,0x63,0x7D,0x67,0x00,0xF4,0x05,0x6A,0x7E,0xB5,0x54,0xCB, -0x9D,0x67,0x0D,0x6A,0x20,0xF0,0x4A,0xC3,0x2B,0x4C,0x00,0x18,0x2E,0x2E,0x06,0x6E, -0x7A,0xB0,0x00,0x6A,0x9D,0x67,0x01,0x6B,0x20,0xF0,0x51,0xC4,0x20,0xF0,0x52,0xC4, -0x20,0xF0,0x73,0xC4,0x20,0xF0,0x54,0xC4,0x20,0xF0,0x55,0xC4,0x20,0xF0,0x56,0xC4, -0x20,0xF0,0x77,0xC4,0xC0,0xF1,0x46,0xC0,0xC0,0xF1,0x5A,0xC0,0x03,0x6A,0xC0,0xF1, -0x58,0xC0,0x6F,0xB2,0x02,0x6B,0xC0,0xF1,0x65,0xC0,0xC0,0xF1,0x64,0xC0,0xC0,0xF1, -0x79,0xC0,0x20,0xF1,0x8E,0x40,0x60,0xC2,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E, -0x60,0xF1,0x4E,0xA0,0x02,0x72,0x07,0x60,0x03,0x52,0x02,0x60,0x01,0x72,0x01,0x10, -0x03,0x72,0x15,0x61,0xAF,0x10,0x63,0xB5,0x00,0x6B,0xFF,0x6C,0x64,0x32,0x69,0xE2, -0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x48,0x32,0xA9,0xE2,0x20,0xF0,0x58,0xA2, -0x8C,0xEA,0x80,0xF0,0x1F,0x2A,0x01,0x4B,0x8C,0xEB,0x0A,0x5B,0xEF,0x61,0x00,0x18, -0xD4,0x5A,0x0A,0x04,0x62,0x67,0x80,0xF0,0x1D,0x2A,0x0A,0x02,0x06,0x4A,0x64,0xA2, -0xFF,0xF7,0x1F,0x6C,0xBD,0x67,0x60,0x33,0x4C,0xD3,0x43,0xA2,0x22,0x4D,0x4D,0xEB, -0x8C,0xEB,0x4C,0xD3,0x5D,0x67,0x20,0xF0,0x53,0xA2,0x7D,0x67,0x4D,0xD2,0x20,0xF0, -0x74,0xA3,0x0A,0x02,0x0A,0x4A,0x4E,0xD3,0x24,0xA2,0x43,0xA2,0x20,0x31,0x8C,0xE9, -0x4D,0xE9,0x8C,0xE9,0x9D,0x67,0x20,0xF0,0x97,0xA4,0x4F,0xD4,0x9D,0x67,0x00,0x18, -0x8E,0xDF,0x20,0x4C,0x50,0xD2,0x62,0x67,0x75,0x2A,0x5D,0x67,0x71,0xAA,0xFF,0xF7, -0x1F,0x6C,0x3D,0xB5,0x8C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32, -0x6B,0xE2,0x3C,0xB3,0x48,0x32,0x61,0xE2,0xE0,0xF0,0x8D,0x40,0x00,0x18,0x2E,0x2E, -0x06,0x6E,0x5D,0x67,0x20,0xF1,0x50,0xAA,0x7D,0x67,0x9D,0x67,0x60,0xF2,0x5E,0xC8, -0x20,0xF1,0x74,0xA3,0x5D,0x67,0xE0,0xF0,0x7A,0xC0,0x20,0xF1,0x98,0xA4,0x7D,0x67, -0xE0,0xF0,0x9C,0xC0,0x20,0xF1,0x5C,0xA2,0xE0,0xF0,0x5D,0xC0,0x20,0xF0,0x40,0xA3, -0xE0,0xF0,0x53,0xC0,0x01,0x6A,0x80,0xF2,0x42,0xC0,0x91,0xAB,0xFF,0xF7,0x1F,0x6A, -0x00,0x18,0x45,0x95,0x4C,0xEC,0x7D,0x67,0x40,0xF1,0x60,0xA3,0x22,0x32,0x5E,0x32, -0x00,0xF1,0x71,0xC0,0x18,0x22,0xEF,0xF7,0x1F,0x6A,0x4C,0xE9,0x01,0x6A,0x80,0xF0, -0x3E,0xC8,0x04,0xD2,0x20,0xB2,0xFF,0xF7,0x1F,0x6C,0xFA,0x6D,0x05,0xD2,0x80,0xF0, -0x5E,0xA8,0x24,0xF2,0x15,0x6E,0x20,0xF5,0x17,0x6F,0x8C,0xEA,0x06,0x6C,0x20,0x18, -0x1B,0x32,0x06,0xD2,0x05,0x10,0x5D,0x67,0x40,0xF1,0x40,0xAA,0x80,0xF0,0x5E,0xC8, -0x00,0x18,0x4E,0x9B,0x0A,0x04,0x22,0x67,0x0F,0x22,0x7D,0x67,0x20,0xF0,0x80,0xA3, -0xE0,0xF0,0xA8,0xA0,0x00,0x18,0xB6,0xDF,0x00,0x65,0x0B,0xB4,0x00,0x18,0xD3,0xDF, -0x00,0x65,0x07,0x10,0x0C,0x6B,0x06,0x10,0x5D,0x67,0x91,0xAA,0x20,0x18,0x13,0x26, -0x01,0x6D,0x71,0x67,0x0B,0x63,0x3E,0x97,0x3D,0x91,0x3C,0x90,0x43,0x67,0x00,0xEF, -0x20,0x63,0x00,0x00,0xEC,0xA0,0x11,0x80,0x48,0x5C,0x11,0x80,0xBD,0x5B,0x11,0x80, -0x48,0x60,0x11,0x80,0xFC,0xA5,0x10,0x80,0xF4,0x63,0x16,0x62,0x15,0xD1,0x14,0xD0, -0x00,0x6A,0x0B,0xD2,0x0C,0xD2,0x0D,0xD2,0x7D,0x67,0x01,0xF4,0x03,0x6A,0x18,0xD4, -0x54,0xCB,0x62,0xA4,0x23,0xA4,0x02,0x6A,0x1E,0x5B,0xC0,0xF3,0x1B,0x60,0x04,0x0A, -0x64,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3,0x00,0xEB,0x00,0x65,0x3D,0x00,0x49,0x00, -0x9D,0x00,0x5B,0x02,0x07,0x03,0x47,0x03,0xD3,0x03,0xAB,0x07,0xF5,0x03,0x07,0x04, -0x21,0x04,0x33,0x04,0x9D,0x06,0x9D,0x05,0x45,0x04,0x6D,0x05,0x85,0x05,0x9D,0x06, -0xAD,0x05,0xBF,0x05,0xD1,0x05,0xFF,0x05,0x0B,0x06,0x21,0x06,0x2D,0x06,0x41,0x06, -0x51,0x06,0x61,0x06,0x6D,0x06,0x7F,0x06,0xA0,0xF7,0x00,0xB2,0x03,0x6C,0x40,0xAA, -0x0B,0xD2,0x0A,0x13,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E, -0x4C,0xEE,0x02,0xF1,0x03,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0, -0x01,0x6D,0x00,0x6C,0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x80,0x18,0x1B,0x2D, -0x00,0x6C,0x00,0x18,0xFE,0x4F,0x00,0x65,0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18, -0x49,0x2B,0xC5,0x67,0x40,0xF7,0x18,0xB3,0x0A,0x6A,0x4C,0xC3,0x08,0x6A,0x4D,0xC3, -0x00,0x6A,0x49,0xC3,0x4A,0xC3,0x87,0x13,0x0B,0x59,0x18,0x67,0x60,0xF3,0x11,0x20, -0x20,0xF7,0x1C,0xB4,0x05,0x21,0x41,0x9C,0x40,0x6B,0x6C,0xEA,0x07,0x22,0x53,0x13, -0x41,0x9C,0x40,0x6B,0x6C,0xEA,0x02,0x2A,0x29,0xC4,0x75,0x13,0x20,0xF7,0x00,0xB3, -0x04,0x6A,0x01,0x6C,0x29,0xC3,0x04,0xD2,0x00,0xF7,0x18,0xB2,0x06,0xD1,0xFA,0x6D, -0x05,0xD2,0x4A,0xA3,0x43,0xF7,0x0A,0x6E,0xE1,0xF4,0x11,0x6F,0x07,0xD2,0x61,0x9B, -0x6A,0x32,0x66,0xEC,0x8C,0xEA,0x8C,0xEB,0x08,0xD2,0x20,0x18,0x1B,0x32,0x09,0xD3, -0xA0,0xF0,0x04,0x20,0x00,0xF0,0x10,0x0A,0x24,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3, -0x00,0xEB,0x00,0x65,0x17,0x00,0x8D,0x00,0xB9,0x00,0xEF,0x00,0x0F,0x01,0x13,0x01, -0x17,0x01,0x39,0x01,0x21,0x01,0x29,0x01,0x31,0x01,0xC0,0xF6,0x04,0xB2,0x61,0x9A, -0x01,0x6A,0x6C,0xEA,0x0B,0x22,0x02,0x6A,0x6C,0xEA,0x04,0x22,0x80,0x18,0x7D,0x2D, -0x00,0x65,0x15,0x10,0x80,0x18,0xA3,0x2D,0x00,0x65,0x11,0x10,0x02,0x6A,0x6C,0xEA, -0x04,0x22,0x80,0x18,0xB6,0x2E,0x00,0x65,0x0A,0x10,0x04,0x6A,0x6C,0xEA,0x04,0x22, -0x80,0x18,0x87,0x2E,0x00,0x65,0x03,0x10,0x80,0x18,0xF5,0x2D,0x00,0x65,0x80,0xF6, -0x00,0xB0,0x8A,0x98,0x4B,0x98,0x29,0x98,0x0E,0xD4,0x00,0x18,0xFE,0x4F,0x0F,0xD2, -0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18,0x49,0x2B,0xC5,0x67,0x0E,0x93,0x0F,0x94, -0x0A,0x6A,0x4C,0xC0,0x08,0x6A,0x4D,0xC0,0x29,0xD8,0x6A,0xD8,0x8B,0xD8,0x0B,0x13, -0x40,0xF6,0x0C,0xB4,0x02,0x6A,0x61,0x9C,0x4D,0xEB,0x04,0x6A,0x6C,0xEA,0x61,0xDC, -0x07,0x22,0x02,0x6A,0x4B,0xEA,0x6C,0xEA,0x80,0x18,0xCC,0x2E,0x41,0xDC,0x1A,0x10, -0x01,0x6A,0x6D,0xEA,0x80,0x18,0x93,0x2D,0x41,0xDC,0x14,0x10,0x20,0xF6,0x00,0xB4, -0x03,0x6A,0x4B,0xEA,0x61,0x9C,0x4C,0xEB,0x02,0x6A,0x4B,0xEA,0x4C,0xEB,0x04,0x6A, -0x6C,0xEA,0x61,0xDC,0x04,0x22,0x80,0x18,0x99,0x2E,0x00,0x65,0x03,0x10,0x80,0x18, -0x08,0x2E,0x00,0x65,0xE0,0xF5,0x18,0xB2,0x40,0x6C,0x61,0x9A,0x8D,0xEB,0x61,0xDA, -0xDA,0x12,0xE0,0xF5,0x0C,0xB0,0x03,0x6B,0x6B,0xEB,0x41,0x98,0x6C,0xEA,0x01,0x6B, -0x6D,0xEA,0x80,0x18,0xB5,0x2D,0x41,0xD8,0x41,0x98,0x40,0x6B,0x6D,0xEA,0x41,0xD8, -0xCA,0x12,0x01,0x6C,0x03,0x10,0x02,0x6C,0x01,0x10,0x03,0x6C,0x80,0x18,0x4E,0x2F, -0x00,0x65,0xC1,0x12,0x80,0x18,0xDD,0x2E,0x00,0x65,0xBD,0x12,0x80,0x18,0x04,0x2F, -0x00,0x65,0xB9,0x12,0x80,0x18,0x20,0x2F,0x00,0x65,0xB5,0x12,0x80,0x18,0x63,0x2F, -0x00,0x65,0xA0,0xF2,0x10,0x22,0x12,0x72,0x58,0x67,0x01,0x5A,0x78,0x67,0x01,0x5B, -0x58,0x67,0x03,0x4A,0xA7,0x12,0x04,0x59,0x60,0xF2,0x1D,0x60,0x80,0x18,0x1B,0x2D, -0x00,0x6C,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE, -0x02,0xF1,0x03,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D, -0x00,0x6C,0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x00,0x18,0xFE,0x4F,0x00,0x65, -0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18,0x49,0x2B,0xC5,0x67,0x40,0xF5,0x00,0xB0, -0x0A,0x6A,0x4C,0xC0,0x08,0x6A,0x2A,0xC0,0x00,0x1C,0xDD,0x31,0x4D,0xC0,0x10,0xD2, -0x41,0x98,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0x01,0x71,0x41,0xD8,0x06,0x61,0x80,0x18, -0x4E,0x2F,0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0x02,0x71,0x04,0x61,0x41,0x98, -0x04,0x6B,0x6D,0xEA,0x41,0xD8,0x00,0x1C,0xE5,0x31,0x10,0x94,0x02,0x6A,0x04,0xD2, -0x00,0xF5,0x00,0xB2,0x06,0xD1,0x01,0x6C,0x05,0xD2,0x41,0x98,0xFA,0x6D,0xE3,0xF7, -0x1E,0x6E,0x4A,0x32,0x8C,0xEA,0xE1,0xF4,0x12,0x6F,0x20,0x18,0x1B,0x32,0x07,0xD2, -0x52,0x12,0x4F,0x59,0x25,0x60,0x18,0x93,0x44,0xA3,0x08,0x5A,0x21,0x60,0xC0,0xF4, -0x10,0xB5,0x7F,0x6A,0x4C,0xE9,0x80,0x9D,0xC0,0xF4,0x0C,0xB2,0x80,0xF4,0x20,0x33, -0x4C,0xEC,0x6D,0xEC,0x80,0xDD,0x18,0x92,0x64,0xA2,0xFF,0x6A,0x4C,0xEB,0x07,0x6A, -0x4C,0xEB,0xA0,0xF4,0x18,0xB2,0x00,0xF7,0x60,0x33,0x8C,0xEA,0x6D,0xEA,0x40,0xDD, -0x32,0x12,0x18,0x93,0x0A,0x59,0x45,0xA3,0x84,0xA3,0x40,0x32,0x4D,0xEC,0x03,0x61, -0x03,0x6C,0x0C,0xD4,0x28,0x12,0x80,0xF4,0x08,0xB6,0x80,0xF4,0x14,0xB3,0xE3,0xF7, -0x1F,0x6A,0xA0,0x9E,0x8C,0xEA,0x54,0x32,0x6C,0xED,0x80,0xF4,0x08,0xB3,0x4D,0xED, -0x24,0x32,0x69,0xE2,0x40,0xAA,0xFF,0xF7,0x1F,0x6B,0xA0,0xDE,0x6C,0xEA,0x4C,0x32, -0x82,0xEA,0xE0,0xF1,0x1E,0x61,0x03,0x59,0x05,0x60,0x02,0x6A,0x4B,0xEA,0x4C,0xED, -0xA0,0xDE,0x0F,0x10,0x06,0x59,0xFF,0x6B,0x58,0x67,0x01,0x6C,0x6C,0xEA,0x61,0x9E, -0x8D,0xED,0x8C,0xEA,0x81,0x6C,0x8B,0xEC,0x5C,0x32,0x8C,0xEB,0x4D,0xEB,0xA0,0xDE, -0x61,0xDE,0x40,0xF4,0x04,0xB2,0x1F,0x6B,0x6B,0xEB,0x49,0xE1,0x80,0xA2,0x0F,0x6A, -0x4C,0xEC,0x40,0x9E,0x84,0x34,0x6C,0xEA,0x8D,0xEA,0x40,0xDE,0xEC,0x11,0x18,0x92, -0x85,0xA2,0x05,0x5C,0xA0,0xF1,0x1F,0x60,0x00,0xF4,0x04,0xB5,0x07,0x6A,0x4C,0xEC, -0x41,0x9D,0x39,0x6B,0x6B,0xEB,0x8C,0x34,0x6C,0xEA,0x8D,0xEA,0x41,0xDD,0xDB,0x11, -0x18,0x94,0xFB,0xB3,0x43,0xA4,0x46,0xC3,0x44,0xA4,0x47,0xC3,0x45,0xA4,0x48,0xC3, -0xD2,0x11,0xF7,0xB5,0xFD,0xB3,0x3E,0x34,0x40,0x9D,0xC0,0xF7,0x80,0x34,0x6C,0xEA, -0x8D,0xEA,0x40,0xDD,0x7F,0x6A,0x4C,0xE9,0x25,0xC5,0xC5,0x11,0x18,0x94,0xF0,0xB3, -0x43,0xA4,0x4E,0xC3,0x44,0xA4,0x4F,0xC3,0x45,0xA4,0x50,0xC3,0xBC,0x11,0x18,0x94, -0xEB,0xB3,0x43,0xA4,0x51,0xC3,0x44,0xA4,0x52,0xC3,0x45,0xA4,0x53,0xC3,0xB3,0x11, -0xE7,0xB6,0xFF,0x6C,0xA4,0x67,0x69,0xA6,0x6C,0xED,0x0A,0x75,0x3F,0x61,0x4C,0xA6, -0x00,0x6F,0x8C,0xEA,0x0A,0x72,0x13,0x60,0x22,0x67,0x44,0x32,0x29,0xE2,0x4C,0x32, -0x2B,0xE2,0x4C,0x32,0xE6,0xB3,0x2B,0xE2,0x48,0x32,0x69,0xE2,0x20,0xF0,0x58,0xA2, -0x05,0x6F,0x8C,0xEA,0x04,0x72,0x03,0x60,0x0A,0x6A,0x00,0x6F,0x4C,0xC6,0x4D,0xA6, -0x08,0x72,0x6A,0x60,0x22,0x67,0x50,0x32,0x29,0xE2,0xDE,0xB4,0x48,0x32,0x2B,0xE2, -0x48,0x32,0x89,0xE2,0x20,0xF1,0x4F,0xA2,0x01,0x6B,0x05,0x6F,0x6C,0xEA,0x05,0x22, -0x00,0xF1,0x52,0xAC,0x47,0xE9,0x6C,0xEA,0x57,0x2A,0x08,0x6A,0x00,0x6F,0x4D,0xC6, -0x53,0x10,0xD5,0xB0,0x7F,0x4D,0x6E,0x4D,0x05,0x6F,0x90,0x67,0xB5,0xE3,0x06,0x6E, -0x00,0x18,0x2E,0x2E,0x13,0xD7,0xFF,0xF7,0x38,0xC0,0x25,0x10,0x4B,0x43,0x8C,0xEA, -0x03,0x5A,0x23,0x60,0xCA,0xB5,0x04,0x6F,0x00,0x69,0x24,0x32,0x29,0xE2,0x4C,0x32, -0x2B,0xE2,0x4C,0x32,0x2B,0xE2,0x48,0x33,0xA9,0xE3,0x20,0xF0,0x58,0xA2,0x8C,0xEA, -0x04,0x72,0xDF,0x60,0x01,0x49,0x8C,0xE9,0x0A,0x59,0xEF,0x61,0x2D,0x10,0xC2,0xB0, -0x60,0xF1,0x02,0x4D,0x05,0x6F,0x90,0x67,0xB5,0xE3,0x06,0x6E,0x00,0x18,0x2E,0x2E, -0x13,0xD7,0xFF,0xF7,0x39,0xC0,0x13,0x97,0x1F,0x10,0x48,0x43,0x8C,0xEA,0x02,0x5A, -0xE5,0x67,0x1A,0x60,0xB7,0xB5,0x04,0x6F,0x00,0x69,0x01,0x6E,0xFF,0xF7,0x1F,0x68, -0x30,0x32,0x29,0xE2,0x48,0x32,0x2B,0xE2,0x48,0x33,0xA9,0xE3,0x20,0xF1,0x4F,0xA2, -0xCC,0xEA,0x06,0x22,0x00,0xF1,0x52,0xAD,0x0C,0xEA,0x47,0xE9,0xCC,0xEA,0xD7,0x2A, -0x01,0x49,0x8C,0xE9,0x08,0x59,0xEC,0x61,0xA1,0xB2,0x4A,0xA2,0x0B,0xD2,0x0B,0x93, -0xE0,0x32,0x4D,0xEB,0x0B,0xD3,0x77,0x10,0xA8,0xB2,0x20,0xF0,0x7C,0xA2,0x0B,0xD3, -0x20,0xF0,0x7D,0xA2,0x0B,0x94,0x20,0xF0,0x5E,0xA2,0x60,0x33,0x6D,0xEC,0x85,0x10, -0xA2,0xB2,0x20,0xF0,0x7F,0xA2,0x0B,0xD3,0x40,0xF0,0x60,0xA2,0x0B,0x94,0x40,0xF0, -0x41,0xA2,0x60,0x33,0x6D,0xEC,0x79,0x10,0x18,0x93,0x43,0xA3,0x62,0xAB,0x60,0x33, -0x6D,0xEA,0x9B,0xB3,0x41,0xDB,0xFF,0x10,0x18,0x94,0x8D,0xB3,0x43,0xA4,0x54,0xC3, -0x44,0xA4,0x55,0xC3,0x45,0xA4,0x56,0xC3,0xF6,0x10,0x18,0x94,0x88,0xB3,0x43,0xA4, -0x57,0xC3,0x44,0xA4,0x58,0xC3,0x45,0xA4,0x59,0xC3,0xED,0x10,0x4F,0x41,0xFF,0x6B, -0x6C,0xEA,0x09,0x5A,0xC0,0xF0,0x15,0x60,0x5C,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D, -0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x79,0x6A,0x4B,0xEA,0x4C,0xEE,0x2C,0x33,0x78,0x6A, -0x4C,0xEB,0x5C,0x6C,0x01,0x6D,0x6D,0xEE,0xA7,0x10,0x79,0xB2,0x92,0xAA,0x69,0x9A, -0x0B,0xD4,0x84,0xB4,0x07,0x10,0x76,0xB2,0x69,0x9A,0x62,0x34,0x82,0x34,0x0B,0xD4, -0xFF,0xF7,0x1F,0x6C,0x8C,0xEB,0x69,0xDA,0x02,0x6A,0x3C,0x10,0x70,0xB2,0x96,0xAA, -0x6B,0x9A,0x0B,0xD4,0x7B,0xB4,0x07,0x10,0x6D,0xB2,0x6B,0x9A,0x62,0x34,0x82,0x34, -0x0B,0xD4,0xFF,0xF7,0x1F,0x6C,0x8C,0xEB,0x6B,0xDA,0xEE,0x17,0x78,0x6C,0x00,0x18, -0xEB,0x9F,0x01,0x6D,0x02,0x6B,0x0B,0xD2,0x0D,0xD3,0xAD,0x10,0x76,0x6C,0x00,0x18, -0xEB,0x9F,0x01,0x6D,0x0B,0xD2,0x02,0x6C,0x0D,0xD4,0xA5,0x10,0x77,0x6C,0x00,0x18, -0xEB,0x9F,0x01,0x6D,0x0B,0xD2,0xD8,0x17,0x5D,0xB2,0x74,0xA2,0x0B,0xD3,0x75,0xA2, -0x0B,0x94,0x56,0xA2,0x60,0x33,0x6D,0xEC,0x08,0x10,0x59,0xB2,0x77,0xA2,0x0B,0xD3, -0x78,0xA2,0x0B,0x94,0x59,0xA2,0x60,0x33,0x6D,0xEC,0x40,0x32,0x40,0x32,0x4D,0xEC, -0x0B,0xD4,0x03,0x6A,0x0D,0xD2,0x87,0x10,0x00,0x6B,0x05,0x59,0x11,0xD3,0x78,0x67, -0x70,0x23,0x18,0x94,0x42,0xA4,0x02,0xAC,0x0C,0x72,0x05,0x61,0x58,0xB2,0x01,0x6F, -0x41,0x9A,0x11,0xD2,0x03,0x10,0x11,0x97,0x03,0x6A,0x0D,0xD2,0x74,0x23,0x00,0xF0, -0x12,0x0A,0x24,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3,0x00,0xEB,0x00,0x65,0x0B,0x00, -0x29,0x00,0x83,0x00,0xA5,0x00,0xAF,0x00,0x06,0x27,0x11,0x96,0x3F,0x6A,0x90,0x67, -0x4C,0xEC,0x00,0x6D,0x31,0x10,0x3F,0x6A,0x90,0x67,0x4C,0xEC,0x00,0x18,0xEB,0x9F, -0xA7,0x67,0x0B,0xD2,0x58,0x10,0x02,0x31,0x01,0x6B,0x6C,0xE9,0x09,0x21,0xA3,0x67, -0x40,0x6C,0xD1,0x67,0x12,0xD3,0x00,0x18,0x01,0xA0,0x13,0xD7,0x13,0x97,0x12,0x93, -0x0C,0x27,0x7F,0x6A,0x4C,0xE8,0x07,0x34,0x40,0x6A,0x11,0x96,0x4D,0xEC,0xFF,0x6A, -0x4C,0xEC,0x00,0x18,0x01,0xA0,0xA3,0x67,0x0B,0x10,0x7F,0x6A,0x4C,0xE8,0x07,0x34, -0x40,0x6A,0x4D,0xEC,0xFF,0x6A,0x4C,0xEC,0x00,0x18,0xEB,0x9F,0xA3,0x67,0x0B,0xD2, -0x32,0x21,0x40,0x6C,0x01,0x6D,0x00,0x6E,0x00,0x18,0x01,0xA0,0x00,0x65,0x2B,0x10, -0x01,0x6A,0x0C,0xEA,0x03,0x22,0x03,0x6B,0x0C,0xD3,0x25,0x10,0x08,0x27,0x11,0x95, -0xFF,0xF7,0x1F,0x6A,0x90,0x67,0x00,0x18,0x9A,0x33,0x4C,0xED,0x1C,0x10,0x2A,0xB2, -0x12,0x10,0x01,0x6A,0x0C,0xEA,0x05,0x2A,0x28,0xB2,0x06,0x10,0x01,0x6A,0x0C,0xEA, -0x02,0x22,0x03,0x6A,0x0F,0x10,0x26,0xB2,0x06,0x27,0x7D,0x67,0x40,0xF0,0x64,0xAB, -0x49,0xE0,0x60,0xCA,0x08,0x10,0x49,0xE0,0x40,0xAA,0xFF,0xF7,0x1F,0x6C,0x4C,0xEC, -0x0B,0xD4,0x01,0x10,0x0C,0xD2,0x0D,0x93,0x0C,0x94,0x70,0x32,0x4D,0xEC,0x18,0x92, -0x83,0xC2,0x18,0x93,0x18,0x94,0x41,0xA3,0x10,0x6B,0x6B,0xEB,0x6C,0xEA,0x41,0xC4, -0x18,0x92,0x0B,0x96,0x02,0x6C,0x00,0x18,0x2C,0x2B,0xA0,0x9A,0x16,0x97,0x15,0x91, -0x14,0x90,0x00,0xEF,0x0C,0x63,0x00,0x00,0xD2,0x04,0x11,0x80,0xD8,0xA0,0x11,0x80, -0xFC,0xA5,0x10,0x80,0xFF,0xFF,0x03,0xFE,0xFF,0xFF,0xFF,0x8F,0x1F,0x00,0xFC,0xFF, -0x88,0xDB,0x10,0x80,0x9C,0xDB,0x10,0x80,0xFF,0xFF,0xFF,0x7F,0x48,0x60,0x11,0x80, -0x58,0x46,0x11,0x80,0xEC,0xA0,0x11,0x80,0xDC,0x00,0x11,0x80,0x08,0xA1,0x11,0x80, -0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0xB6,0x00,0xA0,0x00,0xB0,0x00,0x10,0x00,0xB6, -0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0x44,0xAC,0x24,0x67,0x01,0x72,0x55,0x61, -0x00,0x9C,0x5D,0x67,0xFA,0x6D,0x20,0xF0,0x08,0xC2,0x02,0x6A,0x04,0xD2,0x3F,0xB2, -0x06,0xD0,0x44,0xF2,0x1E,0x6E,0x05,0xD2,0x41,0x9C,0xC1,0xF4,0x1C,0x6F,0x04,0x6C, -0x20,0x18,0x1B,0x32,0x07,0xD2,0x3F,0x6A,0x4C,0xE8,0x20,0x70,0x0A,0x61,0x62,0xA1, -0xFF,0x6A,0x4C,0xEB,0x06,0x2B,0x36,0xB2,0x60,0xDA,0x36,0xB2,0x60,0xDA,0x01,0x6A, -0x42,0xC1,0x7D,0x67,0x20,0xF0,0x68,0xA3,0x3F,0x6A,0x6C,0xEA,0x24,0x72,0x03,0x67, -0x24,0x61,0x7D,0x67,0x01,0xF4,0x03,0x6A,0x00,0x1C,0xDD,0x31,0x50,0xCB,0x00,0x18, -0xFE,0x4F,0x02,0x67,0x00,0x6D,0x9D,0x67,0x20,0x4C,0x80,0x18,0x49,0x2B,0xC5,0x67, -0x29,0xB3,0x40,0x99,0x6C,0xEA,0x29,0xB3,0x6E,0xEA,0x06,0x2A,0x80,0x18,0x4E,0x2F, -0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0xA0,0x99,0x02,0x6C,0x00,0x18,0x2C,0x2B, -0x00,0x6E,0x00,0x1C,0xE5,0x31,0x90,0x67,0x32,0x10,0xFF,0x6A,0x4C,0xE8,0x30,0x70, -0x04,0x61,0x80,0x18,0xEA,0x2F,0x91,0x67,0x2A,0x10,0x44,0xA9,0x02,0x72,0x24,0x61, -0x1B,0xB2,0x40,0xA2,0x21,0x2A,0x40,0x99,0x04,0xF0,0x0F,0x6B,0x6C,0xEA,0x6A,0xEA, -0x0B,0x61,0x18,0xB2,0xFF,0xF7,0x1F,0x6B,0x40,0xAA,0x6C,0xEA,0x40,0x32,0x40,0x32, -0x00,0xF2,0x0F,0x6B,0x6D,0xEA,0x40,0xD9,0x02,0x6A,0x04,0xD2,0x0B,0xB2,0x05,0x6C, -0xFA,0x6D,0x05,0xD2,0x40,0x99,0xA4,0xF2,0x0E,0x6E,0xC1,0xF4,0x1D,0x6F,0x06,0xD2, -0x41,0x99,0x20,0x18,0x1B,0x32,0x07,0xD2,0x00,0x18,0xF4,0x2C,0x91,0x67,0x0E,0x97, -0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0xFC,0xA5,0x10,0x80,0xAC,0xDB,0x10,0x80, -0x38,0x91,0x10,0x80,0x00,0x00,0xFF,0x00,0x00,0x00,0x01,0x00,0x98,0x00,0x11,0x80, -0x04,0x09,0x11,0x80,0xFD,0x63,0x04,0x62,0x00,0x18,0x23,0xEA,0x00,0x65,0x04,0x97, -0x00,0xEF,0x03,0x63,0xEF,0x63,0x20,0x62,0x1F,0xD1,0x1E,0xD0,0x80,0xAC,0x00,0x6A, -0xC6,0xB3,0x11,0xD4,0xA0,0xA5,0x1B,0xD2,0x84,0x32,0x89,0xE2,0x4C,0x32,0x8B,0xE2, -0x4C,0x32,0x8B,0xE2,0x48,0x32,0x69,0xE2,0x19,0xD2,0x12,0xD5,0xE0,0xF0,0x6C,0xA2, -0x18,0xD3,0xA0,0xF0,0x9A,0xAA,0x19,0x93,0x13,0xD4,0xA0,0xF0,0x58,0xAA,0x19,0x94, -0x14,0xD2,0xA0,0xF0,0x7C,0xAB,0x19,0x92,0x15,0xD3,0x7D,0x67,0x60,0xF0,0x6C,0xA3, -0xC0,0xF0,0x80,0xAC,0x16,0xD4,0xC0,0xF2,0x74,0xC2,0x9D,0x67,0xE0,0xF0,0x13,0xA2, -0x60,0xF0,0x8C,0xA4,0xE0,0xF0,0x28,0xA2,0xC0,0xF2,0x95,0xC2,0xB1,0x67,0x00,0x18, -0x7B,0xBB,0x90,0x67,0x17,0xD2,0x17,0x93,0x48,0x32,0x1C,0xD2,0x69,0xE2,0xAC,0xB3, -0x44,0x32,0x69,0xE2,0x1A,0xD2,0x19,0x92,0xE0,0xF0,0xA8,0xA2,0x00,0x18,0xC3,0x34, -0x90,0x67,0x12,0x93,0x0E,0x23,0x18,0x94,0x01,0x74,0x0B,0x61,0x1A,0x92,0x03,0xF4, -0x00,0x6C,0x18,0xF0,0x00,0x6D,0xC3,0xAA,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x8D,0x93, -0x4C,0xEE,0x14,0x93,0x05,0x23,0x19,0x94,0x00,0xF2,0x57,0xA4,0x01,0x72,0x15,0x60, -0x03,0x6A,0x04,0xD2,0x9B,0xB2,0x19,0x93,0x12,0x94,0x05,0xD2,0x14,0x92,0xFA,0x6D, -0xC4,0xF3,0x1C,0x6E,0x06,0xD2,0x00,0xF2,0x57,0xA3,0x64,0xF4,0x18,0x6F,0x08,0xD4, -0x04,0x6C,0x20,0x18,0x1B,0x32,0x07,0xD2,0x18,0x11,0x00,0x1C,0xDD,0x31,0x00,0x65, -0x9D,0x67,0x40,0x4C,0xB1,0x67,0x00,0x18,0x3B,0x94,0x1B,0xD2,0x10,0x92,0x8E,0xB6, -0x46,0x32,0x01,0x4A,0xCC,0xEA,0x10,0xD2,0x19,0x92,0xC0,0xF2,0xEE,0xAA,0x07,0x2F, -0x12,0x93,0x01,0x73,0x04,0x61,0x00,0x1C,0xE5,0x31,0x1B,0x94,0xFE,0x10,0x10,0x95, -0x08,0x25,0x14,0x94,0x06,0x24,0x9B,0xED,0x01,0x2C,0xE5,0xE8,0x10,0xEA,0x00,0x65, -0x01,0x10,0x00,0x6A,0x14,0x93,0xFF,0xF7,0x1F,0x6C,0x4B,0xE3,0x13,0x93,0x8C,0xEA, -0x65,0xE2,0x14,0x92,0x23,0xEA,0x01,0x60,0x47,0xE1,0x12,0x93,0x01,0x73,0x18,0x61, -0x19,0x92,0xEC,0xEC,0xA0,0xF2,0x74,0x9A,0x14,0xD4,0xCC,0xEB,0x73,0xE5,0xA3,0xEB, -0x44,0x67,0x02,0x61,0x75,0xB2,0x49,0xE4,0x14,0x94,0x9A,0xEA,0x01,0x2C,0xE5,0xE8, -0x12,0xE9,0x41,0x41,0x00,0x65,0x98,0xEA,0x12,0xEA,0x65,0xE2,0xA7,0xE1,0xCC,0xE9, -0x19,0x94,0xFF,0x6B,0x14,0x35,0xE0,0xF0,0x48,0xA4,0x6C,0xED,0x02,0x6C,0x6C,0xEA, -0x40,0x32,0x4C,0x32,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x9A,0x33,0x4C,0xED, -0x10,0x92,0x2D,0xE2,0x1D,0xD3,0x08,0x59,0x06,0x60,0x1D,0x94,0x14,0x93,0x71,0xE4, -0x65,0xE1,0x1D,0xD4,0xF8,0x17,0x1D,0x94,0x43,0xE4,0x00,0x18,0xC4,0x36,0x04,0x30, -0x41,0xE0,0x19,0x92,0x4E,0x6C,0x13,0xDA,0x00,0x18,0x9A,0x33,0x14,0x95,0x1D,0x95, -0xFF,0xF7,0x1F,0x6B,0x48,0x6C,0x00,0x18,0x9A,0x33,0x6C,0xED,0x18,0x94,0x14,0x24, -0x16,0x92,0x15,0x93,0x63,0xEA,0x06,0x60,0x43,0xE3,0xFF,0xF7,0x1F,0x6C,0xA2,0x67, -0x8C,0xE8,0x0C,0x10,0x15,0x92,0x16,0x93,0x63,0xEA,0x06,0x60,0x57,0xE3,0xFF,0xF7, -0x1F,0x6C,0x8C,0xED,0x02,0x67,0x02,0x10,0x16,0x95,0x15,0x90,0x00,0x18,0x9A,0x33, -0x4C,0x6C,0x4A,0x6C,0x00,0x18,0x9A,0x33,0xB0,0x67,0x00,0x6C,0x00,0x18,0x9A,0x33, -0x07,0x6D,0x12,0x92,0x0D,0x2A,0x18,0x93,0x01,0x73,0x0A,0x61,0x17,0x94,0x44,0xB2, -0x7D,0x67,0x40,0xF0,0x68,0xA3,0x49,0xE4,0x60,0xC2,0x42,0xB2,0x49,0xE4,0x60,0xC2, -0x1B,0x94,0x00,0x1C,0xE5,0x31,0x02,0x49,0x00,0x18,0x4E,0x05,0x00,0x65,0x01,0xF0, -0x00,0x6D,0x00,0x18,0x78,0xBA,0x5E,0x6C,0x12,0x92,0x21,0x2A,0x18,0x93,0x01,0x73, -0x0D,0x61,0x1A,0x92,0x18,0xF0,0x00,0x6C,0x03,0xF4,0x00,0x6D,0x00,0x18,0x8D,0x93, -0xC3,0xAA,0x19,0x93,0x20,0x6A,0x00,0xF2,0x55,0xC3,0x11,0x10,0x51,0x59,0x07,0x61, -0x11,0x95,0xFF,0xF7,0x1F,0x6A,0x91,0x67,0x00,0x18,0x3A,0x96,0x4C,0xEC,0x1A,0x92, -0x18,0xF0,0x00,0x6C,0x01,0xF4,0x00,0x6D,0x00,0x18,0x8D,0x93,0xC3,0xAA,0x18,0x93, -0x14,0x2B,0x12,0x94,0x12,0x24,0x51,0x59,0x10,0x61,0x11,0x95,0xFF,0xF7,0x1F,0x68, -0x91,0x67,0x00,0x18,0x3A,0x96,0x0C,0xEC,0x1A,0x92,0x01,0xF4,0x00,0x6C,0x18,0xF0, -0x00,0x6D,0xC3,0xAA,0x00,0x18,0x8D,0x93,0x0C,0xEE,0x2B,0x6A,0x7D,0x67,0x58,0xCB, -0x14,0x94,0x1D,0xB2,0xFD,0x67,0x0A,0xD4,0x80,0x9A,0x00,0x6D,0x04,0x06,0x34,0x4F, -0xA9,0xE7,0x40,0xA2,0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x0A,0x95, -0x0B,0x96,0x00,0x18,0x40,0x1E,0x0C,0x97,0x17,0x92,0x0F,0x22,0x1C,0x93,0x13,0xB2, -0x49,0xE3,0x00,0x6B,0xFF,0xF7,0x7C,0xDA,0x1C,0x94,0x11,0xB2,0x49,0xE4,0xFF,0xF7, -0x7C,0xDA,0x10,0xB2,0x49,0xE4,0xFF,0xF7,0x7C,0xDA,0x20,0x97,0x1F,0x91,0x1E,0x90, -0x01,0x6A,0x00,0xEF,0x11,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x70,0x45,0x11,0x80, -0xFC,0xA5,0x10,0x80,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x08,0x48,0x06,0x11,0x80, -0x3C,0x06,0x11,0x80,0x68,0x52,0x11,0x80,0x18,0x07,0x11,0x80,0xE8,0x06,0x11,0x80, -0xB8,0x06,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0xFF,0xF7,0x1F,0x6A, -0x8C,0xEA,0x04,0xD2,0x04,0x93,0x01,0x69,0x44,0xE9,0x69,0xE2,0x4C,0x32,0x6B,0xE2, -0x4C,0x32,0x6B,0xE2,0x20,0xB3,0x48,0x32,0x0D,0xD5,0x69,0xE2,0x05,0xD2,0x00,0x68, -0x20,0x18,0xE4,0x06,0x90,0x67,0x01,0x48,0xFF,0x6B,0x6C,0xE8,0x45,0xE1,0x04,0x58, -0x6C,0xE9,0xF6,0x61,0x05,0x94,0x44,0x41,0xA0,0xF0,0x88,0xAC,0x98,0xEA,0x17,0xB2, -0x06,0xD4,0x60,0xF1,0x42,0xA2,0x6C,0xEA,0x02,0x5A,0x12,0xE9,0x00,0x65,0x06,0x61, -0x40,0xF1,0x00,0x59,0x06,0x60,0xFF,0x69,0x41,0x49,0x03,0x10,0xEE,0x59,0x01,0x60, -0xEE,0x69,0x00,0x1C,0xDD,0x31,0x00,0x65,0x05,0x93,0x02,0x67,0x26,0x32,0xA0,0xF0, -0x48,0xCB,0x04,0x94,0x00,0x18,0x2A,0xFF,0x0D,0x95,0x9D,0x67,0x4C,0xAC,0x05,0x94, -0xA0,0xF0,0x48,0xCC,0x00,0x1C,0xE5,0x31,0x90,0x67,0x0A,0x97,0x09,0x91,0x08,0x90, -0x00,0xEF,0x06,0x63,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xF8,0x63,0x0E,0x62, -0x0D,0xD1,0x0C,0xD0,0x5D,0x67,0x03,0x46,0x10,0xD4,0x26,0x67,0x13,0xD7,0x06,0x04, -0x40,0xF0,0xA4,0xCA,0x06,0x6E,0x00,0x18,0x2E,0x2E,0xB0,0x67,0x69,0xA1,0x9D,0x67, -0x09,0xD3,0x40,0xF0,0x64,0xAC,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32, -0x6B,0xE2,0x4D,0xB3,0x48,0x32,0x69,0xE2,0x0A,0xD2,0x20,0xF0,0x58,0xA2,0x0D,0x72, -0x3D,0x60,0x0E,0x52,0x03,0x60,0x06,0x72,0x04,0x60,0x7F,0x10,0x1B,0x72,0x36,0x60, -0x7C,0x10,0x13,0x93,0x01,0x6A,0x00,0x6D,0x40,0xC3,0x80,0xA9,0xFF,0xF7,0x1F,0x6A, -0x00,0x18,0xC5,0x4A,0x4C,0xEC,0x0A,0x94,0x00,0x18,0xFD,0x1D,0x28,0x4C,0x09,0x93, -0x9D,0x67,0x40,0xF0,0x44,0xAC,0x01,0x73,0x14,0x60,0xFF,0xF7,0x1F,0x6C,0x20,0x18, -0x7C,0x2F,0x4C,0xEC,0x62,0x67,0x0A,0x92,0xE0,0xF0,0x9F,0xA2,0xFF,0x6A,0x4C,0xEC, -0x20,0x6A,0x4C,0xEC,0x01,0x2C,0x64,0x67,0x01,0x73,0x7D,0x67,0x40,0xF0,0x44,0xAB, -0x06,0x60,0xFF,0xF7,0x1F,0x6C,0x00,0x18,0xAD,0xE1,0x4C,0xEC,0x52,0x10,0xFF,0xF7, -0x1F,0x6C,0x4C,0xEC,0x80,0x18,0x25,0x33,0x06,0x05,0x4B,0x10,0x00,0x6C,0x40,0x6B, -0x1F,0x6A,0x66,0xC0,0x00,0xF0,0x47,0xC8,0x8C,0xC1,0x6A,0xC0,0x27,0xB3,0x00,0xF0, -0x4B,0xC8,0x10,0x6A,0x90,0xC1,0x8F,0xC0,0x4E,0xC0,0x50,0xAB,0xBD,0x67,0xDD,0x67, -0x50,0xC0,0x50,0xAB,0xE0,0x6B,0x44,0x4D,0x42,0x32,0x54,0xC1,0x20,0xB2,0x92,0xC0, -0x20,0x4E,0x41,0xA2,0x91,0x67,0x01,0x6F,0x48,0x32,0x6C,0xEA,0x56,0x32,0xC0,0xF3, -0x00,0x6B,0x6D,0xEA,0x00,0xF0,0x53,0xC8,0x13,0x93,0x01,0x6A,0x00,0x18,0x37,0x40, -0x40,0xC3,0x02,0x67,0x16,0x22,0x5D,0x67,0x40,0xF0,0x84,0xAA,0xFF,0xF7,0x1F,0x6B, -0x00,0x18,0xAE,0x5D,0x6C,0xEC,0x0A,0x94,0x0A,0x96,0x00,0x6F,0x60,0xF2,0xBC,0xAC, -0x7F,0x4E,0x04,0xD2,0xFF,0xF7,0x1F,0x6A,0x90,0x67,0x4C,0xED,0x00,0x18,0x6F,0x4E, -0x6E,0x4E,0x10,0x93,0x00,0x6C,0x80,0xC3,0x07,0x10,0x10,0x93,0x0C,0x6A,0x40,0xC3, -0x03,0x10,0x10,0x94,0x00,0x6A,0x40,0xC4,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF, -0x08,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xC0,0x5B,0x11,0x80, -0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x4C,0xB2,0x60,0xF1,0x42,0xA2,0x3C,0x22, -0x00,0x6C,0x84,0x32,0x89,0xE2,0x4C,0x32,0x8B,0xE2,0x4C,0x32,0x48,0xB3,0x8B,0xE2, -0x48,0x32,0x79,0xE2,0x47,0xB2,0xFF,0x6D,0x20,0xF1,0x4C,0xA2,0x28,0x22,0x46,0xB2, -0x40,0xA2,0xAC,0xEA,0x24,0x22,0x20,0xF0,0x78,0xA6,0xAC,0xEB,0x20,0x23,0x40,0xF2, -0x41,0xA6,0xAC,0xEA,0x01,0x72,0x1B,0x61,0x0F,0x73,0x19,0x60,0x14,0x73,0x17,0x60, -0x3E,0xB3,0xFF,0xF7,0x1F,0x6E,0x40,0xAB,0x01,0x4A,0x40,0xCB,0xCC,0xEA,0xE0,0xF3, -0x08,0x5A,0x12,0x61,0x00,0x6A,0x40,0xCB,0x39,0xB2,0x02,0x6C,0xA0,0xAA,0x04,0xF0, -0x0F,0x6A,0x4D,0xED,0xCC,0xED,0x00,0x18,0x2C,0x2B,0x00,0x6E,0x05,0x10,0x01,0x4C, -0xFF,0x6A,0x4C,0xEC,0x0A,0x5C,0xC5,0x61,0x2C,0xB5,0x01,0x68,0xFF,0x6E,0x40,0xF1, -0x5E,0xA5,0x0C,0xEA,0x4A,0x22,0x2F,0xB2,0x00,0x6F,0xFF,0xF7,0x1F,0x6C,0x60,0xAA, -0x02,0xF0,0x00,0x6A,0x6C,0xEA,0x25,0x2A,0x60,0xF1,0x42,0xA5,0xCC,0xEA,0x05,0x2A, -0x01,0x10,0x00,0x6F,0x28,0xB2,0xE0,0xCA,0x2E,0x10,0x06,0x67,0x20,0xB1,0x27,0xB6, -0x67,0x67,0xA4,0x67,0x64,0x34,0x69,0xE4,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2, -0x48,0x32,0x29,0xE2,0xE0,0xF0,0x4B,0xA2,0x0C,0xEA,0x01,0x72,0x05,0x61,0xC9,0xE4, -0x40,0xAA,0xAC,0xEA,0x02,0x5A,0xE5,0x61,0x01,0x4B,0xAC,0xEB,0x0A,0x5B,0xEA,0x61, -0x12,0x10,0x19,0xB2,0x60,0xAA,0x01,0x4B,0x60,0xCA,0x4F,0xAD,0x8C,0xEB,0x8C,0xEA, -0x4A,0x32,0x8C,0xEA,0x43,0xEB,0x07,0x61,0x4D,0xAD,0x8C,0xEA,0x4A,0x32,0x8C,0xEA, -0x43,0xEB,0x01,0x61,0xF0,0x67,0x09,0x27,0x00,0x18,0xB7,0xB5,0x00,0x65,0x00,0x18, -0x31,0xBE,0x00,0x65,0x0C,0xB2,0x00,0x6B,0x60,0xCA,0x06,0x97,0x05,0x91,0x04,0x90, -0x00,0x6A,0x00,0xEF,0x04,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0x48,0x60,0x11,0x80, -0xDC,0x00,0x11,0x80,0xFE,0x08,0x11,0x80,0x16,0xA1,0x11,0x80,0x04,0x09,0x11,0x80, -0xE0,0x00,0x00,0xB6,0xC8,0xA0,0x11,0x80,0x10,0x06,0x11,0x80,0xFD,0x63,0x04,0x62, -0x44,0xAC,0x04,0x72,0x0F,0x61,0x0A,0xB2,0x00,0x6B,0x00,0x18,0x3B,0x2B,0x60,0xC2, -0x08,0xB6,0x00,0x6B,0x0A,0x6D,0xFF,0x6C,0xC9,0xE3,0x01,0x4B,0x8C,0xEB,0x04,0x5B, -0xA0,0xC2,0xFA,0x61,0x04,0x97,0x00,0xEF,0x03,0x63,0x00,0x00,0xFE,0x08,0x11,0x80, -0xB4,0x5B,0x11,0x80,0xFD,0x63,0x04,0x62,0x80,0x18,0x45,0x2B,0x00,0x65,0x0E,0xB2, -0x00,0x6B,0x0F,0xB4,0x60,0xCA,0x0D,0xB2,0x02,0xF0,0x00,0x6D,0x04,0x97,0x60,0xC2, -0x0C,0xB2,0x01,0xF0,0x00,0x6B,0xA0,0xF0,0x72,0xCC,0x6C,0xCA,0xAE,0xCA,0x80,0xF0, -0x43,0xA4,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0xA0,0xF0,0xB6,0xCC,0x80,0xF0,0x43,0xC4, -0x00,0xEF,0x03,0x63,0xC8,0xA0,0x11,0x80,0xCA,0xA0,0x11,0x80,0xDC,0x00,0x11,0x80, -0x48,0x5C,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x44,0xAC,0xC9,0x72, -0x24,0x61,0x00,0x1C,0xDD,0x31,0x00,0x65,0x15,0xB1,0x04,0xD2,0x60,0xF1,0x54,0xA1, -0x40,0xF1,0x9E,0xA1,0x04,0x99,0x05,0xD2,0x80,0x6A,0x44,0xD9,0x55,0x6A,0x60,0xF1, -0x54,0xC1,0x00,0x18,0xEB,0xA4,0x00,0x65,0x60,0xF1,0x54,0xA1,0x04,0xD9,0x55,0x72, -0x04,0x60,0x00,0x18,0x31,0xBE,0x00,0x65,0x04,0x10,0x5D,0x67,0x54,0xA2,0x60,0xF1, -0x54,0xC1,0x00,0x1C,0xE5,0x31,0x04,0x94,0x03,0x10,0x00,0x18,0x2F,0xB9,0x00,0x65, -0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x00,0x00,0x48,0x5C,0x11,0x80, -0xFD,0x63,0x04,0x62,0x00,0x18,0x24,0xB4,0x00,0x65,0x04,0x97,0x00,0xEF,0x03,0x63, -0x0D,0xB2,0xFF,0xF7,0x1F,0x6B,0xAC,0xEB,0x43,0xA2,0x01,0x6D,0xAC,0xEA,0x10,0x22, -0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x07,0xB3,0x48,0x32, -0x69,0xE2,0x60,0xF2,0x4D,0xA2,0xAA,0xEA,0x03,0x61,0x45,0x67,0x20,0xE8,0xA0,0xC4, -0x20,0xE8,0x00,0x6A,0x00,0x46,0x11,0x80,0x48,0x60,0x11,0x80,0xF8,0x63,0x0E,0x62, -0x0D,0xD1,0x0C,0xD0,0xC4,0x67,0xFF,0xF7,0x1F,0x6D,0xAC,0xEE,0xFF,0x76,0x68,0x60, -0xC4,0x32,0xC9,0xE2,0x4C,0x32,0xCB,0xE2,0x35,0xB3,0x4C,0x32,0xCB,0xE2,0x48,0x32, -0x65,0xE2,0xC0,0xF0,0x74,0xA9,0x40,0x6F,0xAC,0xEB,0x6C,0xEF,0x25,0x27,0x04,0x6A, -0x6C,0xEA,0x08,0x22,0xE0,0xF0,0x8D,0x41,0x00,0xF1,0xA7,0x41,0x00,0x18,0x47,0x43, -0x0A,0xD6,0x0A,0x96,0x7D,0x67,0x01,0x6A,0x58,0xC3,0x86,0x67,0x00,0x6A,0x03,0x6E, -0xBD,0x67,0x5A,0xC3,0x00,0x68,0x00,0xF2,0x4A,0xC1,0x18,0x4D,0x64,0x6A,0xE6,0x67, -0x04,0xD2,0x00,0x18,0xA0,0xDD,0x05,0xD0,0x02,0x6C,0x00,0x18,0xE0,0xDC,0xB0,0x67, -0x6F,0x99,0x4D,0xEB,0x6F,0xD9,0x2D,0x10,0xE0,0xF0,0x4C,0xA1,0xFF,0x6C,0x01,0x72, -0x1C,0xB2,0x15,0x61,0x43,0xA2,0x01,0x6B,0x6C,0xEA,0x04,0x22,0xC0,0xF2,0x58,0xA1, -0x8C,0xEA,0x1F,0x2A,0x33,0x6A,0x7D,0x67,0xBD,0x67,0x58,0xC3,0x86,0x67,0x64,0x6A, -0x18,0x4D,0x02,0x6E,0x04,0xD2,0x00,0x18,0xA0,0xDD,0x05,0xD7,0x12,0x10,0x43,0xA2, -0x01,0x6B,0x6C,0xEA,0x04,0x22,0xC0,0xF2,0x57,0xA1,0x8C,0xEA,0x0A,0x2A,0x60,0xF2, -0x4D,0xA1,0x8C,0xEA,0x01,0x72,0x05,0x61,0x9D,0x67,0x20,0x4C,0x80,0x18,0x44,0x34, -0xA6,0x67,0xC0,0xF0,0x54,0xA9,0x07,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC9, -0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0x00,0x00,0x48,0x60,0x11,0x80, -0x00,0x46,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0xFF,0xF7,0x1F,0x6F, -0xAC,0xEF,0xE4,0x32,0xE9,0xE2,0x4C,0x32,0xEB,0xE2,0x38,0xB3,0x4C,0x32,0xEB,0xE2, -0x48,0x32,0x65,0xE2,0xC0,0xF0,0x54,0xA9,0xFF,0xF7,0x1F,0x6B,0xC4,0x67,0x6C,0xEA, -0x02,0x6B,0x6C,0xEA,0x09,0x2A,0xC4,0xA4,0x01,0x6A,0x87,0x67,0x28,0x6D,0x4C,0xEE, -0x20,0x18,0x9B,0x27,0x24,0x6F,0x52,0x10,0xF0,0xF0,0x0F,0x41,0xA5,0x46,0x90,0x67, -0x08,0x6E,0x00,0x18,0x2E,0x2E,0x04,0xD7,0x29,0xB2,0x01,0x6D,0xFF,0x6E,0x60,0xA2, -0x28,0xB2,0x04,0x97,0x83,0xA2,0xAC,0xEC,0x0E,0x24,0xC0,0xF2,0x56,0xA1,0xCC,0xEA, -0x03,0x2A,0xC0,0xF2,0xB6,0xC1,0x0C,0x10,0x60,0xF2,0xBC,0xA9,0xFF,0xF7,0x1F,0x6A, -0x00,0x6C,0x4C,0xED,0x29,0x10,0x20,0xF0,0x58,0xA1,0xCC,0xEA,0x03,0x72,0x1F,0x61, -0x00,0xF1,0x46,0x81,0x00,0x52,0x17,0x60,0x7E,0x32,0x15,0x22,0xC0,0xF0,0x54,0xA9, -0x04,0x68,0x03,0x6E,0x0D,0xEA,0x87,0x67,0xC0,0xF0,0x54,0xC9,0x00,0xF1,0xAF,0xC1, -0x00,0x18,0x2D,0xE2,0xE6,0x67,0x7F,0x6C,0x00,0x18,0xE0,0xDC,0xB0,0x67,0x6F,0x99, -0x4D,0xEB,0x6F,0xD9,0x13,0x10,0x80,0x18,0x53,0x34,0x87,0x67,0x0F,0x10,0x60,0xF2, -0xBC,0xA9,0xFF,0xF7,0x1F,0x6B,0x6C,0xED,0x00,0x18,0xF8,0x4E,0xD0,0x67,0xC0,0xF0, -0x54,0xA9,0x03,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC9,0x08,0x97,0x07,0x91, -0x06,0x90,0x01,0x6A,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0xC0,0x5B,0x11,0x80, -0x00,0x46,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0xFF,0xF7,0x1F,0x69, -0xAC,0xE9,0x24,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x38,0xB3,0x4C,0x32,0x2B,0xE2, -0x48,0x32,0x0C,0xD4,0x61,0xE2,0xC0,0xF0,0x54,0xA8,0x66,0xA4,0xFF,0xF7,0x1F,0x6C, -0x8C,0xEA,0x04,0x6E,0xCC,0xEA,0x06,0x22,0x00,0xF1,0x4F,0xA0,0xFF,0x6D,0xAC,0xEA, -0x6E,0xEA,0x0D,0x22,0x0C,0x92,0xFF,0x6C,0x7F,0x6D,0xE4,0xA2,0x24,0x6A,0x04,0xD2, -0x8C,0xEF,0x01,0x6A,0x91,0x67,0x00,0x18,0xEF,0xE1,0x4C,0xEF,0x47,0x10,0x02,0x5B, -0x0B,0x60,0x0C,0x95,0x6C,0x34,0x11,0xE4,0xE0,0xF0,0x1F,0x4C,0x08,0x4D,0x08,0x6E, -0x00,0x18,0x2E,0x2E,0x06,0xD3,0x06,0x93,0x21,0xB2,0x01,0x6D,0x83,0xA2,0xAC,0xEC, -0x15,0x24,0xC0,0xF2,0x57,0xA0,0xFF,0x6C,0x8C,0xEA,0x07,0x2A,0x80,0x18,0x53,0x34, -0x91,0x67,0x01,0x6D,0xC0,0xF2,0xB7,0xC0,0x29,0x10,0x1A,0xB2,0x60,0xF2,0xBC,0xA8, -0x00,0x6C,0xF0,0xA2,0x0C,0x92,0x08,0x4A,0x04,0xD2,0x11,0x10,0x20,0xF0,0x58,0xA0, -0xFF,0x6D,0xAC,0xEA,0x03,0x72,0x04,0x61,0x00,0x18,0xA5,0xFF,0x91,0x67,0x16,0x10, -0x10,0xB2,0x60,0xF2,0xBC,0xA8,0xF0,0xA2,0x0C,0x92,0x08,0x4A,0x04,0xD2,0xFF,0xF7, -0x1F,0x6A,0x4C,0xED,0xFF,0x6A,0xC3,0x67,0x00,0x18,0x8A,0x41,0x4C,0xEF,0xC0,0xF0, -0x54,0xA8,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC8,0x0A,0x97,0x09,0x91, -0x08,0x90,0x00,0xEF,0x06,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x00,0x46,0x11,0x80, -0xC0,0x5B,0x11,0x80,0xEF,0x63,0x20,0x62,0x1F,0xD1,0x1E,0xD0,0x64,0xAC,0xC4,0x67, -0x24,0x73,0x22,0x61,0x94,0xB2,0x60,0xF1,0x50,0xA2,0x1E,0x22,0x7D,0x67,0x01,0xF4, -0x03,0x6A,0x40,0xF0,0x58,0xCB,0x00,0x1C,0xDD,0x31,0x00,0x65,0x00,0x18,0xFE,0x4F, -0x02,0x67,0x00,0x6D,0x9D,0x67,0xC5,0x67,0x80,0x18,0x49,0x2B,0x58,0x4C,0x80,0x18, -0x4E,0x2F,0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0x20,0x18,0x10,0x2F,0x00,0x65, -0x00,0x1C,0xE5,0x31,0x90,0x67,0x01,0x11,0xFF,0xF7,0x1F,0x69,0x51,0x67,0x6C,0xEA, -0x9C,0x72,0x1A,0x61,0x00,0x9E,0xFF,0x6F,0x44,0xA0,0x46,0x32,0x2C,0xEA,0x18,0x72, -0x13,0x61,0xBA,0xA0,0x99,0xA0,0xDD,0x67,0xEC,0xED,0xEC,0xEC,0x00,0x18,0x1A,0xDF, -0x5A,0x4E,0x06,0x2A,0xBD,0x67,0x40,0xF0,0x9A,0xAD,0x20,0x18,0x62,0x23,0x2C,0xEC, -0x20,0x18,0xCF,0x06,0x90,0x67,0xD8,0x10,0xFF,0xF7,0x1F,0x6C,0x44,0x67,0x6C,0xEA, -0x93,0x72,0x29,0x61,0x00,0x9E,0x44,0xA0,0x46,0x32,0x11,0x72,0x07,0x60,0x7F,0x72, -0x22,0x61,0x45,0xA0,0xFF,0x6B,0x6C,0xEA,0x17,0x72,0x1D,0x61,0x6B,0xA8,0x8C,0xEB, -0xFF,0x73,0x19,0x60,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2, -0x67,0xB3,0x48,0x32,0x69,0xE2,0xBF,0x9A,0x82,0x67,0x00,0x18,0xB2,0x69,0x1C,0xD6, -0x01,0x72,0x64,0xA0,0x1C,0x96,0x03,0x61,0x01,0x6A,0x6D,0xEA,0x03,0x10,0x02,0x6A, -0x4B,0xEA,0x6C,0xEA,0x44,0xC0,0x44,0xAE,0xFF,0xF7,0x1F,0x6C,0x93,0x72,0xA0,0xF0, -0x09,0x61,0x00,0x9E,0xFF,0x6A,0xA2,0x67,0x64,0xA0,0x6C,0xED,0xA6,0x35,0x8C,0xED, -0x18,0xD5,0xA5,0xA0,0x4C,0xED,0x19,0xD5,0x4B,0xA8,0x18,0x95,0x8C,0xEA,0x7F,0x75, -0x1A,0xD2,0x03,0x61,0x19,0x92,0x04,0x72,0x04,0x60,0x18,0x95,0x28,0x75,0x80,0xF0, -0x11,0x61,0xFF,0x69,0xC1,0x9E,0x51,0x67,0x6C,0xEA,0x46,0x32,0x2C,0xEA,0xA6,0x67, -0x9D,0x67,0x18,0xD2,0x5C,0x4C,0xDA,0xC0,0x2C,0xED,0x00,0x18,0x3B,0x94,0x1C,0xD6, -0x18,0x92,0x1C,0x96,0x7F,0x72,0x58,0x67,0x1B,0xD2,0x04,0x22,0xE1,0xF4,0x03,0x6F, -0x00,0x6B,0x04,0x10,0x65,0xA0,0x01,0xF4,0x16,0x6F,0x2C,0xEB,0x10,0x6A,0x04,0xD2, -0x40,0xB2,0x18,0x95,0x08,0xD3,0x05,0xD2,0x17,0x92,0x07,0xD5,0x01,0x6B,0x06,0xD2, -0x59,0xA0,0x0A,0xD6,0x04,0x6C,0x09,0xD2,0x44,0xA0,0xFA,0x6D,0x6C,0xEA,0x0B,0xD2, -0x4B,0xA8,0x0C,0xD2,0x38,0xB2,0x49,0xE6,0x44,0xA2,0xA2,0xF4,0x10,0x6E,0x6C,0xEA, -0x0D,0xD2,0x44,0xA0,0x0E,0xD2,0x45,0xA0,0x0F,0xD2,0x46,0xA0,0x10,0xD2,0x47,0xA0, -0x11,0xD2,0x48,0xA0,0x12,0xD2,0x49,0xA0,0x13,0xD2,0x4A,0xA0,0x14,0xD2,0x4B,0xA0, -0x20,0x18,0x1B,0x32,0x15,0xD2,0x1A,0x92,0xFF,0x72,0x3E,0x60,0x1A,0x93,0x44,0x32, -0xFF,0x6D,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x24,0xB3,0x48,0x32, -0x65,0xE2,0xE0,0xF0,0x4B,0xA1,0xAC,0xEA,0x01,0x72,0x2E,0x61,0x20,0xF0,0x58,0xA1, -0xFF,0x6B,0x6C,0xEA,0x0B,0x72,0x13,0x61,0x1C,0xB2,0xB0,0x67,0x00,0x18,0xE0,0x1D, -0x80,0x9A,0x00,0xF2,0x54,0xA1,0xFF,0x6D,0xAC,0xEA,0x01,0x72,0x26,0x61,0x8D,0x99, -0x00,0x18,0x1A,0x1E,0x00,0x6D,0x00,0x6A,0x00,0xF2,0x54,0xC1,0x1E,0x10,0x1A,0x94, -0x00,0x18,0x5E,0xDE,0xB0,0x67,0x1B,0x92,0x08,0x2A,0x19,0x93,0x04,0x73,0x05,0x61, -0x1A,0x95,0x80,0x18,0xD1,0x34,0x90,0x67,0x07,0x10,0x18,0x95,0x28,0x75,0x04,0x61, -0x1A,0x95,0x80,0x18,0x91,0x34,0x90,0x67,0x08,0xB2,0xB0,0x67,0x00,0x18,0xE0,0x1D, -0x80,0x9A,0x03,0x10,0x20,0x18,0xFA,0x24,0x86,0x67,0x20,0x97,0x1F,0x91,0x1E,0x90, -0x00,0xEF,0x11,0x63,0x48,0x5C,0x11,0x80,0x64,0x52,0x11,0x80,0x48,0x60,0x11,0x80, -0xFC,0xA5,0x10,0x80,0x04,0x46,0x11,0x80,0xFF,0x63,0x00,0xD0,0x0F,0xB0,0xFF,0xF7, -0x1F,0x6A,0x4C,0xEC,0x00,0x6B,0xE2,0x67,0xFF,0x6E,0x64,0x32,0x69,0xE2,0x48,0x32, -0x6B,0xE2,0x48,0x32,0x15,0xE2,0x43,0xAD,0xEC,0xEA,0x8E,0xEA,0x05,0x2A,0x42,0x9D, -0x08,0x72,0x02,0x61,0x00,0x6A,0x05,0x10,0x01,0x4B,0xCC,0xEB,0x03,0x5B,0xED,0x61, -0x01,0x6A,0x00,0x90,0x20,0xE8,0x01,0x63,0x98,0x5F,0x11,0x80,0xFD,0x63,0x04,0x62, -0x16,0xB2,0x00,0x6B,0x60,0xF1,0x43,0xA2,0x01,0x72,0x14,0x61,0x14,0xB6,0x83,0x67, -0xFF,0x6D,0x84,0x32,0x89,0xE2,0x4C,0x32,0x8B,0xE2,0x4C,0x32,0x8B,0xE2,0x48,0x32, -0xC9,0xE2,0xE0,0xF0,0x4B,0xA2,0xAC,0xEA,0x01,0x72,0x0D,0x60,0x01,0x4C,0xAC,0xEC, -0x0A,0x5C,0xEF,0x61,0x09,0xB2,0x60,0xF1,0x43,0xA2,0x02,0x5A,0x02,0x60,0x43,0x67, -0x07,0x23,0x0C,0x6A,0x05,0x10,0x80,0x18,0xAE,0x35,0x00,0x65,0x62,0x67,0xF2,0x17, -0x04,0x97,0x00,0xEF,0x03,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0x48,0x60,0x11,0x80, -0xF9,0x63,0x0C,0x62,0x0B,0xD1,0x0A,0xD0,0x00,0x6A,0x0F,0xD5,0x06,0xD2,0x40,0xAC, -0x24,0x67,0x01,0xF0,0x0B,0x72,0x0C,0x61,0xBD,0x67,0x80,0x18,0xD5,0x2B,0x10,0x4D, -0x80,0xA9,0xFF,0xF7,0x1F,0x6B,0xA2,0x67,0x00,0x18,0xC5,0x4A,0x6C,0xEC,0xAC,0x10, -0x00,0xF4,0x19,0x72,0x2C,0x61,0x49,0xA4,0x03,0x5A,0x02,0x61,0x01,0x6A,0x49,0xC4, -0x7D,0x67,0x58,0xA3,0x00,0x1C,0xDD,0x31,0x52,0xC3,0xBD,0x67,0x91,0x67,0x12,0x4D, -0x00,0x18,0xB7,0x45,0x07,0xD2,0x02,0x67,0x0C,0x2A,0xA9,0xA1,0xFF,0x6B,0x20,0x6A, -0x6C,0xED,0xB8,0x35,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0xAA,0x6C,0x00,0x18,0xB6,0x33, -0x4C,0xED,0x00,0x1C,0xE5,0x31,0x07,0x94,0x7D,0x67,0x52,0xA3,0xFF,0x6B,0x6C,0xEA, -0x61,0x2A,0x80,0xA9,0xFF,0xF7,0x1F,0x6A,0xB0,0x67,0x4C,0xEC,0x58,0x10,0x00,0xF4, -0x05,0x72,0x06,0x61,0x4B,0xA4,0x03,0x5A,0x79,0x61,0x01,0x6A,0x4B,0xC4,0x76,0x10, -0x41,0xF4,0x12,0x72,0x10,0x61,0x00,0x18,0xE5,0x41,0x00,0x65,0x06,0x94,0x00,0x18, -0x78,0x36,0x02,0x67,0x80,0xA9,0x06,0x96,0xFF,0xF7,0x1F,0x6A,0x4C,0xEC,0x00,0x18, -0x33,0x4B,0xB0,0x67,0x3F,0x10,0x01,0xF0,0x04,0x72,0x3F,0x61,0x04,0xA4,0xFF,0xF7, -0x1F,0x6A,0xFF,0xF7,0x1F,0x6B,0x00,0x30,0x4C,0xE8,0x43,0xA4,0xBD,0x67,0x14,0x4D, -0x4D,0xE8,0x6C,0xE8,0x00,0x18,0x2A,0xDF,0x90,0x67,0x04,0x22,0x5D,0x67,0x0A,0xCA, -0x02,0x6A,0x23,0x10,0x7D,0x67,0xAA,0xAB,0xFF,0xF7,0x1F,0x6B,0xAC,0xEB,0x64,0x32, -0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x27,0xB3,0x48,0x32,0x69,0xE2, -0x20,0xF0,0x78,0xA2,0xFF,0x6A,0x4C,0xEB,0x12,0x73,0x0A,0x60,0x19,0x73,0x08,0x60, -0x80,0xA9,0xFF,0xF7,0x1F,0x6A,0x0C,0x6D,0x00,0x18,0xC5,0x4A,0x4C,0xEC,0x2E,0x10, -0xFF,0xF7,0x1F,0x6C,0x00,0x18,0x0C,0x48,0xAC,0xEC,0x80,0xA9,0xA2,0x67,0x00,0x18, -0xC5,0x4A,0x00,0x65,0x01,0x6B,0x06,0xD3,0x21,0x10,0x21,0xF4,0x06,0x72,0x1E,0x61, -0x80,0x18,0xBF,0x35,0x00,0x65,0x10,0x2A,0x14,0xB0,0x7D,0x67,0x78,0xA3,0x60,0xF1, -0x43,0xA0,0x91,0x67,0x60,0xF1,0x63,0xC0,0x00,0x18,0xFC,0x52,0x08,0xD2,0x7D,0x67, -0x20,0xF0,0x60,0xA3,0x60,0xF1,0x63,0xC0,0x80,0xA9,0x06,0x96,0xFF,0xF7,0x1F,0x6B, -0x6C,0xEC,0x00,0x18,0x33,0x4B,0xA2,0x67,0x01,0x6A,0x06,0xD2,0x06,0x92,0x03,0x22, -0x0F,0x93,0x66,0x6A,0x40,0xC3,0x0C,0x97,0x0B,0x91,0x0A,0x90,0x01,0x6A,0x00,0xEF, -0x07,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xF5,0x63,0x14,0x62, -0x13,0xD1,0x12,0xD0,0x00,0x6D,0x17,0xF7,0x0C,0x6E,0x00,0x18,0x01,0xA0,0x33,0x6C, -0x61,0xB4,0x20,0x18,0xD6,0x32,0x00,0x69,0x20,0x18,0x5B,0x30,0x00,0x65,0x00,0x18, -0xA6,0x5C,0x00,0x65,0x00,0x18,0xC8,0x8A,0x00,0x65,0x00,0x18,0xA3,0x9B,0x00,0x65, -0x5A,0xB4,0x00,0x18,0x44,0x81,0x00,0x65,0x59,0xB0,0x00,0x18,0x4C,0x81,0x90,0x67, -0x87,0x40,0x00,0x18,0x4C,0x81,0x01,0x4C,0x56,0xB4,0x57,0xB5,0x20,0xC0,0x00,0x18, -0x2E,0x2E,0x30,0x6E,0x55,0xB5,0x88,0x40,0xD8,0x4C,0x00,0x18,0x2E,0x2E,0x30,0x6E, -0x53,0xB5,0x87,0x40,0x11,0x4C,0x00,0x18,0x2E,0x2E,0x18,0x6E,0x51,0xB0,0x03,0x6B, -0x40,0x98,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x6A,0xEA,0x05,0x60,0x4E,0xB2,0x20,0xF1, -0x2C,0xC2,0x20,0xF1,0x36,0xC2,0x00,0x18,0x04,0xF6,0x00,0x65,0x00,0x18,0x48,0x3C, -0x00,0x65,0x00,0x18,0x71,0x32,0x00,0x65,0x00,0x18,0xE2,0x24,0x00,0x65,0x00,0x18, -0x9A,0x7E,0x00,0x65,0x00,0x18,0xB5,0xC8,0x00,0x65,0x45,0xB3,0x43,0xB2,0x60,0xDA, -0x00,0x18,0x0B,0x2B,0x00,0x65,0x40,0x98,0x0F,0x6B,0x46,0x32,0x6C,0xEA,0x03,0x72, -0x05,0x61,0x9D,0x67,0x40,0x4C,0x00,0x18,0x1B,0x28,0x00,0x6D,0x00,0x18,0xE9,0x2F, -0x00,0x65,0x80,0x18,0x68,0x2A,0x00,0x65,0x20,0x18,0xA2,0x39,0x00,0x65,0x80,0x18, -0x1C,0x2A,0x00,0x65,0x00,0x1C,0xAD,0x31,0x00,0x65,0x29,0xF6,0x00,0x6D,0x00,0x18, -0x17,0x2D,0x01,0x6C,0x09,0x6A,0x04,0xD2,0x32,0xB2,0x2F,0xB3,0x01,0x6C,0x05,0xD2, -0x68,0xF1,0x1A,0x6A,0x06,0xD2,0x30,0xF0,0x0E,0x6A,0x07,0xD2,0x2E,0xB2,0xFA,0x6D, -0x09,0xF6,0x17,0x6E,0x40,0x9A,0xA1,0xF3,0x16,0x6F,0x08,0xD2,0x40,0xF0,0x41,0xA3, -0x09,0xD2,0x40,0xF0,0x40,0xA3,0x0A,0xD2,0x20,0xF0,0x5F,0xA3,0x0B,0xD2,0x20,0xF0, -0x5E,0xA3,0x0C,0xD2,0x20,0xF0,0x5D,0xA3,0x0D,0xD2,0x20,0xF0,0x5C,0xA3,0x20,0x18, -0x1B,0x32,0x0E,0xD2,0x21,0xB2,0x22,0xB3,0x40,0x9A,0x6E,0xEA,0x19,0x2A,0x21,0xB1, -0x21,0xB3,0x40,0x99,0x6E,0xEA,0x14,0x2A,0x20,0xB0,0x21,0xB2,0x21,0xB3,0x80,0x98, -0x8C,0xEA,0x6E,0xEA,0x0B,0x2A,0x20,0xB3,0x00,0xF6,0x82,0x32,0x00,0x6D,0x3F,0xF4, -0x00,0x6C,0x00,0x18,0xFA,0x8B,0x40,0xC3,0x00,0x6A,0x40,0xD8,0x00,0x6A,0x40,0xD9, -0x13,0xB3,0x12,0xB2,0x20,0x18,0x3D,0x36,0x60,0xDA,0x14,0x97,0x13,0x91,0x12,0x90, -0x00,0xEF,0x0B,0x63,0x84,0xC8,0x00,0x80,0x03,0x00,0x00,0xC4,0x98,0x24,0x11,0x80, -0x38,0x24,0x11,0x80,0xF8,0xDA,0x10,0x80,0x40,0xDB,0x10,0x80,0x28,0xDB,0x10,0x80, -0x6C,0x1D,0x11,0x80,0xDC,0x00,0x11,0x80,0x5C,0xA1,0x00,0xB0,0x00,0x00,0x01,0x00, -0xFC,0xA5,0x10,0x80,0x90,0x1E,0x11,0x80,0x3C,0x91,0x10,0x80,0xEF,0xBE,0x23,0x87, -0x44,0x91,0x10,0x80,0x32,0x97,0x79,0x23,0x40,0x91,0x10,0x80,0xFF,0xFF,0xFF,0x00, -0xEE,0xFF,0xC0,0x00,0xD0,0x00,0x11,0x80,0x2E,0x5A,0x2C,0x4B,0xCF,0x9D,0xF2,0xCB, -0x74,0x9C,0x13,0xCE,0x57,0xF4,0x4C,0x54,0x48,0xA9,0xD3,0x53,0xC5,0x19,0x73,0x6F, -0xF7,0xEB,0x68,0x53,0xCC,0xAE,0x50,0xF1,0x57,0x02,0xE2,0x66,0xA3,0x5C,0xBC,0xD3, -0xB7,0xA6,0x2F,0xC9,0xAE,0xDC,0x77,0x9E,0x07,0x91,0x5F,0x86,0x91,0x8D,0xDC,0x27, -0x00,0x5D,0xF1,0xD6,0xCF,0x0C,0x14,0x2B,0x62,0x5E,0xD2,0xEF,0xF4,0xA5,0x18,0xFF, -0x15,0x20,0x70,0x09,0x98,0x44,0x21,0xA6,0x58,0x6F,0x9F,0xC3,0xFE,0x7E,0x43,0x29, -0xD2,0x80,0x9E,0xA5,0x11,0x25,0xF8,0xED,0xB0,0x9D,0x42,0xB8,0x1B,0xC5,0xBD,0x00, -0x9F,0x79,0xE4,0xB5,0x9D,0xBB,0xAA,0x85,0x7F,0xCA,0x85,0x6F,0xB9,0xF7,0xEA,0x25, -0x07,0x04,0x05,0x01,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x04,0x00,0x00,0x00, -0x01,0x03,0x02,0x04,0x00,0x00,0x00,0x00,0x1B,0x00,0xB7,0x00,0x53,0x01,0x36,0x00, -0x6F,0x01,0xA7,0x02,0x53,0x00,0x28,0x02,0xFD,0x03,0x25,0x00,0x04,0x0B,0x0F,0x04, -0x0A,0x0E,0x08,0x0B,0x0F,0x00,0x00,0x00,0x7A,0x41,0x2E,0x80,}; - -#endif //CONFIG_MP_INCLUDED - -#ifndef CONFIG_PHY_SETTING_WITH_ODM -u32 Rtl8723UPHY_REG_2TArray[Rtl8723UPHY_REG_2TArrayLength] = { -0x0, }; - -u32 Rtl8723UPHY_REG_1TArray[Rtl8723UPHY_REG_1TArrayLength] = { -0x800,0x80040000, -0x804,0x00000003, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10005388, -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66f60110, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x32323200, -0x870,0x07000760, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xa78,0x00000900, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x69543420, -0xc54,0x43bc0094, -0xc58,0x69543420, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x7116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u32 Rtl8723UPHY_ChangeTo_1T1RArray[Rtl8723UPHY_ChangeTo_1T1RArrayLength] = { -0x0, }; - -u32 Rtl8723UPHY_ChangeTo_1T2RArray[Rtl8723UPHY_ChangeTo_1T2RArrayLength] = { -0x0, }; - -u32 Rtl8723UPHY_ChangeTo_2T2RArray[Rtl8723UPHY_ChangeTo_2T2RArrayLength] = { -0x0, }; - - -u32 Rtl8723UPHY_REG_1T_mCardArray[Rtl8723UPHY_REG_1T_mCardArrayLength] = { -0x800,0x80040000, -0x804,0x00000003, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10005388, -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66f60110, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x32323200, -0x870,0x07000760, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xa78,0x00000900, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x69543420, -0xc54,0x43bc0094, -0xc58,0x69543420, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x7116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u32 Rtl8723UPHY_REG_1T_SDIOArray[Rtl8723UPHY_REG_1T_SDIOArrayLength] = { -0x800,0x80040000, -0x804,0x00000003, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10005388, -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66f60110, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x32323200, -0x870,0x07000760, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xa78,0x00000900, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x69543420, -0xc54,0x43bc0094, -0xc58,0x69543420, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x7116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u32 Rtl8723URadioA_2TArray[Rtl8723URadioA_2TArrayLength] = { -0x0, }; - -u32 Rtl8723URadioB_2TArray[Rtl8723URadioB_2TArrayLength] = { -0x0, }; - -u32 Rtl8723URadioA_1TArray[Rtl8723URadioA_1TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00039c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001a3f1, -0x00b,0x00014787, -0x00c,0x000896fe, -0x00d,0x0000e02c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00030355, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0000024f, -0x01f,0x00000000, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x00057730, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f474, -0x015,0x0004f477, -0x015,0x0008f474, -0x015,0x000cf474, -0x016,0x00000339, -0x016,0x00040339, -0x016,0x00080339, -0x016,0x000c0366, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00000003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00000247, -0x01f,0x00000000, -0x000,0x00030159, -}; - -u32 Rtl8723URadioB_1TArray[Rtl8723URadioB_1TArrayLength] = { -0x0, }; - -u32 Rtl8723URadioA_1T_mCardArray[Rtl8723URadioA_1T_mCardArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001a3f1, -0x00b,0x00014787, -0x00c,0x000896fe, -0x00d,0x0000e02c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00030355, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x00057730, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x00000339, -0x016,0x00040339, -0x016,0x00080339, -0x016,0x000c0356, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u32 Rtl8723URadioA_1T_SDIOArray[Rtl8723URadioA_1T_SDIOArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00039c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001a3f1, -0x00b,0x00014787, -0x00c,0x000896fe, -0x00d,0x0000e02c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00030355, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0000024f, -0x01f,0x00000000, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x00057730, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f474, -0x015,0x0004f477, -0x015,0x0008f474, -0x015,0x000cf474, -0x016,0x00000339, -0x016,0x00040339, -0x016,0x00080339, -0x016,0x000c0366, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00000003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00000247, -0x01f,0x00000000, -0x000,0x00030159, -}; - -u32 Rtl8723URadioB_GM_Array[Rtl8723URadioB_GM_ArrayLength] = { -0x0, }; - -u32 Rtl8723UMAC_2T_Array[Rtl8723UMAC_2T_ArrayLength] = { -0x420,0x00000080, -0x423,0x00000000, -0x430,0x00000000, -0x431,0x00000000, -0x432,0x00000000, -0x433,0x00000001, -0x434,0x00000004, -0x435,0x00000005, -0x436,0x00000006, -0x437,0x00000007, -0x438,0x00000000, -0x439,0x00000000, -0x43a,0x00000000, -0x43b,0x00000001, -0x43c,0x00000004, -0x43d,0x00000005, -0x43e,0x00000006, -0x43f,0x00000007, -0x440,0x0000005d, -0x441,0x00000001, -0x442,0x00000000, -0x444,0x00000015, -0x445,0x000000f0, -0x446,0x0000000f, -0x447,0x00000000, -0x458,0x00000041, -0x459,0x000000a8, -0x45a,0x00000072, -0x45b,0x000000b9, -0x460,0x00000066, -0x461,0x00000066, -0x462,0x00000008, -0x463,0x00000003, -0x4c8,0x000000ff, -0x4c9,0x00000008, -0x4cc,0x000000ff, -0x4cd,0x000000ff, -0x4ce,0x00000001, -0x500,0x00000026, -0x501,0x000000a2, -0x502,0x0000002f, -0x503,0x00000000, -0x504,0x00000028, -0x505,0x000000a3, -0x506,0x0000005e, -0x507,0x00000000, -0x508,0x0000002b, -0x509,0x000000a4, -0x50a,0x0000005e, -0x50b,0x00000000, -0x50c,0x0000004f, -0x50d,0x000000a4, -0x50e,0x00000000, -0x50f,0x00000000, -0x512,0x0000001c, -0x514,0x0000000a, -0x515,0x00000010, -0x516,0x0000000a, -0x517,0x00000010, -0x51a,0x00000016, -0x524,0x0000000f, -0x525,0x0000004f, -0x546,0x00000040, -0x547,0x00000000, -0x550,0x00000010, -0x551,0x00000010, -0x559,0x00000002, -0x55a,0x00000002, -0x55d,0x000000ff, -0x605,0x00000030, -0x608,0x0000000e, -0x609,0x0000002a, -0x652,0x00000020, -0x63c,0x0000000a, -0x63d,0x0000000e, -0x63e,0x0000000a, -0x63f,0x0000000e, -0x66e,0x00000005, -0x700,0x00000021, -0x701,0x00000043, -0x702,0x00000065, -0x703,0x00000087, -0x708,0x00000021, -0x709,0x00000043, -0x70a,0x00000065, -0x70b,0x00000087, -}; - - -u32 Rtl8723UAGCTAB_2TArray[Rtl8723UAGCTAB_2TArrayLength] = { -0x0, }; - -u32 Rtl8723UAGCTAB_1TArray[Rtl8723UAGCTAB_1TArrayLength] = { -0xc78,0x7b000001, -0xc78,0x7b010001, -0xc78,0x7b020001, -0xc78,0x7b030001, -0xc78,0x7b040001, -0xc78,0x7b050001, -0xc78,0x7a060001, -0xc78,0x79070001, -0xc78,0x78080001, -0xc78,0x77090001, -0xc78,0x760a0001, -0xc78,0x750b0001, -0xc78,0x740c0001, -0xc78,0x730d0001, -0xc78,0x720e0001, -0xc78,0x710f0001, -0xc78,0x70100001, -0xc78,0x6f110001, -0xc78,0x6e120001, -0xc78,0x6d130001, -0xc78,0x6c140001, -0xc78,0x6b150001, -0xc78,0x6a160001, -0xc78,0x69170001, -0xc78,0x68180001, -0xc78,0x67190001, -0xc78,0x661a0001, -0xc78,0x651b0001, -0xc78,0x641c0001, -0xc78,0x631d0001, -0xc78,0x621e0001, -0xc78,0x611f0001, -0xc78,0x60200001, -0xc78,0x49210001, -0xc78,0x48220001, -0xc78,0x47230001, -0xc78,0x46240001, -0xc78,0x45250001, -0xc78,0x44260001, -0xc78,0x43270001, -0xc78,0x42280001, -0xc78,0x41290001, -0xc78,0x402a0001, -0xc78,0x262b0001, -0xc78,0x252c0001, -0xc78,0x242d0001, -0xc78,0x232e0001, -0xc78,0x222f0001, -0xc78,0x21300001, -0xc78,0x20310001, -0xc78,0x06320001, -0xc78,0x05330001, -0xc78,0x04340001, -0xc78,0x03350001, -0xc78,0x02360001, -0xc78,0x01370001, -0xc78,0x00380001, -0xc78,0x00390001, -0xc78,0x003a0001, -0xc78,0x003b0001, -0xc78,0x003c0001, -0xc78,0x003d0001, -0xc78,0x003e0001, -0xc78,0x003f0001, -0xc78,0x7b400001, -0xc78,0x7b410001, -0xc78,0x7b420001, -0xc78,0x7b430001, -0xc78,0x7b440001, -0xc78,0x7b450001, -0xc78,0x7a460001, -0xc78,0x79470001, -0xc78,0x78480001, -0xc78,0x77490001, -0xc78,0x764a0001, -0xc78,0x754b0001, -0xc78,0x744c0001, -0xc78,0x734d0001, -0xc78,0x724e0001, -0xc78,0x714f0001, -0xc78,0x70500001, -0xc78,0x6f510001, -0xc78,0x6e520001, -0xc78,0x6d530001, -0xc78,0x6c540001, -0xc78,0x6b550001, -0xc78,0x6a560001, -0xc78,0x69570001, -0xc78,0x68580001, -0xc78,0x67590001, -0xc78,0x665a0001, -0xc78,0x655b0001, -0xc78,0x645c0001, -0xc78,0x635d0001, -0xc78,0x625e0001, -0xc78,0x615f0001, -0xc78,0x60600001, -0xc78,0x49610001, -0xc78,0x48620001, -0xc78,0x47630001, -0xc78,0x46640001, -0xc78,0x45650001, -0xc78,0x44660001, -0xc78,0x43670001, -0xc78,0x42680001, -0xc78,0x41690001, -0xc78,0x406a0001, -0xc78,0x266b0001, -0xc78,0x256c0001, -0xc78,0x246d0001, -0xc78,0x236e0001, -0xc78,0x226f0001, -0xc78,0x21700001, -0xc78,0x20710001, -0xc78,0x06720001, -0xc78,0x05730001, -0xc78,0x04740001, -0xc78,0x03750001, -0xc78,0x02760001, -0xc78,0x01770001, -0xc78,0x00780001, -0xc78,0x00790001, -0xc78,0x007a0001, -0xc78,0x007b0001, -0xc78,0x007c0001, -0xc78,0x007d0001, -0xc78,0x007e0001, -0xc78,0x007f0001, -0xc78,0x3800001e, -0xc78,0x3801001e, -0xc78,0x3802001e, -0xc78,0x3803001e, -0xc78,0x3804001e, -0xc78,0x3805001e, -0xc78,0x3806001e, -0xc78,0x3807001e, -0xc78,0x3808001e, -0xc78,0x3c09001e, -0xc78,0x3e0a001e, -0xc78,0x400b001e, -0xc78,0x440c001e, -0xc78,0x480d001e, -0xc78,0x4c0e001e, -0xc78,0x500f001e, -0xc78,0x5210001e, -0xc78,0x5611001e, -0xc78,0x5a12001e, -0xc78,0x5e13001e, -0xc78,0x6014001e, -0xc78,0x6015001e, -0xc78,0x6016001e, -0xc78,0x6217001e, -0xc78,0x6218001e, -0xc78,0x6219001e, -0xc78,0x621a001e, -0xc78,0x621b001e, -0xc78,0x621c001e, -0xc78,0x621d001e, -0xc78,0x621e001e, -0xc78,0x621f001e, -}; - - -#endif//ENDIF CONFIG_PHY_SETTING_WITH_ODM - -u32 Rtl8723UPHY_REG_Array_PG[Rtl8723UPHY_REG_Array_PGLength] = { -0xe00,0xffffffff,0x0a0c0c0c, -0xe04,0xffffffff,0x02040608, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x0a0c0d0e, -0xe14,0xffffffff,0x02040608, -0xe18,0xffffffff,0x0a0c0d0e, -0xe1c,0xffffffff,0x02040608, -0x830,0xffffffff,0x0a0c0c0c, -0x834,0xffffffff,0x02040608, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x0a0c0d0e, -0x848,0xffffffff,0x02040608, -0x84c,0xffffffff,0x0a0c0d0e, -0x868,0xffffffff,0x02040608, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x06060606, -0xe14,0xffffffff,0x00020406, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x06060606, -0x848,0xffffffff,0x00020406, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -}; - -u32 Rtl8723UMACPHY_Array_PG[Rtl8723UMACPHY_Array_PGLength] = { -0x0, }; - -#if MP_DRIVER == 1 - -u32 Rtl8723UPHY_REG_Array_MP[Rtl8723UPHY_REG_Array_MPLength] = { -0xc30,0x69e9ac4a, -0xc3c,0x0a979718, -}; - -#endif//#if MP_DRIVER == 1 - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +/*Created on 2013/01/14, 15:51*/ +#include "../odm_precomp.h" + +u8 Rtl8723UFwImgArray[Rtl8723UImgArrayLength] = { +0x01,0x23,0x02,0x00,0x0e,0x00,0x00,0x00,0x01,0x13,0x16,0x18,0x7c,0x56,0x01,0x00, +0x54,0x89,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x58,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x60,0xec,0x00,0x00,0x00,0x00,0x00,0x02,0x61,0x93,0x00,0x00, +0x00,0x00,0x00,0x02,0x67,0x2b,0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03, +0x00,0x04,0x06,0x05,0x04,0x02,0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09, +0x08,0x06,0x00,0x08,0x0a,0x09,0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08, +0x0a,0x09,0x08,0x00,0x00,0x08,0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10, +0x00,0x18,0x22,0x21,0x20,0x18,0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21, +0x20,0x08,0x00,0x20,0x22,0x21,0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20, +0x22,0x20,0x18,0x08,0x00,0x20,0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00, +0x00,0x30,0x31,0x2f,0x10,0x10,0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28, +0x10,0x00,0x00,0x30,0x31,0x20,0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30, +0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05, +0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05, +0x05,0x05,0x06,0x07,0x0a,0x0b,0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11, +0x08,0x08,0x09,0x09,0x0a,0x0c,0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07, +0x07,0x07,0x08,0x0a,0x04,0x04,0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07, +0x08,0x0b,0x0d,0x0f,0x04,0x04,0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12, +0x04,0x04,0x05,0x05,0x06,0x0a,0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f, +0x21,0x27,0x29,0x2a,0x00,0x00,0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04, +0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90, +0x00,0xc0,0x00,0xd8,0x00,0x50,0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90, +0x01,0xe0,0x02,0x30,0x01,0x2c,0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0, +0x06,0x40,0x07,0xd0,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12, +0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c, +0x00,0x50,0x00,0x64,0x00,0xa0,0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0, +0x00,0xf0,0x01,0x68,0x01,0xf4,0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02, +0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12, +0x05,0x07,0x07,0x08,0x0b,0x12,0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04, +0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08, +0x09,0x0a,0x0b,0x0c,0x20,0x1e,0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0xbb,0x01,0x06,0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01, +0xf3,0x22,0xf8,0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83, +0xe8,0xf0,0x22,0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25, +0x82,0xc8,0xf2,0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82, +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, +0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb, +0xfe,0x07,0xe3,0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5, +0xf0,0x74,0x01,0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, +0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0, +0x08,0xe6,0x22,0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22, +0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a, +0x89,0x82,0x8a,0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0, +0x19,0x22,0xbb,0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11, +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0, +0x22,0x50,0x09,0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9, +0x25,0x82,0xc8,0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed, +0x49,0xfd,0xec,0x48,0xfc,0x22,0xbb,0x01,0x07,0x89,0x82,0x8a,0x83,0x02,0x43,0x46, +0x50,0x05,0xe9,0xf8,0x02,0x43,0xda,0xbb,0xfe,0x05,0xe9,0xf8,0x02,0x43,0xe6,0x89, +0x82,0x8a,0x83,0x02,0x43,0xf2,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb, +0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0, +0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0, +0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12, +0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83, +0xe4,0x73,0x74,0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0xd0,0x83,0xd0, +0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74, +0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0xb5,0xf0,0x06,0x74,0x03, +0x93,0x68,0x60,0xe9,0xa3,0xa3,0xa3,0xa3,0x80,0xd8,0xe6,0xfc,0x08,0xe6,0xfd,0x08, +0xe6,0xfe,0x08,0xe6,0xff,0x22,0xe2,0xfc,0x08,0xe2,0xfd,0x08,0xe2,0xfe,0x08,0xe2, +0xff,0x22,0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0x74,0x02,0x93,0xfe,0x74,0x03,0x93, +0xff,0x22,0x02,0x44,0x40,0x02,0x50,0x33,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40, +0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07, +0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56, +0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, +0x90,0x44,0x85,0xe4,0x7e,0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09, +0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8, +0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82, +0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf, +0xe9,0xde,0xe7,0x80,0xbe,0x48,0x9e,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x48,0x9e,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x9e,0xab,0x00,0x41, +0x9f,0x19,0x00,0x41,0x9e,0x84,0x80,0x41,0x9e,0x85,0x80,0x41,0x9d,0xa8,0x00,0x41, +0x9d,0xa9,0x00,0x41,0x9d,0xa7,0x00,0x41,0x9e,0xbd,0x00,0x00,0x90,0x02,0x84,0xef, +0xf0,0xa3,0xee,0xf0,0xa3,0x74,0x05,0xf0,0x22,0xfd,0x7f,0x81,0xd3,0x10,0xaf,0x01, +0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0,0x12,0x4f,0x6d,0xd0,0xd0,0x92, +0xaf,0x22,0xe4,0x90,0x9e,0xb9,0xf0,0x90,0x00,0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80, +0x80,0xda,0x8f,0x82,0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0x12,0x4f,0x49,0x02, +0x4f,0x7d,0x22,0x02,0x6a,0xe7,0x02,0x6a,0xee,0xef,0x8e,0xf0,0x71,0xad,0x45,0x26, +0x00,0x40,0x45,0x4e,0x00,0x80,0x45,0x79,0x01,0x00,0x45,0x8d,0x02,0x00,0x45,0xa5, +0x04,0x00,0x00,0x00,0x45,0xc2,0xed,0x54,0x3f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e, +0x00,0x7f,0x40,0xef,0x2d,0xff,0xee,0x3c,0xfe,0xef,0x78,0x06,0xce,0xc3,0x13,0xce, +0x13,0xd8,0xf9,0x78,0x06,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x80,0x26,0xed,0x54, +0x7f,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x00,0x7f,0x80,0xef,0x2d,0xff,0xee,0x3c, +0xfe,0xef,0x78,0x07,0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0x78,0x07,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xfd,0xac,0x06,0x80,0x49,0xed,0x70,0x04,0xfe,0xff,0x80,0x04, +0x7e,0x01,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x7d,0x00,0xfc,0x80,0x35,0xec,0x54,0x01, +0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e,0x02,0x7f,0x00,0xef,0x2d,0xee,0x3c,0xc3, +0x13,0x7d,0x00,0x80,0x1a,0xec,0x54,0x03,0x4d,0x70,0x04,0xfe,0xff,0x80,0x04,0x7e, +0x04,0x7f,0x00,0xef,0x2d,0xee,0x3c,0x13,0x13,0x54,0x3f,0x7d,0x00,0x25,0xe0,0x25, +0xe0,0xfc,0xae,0x04,0xaf,0x05,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0x90, +0x9e,0x71,0xf0,0xa3,0x74,0x08,0xf0,0xa3,0xf0,0x90,0x01,0x1f,0xe0,0xfe,0x90,0x01, +0x1e,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x9e,0x6b,0xf0,0xa3,0xef,0xf0, +0x90,0x02,0x87,0xe0,0x90,0x9e,0x70,0xf0,0x90,0x9e,0xc1,0xe0,0x20,0xe0,0x02,0xe1, +0x3b,0xe4,0x90,0x9e,0x6f,0xf0,0x90,0x9e,0x70,0xe0,0xff,0x90,0x9e,0x6f,0xe0,0xc3, +0x9f,0x40,0x02,0xe1,0x3b,0x90,0x9e,0x6b,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0x90,0xfd, +0x11,0xf0,0x74,0x02,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0x0f,0xfc, +0x33,0x33,0x33,0x54,0xf8,0xff,0xed,0x24,0x18,0x2f,0x90,0x9e,0x6d,0xf0,0xe0,0x24, +0x00,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x54,0xfc,0x90,0x9e,0x6e,0xf0,0x74, +0x01,0x2d,0xf5,0x82,0xe4,0x34,0xfb,0xf5,0x83,0xe0,0xfe,0x74,0x00,0x2d,0xf5,0x82, +0xe4,0x34,0xfb,0xf5,0x83,0xe0,0x7a,0x00,0x24,0x00,0xff,0xea,0x3e,0x54,0x3f,0xab, +0x07,0xfa,0xaf,0x04,0xef,0x75,0xf0,0x08,0xa4,0x24,0x18,0xff,0xe4,0x35,0xf0,0xfe, +0xef,0x2b,0xfb,0xee,0x3a,0xfa,0x90,0x9e,0xc5,0xe0,0xfe,0xa3,0xe0,0xff,0xad,0x03, +0xac,0x02,0xb1,0x09,0xaa,0x06,0xab,0x07,0x90,0x9e,0x6b,0xee,0x8f,0xf0,0x51,0x54, +0x90,0x9e,0xc7,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x9e,0x6b,0xe0,0xfc,0xa3,0xe0,0xfd, +0xd3,0x9f,0xec,0x9e,0x40,0x1b,0x90,0x9e,0xc8,0xe0,0x24,0x01,0xff,0x90,0x9e,0xc7, +0xe0,0x34,0x00,0xfe,0xc3,0xed,0x9f,0xff,0xec,0x9e,0x90,0x9e,0x6b,0xf0,0xa3,0xef, +0xf0,0x90,0x9e,0x6e,0xe0,0xff,0x24,0x40,0x60,0x04,0x24,0x20,0x70,0x2b,0x90,0x9e, +0xc9,0xe0,0xfe,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x26,0xef,0x90,0x00,0x81, +0xb4,0xa0,0x05,0xe0,0x44,0x04,0x80,0x03,0xe0,0x44,0x08,0xfd,0x7f,0x81,0x91,0xcc, +0x90,0x9e,0xc1,0xe0,0x44,0x80,0xf0,0x80,0x09,0x90,0x9e,0xc9,0xe0,0xc4,0x13,0x13, +0x54,0x03,0x90,0x9e,0xc1,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x03, +0x12,0x92,0x86,0x12,0x95,0x13,0xbf,0x01,0x0a,0x90,0x9e,0x6b,0xe0,0xfe,0xa3,0xe0, +0xff,0x91,0xbc,0x90,0x9e,0x6f,0xe0,0x04,0xf0,0xc1,0x06,0xd0,0xd0,0x92,0xaf,0x22, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x9e,0xef, +0x71,0x7e,0xab,0x63,0xaa,0x64,0xa9,0x65,0x90,0x9e,0xf2,0x71,0x7e,0xaf,0x66,0x15, +0x66,0xef,0x60,0x1b,0x90,0x9e,0xf2,0xe4,0x75,0xf0,0x01,0x71,0x67,0x12,0x1f,0x04, +0xff,0x90,0x9e,0xef,0xe4,0x75,0xf0,0x01,0x71,0x67,0xef,0x51,0x20,0x80,0xde,0xab, +0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x9e,0xba,0xe0,0xb4,0x01, +0x04,0x7d,0x91,0x80,0x0c,0x90,0x9e,0xba,0xe0,0x70,0x04,0x7d,0x90,0x80,0x02,0xe4, +0xfd,0x7f,0x93,0x91,0xcc,0x90,0x00,0x29,0xe0,0x54,0x3f,0xfd,0x7f,0x29,0x91,0xcc, +0x90,0x00,0x28,0xe0,0x54,0xfc,0xfd,0x7f,0x28,0x91,0xcc,0x90,0x00,0x08,0xe0,0x44, +0x10,0xfd,0x7f,0x08,0x91,0xcc,0x7f,0x01,0x12,0x78,0xe1,0x90,0x00,0x00,0xe0,0x44, +0x20,0xfd,0xe4,0xff,0x91,0xcc,0x90,0x00,0x20,0xe0,0x54,0xfe,0xfd,0x7f,0x20,0x91, +0xcc,0x90,0x00,0x90,0xe0,0x44,0x01,0xfd,0x7f,0x90,0x91,0xcc,0x7f,0x14,0x7e,0x00, +0x02,0x3b,0x3b,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a, +0x90,0x05,0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90, +0x01,0xc7,0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf, +0x22,0x90,0x9e,0xb6,0xe0,0xff,0x7d,0x01,0xe4,0xfb,0xfa,0xef,0x30,0xe0,0x02,0x7b, +0x80,0xef,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0xed,0x60,0x0e, +0x74,0x0f,0x2b,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0xaf,0x03, +0x74,0x08,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2f,0xf5, +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2b,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf7,0xf0,0xae,0x02,0xaf,0x03,0x22,0x8f,0x25,0x90, +0x9e,0x86,0xe0,0x30,0xe0,0x39,0x90,0x04,0x1d,0xe0,0x70,0x6a,0x12,0x47,0xf3,0xef, +0x64,0x01,0x70,0x62,0x11,0x21,0x8e,0x26,0x8f,0x27,0xe5,0x25,0x60,0x10,0x74,0x21, +0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x42,0x74,0x21, +0x25,0x27,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x80,0x31,0x12, +0x47,0xf3,0xef,0x64,0x01,0x70,0x2f,0x11,0x21,0x8e,0x26,0x8f,0x27,0xe5,0x25,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0f,0x74,0x21,0x25,0x27,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0, +0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x67, +0xb4,0x01,0x04,0x7f,0x01,0x11,0x7d,0x53,0x68,0xf0,0x43,0x68,0x04,0x90,0x9e,0xda, +0xe0,0x30,0xe0,0x07,0x90,0x05,0x27,0xe0,0x44,0x80,0xf0,0x22,0xf0,0x7d,0x01,0x7f, +0x0c,0x90,0x9f,0x0e,0xed,0xf0,0x90,0x9f,0x0d,0xef,0xf0,0x54,0x0f,0xff,0xe5,0x68, +0x54,0x0f,0x6f,0x60,0x6d,0x90,0x9f,0x0d,0xe0,0x30,0xe2,0x28,0xe5,0x68,0x20,0xe2, +0x04,0x7f,0x01,0xf1,0x30,0xe5,0x68,0x30,0xe3,0x09,0x90,0x9f,0x0d,0xe0,0x20,0xe3, +0x02,0x80,0xa4,0xe5,0x68,0x20,0xe3,0x4a,0x90,0x9f,0x0d,0xe0,0x30,0xe3,0x43,0xa3, +0xe0,0xff,0xe1,0xb4,0xe5,0x68,0x54,0x0f,0xff,0xbf,0x0c,0x0f,0x90,0x9f,0x0d,0xe0, +0x20,0xe3,0x08,0x12,0x77,0xa3,0xef,0x60,0x29,0x11,0xf7,0xe5,0x68,0x54,0x0f,0xff, +0xbf,0x04,0x0f,0x90,0x9f,0x0d,0xe0,0x20,0xe2,0x08,0x12,0x77,0xec,0xef,0x60,0x12, +0xf1,0x91,0xe5,0x68,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x78,0x6b,0xef,0x60,0x02, +0xf1,0x1d,0x22,0xe4,0x90,0x9e,0x5a,0xf0,0x90,0x9e,0x86,0xe0,0x20,0xe0,0x02,0x81, +0x06,0x90,0x9e,0x8c,0xe0,0x64,0x01,0x70,0x5c,0x90,0x9e,0x89,0xe0,0x30,0xe0,0x19, +0xe0,0xc3,0x13,0x30,0xe0,0x02,0x80,0x0b,0x90,0x9e,0x89,0xe0,0x13,0x13,0x54,0x3f, +0x30,0xe0,0x06,0xa3,0xe0,0x90,0x9e,0x5a,0xf0,0xe4,0xf5,0x48,0x90,0x9e,0x5a,0xe0, +0x24,0x03,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x60,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01, +0x63,0x74,0x05,0xf0,0x90,0x9e,0x8c,0xe0,0x04,0xf0,0x90,0x9e,0x86,0xe0,0xc4,0x13, +0x54,0x07,0x30,0xe0,0x02,0x81,0x06,0x90,0x9e,0x86,0xe0,0xc4,0x54,0x0f,0x20,0xe0, +0x02,0x61,0xa5,0x61,0x9d,0x90,0x9e,0x8c,0xe0,0x64,0x02,0x60,0x02,0x41,0xc1,0x90, +0x07,0x78,0x04,0xf0,0x90,0x9e,0x89,0xe0,0x30,0xe0,0x20,0xe0,0xc3,0x13,0x30,0xe0, +0x02,0x80,0x0b,0x90,0x9e,0x89,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x0d,0xa3,0xe0, +0x90,0x9e,0x5a,0xf0,0x90,0x9e,0x89,0xe0,0x54,0xfb,0xf0,0xe4,0xf5,0x48,0x90,0x9e, +0x87,0xe0,0xff,0xc3,0x74,0x2e,0x9f,0xff,0x90,0x9e,0x5a,0xe0,0xfe,0xc3,0xef,0x9e, +0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x60,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x63,0x74, +0x05,0xf0,0x90,0x9e,0x86,0xe0,0xff,0xc3,0x13,0x90,0x9e,0x56,0x30,0xe0,0x09,0x12, +0x1f,0xe3,0x00,0x00,0x03,0x00,0x80,0x07,0x12,0x1f,0xe3,0x00,0x00,0x03,0x10,0x91, +0x07,0xe4,0x90,0x9e,0x8b,0xf0,0xa3,0xe0,0x04,0xf0,0x90,0x9e,0x86,0xe0,0xc4,0x13, +0x54,0x07,0x30,0xe0,0x02,0x81,0x00,0x90,0x9e,0x86,0xe0,0xc4,0x54,0x0f,0x30,0xe0, +0x02,0x80,0x06,0xe5,0x6a,0x70,0x02,0x81,0x00,0xe4,0xfd,0xaf,0x69,0x31,0x21,0x81, +0x00,0x90,0x9e,0x8c,0xe0,0x64,0x03,0x60,0x02,0x61,0x66,0x90,0x9e,0x86,0xe0,0xc4, +0x13,0x13,0x54,0x03,0x90,0x07,0x78,0x30,0xe0,0x05,0x74,0x0d,0xf0,0x80,0x03,0x74, +0x09,0xf0,0xe4,0xf5,0x48,0x90,0x9e,0x88,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x60, +0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x63,0x74,0x05,0xf0,0x90,0x9e,0x56,0x12,0x1f, +0xe3,0x00,0x00,0x03,0x10,0x91,0x07,0x90,0x9e,0x8b,0x74,0x01,0xf0,0xa3,0xe0,0x04, +0xf0,0x90,0x9e,0x86,0xe0,0xc4,0x13,0x54,0x07,0x20,0xe0,0x1f,0x90,0x9e,0x86,0xe0, +0xc4,0x54,0x0f,0x30,0xe0,0x0b,0x90,0x05,0x22,0xe4,0xf0,0x7d,0x01,0x7f,0x0c,0x80, +0x08,0xe5,0x6a,0x60,0x06,0xe4,0xfd,0x7f,0x04,0x31,0x21,0x90,0x05,0x22,0xe4,0xf0, +0x90,0x9e,0x96,0xe0,0x60,0x02,0x81,0x00,0x90,0x9e,0x86,0xe0,0xc4,0x13,0x54,0x07, +0x30,0xe0,0x02,0x81,0x06,0x90,0x9e,0x86,0xe0,0xff,0x13,0x13,0x54,0x3f,0x20,0xe0, +0x02,0x81,0x06,0x02,0x64,0x90,0x90,0x9e,0x8c,0xe0,0x64,0x04,0x70,0x3e,0xf5,0x48, +0x75,0x49,0x03,0xfb,0xfd,0x7f,0x60,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x63,0x74, +0x05,0xf0,0x90,0x9e,0x8c,0xe0,0x04,0xf0,0x90,0x9e,0x86,0xe0,0xc4,0x13,0x54,0x07, +0x20,0xe0,0x73,0x90,0x9e,0x86,0xe0,0xc4,0x54,0x0f,0x30,0xe0,0x08,0xe4,0xfd,0x7f, +0x04,0x31,0x21,0x80,0x5b,0x90,0x05,0x22,0x74,0xff,0xf0,0x22,0x90,0x9e,0x8c,0xe0, +0x64,0x05,0x70,0x52,0x90,0x07,0x78,0x04,0xf0,0x90,0x9e,0x86,0xe0,0xff,0xc3,0x13, +0x90,0x9e,0x56,0x30,0xe0,0x09,0x12,0x1f,0xe3,0x00,0x00,0x03,0x00,0x80,0x07,0x12, +0x1f,0xe3,0x00,0x00,0x03,0x10,0x91,0x07,0xe4,0x90,0x9e,0x8b,0xf0,0xa3,0xf0,0x90, +0x9e,0x86,0xe0,0xc4,0x13,0x54,0x07,0x20,0xe0,0x16,0x90,0x9e,0x86,0xe0,0xc4,0x54, +0x0f,0x30,0xe0,0x02,0x80,0x04,0xe5,0x6a,0x60,0x06,0xe4,0xfd,0xaf,0x69,0x31,0x21, +0x90,0x05,0x22,0x74,0x6f,0xf0,0x22,0x7b,0x01,0x7a,0x9e,0x79,0x56,0x7f,0x70,0x7e, +0x08,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xef,0x54,0xfc,0xff,0x90,0x01,0xe8,0xf0, +0xee,0x44,0xf0,0xa3,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0x01,0xec,0xf0,0x90, +0x00,0x02,0x12,0x1f,0x1d,0x90,0x01,0xed,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90, +0x01,0xee,0xf0,0x12,0x1f,0x04,0x90,0x01,0xef,0xf0,0x90,0x01,0xeb,0x74,0x40,0xf0, +0x12,0x8e,0xd6,0xd0,0xd0,0x92,0xaf,0x22,0xef,0x64,0x01,0x70,0x32,0x7d,0x78,0x7f, +0x02,0x12,0x3a,0x54,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x54,0x90,0x01,0x57,0xe4,0xf0, +0x90,0x01,0x3c,0x74,0x02,0x31,0x1c,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x02,0xd1,0x27, +0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90, +0x01,0x36,0x74,0x78,0xf0,0xa3,0x74,0x02,0xf0,0x7d,0x78,0xff,0x12,0x3a,0xc5,0x7d, +0x02,0x7f,0x03,0x12,0x3a,0xc5,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a, +0xe0,0x44,0x07,0xf0,0x12,0x79,0x87,0xe5,0x67,0x30,0xe0,0x21,0x90,0x9e,0x90,0xe0, +0x70,0x20,0xe0,0x04,0xf0,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01, +0x7f,0x04,0x31,0x21,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x07,0xc1,0x27,0xe4,0x90,0x9e, +0x90,0xf0,0x22,0x8b,0x13,0x8a,0x14,0x89,0x15,0x12,0x77,0x6d,0xab,0x13,0xaa,0x14, +0xa9,0x15,0x12,0x1f,0x04,0xf5,0x6a,0x12,0x43,0x87,0x4d,0x13,0x00,0x4d,0x1b,0x01, +0x4d,0x2e,0x02,0x4d,0x42,0x03,0x4d,0x48,0x04,0x4d,0x5f,0x05,0x4d,0x77,0x06,0x00, +0x00,0x4d,0x82,0x7f,0x01,0x91,0x58,0x7f,0x01,0x80,0x64,0xab,0x13,0xaa,0x14,0xa9, +0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0xe4,0xff,0xb1,0x92,0x80,0x18,0xab,0x13, +0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0x7f,0x01,0xb1,0x92,0x1f, +0x80,0x04,0xb1,0x83,0xe4,0xff,0x81,0x58,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00, +0x02,0x12,0x1f,0x1d,0xfd,0xe4,0xff,0xb1,0x92,0x91,0x58,0xe4,0xff,0x80,0x20,0xab, +0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd,0x7f,0x01,0xb1,0x92, +0x1f,0x91,0x58,0xe4,0xff,0x80,0x08,0xb1,0x83,0xe4,0xff,0x91,0x58,0xe4,0xff,0x12, +0x77,0x79,0x22,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x1f,0x1d,0xfd, +0x7f,0x02,0xef,0x24,0xfe,0x60,0x12,0x04,0x70,0x2f,0x90,0x9e,0x9d,0x74,0x01,0xf0, +0x90,0x9e,0x8e,0xf0,0x90,0x9e,0xa0,0xf0,0x22,0xed,0x70,0x0a,0x90,0x9e,0x9a,0xe0, +0x90,0x9e,0x9d,0xf0,0x80,0x05,0x90,0x9e,0x9d,0xed,0xf0,0x90,0x9e,0x9d,0xe0,0x90, +0x9e,0x8e,0xf0,0x90,0x9e,0xa0,0x74,0x01,0xf0,0x22,0x90,0x9e,0xda,0xe0,0x30,0xe0, +0x04,0xaf,0x69,0x80,0x2f,0x7d,0x01,0xaf,0x69,0x21,0x21,0x11,0xf7,0x90,0x9e,0xdb, +0x74,0x01,0xf0,0x22,0x90,0x9e,0x43,0xe0,0xc3,0x13,0x30,0xe0,0x16,0xef,0x7b,0x01, +0xb4,0x01,0x06,0x7a,0x9e,0x79,0x4a,0x80,0x04,0x7a,0x9e,0x79,0x46,0x7f,0x80,0x7e, +0x08,0x91,0x11,0x22,0xae,0x07,0xe4,0xff,0xd1,0x6c,0xef,0x60,0x17,0x90,0x9e,0xda, +0xe0,0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x0b,0xaf,0x06,0x7d,0x01,0x31,0x21,0xd1, +0x27,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x9e,0xdb,0xe0,0x64,0x06,0x60,0x3c,0xe5, +0x68,0x54,0x0f,0x14,0x60,0x2e,0x14,0x60,0x1e,0x24,0xfe,0x60,0x0e,0x24,0xf8,0x70, +0x2a,0xe4,0x90,0x9e,0xdb,0xf0,0x90,0x05,0x22,0xf0,0x22,0x90,0x9e,0xdb,0x74,0x01, +0xf0,0x90,0x05,0x22,0xe4,0xf0,0x22,0x90,0x9e,0xdb,0x74,0x03,0xf0,0x90,0x05,0x22, +0x74,0xff,0xf0,0x22,0x90,0x01,0xc6,0xe0,0x44,0x08,0xf0,0x22,0x8f,0x6e,0x90,0x05, +0x43,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0x22,0xe4,0x90,0x9f,0x1b,0xf0,0xe5, +0x6a,0x70,0x02,0xe1,0x1c,0xe5,0x67,0x64,0x01,0x60,0x02,0xe1,0x1c,0xe5,0x6a,0x14, +0x60,0x28,0x24,0xfd,0x60,0x24,0x24,0x02,0x24,0xfb,0x50,0x02,0x80,0x22,0xe4,0x90, +0x9e,0x8e,0xf0,0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x9e,0x8e,0xe0,0x70,0x0a, +0x90,0x9e,0x9d,0xe0,0x90,0x9e,0x8e,0xf0,0x80,0x00,0x90,0x9f,0x1b,0x74,0x01,0xf0, +0x90,0x9e,0xda,0xe0,0x30,0xe0,0x15,0xa3,0xe0,0xb4,0x06,0x05,0xe4,0x90,0x9f,0x1b, +0xf0,0xe4,0xff,0xd1,0x6c,0xef,0x70,0x04,0x90,0x9f,0x1b,0xf0,0x90,0x9f,0x1b,0xe0, +0x60,0x3a,0x43,0x6b,0x10,0xe4,0xf5,0x48,0x90,0x9e,0x99,0xe0,0xf5,0x49,0xe4,0xfb, +0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x68, +0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01,0x7f,0x04,0x31,0x21,0x90,0x9e,0xda, +0xe0,0x30,0xe0,0x08,0xd1,0x27,0x90,0x05,0x22,0x74,0xff,0xf0,0x22,0x53,0x68,0xf0, +0x43,0x68,0x01,0x12,0x47,0x8a,0x12,0x79,0x39,0x53,0x68,0xf0,0x43,0x68,0x02,0x22, +0x90,0x9f,0x1a,0xef,0xf0,0xf1,0x49,0x90,0x9f,0x1a,0xe0,0x60,0x05,0x90,0x05,0x22, +0xe4,0xf0,0x53,0x68,0xf0,0x43,0x68,0x04,0x22,0x90,0x01,0x01,0xe0,0x44,0x02,0xf0, +0x90,0x01,0x00,0x74,0xff,0xf0,0x90,0x00,0x02,0xe0,0x44,0x01,0xf0,0xf1,0x6d,0x90, +0x01,0xba,0xe4,0xf0,0x22,0xf4,0xff,0x90,0x00,0x63,0xe0,0x5f,0xf0,0xd3,0x10,0xaf, +0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x05,0x22, +0x74,0x6f,0xf0,0x90,0x05,0x27,0xe0,0x54,0xbf,0xf0,0x90,0x9e,0xe1,0x74,0x03,0xf0, +0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x12,0x8f,0xd5,0xef,0x70,0x06,0x90,0x01,0xc8, +0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x3a,0xc5,0x12,0x57,0x64,0x53,0x68,0xf0, +0x43,0x68,0x02,0x22,0x90,0x06,0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x67, +0xb4,0x01,0x04,0xe4,0xff,0x11,0x7d,0x53,0x68,0xf0,0x43,0x68,0x0c,0x90,0x9e,0xda, +0xe0,0x30,0xe0,0x07,0x90,0x05,0x27,0xe0,0x54,0x7f,0xf0,0x22,0x80,0x9f,0x12,0x57, +0x90,0x80,0x9a,0xf1,0x49,0x90,0x9e,0xe1,0x74,0x04,0xf0,0x22,0xf1,0x91,0x90,0x9e, +0xdb,0x74,0x03,0xf0,0x22,0xf1,0x30,0x90,0x9e,0xdb,0x74,0x01,0xf0,0x22,0x12,0x47, +0xf3,0xbf,0x01,0x10,0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x48,0x28,0x90,0x04, +0x1f,0x74,0x20,0xf0,0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x07,0xf5,0x2b, +0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5, +0x2b,0xf0,0x22,0xe4,0x90,0x9e,0x68,0xf0,0xa3,0xf0,0x12,0x60,0xb4,0x75,0x8e,0x02, +0x12,0x44,0xe2,0x12,0x60,0x0b,0x90,0x9e,0xba,0xef,0xf0,0x12,0x60,0x1e,0x90,0x9e, +0xbc,0xef,0xf0,0x12,0x60,0x2a,0x90,0x9e,0xa1,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xf5, +0x57,0x12,0x82,0x34,0x12,0x77,0x03,0x12,0x37,0x4e,0x31,0x3d,0x11,0x15,0x12,0x60, +0x42,0x12,0x60,0x57,0xf1,0xe8,0x12,0x45,0x02,0x12,0x60,0xbc,0x12,0x94,0x02,0x31, +0x25,0x90,0x9e,0x6a,0xe5,0xd9,0xf0,0x12,0x5f,0xdc,0xc2,0xaf,0x90,0x00,0x80,0xe0, +0x44,0x40,0xf0,0x12,0x4f,0x6d,0x75,0xe8,0x03,0x43,0xa8,0x85,0x12,0x8e,0x27,0xd2, +0xaf,0x12,0x84,0x56,0x12,0x60,0x5e,0x90,0x9e,0x68,0xe0,0x64,0x01,0xf0,0x24,0x33, +0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xe5,0x57,0x30,0xe0,0x0a,0xc2,0xaf,0x53, +0x57,0xfe,0x12,0x95,0x34,0xd2,0xaf,0xe5,0x57,0x30,0xe2,0x10,0x12,0x6a,0xf5,0xbf, +0x01,0x0a,0xc2,0xaf,0x53,0x57,0xfb,0xd2,0xaf,0x12,0x45,0xc7,0xe5,0x57,0x30,0xe4, +0x0a,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x12,0x6b,0x32,0xe5,0x57,0x30,0xe6,0x0a, +0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x7b,0xd8,0xe5,0x57,0x30,0xe7,0x0a,0xc2, +0xaf,0x53,0x57,0x7f,0xd2,0xaf,0x12,0x5d,0xe9,0xc2,0xaf,0xe5,0x69,0x54,0x0f,0xff, +0xbf,0x01,0x0e,0x90,0x9e,0x92,0x74,0x01,0xf0,0x12,0x4d,0xca,0xe4,0x90,0x9e,0x92, +0xf0,0xd2,0xaf,0x80,0x82,0x90,0x9e,0xbe,0xe0,0x54,0xfe,0xf0,0xe4,0x90,0x9e,0xc0, +0xf0,0x90,0x9e,0xbe,0xe0,0x54,0x7f,0xf0,0xa3,0x74,0x0a,0xf0,0x22,0x90,0x9e,0xe0, +0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x9e,0xda,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3, +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90, +0x9e,0x76,0x12,0x43,0x7e,0xe4,0x90,0x9e,0x79,0xf0,0x12,0x1f,0x04,0xc3,0x13,0x20, +0xe0,0x02,0x41,0xbb,0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x54,0x02, +0xfe,0x90,0x9e,0xe0,0xe0,0x54,0xfd,0x4e,0xfe,0xf0,0xef,0x54,0x01,0xff,0xee,0x54, +0xfe,0x4f,0xff,0xf0,0x12,0x1f,0x04,0xfe,0x54,0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff, +0x90,0x9e,0xe0,0xf0,0xee,0x54,0x10,0xfe,0xef,0x54,0xef,0x4e,0xff,0xf0,0x12,0x1f, +0x04,0xfe,0x54,0x20,0xfd,0xef,0x54,0xdf,0x4d,0xff,0x90,0x9e,0xe0,0xf0,0xee,0x54, +0x40,0xfe,0xef,0x54,0xbf,0x4e,0xf0,0x20,0xe0,0x02,0x41,0xab,0x31,0x3d,0x90,0x9e, +0x79,0x74,0x21,0xf0,0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x13,0x13, +0x54,0x01,0xfe,0x90,0x9e,0xe0,0xe0,0xfd,0x13,0x13,0x54,0x01,0x6e,0x60,0x31,0xef, +0x54,0x04,0xff,0xed,0x54,0xfb,0x4f,0xf0,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x15, +0x90,0x01,0x34,0x74,0x40,0xf0,0xfd,0xe4,0xff,0x12,0x3a,0xc5,0x90,0x9e,0x79,0xe0, +0x44,0x08,0xf0,0x80,0x0b,0xe4,0x90,0x9e,0xe2,0xf0,0x7d,0x40,0xff,0x12,0x3a,0x54, +0x90,0x9e,0xe0,0xe0,0xfd,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x9e,0x79, +0xe0,0x44,0x12,0xf0,0xed,0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x9e,0x79,0xe0,0x44, +0x14,0xf0,0x90,0x9e,0xe0,0xe0,0xc4,0x13,0x54,0x07,0x30,0xe0,0x07,0x90,0x9e,0x79, +0xe0,0x44,0x80,0xf0,0x90,0x9e,0xe0,0xe0,0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x07, +0x90,0x9e,0x79,0xe0,0x44,0x40,0xf0,0x90,0x9e,0x79,0xe0,0x90,0x05,0x27,0xf0,0x90, +0x9e,0xe1,0xe0,0x70,0x04,0x7f,0x01,0xd1,0x20,0x90,0x9e,0xe0,0xe0,0xc4,0x13,0x13, +0x54,0x03,0x30,0xe0,0x04,0x7f,0x03,0x80,0x0e,0x7f,0x01,0x12,0x4e,0x6c,0xef,0x60, +0x04,0x7f,0x01,0x80,0x02,0x7f,0x02,0xd1,0x20,0x81,0x0e,0x90,0x9e,0x79,0x74,0x01, +0xf0,0x90,0x05,0x27,0xf0,0xe4,0xff,0xd1,0x20,0x81,0x0c,0x90,0x9e,0x76,0x12,0x43, +0x5e,0x12,0x1f,0x04,0xff,0x54,0x02,0xfe,0x90,0x9e,0xda,0xe0,0x54,0xfd,0x4e,0xfe, +0xf0,0xef,0x54,0x01,0xff,0xee,0x54,0xfe,0x4f,0xff,0xf0,0x12,0x1f,0x04,0xfe,0x54, +0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff,0x90,0x9e,0xda,0xf0,0xee,0x54,0x10,0xfe,0xef, +0x54,0xef,0x4e,0xff,0xf0,0x12,0x1f,0x04,0x54,0x40,0xfe,0xef,0x54,0xbf,0x4e,0x90, +0x9e,0xda,0xf0,0x20,0xe0,0x02,0x61,0xdf,0x31,0x3d,0x90,0x9e,0x79,0x74,0x31,0xf0, +0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x13,0x13,0x54,0x01,0xfe,0x90, +0x9e,0xda,0xe0,0xfd,0x13,0x13,0x54,0x01,0x6e,0x60,0x31,0xef,0x54,0x04,0xff,0xed, +0x54,0xfb,0x4f,0xf0,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x15,0x90,0x01,0x34,0x74, +0x40,0xf0,0xfd,0xe4,0xff,0x12,0x3a,0xc5,0x90,0x9e,0x79,0xe0,0x44,0x08,0xf0,0x80, +0x0b,0xe4,0x90,0x9e,0xdc,0xf0,0x7d,0x40,0xff,0x12,0x3a,0x54,0x90,0x9e,0xda,0xe0, +0xfd,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x9e,0x79,0xe0,0x44,0x02,0xf0, +0xed,0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x9e,0x79,0xe0,0x44,0x04,0xf0,0x90,0x9e, +0x79,0xe0,0x54,0x0e,0x60,0x0c,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12, +0x3a,0xdf,0x90,0x9e,0x79,0xe0,0x90,0x05,0x27,0xf0,0x90,0x9e,0xda,0xe0,0xff,0xc4, +0x13,0x13,0x54,0x03,0x30,0xe0,0x0c,0xa3,0xe0,0x64,0x06,0x60,0x61,0x7f,0x06,0x91, +0x13,0x80,0x5b,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0x90,0x9e,0xdb,0xe0,0xb4,0x06, +0x19,0x7f,0x01,0x91,0x13,0xe4,0xff,0x12,0x4e,0x6c,0xef,0x60,0x09,0x7d,0x01,0xaf, +0x69,0x12,0x49,0x21,0x80,0x04,0xf1,0xb6,0x80,0x34,0x12,0x4e,0x27,0x80,0x2f,0x90, +0x9e,0x79,0x74,0x01,0xf0,0x90,0x05,0x27,0xf0,0x7d,0x03,0x7f,0x02,0x12,0x3a,0x71, +0x90,0x9e,0xdb,0xe0,0xb4,0x06,0x04,0x7f,0x01,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4, +0x04,0x04,0xe4,0xff,0x91,0x13,0x12,0x5f,0x5f,0x12,0x4d,0xca,0x31,0x3d,0xd0,0xd0, +0x92,0xaf,0x22,0x90,0x9e,0xdb,0xe0,0xfe,0x6f,0x70,0x02,0xa1,0xd0,0xef,0x12,0x43, +0x87,0x54,0x3a,0x00,0x54,0x6f,0x01,0x54,0xaf,0x02,0x54,0xea,0x03,0x55,0x22,0x04, +0x55,0x5a,0x05,0x55,0x95,0x06,0x00,0x00,0x55,0xd0,0xee,0xb4,0x04,0x04,0x7f,0x01, +0xa1,0xfc,0x90,0x9e,0xdb,0xe0,0xff,0xb4,0x05,0x02,0xa1,0xd1,0xef,0xb4,0x06,0x06, +0x7f,0x01,0xb1,0xe6,0x80,0x17,0x90,0x9e,0xdb,0xe0,0xb4,0x03,0x07,0x7f,0x01,0x12, +0x4f,0xf5,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x02,0x02,0xb1,0xdb,0xc1,0x15,0x90, +0x9e,0xdb,0xe0,0xb4,0x04,0x06,0x7f,0x01,0xb1,0xfc,0x80,0x09,0x90,0x9e,0xdb,0xe0, +0xb4,0x05,0x02,0xb1,0xd1,0x90,0x9e,0xdb,0xe0,0x70,0x03,0x02,0x4d,0xdb,0x90,0x9e, +0xdb,0xe0,0xfe,0xb4,0x06,0x04,0x7f,0x01,0xa1,0xe6,0xee,0xb4,0x03,0x05,0x7f,0x01, +0x02,0x4f,0xf5,0x90,0x9e,0xdb,0xe0,0x64,0x02,0x60,0x02,0xa1,0xd0,0xa1,0xdb,0x90, +0x9e,0xdb,0xe0,0xb4,0x04,0x06,0x7f,0x01,0xb1,0xfc,0x80,0x09,0x90,0x9e,0xdb,0xe0, +0xb4,0x05,0x02,0xb1,0xd1,0x90,0x9e,0xdb,0xe0,0x70,0x05,0x12,0x4d,0xdb,0x80,0x17, +0x90,0x9e,0xdb,0xe0,0xfe,0xb4,0x06,0x06,0x7f,0x01,0xb1,0xe6,0x80,0x09,0xee,0xb4, +0x03,0x05,0x7f,0x01,0x12,0x4f,0xf5,0x02,0x8f,0xb4,0x90,0x9e,0xdb,0xe0,0xb4,0x04, +0x06,0x7f,0x01,0xb1,0xfc,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x05,0x02,0xb1,0xd1, +0x90,0x9e,0xdb,0xe0,0x70,0x05,0x12,0x4d,0xdb,0x80,0x14,0x90,0x9e,0xdb,0xe0,0xfe, +0xb4,0x06,0x06,0xe4,0xff,0xb1,0xe6,0x80,0x06,0xee,0xb4,0x02,0x02,0xb1,0xdb,0x02, +0x4f,0xec,0x90,0x9e,0xdb,0xe0,0xfe,0xb4,0x06,0x06,0xe4,0xff,0xb1,0xe6,0x80,0x14, +0xee,0xb4,0x03,0x07,0x7f,0x01,0x12,0x4f,0xf5,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4, +0x02,0x02,0xb1,0xdb,0x90,0x9e,0xdb,0xe0,0xb4,0x01,0x04,0xd1,0x15,0x80,0x09,0x90, +0x9e,0xdb,0xe0,0xb4,0x05,0x02,0xb1,0xd1,0xe1,0x87,0x90,0x9e,0xdb,0xe0,0xfe,0xb4, +0x06,0x06,0xe4,0xff,0xb1,0xe6,0x80,0x14,0xee,0xb4,0x03,0x07,0x7f,0x01,0x12,0x4f, +0xf5,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x02,0x02,0xb1,0xdb,0x90,0x9e,0xdb,0xe0, +0xb4,0x01,0x04,0xd1,0x15,0x80,0x0b,0x90,0x9e,0xdb,0xe0,0xb4,0x04,0x04,0x7f,0x01, +0xb1,0xfc,0x02,0x8f,0xa7,0x90,0x9e,0xdb,0xe0,0xb4,0x04,0x06,0x7f,0x01,0xb1,0xfc, +0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x05,0x02,0xb1,0xd1,0x90,0x9e,0xdb,0xe0,0x70, +0x05,0x12,0x4d,0xdb,0x80,0x17,0x90,0x9e,0xdb,0xe0,0xb4,0x03,0x07,0xe4,0xff,0x12, +0x4f,0xf5,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x02,0x02,0xb1,0xdb,0x12,0x8f,0xc1, +0x22,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xdb,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0, +0x90,0x9e,0xdb,0x04,0xf0,0x22,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0xef,0x60,0x05, +0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xdb,0x74,0x01,0xf0,0x22,0x90,0x9f,0x1d,0xef, +0xf0,0x12,0x4f,0x49,0x90,0x9f,0x1d,0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0xe4, +0x90,0x9e,0xdb,0xf0,0x22,0x7f,0x01,0x12,0x4f,0xb4,0xe4,0x90,0x9e,0xdb,0xf0,0x22, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xe1,0xe0,0x90,0x9f,0x1c,0xf0,0x6f, +0x70,0x02,0xc1,0xf0,0xef,0x14,0x60,0x3d,0x14,0x60,0x61,0x14,0x70,0x02,0xc1,0xc7, +0x24,0x03,0x60,0x02,0xc1,0xf0,0x90,0x9f,0x1c,0xe0,0xb4,0x03,0x04,0xf1,0x0c,0xc1, +0xf0,0x90,0x9f,0x1c,0xe0,0xb4,0x02,0x04,0xf1,0x24,0xc1,0xf0,0x90,0x9f,0x1c,0xe0, +0xb4,0x04,0x04,0xf1,0x28,0xc1,0xf0,0x90,0x9f,0x1c,0xe0,0x64,0x01,0x60,0x02,0xc1, +0xf0,0xf1,0x0e,0x80,0x7b,0x90,0x9f,0x1c,0xe0,0xff,0xb4,0x03,0x04,0xf1,0xa3,0x80, +0x6f,0xef,0xb4,0x02,0x04,0xf1,0x40,0x80,0x67,0x90,0x9f,0x1c,0xe0,0xff,0xb4,0x04, +0x04,0xf1,0x35,0x80,0x5b,0xef,0x70,0x58,0xf1,0x90,0x80,0x54,0x90,0x9f,0x1c,0xe0, +0xb4,0x03,0x04,0xf1,0x4e,0x80,0x49,0x90,0x9f,0x1c,0xe0,0xb4,0x01,0x04,0xd1,0xf7, +0x80,0x3e,0x90,0x9f,0x1c,0xe0,0xb4,0x04,0x04,0xf1,0x2c,0x80,0x33,0x90,0x9f,0x1c, +0xe0,0x70,0x2d,0xd1,0xf5,0x80,0x29,0x90,0x9f,0x1c,0xe0,0xff,0xb4,0x01,0x05,0x12, +0x4f,0x7d,0x80,0x1c,0xef,0xb4,0x02,0x05,0x12,0x44,0xfc,0x80,0x13,0x90,0x9f,0x1c, +0xe0,0xff,0xb4,0x04,0x05,0x12,0x4f,0xdc,0x80,0x06,0xef,0x70,0x03,0x12,0x4f,0xde, +0xd0,0xd0,0x92,0xaf,0x22,0xf1,0x90,0x12,0x8f,0xd5,0xef,0x70,0x06,0x90,0x01,0xc8, +0x74,0xfd,0xf0,0xf1,0x64,0x90,0x9e,0xe1,0x74,0x02,0xf0,0x22,0xf1,0xa3,0x7d,0x03, +0x7f,0x02,0x12,0x3a,0x71,0x90,0x05,0x27,0xe4,0xf0,0xe0,0x54,0xbf,0xf0,0xe4,0x90, +0x9e,0xe1,0xf0,0x22,0xf1,0x40,0x80,0xe6,0xf1,0x35,0x80,0xe2,0xf1,0x64,0x90,0x9e, +0xe1,0x74,0x02,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xe1,0x04,0xf0,0x22, +0x12,0x4f,0x49,0x90,0x05,0x22,0xe4,0xf0,0x90,0x9e,0xe1,0x04,0xf0,0x22,0x90,0x05, +0x27,0xe0,0x44,0x40,0xf0,0xf1,0x5e,0x90,0x9e,0xe1,0x74,0x02,0xf0,0x22,0x90,0x05, +0x22,0x74,0xff,0xf0,0x90,0x00,0x02,0xe0,0x54,0xfe,0xf0,0x12,0x4f,0x6d,0x90,0x01, +0x00,0x74,0x3f,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0x90,0x05,0x53,0xe0,0x44,0x20,0xf0, +0x90,0x01,0xba,0x74,0xcc,0xf0,0x22,0xf1,0x5e,0x90,0x9e,0xdb,0x74,0x04,0xf0,0x22, +0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x3a,0xdf,0x90,0x9e,0xe1,0x74, +0x01,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0,0x90, +0x9e,0xe1,0x74,0x01,0xf0,0x22,0x90,0x9e,0x90,0xe0,0x60,0x16,0x90,0x9e,0xdb,0xe0, +0x70,0x04,0x7f,0x05,0x80,0x1f,0x90,0x9e,0xdb,0xe0,0x64,0x01,0x70,0x19,0x7f,0x02, +0x80,0x13,0x90,0x9e,0xdb,0xe0,0xb4,0x01,0x04,0x7f,0x03,0x80,0x08,0x90,0x9e,0xdb, +0xe0,0x70,0x04,0x7f,0x04,0x91,0x13,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5, +0x32,0x43,0x32,0x20,0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5, +0x32,0xf0,0x22,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, +0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0x12,0x44,0xcc,0xe4,0xfd, +0x7f,0x51,0x12,0x44,0xcc,0xe4,0xfd,0x7f,0x52,0x12,0x44,0xcc,0xe4,0xfd,0x7f,0x53, +0x02,0x44,0xcc,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00, +0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07, +0x90,0x01,0xc4,0x74,0x33,0xf0,0x74,0x58,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55,0x28, +0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5,0x2f, +0xe5,0x2c,0x20,0xe0,0x02,0x21,0xe9,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1,0x4d, +0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52,0x85,0xd7,0x53,0x85, +0xd9,0x54,0x85,0xd2,0x4e,0x78,0xac,0x7c,0x9e,0xfd,0x7b,0x00,0x7a,0x00,0x79,0x4d, +0x7e,0x00,0x7f,0x08,0x12,0x1e,0xde,0x90,0x9e,0xad,0xe0,0xff,0xc4,0x13,0x54,0x01, +0xfe,0xef,0xc4,0x13,0x13,0x54,0x01,0x6e,0x70,0x02,0x21,0x9b,0x90,0x9e,0xad,0xe0, +0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x30,0xe0,0x02,0x21,0x9b,0xef,0x54,0x1f,0xf5, +0x08,0x90,0x9e,0xae,0xe0,0x54,0x3f,0xf5,0x09,0x90,0x9e,0xb0,0xe0,0x54,0x1f,0xff, +0xe5,0x08,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4,0x8f,0xf0, +0x12,0x42,0x54,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03,0x75,0x09,0x04,0x75,0xf0,0x0a, +0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75,0xf0,0x02,0xe5,0x09,0x12,0x43,0x52, +0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x9e,0xb0,0xe0,0x54,0x1f,0x2f,0xff,0xe4,0x3e,0xfe, +0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75,0xf0,0x02,0xe5,0x09, +0x12,0x43,0x52,0xee,0xf0,0xa3,0xef,0xf0,0x90,0x9e,0xad,0xe0,0xc4,0x13,0x13,0x54, +0x03,0x20,0xe0,0x28,0x90,0x9e,0xb0,0xe0,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24, +0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x54,0x90,0x9e, +0xaf,0xe0,0x30,0xe7,0x36,0xaf,0x08,0x12,0x74,0xbb,0x80,0x2f,0x90,0x9e,0xb0,0xe0, +0x54,0x1f,0xff,0xfd,0xe5,0x08,0x25,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5, +0x83,0xe4,0x8d,0xf0,0x12,0x42,0x54,0x90,0x9e,0xaf,0xe0,0xfe,0x30,0xe7,0x0c,0x54, +0x7f,0xfd,0x8f,0x0d,0xab,0x09,0xaf,0x08,0x12,0x74,0x58,0xe5,0x6a,0x14,0x24,0xfd, +0x50,0x02,0x80,0x45,0x90,0x9e,0x9e,0xe0,0x60,0x37,0x90,0x01,0x5b,0xe4,0xf0,0x90, +0x01,0x3c,0x74,0x04,0xf0,0x91,0xb8,0xef,0x64,0x01,0x70,0x2d,0x90,0x9e,0x93,0xe0, +0xf5,0x48,0x75,0x49,0x00,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x39,0xa9,0x90, +0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90,0x9e,0x9c,0xf0,0x80, +0x08,0x91,0xb8,0xbf,0x01,0x03,0x12,0x4d,0xca,0xe5,0x2c,0x30,0xe1,0x7b,0x90,0x01, +0x34,0x74,0x02,0xf0,0x90,0xfd,0x10,0x74,0x7f,0xf0,0x90,0x04,0x7f,0xe0,0x54,0x07, +0xf5,0x55,0x90,0x04,0x7e,0xe0,0x54,0x07,0xf5,0x56,0x65,0x55,0x60,0x5b,0xe4,0xff, +0x75,0xf0,0x08,0xe5,0x55,0xa4,0x2f,0xf5,0x82,0xe4,0x35,0xf0,0xf5,0x83,0xe5,0x82, +0x24,0xc0,0xf5,0x82,0xe5,0x83,0x34,0xfc,0xf5,0x83,0xe0,0xfe,0x74,0x58,0x2f,0xf8, +0xa6,0x06,0x0f,0xbf,0x08,0xda,0x78,0xa3,0x7c,0x9e,0x7d,0x01,0x7b,0x00,0x7a,0x00, +0x79,0x58,0x7e,0x00,0x7f,0x08,0x12,0x1e,0xde,0x90,0x9e,0xa3,0xe0,0xff,0xc4,0x13, +0x13,0x54,0x03,0x30,0xe0,0x02,0xb1,0x18,0xe5,0x55,0x24,0x01,0xff,0xef,0x54,0x07, +0xf5,0x55,0x90,0x04,0x7f,0xf0,0xb5,0x56,0xa5,0xe5,0x2c,0x30,0xe3,0x10,0x90,0x01, +0x34,0x74,0x08,0xf0,0x90,0x9e,0xc1,0xe0,0x30,0xe0,0x03,0x43,0x57,0x04,0xe5,0x2c, +0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, +0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, +0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x11,0x03,0x90,0x00,0x03,0xe0,0x54,0xfb, +0xf0,0x12,0x4f,0x6d,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, +0xf0,0xe5,0x2e,0x30,0xe0,0x41,0x90,0x9e,0xbb,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, +0x12,0x95,0xd8,0x90,0x9e,0xe0,0xe0,0x30,0xe0,0x0d,0x13,0x13,0x54,0x3f,0x30,0xe0, +0x06,0x90,0x9e,0xe2,0x74,0x01,0xf0,0x90,0x9e,0xda,0xe0,0xff,0x30,0xe0,0x0d,0x13, +0x13,0x54,0x3f,0x30,0xe0,0x06,0x90,0x9e,0xdc,0x74,0x01,0xf0,0x12,0x4e,0x7a,0x12, +0x94,0xbe,0x90,0x9e,0xbb,0xe4,0xf0,0xe5,0x2e,0x30,0xe1,0x60,0x90,0x01,0x36,0x74, +0x02,0xf0,0x43,0x57,0x40,0x12,0x96,0x30,0x90,0x01,0x02,0xe0,0x54,0x03,0x64,0x01, +0x70,0x29,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a,0x74,0x01,0xf0,0x90,0x9e,0xab,0xe4, +0xf0,0x80,0x18,0x90,0x9e,0xab,0xe0,0x04,0xf0,0xe0,0xc3,0x94,0x0a,0x40,0x0c,0xe4, +0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x4f,0xfe,0x90,0x9e,0xda,0xe0,0x30, +0xe0,0x0d,0xe4,0xff,0x12,0x4e,0x6c,0xef,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90, +0x9e,0xa0,0xe0,0x60,0x07,0x7d,0x02,0x7f,0x02,0x12,0x3a,0x54,0xe5,0x2e,0x30,0xe2, +0x43,0x90,0x01,0x36,0x74,0x04,0xf0,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x06,0xa3,0xe0, +0x64,0x06,0x60,0x30,0x12,0x65,0x92,0x90,0x9e,0xa0,0xe0,0x60,0x27,0x90,0x9e,0x9d, +0xe0,0xff,0x90,0x9e,0x8e,0xe0,0xb5,0x07,0x1b,0x90,0x9e,0x9d,0xe0,0x90,0x05,0x73, +0xf0,0x90,0x01,0x3f,0x74,0x10,0xf0,0xfd,0x7f,0x03,0x12,0x3a,0xdf,0x7d,0x01,0x7f, +0x02,0x12,0x3a,0x54,0xe5,0x2e,0x30,0xe3,0x34,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5, +0x67,0x64,0x01,0x70,0x28,0xe5,0x6a,0x60,0x24,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01, +0x3c,0x74,0x02,0xf0,0x75,0x48,0x00,0x90,0x9e,0x95,0xe0,0xf5,0x49,0xe4,0xfb,0xfd, +0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30, +0xe4,0x2b,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x67,0xb4,0x01,0x20,0xe5,0x6a,0x60, +0x1c,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0x9f,0xe4, +0xf0,0x53,0x6b,0xfd,0xe5,0x6b,0x54,0x07,0x70,0x03,0x12,0x4d,0xca,0xe5,0x2e,0x30, +0xe5,0x25,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x67,0xb4,0x01,0x1a,0xe5,0x6a,0x60, +0x16,0x90,0x9e,0x9e,0xe0,0x64,0x02,0x60,0x0b,0xe5,0x68,0x64,0x0c,0x60,0x08,0x12, +0x64,0x90,0x80,0x03,0x12,0x66,0x76,0xe5,0x2e,0x30,0xe6,0x1b,0x90,0x01,0x36,0x74, +0x40,0xf0,0xe5,0x67,0xb4,0x01,0x10,0xe5,0x6a,0x60,0x0c,0x53,0x6b,0xfe,0xe5,0x6b, +0x54,0x07,0x70,0x03,0x12,0x4d,0xca,0xe5,0x2f,0x30,0xe1,0x26,0x90,0x01,0x37,0x74, +0x02,0xf0,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x17,0xe4,0xff,0x12,0x4e,0x6c,0xef,0x60, +0x07,0x91,0xd1,0x12,0x4e,0x27,0x80,0x0a,0x90,0x9e,0xdf,0x74,0x01,0xf0,0x80,0x02, +0x91,0xd1,0x74,0x33,0x04,0x90,0x01,0xc4,0xf0,0x74,0x58,0xa3,0xf0,0xd0,0x07,0xd0, +0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0, +0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0x04,0x1a,0xe0,0xf4,0x60,0x03,0x7f, +0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x07,0x64,0x07,0x7f,0x01,0x60,0x02,0x7f,0x00, +0x22,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x54,0xe5,0x6a,0x14,0x24,0xfd,0x50,0x06,0x24, +0xfd,0x50,0x24,0x80,0x32,0x90,0x9e,0x86,0xe0,0x20,0xe0,0x2b,0x90,0x9e,0x9e,0xe0, +0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x1c,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50, +0x16,0x7d,0x01,0x7f,0x04,0x80,0x0d,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07, +0x7d,0x01,0x7f,0x04,0x12,0x49,0x21,0x22,0x90,0x9e,0x52,0xe0,0x54,0xf0,0x44,0x03, +0xf0,0x54,0x0f,0x44,0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x9e,0xfe,0x12, +0x43,0x7e,0x0b,0x7a,0x9e,0x79,0x52,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e, +0xfb,0x12,0x43,0x7e,0x90,0x9d,0xa9,0xe0,0xff,0x90,0x9d,0xa8,0xe0,0xb5,0x07,0x07, +0x7d,0x02,0x7f,0x03,0x12,0x3a,0xdf,0x90,0x9d,0xa8,0xe0,0x70,0x06,0xa3,0xe0,0x64, +0x09,0x60,0x0b,0x90,0x9d,0xa8,0xe0,0x14,0xff,0xa3,0xe0,0xb5,0x07,0x0d,0xf1,0x05, +0xef,0x60,0x71,0xb1,0xe9,0x90,0x01,0x3f,0x74,0x02,0xf0,0x90,0x9d,0xa9,0xe0,0x75, +0xf0,0x0f,0xa4,0x24,0xad,0xf9,0x74,0x9d,0x35,0xf0,0xa8,0x01,0xfc,0x7d,0x01,0x90, +0x9e,0xfb,0x12,0x43,0x5e,0x7e,0x00,0x7f,0x02,0x12,0x1e,0xde,0x90,0x9d,0xa9,0xe0, +0x75,0xf0,0x0f,0xa4,0x24,0xaf,0xf9,0x74,0x9d,0x35,0xf0,0xfa,0x7b,0x01,0xc0,0x03, +0xc0,0x02,0xc0,0x01,0x90,0x9e,0xfe,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65, +0x90,0x9e,0xfb,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0xc4,0x54,0x0f,0xf5,0x66,0xd0, +0x01,0xd0,0x02,0xd0,0x03,0x12,0x47,0x40,0x90,0x9d,0xa9,0xe0,0x04,0xf0,0xe0,0xb4, +0x0a,0x02,0xe4,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x90,0x9d,0xa8,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xad,0xf9,0x74,0x9d,0x35,0xf0,0xfa, +0x7b,0x01,0xc0,0x02,0xc0,0x01,0xe0,0x75,0xf0,0x0f,0xa4,0x24,0xaf,0xf9,0x74,0x9d, +0x35,0xf0,0xfa,0x90,0x9e,0xf8,0x12,0x43,0x7e,0xd0,0x01,0xd0,0x02,0xd1,0x43,0x90, +0x9d,0xa8,0xe0,0x04,0xf0,0xe0,0xb4,0x0a,0x02,0xe4,0xf0,0x90,0x9d,0xa9,0xe0,0xff, +0x90,0x9d,0xa8,0xe0,0xb5,0x07,0x07,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x71,0xd0,0xd0, +0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9e,0xf5,0x12,0x43,0x7e, +0x90,0x9d,0xa7,0xe0,0xff,0x04,0xf0,0x90,0x00,0x01,0xef,0x12,0x42,0x32,0xf1,0x05, +0xef,0x70,0x02,0xe1,0x00,0x90,0x9e,0xf5,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89, +0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0x12,0x47,0x40,0x90,0x9e,0xf8, +0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x90,0x9e,0xf5,0x12,0x43,0x5e,0x12, +0x1f,0x04,0xff,0xc4,0x54,0x0f,0xf5,0x66,0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x47, +0x40,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90,0x9e,0xba,0xe0,0x64,0x01,0x70,0x4a,0x90, +0x9e,0xf5,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01, +0x7a,0xfd,0x79,0x20,0x12,0x47,0x40,0x90,0x9e,0xf8,0x12,0x43,0x5e,0x8b,0x63,0x8a, +0x64,0x89,0x65,0x90,0x9e,0xf5,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0xc4,0x54,0x0f, +0xf5,0x66,0x7b,0x01,0x7a,0xfd,0x79,0x22,0x12,0x47,0x40,0x90,0x9e,0xa1,0xe0,0xfe, +0xa3,0xe0,0xf5,0x82,0x8e,0x83,0x74,0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0, +0xd0,0xd0,0x92,0xaf,0x22,0x7f,0xaf,0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x90,0x9f,0x06,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90,0x9f,0x06, +0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x9f,0x09,0xe0, +0x94,0xe8,0x90,0x9f,0x08,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0,0x44,0x10, +0xf0,0x7f,0x00,0x80,0x15,0x90,0x9f,0x08,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f, +0x0a,0x7e,0x00,0x12,0x3b,0x3b,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0x90, +0x9e,0xdf,0xe0,0xb4,0x01,0x04,0xe4,0xf0,0x91,0xd1,0x22,0x90,0x9e,0xda,0xe0,0xff, +0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x0b,0xa3,0xe0,0x64,0x06,0x60,0x05,0x7f,0x06, +0x12,0x54,0x13,0x90,0x9e,0xdb,0xe0,0x64,0x06,0x60,0x02,0xf1,0x5f,0x22,0xad,0x07, +0x90,0x9e,0x56,0xe0,0x54,0xf0,0x44,0x05,0xf0,0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e, +0x58,0xef,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x58,0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7a, +0x9e,0x79,0x56,0xa1,0x37,0xad,0x07,0x90,0x9e,0x60,0xe0,0x54,0xf0,0x44,0x07,0xf0, +0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e,0x62,0xef,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x62, +0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x60,0xa1,0x37,0x90,0x01,0x3c,0x74, +0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, +0xfd,0x7f,0x54,0x12,0x44,0xcc,0x7d,0xff,0x7f,0x55,0x12,0x44,0xcc,0x7d,0xff,0x7f, +0x56,0x12,0x44,0xcc,0x7d,0xff,0x7f,0x57,0x02,0x44,0xcc,0x90,0x00,0xf4,0xe0,0x20, +0xe3,0x09,0xe0,0x7f,0x01,0x20,0xe2,0x05,0x7f,0x02,0x22,0x7f,0x00,0x22,0x90,0x00, +0xf3,0xe0,0x7f,0x00,0x30,0xe3,0x02,0x7f,0x01,0x22,0x90,0x9e,0xbc,0xe0,0xb4,0x01, +0x0c,0x90,0x00,0xf2,0xe0,0x30,0xe7,0x05,0x7e,0xfd,0x7f,0x33,0x22,0x7e,0xfd,0x7f, +0x2f,0x22,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90, +0x05,0x5a,0xf0,0xa3,0xe4,0xf0,0x22,0x90,0x01,0x64,0x74,0x20,0xf0,0x22,0xe4,0x90, +0x9e,0x6b,0xf0,0xa3,0xf0,0x90,0x01,0x98,0xe0,0x7f,0x00,0x30,0xe4,0x02,0x7f,0x01, +0xef,0x64,0x01,0x60,0x3e,0xc3,0x90,0x9e,0x6c,0xe0,0x94,0x88,0x90,0x9e,0x6b,0xe0, +0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44,0x80,0xf0,0x22,0x90,0x9e,0x6b,0xe4, +0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x14,0x7e,0x00,0x12,0x3b,0x3b,0xd3,0x90,0x9e, +0x6c,0xe0,0x94,0x32,0x90,0x9e,0x6b,0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0, +0x30,0xe3,0xb2,0x22,0x90,0x01,0x94,0xe0,0x44,0x01,0xf0,0x22,0x90,0x01,0x01,0xe0, +0x44,0x04,0xf0,0x90,0x01,0x9c,0x74,0x7e,0xf0,0xa3,0x74,0x92,0xf0,0xa3,0x74,0xa0, +0xf0,0xa3,0x74,0x24,0xf0,0x90,0x01,0x9b,0x74,0x49,0xf0,0x90,0x01,0x9a,0x74,0xe0, +0xf0,0x90,0x01,0x99,0xe4,0xf0,0x90,0x01,0x98,0x04,0xf0,0x22,0xc0,0xe0,0xc0,0x83, +0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x7d,0xec,0x90, +0x01,0xc4,0xed,0xf0,0x74,0x60,0xff,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0, +0xfe,0x90,0x00,0x55,0xe0,0x5e,0xf5,0x3d,0x90,0x00,0x52,0xe0,0xfe,0x90,0x00,0x56, +0xe0,0x5e,0xf5,0x3e,0xe5,0x3d,0x30,0xe4,0x06,0x90,0x00,0x55,0x74,0x10,0xf0,0xe5, +0x3d,0x30,0xe5,0x06,0x90,0x00,0x55,0x74,0x20,0xf0,0xe5,0x3d,0x30,0xe6,0x06,0x90, +0x00,0x55,0x74,0x40,0xf0,0xe5,0x3d,0x30,0xe7,0x06,0x90,0x00,0x55,0x74,0x80,0xf0, +0xe5,0x3e,0x30,0xe0,0x06,0x90,0x00,0x56,0x74,0x01,0xf0,0xe5,0x3e,0x30,0xe1,0x06, +0x90,0x00,0x56,0x74,0x02,0xf0,0xe5,0x3e,0x30,0xe2,0x06,0x90,0x00,0x56,0x74,0x04, +0xf0,0xe5,0x3e,0x30,0xe3,0x06,0x90,0x00,0x56,0x74,0x08,0xf0,0x90,0x01,0xc4,0xed, +0xf0,0xa3,0xef,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0xd0,0xd0,0x82,0xd0,0x83, +0xd0,0xe0,0x32,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00, +0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07, +0x90,0x01,0xc4,0x74,0x93,0xf0,0x74,0x61,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c, +0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5, +0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74, +0x01,0xf0,0xe5,0x34,0x30,0xe1,0x08,0x90,0x01,0x3c,0x74,0x02,0xf0,0xd1,0x38,0xe5, +0x34,0x30,0xe2,0x36,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0, +0x21,0x75,0x48,0x00,0x90,0x9e,0x93,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x58,0x7e, +0x01,0x12,0x39,0xa9,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0, +0x80,0x08,0x90,0x9e,0x9c,0xe4,0xf0,0x12,0x4d,0xca,0xe5,0x34,0x30,0xe3,0x36,0x90, +0x01,0x3c,0x74,0x08,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe1,0x21,0x75,0x48,0x00,0x90, +0x9e,0x93,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x12,0x39,0xa9,0x90, +0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x08,0x90,0x9e,0x9b, +0xe4,0xf0,0x12,0x4d,0xca,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,0xf0, +0x12,0x49,0xa3,0xe5,0x34,0x30,0xe5,0x06,0x90,0x01,0x3c,0x74,0x20,0xf0,0xe5,0x35, +0x30,0xe0,0x18,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x01,0x2f,0xe0,0x44,0x7f,0xf0, +0x90,0x00,0x83,0xe0,0xf5,0x69,0x91,0x71,0x12,0x4d,0xca,0xe5,0x35,0x30,0xe2,0x0c, +0x90,0x01,0x3d,0x74,0x04,0xf0,0x53,0x6b,0xfb,0x12,0x4d,0xca,0xe5,0x36,0x30,0xe0, +0x6d,0x90,0x01,0x3e,0x74,0x01,0xf0,0x90,0x9e,0xe0,0xe0,0x30,0xe0,0x13,0xa3,0xe0, +0x64,0x03,0x60,0x0d,0x7f,0x01,0x12,0x4e,0x6c,0xef,0x60,0x05,0x7f,0x01,0x12,0x56, +0x20,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x46,0xe4,0xff,0x12,0x4e,0x6c,0xef,0x60,0x3e, +0x12,0x5f,0x6b,0x90,0x9e,0xdb,0xe0,0xff,0x64,0x06,0x60,0x32,0xef,0xb4,0x04,0x02, +0x80,0x07,0x90,0x9e,0xdb,0xe0,0xb4,0x05,0x04,0xe4,0xff,0x80,0x14,0x90,0x9e,0xdb, +0xe0,0xb4,0x03,0x04,0x7f,0x01,0x80,0x09,0x90,0x9e,0xdb,0xe0,0xb4,0x02,0x05,0x7f, +0x01,0x12,0x54,0x13,0x7d,0x01,0xaf,0x69,0x12,0x49,0x21,0x12,0x4e,0x27,0xe5,0x36, +0x30,0xe1,0x3c,0x90,0x01,0x3e,0x74,0x02,0xf0,0x90,0x9e,0xe0,0xe0,0x30,0xe0,0x13, +0xa3,0xe0,0x64,0x03,0x60,0x0d,0x7f,0x01,0x12,0x4e,0x6c,0xef,0x70,0x05,0x7f,0x02, +0x12,0x56,0x20,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x15,0xd1,0xbc,0x90,0x9e,0xdb,0xe0, +0x64,0x06,0x60,0x0b,0xe4,0xff,0x12,0x4e,0x6c,0xef,0x70,0x03,0x12,0x57,0xb6,0xe5, +0x36,0x30,0xe3,0x09,0x90,0x01,0x3e,0x74,0x08,0xf0,0x43,0x6b,0x04,0xe5,0x36,0x30, +0xe4,0x06,0x90,0x01,0x3e,0x74,0x10,0xf0,0xe5,0x36,0x30,0xe2,0x76,0x90,0x01,0x3e, +0x74,0x04,0xf0,0x90,0x07,0x8f,0xe0,0x30,0xe7,0x13,0x74,0x80,0xf0,0x90,0x07,0x95, +0x74,0x04,0xf0,0xa3,0xe0,0x44,0x04,0xf0,0xe4,0xff,0x12,0x4d,0xe4,0x90,0x07,0x8f, +0xe0,0x30,0xe6,0x12,0x74,0x40,0xf0,0x90,0x07,0x7c,0xe0,0xb4,0x06,0x08,0x90,0x07, +0x80,0xe0,0xff,0x12,0x5f,0x8e,0x90,0x07,0x8f,0xe0,0x30,0xe5,0x14,0x74,0x20,0xf0, +0xe4,0xff,0x12,0x4d,0xe4,0x90,0x07,0x95,0xe0,0x44,0x01,0xf0,0xa3,0xe0,0x44,0x01, +0xf0,0x90,0x07,0x95,0xe0,0x30,0xe2,0x0d,0x74,0x04,0xf0,0xa3,0xe0,0x54,0xfb,0xf0, +0x7f,0x01,0x12,0x4d,0xe4,0x90,0x07,0x95,0xe0,0x30,0xe0,0x07,0x74,0x01,0xf0,0xff, +0x12,0x4d,0xe4,0xe5,0x36,0x30,0xe5,0x06,0x90,0x01,0x3e,0x74,0x20,0xf0,0xe5,0x36, +0x30,0xe6,0x08,0x90,0x01,0x3e,0x74,0x40,0xf0,0x91,0x90,0xe5,0x36,0x30,0xe7,0x0c, +0x90,0x01,0x3e,0x74,0x80,0xf0,0x53,0x6b,0xfe,0x12,0x4d,0xca,0xe5,0x37,0x30,0xe1, +0x09,0x90,0x01,0x3f,0x74,0x02,0xf0,0x43,0x57,0x80,0xe5,0x37,0x30,0xe4,0x1c,0x90, +0x01,0x3f,0x74,0x10,0xf0,0x12,0x4e,0x7a,0x90,0x9e,0x9d,0xe0,0x90,0x05,0x73,0xf0, +0x90,0x01,0x36,0x74,0x02,0xf0,0xfd,0xff,0x12,0x3a,0xc5,0x74,0x93,0x04,0x90,0x01, +0xc4,0xf0,0x74,0x61,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03, +0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0, +0x32,0xe5,0x69,0x30,0xe6,0x19,0xe5,0x69,0x54,0x0f,0xff,0x90,0x9e,0x85,0xe0,0xfe, +0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x9e,0x85,0xf0,0x53,0x69,0xbf,0x22, +0x90,0x9e,0x86,0xe0,0x30,0xe0,0x11,0x90,0x05,0x22,0xe0,0x20,0xe4,0x20,0x12,0x47, +0xf3,0xef,0x64,0x01,0x70,0x18,0x80,0x06,0x12,0x47,0xf3,0xbf,0x01,0x10,0x90,0x9e, +0xb5,0xe0,0xff,0xe4,0xfd,0x12,0x48,0x28,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90, +0x06,0xa9,0xe0,0x90,0x9e,0x52,0xf0,0xe0,0x54,0xc0,0x70,0x09,0x53,0x6b,0xfe,0x53, +0x6b,0xfd,0x12,0x4d,0xca,0x90,0x9e,0x52,0xe0,0x30,0xe6,0x13,0x43,0x6b,0x01,0x90, +0x9e,0x9e,0xe0,0x64,0x02,0x60,0x04,0x91,0x90,0x80,0x07,0xd1,0x76,0x80,0x03,0x53, +0x6b,0xfe,0x90,0x9e,0x52,0xe0,0x30,0xe7,0x2a,0x43,0x6b,0x02,0xe4,0xf5,0x48,0x90, +0x9e,0x95,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39,0xa9,0x90, +0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0x9f,0x74,0x01,0xf0,0x90,0x9e,0x89,0xe0,0x44, +0x04,0xf0,0x22,0x53,0x6b,0xfd,0x22,0x90,0x06,0xa9,0xe0,0x90,0x9e,0x52,0xf0,0xe0, +0x54,0xc0,0x70,0x09,0x53,0x6b,0xfe,0x53,0x6b,0xfd,0x02,0x4d,0xca,0x90,0x9e,0x52, +0xe0,0x30,0xe6,0x1d,0x90,0x9e,0x8d,0xe0,0x70,0x07,0x43,0x6b,0x01,0x91,0x90,0x80, +0x13,0x90,0x9e,0x9e,0xe0,0xb4,0x01,0x0c,0x43,0x6b,0x04,0x7f,0x01,0xb1,0xff,0x80, +0x03,0x53,0x6b,0xfe,0x90,0x9e,0x52,0xe0,0x30,0xe7,0x23,0x43,0x6b,0x02,0xe4,0xf5, +0x48,0x90,0x9e,0x95,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x39, +0xa9,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x9e,0x9f,0x74,0x01,0xf0,0x22,0x53,0x6b, +0xfd,0x22,0xe5,0x67,0x64,0x01,0x70,0x66,0xe5,0x6a,0x60,0x62,0xe5,0x6a,0x64,0x02, +0x60,0x06,0xe5,0x6a,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x9e,0x8e,0xf0, +0x90,0x06,0xaa,0xe0,0x90,0x9e,0x9d,0xf0,0x90,0x9e,0x8e,0xe0,0x70,0x07,0x90,0x9e, +0x9d,0xe0,0xff,0x80,0x05,0x90,0x9e,0x8e,0xe0,0xff,0x90,0x9e,0x8e,0xef,0xf0,0x90, +0x9e,0x90,0xe0,0x60,0x03,0xe0,0x14,0xf0,0xe4,0x90,0x9e,0x8f,0xf0,0x90,0x01,0x57, +0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x53,0x6b,0xfd,0x53,0x6b,0xef,0xe5,0x6a,0x14, +0x24,0xfd,0x50,0x06,0x24,0xfd,0x50,0x04,0x80,0x04,0x81,0xbf,0xb1,0x27,0x22,0x8f, +0x6d,0x12,0x47,0xf3,0xef,0x64,0x01,0x70,0x2e,0x90,0x9e,0xb7,0x12,0x48,0x24,0xe5, +0x6d,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10, +0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef, +0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xe5,0x6a,0x60,0x39,0x90,0x9e,0x9f,0xe0, +0x60,0x0d,0xe4,0xf0,0x53,0x6b,0xfd,0xe5,0x6b,0x54,0x07,0x70,0x28,0x80,0x23,0x90, +0x9e,0x8f,0xe0,0x04,0xf0,0x53,0x6b,0xef,0x90,0x9e,0x94,0xe0,0xff,0x90,0x9e,0x8f, +0xe0,0xd3,0x9f,0x40,0x0d,0xe5,0x67,0xb4,0x01,0x0b,0xa3,0xe0,0x70,0x07,0xe0,0x04, +0xf0,0x22,0x12,0x4d,0xca,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08, +0xf0,0xe4,0xf5,0x48,0x90,0x9e,0x93,0xe0,0xf5,0x49,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e, +0x01,0x12,0x39,0xa9,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0, +0x90,0x9e,0x9b,0x14,0xf0,0xe5,0x68,0x54,0x0f,0xc3,0x94,0x0c,0x50,0x0d,0x12,0x49, +0x1d,0x90,0x9e,0xda,0xe0,0x30,0xe0,0x03,0x12,0x4e,0x27,0x22,0x90,0x01,0x57,0xe0, +0x60,0x3c,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x9e,0x9f, +0xe0,0x60,0x07,0xe4,0xf0,0x53,0x6b,0xfd,0x80,0x24,0x90,0x9e,0x8f,0xe0,0x04,0xf0, +0x53,0x6b,0xef,0x90,0x9e,0x94,0xe0,0xff,0x90,0x9e,0x8f,0xe0,0xd3,0x9f,0x40,0x0e, +0xe5,0x67,0xb4,0x01,0x09,0x90,0x9e,0x90,0xe0,0x70,0x03,0xe0,0x04,0xf0,0x90,0x01, +0x5b,0xe0,0x60,0x10,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0xe4, +0x90,0x9e,0x9c,0xf0,0x90,0x01,0x5f,0xe0,0x60,0x10,0x90,0x01,0x5f,0xe4,0xf0,0x90, +0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x9e,0x9b,0xf0,0x22,0xc0,0xe0,0xc0,0xf0,0xc0, +0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03, +0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x53,0x91,0xbf,0x90,0xfd,0x68,0xe0,0x20, +0xe0,0x03,0x02,0x68,0xe1,0x90,0x01,0xba,0xe0,0x04,0xf0,0x90,0xfd,0x62,0xe0,0x90, +0x01,0xbc,0xf0,0x90,0xfd,0x63,0xe0,0x90,0x01,0xbd,0xf0,0x90,0xfd,0x60,0xe0,0x90, +0x01,0xbe,0xf0,0x90,0xfd,0x60,0xe0,0x64,0x0e,0x60,0x03,0x02,0x68,0x22,0x90,0x9e, +0x43,0xe0,0xff,0x13,0x13,0x13,0x54,0x1f,0x20,0xe0,0x03,0x02,0x68,0x22,0x90,0xfd, +0x62,0xe0,0x54,0xc0,0xfe,0x90,0x07,0x90,0xe0,0x54,0x3f,0x4e,0xf0,0x90,0xfd,0x63, +0xe0,0x90,0x07,0x91,0xf0,0x90,0xfd,0x64,0xe0,0x90,0x07,0x92,0xf0,0x90,0xfd,0x65, +0xe0,0x90,0x07,0x93,0xf0,0x90,0x07,0x95,0x74,0x01,0xf0,0xef,0x20,0xe0,0x44,0x90, +0x9e,0x43,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x19,0x90,0x07,0x78,0x12,0x68,0xfc, +0x90,0x9e,0x43,0xe0,0xff,0xc3,0x13,0x30,0xe0,0x48,0x90,0x07,0x83,0xe0,0x44,0x40, +0xf0,0x80,0x3f,0x90,0x9e,0x43,0xe0,0xff,0xc3,0x13,0x30,0xe0,0x11,0xe4,0xff,0x12, +0x4d,0xe4,0x90,0x07,0x95,0xe0,0x44,0x01,0xf0,0xa3,0xe0,0x44,0x01,0xf0,0x90,0x07, +0x78,0x80,0x13,0x90,0x9e,0x43,0xe0,0xff,0x13,0x13,0x54,0x3f,0x90,0x07,0x78,0x30, +0xe0,0x04,0x11,0xfc,0x80,0x0c,0xe0,0x44,0x10,0xf0,0xe0,0x44,0x20,0xf0,0xe0,0x54, +0xdf,0xf0,0x90,0xfd,0x60,0xe0,0xb4,0x0f,0x0a,0x90,0xfd,0x62,0xe0,0xff,0xa3,0xe0, +0xfd,0x51,0x62,0x90,0xfd,0x60,0xe0,0x64,0x15,0x70,0x64,0x90,0xfd,0x62,0xe0,0x90, +0x9e,0x5e,0xf0,0x90,0xfd,0x62,0xe0,0x30,0xe0,0x15,0x90,0x9e,0x5e,0xe0,0xf4,0x54, +0x3f,0x04,0xff,0x90,0x9e,0x4e,0xe0,0x13,0x13,0x54,0x3f,0xc3,0x9f,0x80,0x10,0x90, +0x9e,0x4e,0xe0,0x13,0x13,0x54,0x3f,0xff,0x90,0x9e,0x5e,0xe0,0x54,0x3f,0x2f,0x90, +0x9e,0x5d,0xf0,0x90,0x9e,0x5d,0xe0,0xff,0x54,0x30,0xc4,0x54,0x0f,0xfe,0xef,0x25, +0xe0,0x25,0xe0,0x4e,0x90,0x9e,0x5f,0xf0,0x90,0x00,0x2e,0xf0,0x90,0x9e,0x5d,0xe0, +0xc4,0x54,0xf0,0xff,0x90,0x9e,0x4f,0xe0,0x54,0x0f,0x4f,0x90,0x00,0x2d,0xf0,0x90, +0xfd,0x60,0xe0,0xb4,0x16,0x08,0x90,0xfd,0x62,0xe0,0xff,0x12,0x5f,0xb5,0x90,0xfd, +0x60,0xe0,0xb4,0x21,0x07,0x90,0xfd,0x62,0xe0,0xff,0x31,0xe9,0x90,0xfd,0x60,0xe0, +0xb4,0x22,0x02,0x51,0x11,0x90,0xfd,0x60,0xe0,0xb4,0x23,0x05,0xa3,0xe0,0xff,0x51, +0x8d,0x90,0xfd,0x60,0xe0,0xb4,0x24,0x02,0x51,0x39,0x90,0xfd,0x68,0xe0,0x44,0x01, +0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0, +0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xe0,0x54,0xef,0xf0, +0x90,0xfd,0x63,0xe0,0x54,0x3f,0x25,0xe0,0x25,0xe0,0xff,0x90,0xfd,0x62,0xe0,0x54, +0x03,0x4f,0x90,0x9e,0x5b,0xf0,0x90,0xfd,0x64,0xe0,0x54,0x3f,0x25,0xe0,0x25,0xe0, +0xff,0x90,0xfd,0x63,0xe0,0x54,0x03,0x4f,0x90,0x9e,0x5c,0xf0,0x90,0x9e,0x5b,0xe0, +0xfd,0xa3,0xe0,0xfb,0xe4,0xff,0x90,0x9e,0x60,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0xeb, +0xf0,0x12,0x47,0xf3,0xef,0x64,0x01,0x60,0x02,0x21,0xe8,0x90,0x9e,0xb8,0x12,0x48, +0x24,0x90,0x9e,0x60,0xe0,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x54,0xef,0xf0,0xad,0x07,0x74,0x06,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x44,0x10,0xf0,0x74,0x11,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0, +0x54,0xef,0xf0,0xad,0x07,0x74,0x16,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0, +0x44,0x02,0xf0,0x74,0x16,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0x03, +0xf0,0x90,0x9e,0x61,0xe0,0xfd,0xac,0x07,0x74,0x22,0x2c,0xf5,0x82,0xe4,0x34,0xfc, +0xf5,0x83,0xed,0xf0,0x90,0x9e,0x62,0xe0,0xfd,0x74,0x23,0x2c,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xed,0xf0,0x74,0x24,0x2c,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0, +0x04,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0xad,0x07,0x90,0x9e,0x60,0xe0,0x54, +0xf0,0x44,0x09,0xf0,0x54,0x0f,0x44,0x10,0xf0,0x90,0x9e,0x62,0xef,0xf0,0x7b,0x01, +0x7a,0x9e,0x79,0x62,0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x60,0x02,0x5d, +0x37,0x90,0x00,0x75,0xe0,0x44,0x01,0xf0,0x7f,0x01,0x7e,0x00,0x12,0x3a,0xaa,0x90, +0xfe,0x13,0x74,0x03,0xf0,0x7f,0x02,0x7e,0x00,0x12,0x3a,0xaa,0x90,0xfe,0x13,0xe4, +0xf0,0x90,0x00,0x75,0xe0,0x54,0xfe,0xf0,0x22,0x90,0x9e,0x60,0xe0,0x54,0xf0,0x44, +0x0d,0xf0,0x54,0x0f,0x44,0x10,0xf0,0x90,0xfd,0x62,0xe0,0x90,0x9e,0x62,0xf0,0x7b, +0x01,0x7a,0x9e,0x79,0x62,0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x60,0x02, +0x5d,0x37,0xae,0x07,0x90,0x9e,0x60,0xe0,0x54,0xf0,0x44,0x04,0xf0,0x54,0x0f,0x44, +0x20,0xf0,0x90,0x9e,0x62,0xee,0xf0,0xa3,0xed,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x62, +0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7a,0x9e,0x79,0x60,0x02,0x5d,0x37,0xad,0x07,0x90, +0x9e,0x60,0xe0,0x54,0xf0,0x44,0x0c,0xf0,0x54,0x0f,0xf0,0xed,0xb4,0x02,0x08,0xe0, +0x54,0x0f,0x44,0x20,0xf0,0x80,0x0d,0xed,0xb4,0x04,0x09,0x90,0x9e,0x60,0xe0,0x54, +0x0f,0x44,0x40,0xf0,0x90,0xfd,0x62,0xe0,0x90,0x9e,0x62,0xf0,0x90,0xfd,0x63,0xe0, +0x90,0x9e,0x63,0xf0,0x90,0xfd,0x64,0xe0,0x90,0x9e,0x64,0xf0,0x90,0xfd,0x65,0xe0, +0x90,0x9e,0x65,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0x62,0x90,0x9e,0xfe,0x12,0x43,0x7e, +0x7a,0x9e,0x79,0x60,0x02,0x5d,0x37,0x8f,0x1f,0x8c,0x20,0x8d,0x21,0x22,0x8f,0x22, +0x8c,0x23,0x8d,0x24,0x22,0xe4,0x90,0x9e,0x6b,0xf0,0xa3,0xf0,0x90,0x02,0x86,0xe0, +0x20,0xe1,0x2c,0xc3,0x90,0x9e,0x6c,0xe0,0x94,0xd0,0x90,0x9e,0x6b,0xe0,0x94,0x07, +0x40,0x0a,0x90,0x01,0xc6,0xe0,0x44,0x20,0xf0,0x7f,0x00,0x22,0x90,0x9e,0x6b,0xe4, +0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x0a,0x7e,0x00,0x12,0x3b,0x3b,0x80,0xcd,0x7f, +0x01,0x22,0x90,0x01,0xcc,0xe0,0x54,0x0f,0x90,0x9e,0x6b,0xf0,0x90,0x9e,0x6b,0xe0, +0xfd,0x70,0x02,0x81,0x73,0x90,0x9f,0x19,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81, +0x6c,0x90,0x9f,0x19,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x52,0xe0,0x90, +0x9e,0x6c,0xf0,0x75,0x63,0x01,0x75,0x64,0x9e,0x75,0x65,0x6c,0x75,0x66,0x01,0x7b, +0x01,0x7a,0x9e,0x79,0x6d,0x12,0x47,0x40,0x90,0x9e,0x6d,0xe0,0xff,0xc4,0x13,0x13, +0x13,0x54,0x01,0x90,0x9f,0x19,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88, +0x12,0x43,0x52,0xe0,0x90,0x9e,0x6e,0xf0,0x90,0x9f,0x19,0xe0,0x75,0xf0,0x02,0x90, +0x00,0x89,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6f,0xf0,0x90,0x9f,0x19,0xe0,0x75,0xf0, +0x04,0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x9e,0x70,0xf0,0x90,0x9f,0x19,0xe0, +0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90,0x9e,0x71,0xf0,0x90,0x9f, +0x19,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52,0xe0,0x90,0x9e,0x72,0xf0, +0x80,0x33,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x9e,0x6e, +0xf0,0x90,0x9f,0x19,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90, +0x9e,0x6f,0xf0,0x90,0x9f,0x19,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52, +0xe0,0x90,0x9e,0x70,0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x9e,0x79,0x6e,0x91, +0x74,0x90,0x9e,0x6b,0xe0,0xff,0x90,0x9f,0x19,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x90,0x9e,0x6b,0xf0,0x90,0x9f,0x19,0xe0, +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0, +0x90,0x9f,0x19,0xe0,0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0x3c,0x90,0x01,0xc6,0xe0, +0x44,0x02,0xf0,0x22,0x90,0x9e,0x73,0x12,0x43,0x7e,0xef,0x12,0x43,0x87,0x6d,0x0c, +0x01,0x6d,0x15,0x02,0x6d,0x42,0x03,0x6d,0x4b,0x05,0x6d,0x54,0x06,0x6e,0xad,0x07, +0x6d,0x5c,0x08,0x6d,0x65,0x10,0x6d,0x6e,0x11,0x6d,0x77,0x12,0x6d,0x80,0x13,0x6d, +0x89,0x14,0x6d,0x92,0x15,0x6d,0x9b,0x16,0x6d,0xa5,0x17,0x6d,0xaf,0x18,0x6d,0xb9, +0x19,0x6e,0x82,0x1a,0x6e,0x8b,0x1b,0x6e,0x94,0x1c,0x6d,0xc2,0x1d,0x6d,0xcc,0x1e, +0x6d,0xd7,0x21,0x6d,0xe0,0x22,0x6d,0xe9,0x23,0x6d,0xf2,0x24,0x6d,0xfb,0x25,0x6e, +0x04,0x26,0x6e,0x0d,0x27,0x6e,0x16,0x28,0x6e,0x1f,0x29,0x6d,0x1e,0x2d,0x6d,0x27, +0x2e,0x6e,0x28,0x2f,0x6e,0x9d,0x30,0x6e,0x3a,0x32,0x6e,0x31,0x33,0x6d,0x39,0x34, +0x6e,0x43,0x36,0x6e,0x4c,0x37,0x6e,0x55,0x38,0x6e,0x5e,0x3a,0x6d,0x30,0x3b,0x6e, +0x79,0x3c,0x6e,0x67,0x3e,0x6e,0x70,0x3f,0x00,0x00,0x6e,0xa6,0x90,0x9e,0x73,0x12, +0x43,0x5e,0x02,0x84,0x62,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x84,0x8c,0x90,0x9e, +0x73,0x12,0x43,0x5e,0x02,0x84,0x92,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x84,0xda, +0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x85,0x08,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02, +0x85,0x15,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x85,0x30,0x90,0x9e,0x73,0x12,0x43, +0x5e,0x02,0x84,0x06,0x90,0x9e,0x73,0x12,0x43,0x5e,0xc1,0xae,0x90,0x9e,0x73,0x12, +0x43,0x5e,0x02,0x51,0x68,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x85,0x78,0x90,0x9e, +0x73,0x12,0x43,0x5e,0x02,0x85,0xbf,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x85,0xe6, +0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x86,0x05,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02, +0x86,0x1f,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x86,0xf7,0x90,0x9e,0x73,0x12,0x43, +0x5e,0x7f,0x01,0x80,0x2f,0x90,0x9e,0x73,0x12,0x43,0x5e,0x7f,0x02,0x80,0x25,0x90, +0x9e,0x73,0x12,0x43,0x5e,0x7f,0x03,0x80,0x1b,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02, +0x88,0x7c,0x90,0x9e,0x73,0x12,0x43,0x5e,0xe4,0xff,0x80,0x08,0x90,0x9e,0x73,0x12, +0x43,0x5e,0x7f,0x04,0x02,0x87,0x9a,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x88,0xee, +0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x89,0x15,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02, +0x89,0x3c,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x89,0x63,0x90,0x9e,0x73,0x12,0x43, +0x5e,0x02,0x89,0x8a,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x89,0xb1,0x90,0x9e,0x73, +0x12,0x43,0x5e,0x02,0x89,0xd8,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8a,0x0f,0x90, +0x9e,0x73,0x12,0x43,0x5e,0x02,0x8a,0x36,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8a, +0x5e,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8a,0xa1,0x90,0x9e,0x73,0x12,0x43,0x5e, +0x02,0x8a,0xca,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8a,0xf3,0x90,0x9e,0x73,0x12, +0x43,0x5e,0x02,0x8c,0x86,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8c,0x98,0x90,0x9e, +0x73,0x12,0x43,0x5e,0x02,0x8c,0xcd,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8e,0x8a, +0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x8e,0xb3,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02, +0x94,0x4b,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x92,0xc6,0x90,0x9e,0x73,0x12,0x43, +0x5e,0x02,0x84,0x4e,0x90,0x9e,0x73,0x12,0x43,0x5e,0x02,0x84,0x35,0x90,0x9e,0x73, +0x12,0x43,0x5e,0x02,0x94,0xf3,0x90,0x01,0xc6,0xe0,0x44,0x01,0xf0,0x22,0x90,0x00, +0x04,0x12,0x1f,0x1d,0xff,0x54,0x1f,0xfe,0xef,0x54,0x20,0xc4,0x13,0x54,0x07,0xfd, +0xaf,0x06,0x90,0x9e,0x76,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0x12,0x43,0x7e,0x90,0x9e, +0x78,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x1f,0x1d,0x54,0xf0,0xc4,0x54,0x0f,0x90, +0x9e,0x7b,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x54,0x40,0xc4,0x13,0x13,0x54,0x03, +0x90,0x9e,0x7c,0xf0,0x90,0x9e,0x76,0xe0,0xff,0x75,0xf0,0x09,0x90,0x96,0x46,0x12, +0x43,0x52,0xad,0x82,0xac,0x83,0x90,0x9e,0x7d,0xec,0xf0,0xa3,0xed,0xf0,0xef,0x75, +0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,0x35,0xf0,0xfa,0x7b,0x01,0xa3,0x12,0x43, +0x7e,0x90,0x9e,0x78,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x1f,0x1d,0x54,0x0f,0xff, +0x90,0x9e,0x7f,0x12,0x43,0x5e,0xef,0x12,0x42,0x20,0x90,0x9e,0x78,0x12,0x43,0x5e, +0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x90,0x9e,0x7f,0x12,0x43,0x5e,0x90,0x00,0x01, +0xef,0x12,0x42,0x32,0x90,0x9e,0x78,0x12,0x43,0x5e,0x90,0x00,0x01,0x12,0x1f,0x1d, +0xff,0x90,0x9e,0x7d,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5,0x82,0x8c,0x83,0xef,0xf0,0x12, +0x1f,0x04,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x9e,0x7b,0xe0,0xfe,0x90,0x9e,0x76, +0xe0,0xff,0x24,0x82,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0x90,0x9e,0x77, +0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x96,0x4a,0x12,0x43,0x52,0xee,0xf0,0x75,0xf0, +0x09,0xef,0x90,0x96,0x4b,0x12,0x43,0x52,0x74,0x01,0xf0,0x90,0x9e,0x7c,0xe0,0xfe, +0x75,0xf0,0x09,0xef,0x90,0x96,0x4c,0x12,0x43,0x52,0xee,0xf0,0x8f,0x13,0xef,0x25, +0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xaf,0x82,0xf5,0x15,0x8f,0x16,0xe5,0x13, +0x75,0xf0,0x02,0xa4,0x24,0x02,0xf9,0x74,0x95,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18, +0x89,0x19,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x46,0x12,0x43,0x52,0xaf,0x82,0x85, +0x83,0x1a,0x8f,0x1b,0xe5,0x13,0x75,0xf0,0x09,0xa4,0x24,0x44,0xf9,0x74,0x96,0x35, +0xf0,0x75,0x1c,0x01,0xf5,0x1d,0x89,0x1e,0x74,0x82,0x25,0x13,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe0,0x12,0x43,0x87,0x70,0x3c,0x00,0x70,0x51,0x01,0x70,0x66,0x02, +0x70,0x7b,0x03,0x70,0xa4,0x04,0x70,0xb9,0x05,0x70,0xce,0x06,0x70,0xf4,0x0c,0x71, +0x21,0x0d,0x71,0x4e,0x0e,0x71,0x7b,0x0f,0x00,0x00,0x71,0xaf,0xe5,0x13,0x25,0xe0, +0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x15,0x80, +0x3c,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0, +0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34, +0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80,0x12,0xe5,0x13,0x25,0xe0,0x24, +0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,0xe5,0x13, +0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74, +0x8f,0xf0,0x21,0xaf,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5, +0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5, +0x82,0xe4,0x34,0x9b,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,0xe5,0x13, +0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d, +0xf0,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0, +0xa3,0xf0,0x21,0xaf,0x90,0x04,0x47,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x12,0x42, +0x20,0x90,0x04,0x46,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x01,0x12,0x42, +0x32,0x90,0x04,0x45,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xf0,0x90,0x04,0x44,0x21, +0xa6,0x90,0x04,0x4b,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x12,0x42,0x20,0x90,0x04, +0x4a,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x04, +0x49,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04, +0x4f,0xe0,0xab,0x17,0xaa,0x18,0xa9,0x19,0x12,0x42,0x20,0x90,0x04,0x4e,0xe0,0xab, +0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x04,0x4d,0xe0,0x85, +0x16,0x82,0x85,0x15,0x83,0xf0,0x90,0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab, +0x17,0xaa,0x18,0xa9,0x19,0x12,0x42,0x20,0x90,0x04,0x52,0xe0,0xab,0x17,0xaa,0x18, +0xa9,0x19,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x04,0x51,0xe0,0x85,0x16,0x82,0x85, +0x15,0x83,0xf0,0x90,0x04,0x50,0xe0,0x85,0x16,0x82,0x85,0x15,0x83,0xa3,0xf0,0xab, +0x17,0xaa,0x18,0xa9,0x19,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x1f,0x04,0xff,0xab, +0x1c,0xaa,0x1d,0xa9,0x1e,0x12,0x1f,0x04,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12, +0x42,0x20,0xab,0x17,0xe5,0x19,0x24,0x01,0xf9,0xe4,0x35,0x18,0xfa,0xc0,0x03,0xc0, +0x02,0xc0,0x01,0x12,0x1f,0x04,0xff,0xab,0x1c,0xaa,0x1d,0xa9,0x1e,0x90,0x00,0x01, +0x12,0x1f,0x1d,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x20,0x85,0x16,0x82, +0x85,0x15,0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1b,0x82,0x85,0x1a,0x83,0xe0, +0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0x85,0x16,0x82,0x85,0x15,0x83,0xa3,0xc0, +0x83,0xc0,0x82,0xe0,0xff,0x85,0x1b,0x82,0x85,0x1a,0x83,0xa3,0xe0,0xfe,0xef,0x5e, +0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0x75,0x14,0x0b,0x74,0x01,0x7e,0x00, +0xa8,0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x13,0x25, +0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f, +0x4e,0x60,0x06,0xe5,0x14,0x24,0x10,0x80,0x5d,0x15,0x14,0xe5,0x14,0xc3,0x94,0x00, +0x50,0xca,0x80,0x56,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5, +0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3d,0x75,0x14,0x0f,0x74,0x01,0x7e,0x00,0xa8, +0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x13,0x25,0xe0, +0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e, +0x60,0x08,0x90,0x9e,0x82,0xe5,0x14,0xf0,0x80,0x10,0x15,0x14,0xe5,0x14,0xc3,0x94, +0x00,0x50,0xc8,0x80,0x05,0xe4,0x90,0x9e,0x82,0xf0,0xe5,0x13,0x25,0xe0,0x24,0xc6, +0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5, +0x14,0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0xe5,0x13,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0, +0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x9e,0x83,0xe5,0x14,0xf0,0x80,0x5b, +0x05,0x14,0xe5,0x14,0xb4,0x10,0xca,0x80,0x52,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x14, +0x74,0x01,0x7e,0x00,0xa8,0x14,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, +0xff,0xe5,0x13,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e, +0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x14,0x24,0x10,0x80,0x0a,0x05,0x14,0xe5, +0x14,0xb4,0x0c,0xcc,0x80,0x05,0xe4,0x90,0x9e,0x83,0xf0,0x90,0x9e,0x82,0xe0,0xff, +0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x48,0x12,0x43,0x52,0xef,0xf0,0x90,0x9e,0x83, +0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x49,0x12,0x43,0x52,0xee,0xf0,0x74, +0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90, +0x9e,0x82,0x71,0xfe,0x74,0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0, +0xff,0x90,0x9e,0x83,0xe0,0xfe,0xef,0xc3,0x9e,0x50,0x02,0x71,0xfe,0x90,0x9e,0x82, +0xe0,0xff,0xd3,0x94,0x13,0x40,0x07,0x90,0x96,0x43,0x74,0x03,0xf0,0x22,0xef,0xd3, +0x94,0x0b,0x40,0x07,0x90,0x96,0x43,0x74,0x02,0xf0,0x22,0xef,0xd3,0x94,0x03,0x40, +0x07,0x90,0x96,0x43,0x74,0x01,0xf0,0x22,0xe4,0x90,0x96,0x43,0xf0,0x22,0xe0,0xfd, +0x74,0x26,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xed,0xf0,0xaf,0x13,0xd3, +0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xef,0xc3,0x94,0x20,0x50,0x0e,0x74,0x84,0x2f,0xf5, +0x82,0xe4,0x34,0x04,0xf5,0x83,0xed,0xf0,0x80,0x29,0x74,0xa6,0x2f,0xf5,0x82,0xe4, +0x34,0x9c,0xf5,0x83,0xed,0xf0,0x90,0x9e,0xcd,0xef,0xf0,0x24,0xa6,0xf5,0x82,0xe4, +0x34,0x9c,0xf5,0x83,0xe0,0x90,0x9e,0xce,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0xcd,0x7d, +0x02,0xb1,0x27,0xd0,0xd0,0x92,0xaf,0x22,0x8f,0x0a,0x8d,0x0b,0xe5,0x0b,0x54,0x1f, +0xf5,0x10,0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x0e,0x90, +0x04,0xfd,0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3, +0x95,0x11,0x40,0x04,0xaf,0x0a,0x80,0x33,0xe5,0x0e,0x25,0x0d,0xf5,0x0f,0xe5,0x10, +0x90,0x41,0xdc,0x93,0xff,0xe5,0x0f,0xd3,0x9f,0x74,0x01,0x40,0x11,0x25,0x0a,0xf5, +0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xad,0x0b,0xaf,0x0a,0x81,0x0f,0x25,0x0a, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x0f,0xf0,0x22,0xad,0x07,0x75,0xf0,0x09, +0xed,0x90,0x96,0x48,0x12,0x43,0x52,0xe0,0xff,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34, +0x9d,0xf5,0x83,0xe0,0x54,0x1f,0xf5,0x12,0xd3,0x9f,0x40,0x02,0x8f,0x12,0xe5,0x12, +0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01, +0x93,0xff,0xe5,0x12,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, +0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0, +0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x05, +0xad,0x12,0x91,0x0f,0xaf,0x12,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9f, +0x01,0x12,0x43,0x7e,0x90,0x9f,0x04,0xe0,0x54,0xf0,0x44,0x06,0xff,0xf0,0xed,0x54, +0x0f,0xc4,0x54,0xf0,0xfe,0xef,0x54,0x0f,0x4e,0xf0,0x90,0x9f,0x01,0x12,0x43,0x5e, +0x90,0x9e,0xfe,0x12,0x43,0x7e,0x7b,0x01,0x7a,0x9f,0x79,0x04,0x12,0x5d,0x37,0xd0, +0xd0,0x92,0xaf,0x22,0xac,0x07,0xec,0xc3,0x94,0x20,0x50,0x0d,0x74,0x84,0x2c,0xf5, +0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x80,0x0b,0x74,0xa6,0x2c,0xf5,0x82,0xe4,0x34, +0x9c,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1e,0xe5,0x1e,0x54,0x1f,0xff,0x90,0x9e,0x77, +0xf0,0x75,0xf0,0x09,0xec,0x90,0x96,0x49,0x12,0x43,0x52,0xe0,0x90,0x9e,0x79,0xf0, +0x75,0xf0,0x09,0xec,0x90,0x96,0x48,0x12,0x43,0x52,0xe0,0xfe,0x90,0x9e,0x7a,0xf0, +0xec,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0,0xfb,0xa3,0xe0, +0x90,0x9e,0x7b,0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25,0xe0,0x24,0x02,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x7d,0xcb,0xf0,0xa3,0xeb,0xf0, +0xef,0xd3,0x9e,0x40,0x0a,0x90,0x9e,0x7a,0xe0,0x90,0x9e,0x77,0xf0,0xf5,0x1e,0xed, +0x70,0x02,0xc1,0xba,0x90,0x9e,0x78,0xed,0xf0,0xe5,0x1e,0x30,0xe6,0x0a,0x90,0x9e, +0x77,0xe0,0xf5,0x1e,0xa3,0xe0,0x14,0xf0,0x90,0x9e,0x78,0xe0,0x70,0x02,0xc1,0xba, +0x90,0x9e,0x77,0xe0,0xff,0xd3,0x94,0x00,0x50,0x02,0xc1,0xba,0xe4,0x90,0x9e,0x76, +0xf0,0xef,0x14,0x90,0x9e,0x75,0xf0,0x90,0x9e,0x79,0xe0,0xfd,0x90,0x9e,0x75,0xe0, +0xff,0xd3,0x9d,0x40,0x6b,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x9e,0x7d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x9e,0x75,0xe0,0xff, +0xc3,0x94,0x10,0x50,0x33,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x7b,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e, +0x60,0x16,0x90,0x9e,0x75,0xe0,0xf5,0x1e,0xa3,0xe0,0x04,0xf0,0x90,0x9e,0x78,0xe0, +0xff,0x90,0x9e,0x76,0xe0,0x6f,0x60,0x08,0x90,0x9e,0x75,0xe0,0x14,0xf0,0x80,0x87, +0x90,0x9e,0x78,0xe0,0xff,0x90,0x9e,0x76,0xe0,0xc3,0x9f,0x50,0x0d,0x90,0x9e,0x75, +0xe0,0xb5,0x05,0x06,0x90,0x9e,0x79,0xe0,0xf5,0x1e,0xe5,0x1e,0x25,0xe0,0x24,0xa4, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xe5,0x1e, +0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff, +0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0,0x24,0xc2,0xf5,0x82, +0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04,0xad,0x1e,0x91,0x0f, +0xaf,0x1e,0x22,0xe4,0xf5,0x67,0xf5,0x6b,0xf5,0x6a,0x75,0x69,0x0c,0x75,0x68,0x0c, +0x90,0x9e,0x9e,0xf0,0x90,0x9e,0x9c,0xf0,0x90,0x9e,0x9b,0xf0,0x90,0x9e,0x9d,0x04, +0xf0,0x90,0x9e,0x8e,0xf0,0xe4,0x90,0x9e,0x9f,0xf0,0x90,0x9e,0x90,0xf0,0x90,0x9e, +0x99,0x74,0x07,0xf0,0xe4,0x90,0x9e,0x8f,0xf0,0x90,0x9e,0x97,0xf0,0xa3,0x74,0x0b, +0xf0,0x90,0x9e,0x94,0x74,0x01,0xf0,0xa3,0x74,0x03,0xf0,0x90,0x9e,0x93,0x74,0x14, +0xf0,0x90,0x9e,0x9a,0x74,0x05,0xf0,0xe4,0x90,0x9e,0x92,0xf0,0x90,0x9e,0x8d,0xf0, +0x90,0x9e,0xbb,0xf0,0x90,0x9e,0x96,0xf0,0x90,0x9e,0xa0,0xf0,0x22,0xe4,0x90,0x9e, +0x9f,0xf0,0x90,0x9e,0x8f,0xf0,0xf5,0x6b,0x22,0xef,0xb4,0x01,0x07,0x7d,0xc8,0x7f, +0x02,0x02,0x3a,0x71,0x7d,0x60,0x7f,0x02,0x12,0x3a,0x54,0x90,0x01,0x3d,0x74,0x04, +0xf0,0xa3,0x74,0xc8,0xf0,0x7d,0x04,0x7f,0x01,0x12,0x3a,0xdf,0x7d,0xc8,0x7f,0x02, +0x02,0x3a,0xdf,0x12,0x5c,0xb8,0xef,0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01, +0xf0,0x80,0x30,0x90,0x9e,0x9c,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80, +0x22,0x90,0x9e,0x9b,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x14,0xe5, +0x69,0x54,0x0f,0xd3,0x94,0x04,0x40,0x08,0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x03, +0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x08,0xf0,0x7f,0x00,0x22,0x12,0x5c,0xb8,0xef, +0x64,0x01,0x60,0x08,0x90,0x01,0xb9,0x74,0x01,0xf0,0x80,0x66,0xe5,0x6b,0x54,0x03, +0x60,0x08,0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x58,0xe5,0x69,0x54,0x0f,0xd3,0x94, +0x02,0x40,0x08,0x90,0x01,0xb9,0x74,0x04,0xf0,0x80,0x47,0xe5,0x6b,0x30,0xe2,0x08, +0x90,0x01,0xb9,0x74,0x08,0xf0,0x80,0x3a,0xe5,0x6b,0x30,0xe4,0x08,0x90,0x01,0xb9, +0x74,0x10,0xf0,0x80,0x2d,0x90,0x9e,0x90,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x20, +0xf0,0x80,0x1f,0x90,0x9e,0x8b,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x40,0xf0,0x80, +0x11,0x90,0x9e,0x96,0xe0,0x60,0x08,0x90,0x01,0xb9,0x74,0x80,0xf0,0x80,0x03,0x7f, +0x01,0x22,0x90,0x01,0xb8,0x74,0x04,0xf0,0x7f,0x00,0x22,0xe5,0x57,0x60,0x08,0x90, +0x01,0xb9,0x74,0x01,0xf0,0x80,0x61,0xe5,0x69,0x54,0x0f,0xd3,0x94,0x01,0x40,0x08, +0x90,0x01,0xb9,0x74,0x02,0xf0,0x80,0x50,0x90,0x02,0x87,0xe0,0x60,0x08,0x90,0x01, +0xb9,0x74,0x04,0xf0,0x80,0x42,0x90,0x9e,0xba,0xe0,0xb4,0x01,0x10,0x90,0x9e,0xa1, +0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x1c,0x80,0x2b,0x90,0x9e,0xba, +0xe0,0x70,0x14,0x90,0x9d,0xa9,0xe0,0xff,0x90,0x9d,0xa8,0xe0,0x6f,0x60,0x08,0x90, +0x01,0xb9,0x74,0x08,0xf0,0x80,0x11,0x90,0x9e,0x92,0xe0,0x70,0x08,0x90,0x01,0xb9, +0x74,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xb8,0x74,0x02,0xf0,0x7f,0x00, +0x22,0x8f,0x6c,0xe4,0x90,0x9f,0x0f,0xf0,0xa3,0xf0,0x90,0x01,0x09,0xe0,0x7f,0x00, +0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90,0x9f,0x10,0xe0,0x94, +0x88,0x90,0x9f,0x0f,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44,0x80,0xf0, +0x22,0x90,0x9f,0x0f,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x14,0x7e,0x00,0x12, +0x3b,0x3b,0xd3,0x90,0x9f,0x10,0xe0,0x94,0x32,0x90,0x9f,0x0f,0xe0,0x94,0x00,0x40, +0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x90,0x00,0x20,0xe0,0x44,0x01,0xfd, +0x7f,0x20,0x12,0x44,0xcc,0x7f,0xf4,0x7e,0x01,0x12,0x3b,0x3b,0x90,0x00,0x00,0xe0, +0x54,0xdf,0xfd,0xe4,0xff,0x12,0x44,0xcc,0x90,0x00,0x28,0xe0,0x44,0x03,0xfd,0x7f, +0x28,0x12,0x44,0xcc,0x90,0x00,0x08,0xe0,0x54,0xef,0xfd,0x7f,0x08,0x12,0x44,0xcc, +0xe4,0xff,0x11,0xe1,0x7f,0x64,0x7e,0x00,0x12,0x3b,0x3b,0x90,0x00,0x29,0xe0,0x44, +0xc0,0xfd,0x7f,0x29,0x02,0x44,0xcc,0x90,0x9e,0x97,0xe0,0xa3,0xe0,0x90,0x05,0x58, +0xf0,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef,0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0, +0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54, +0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, +0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d, +0xf0,0x22,0xad,0x07,0xed,0xc3,0x94,0x20,0x50,0x0d,0x74,0x84,0x2d,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xe0,0x80,0x0b,0x74,0xa6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5, +0x83,0xe0,0x54,0x7f,0xf5,0x1e,0xe5,0x1e,0x54,0x1f,0xfc,0x75,0xf0,0x09,0xed,0x90, +0x96,0x48,0x12,0x43,0x52,0xe0,0xff,0x90,0x9e,0x75,0xf0,0xed,0x25,0xe0,0x24,0x02, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x9e,0x76,0xcb,0xf0, +0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe0, +0xfb,0xa3,0xe0,0x90,0x9e,0x78,0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25,0xe0,0x24,0x6c, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01,0x93,0xfb,0xed,0x25, +0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xea,0xf0,0xa3,0xeb,0xf0,0xec, +0xc3,0x9f,0x40,0x02,0x41,0xf0,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83, +0xec,0xf0,0x04,0xfb,0x90,0x9e,0x75,0xe0,0xff,0xeb,0xd3,0x9f,0x40,0x02,0x61,0x21, +0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e,0x76,0xe0,0x5e, +0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50,0x40,0x74,0x01,0x7e, +0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x9e, +0x78,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x23,0xbb,0x11,0x09,0x90,0x9e,0x77, +0xe0,0x30,0xe7,0x02,0x7b,0x17,0xeb,0x64,0x13,0x60,0x03,0xbb,0x12,0x09,0x90,0x9e, +0x76,0xe0,0x30,0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1e,0x80,0x34,0x0b,0x80,0x84, +0x90,0x9e,0x75,0xe0,0xfb,0x6c,0x70,0x69,0x74,0x67,0x2d,0xf5,0x82,0xe4,0x34,0x9d, +0xf5,0x83,0xec,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4a,0x12,0x43,0x52,0xe0,0xb4, +0x01,0x0c,0xe5,0x1e,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1e,0x80,0x03,0xaf,0x1e, +0x22,0xec,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe, +0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25, +0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80, +0x5b,0xec,0xd3,0x9b,0x40,0x56,0x90,0x9e,0x75,0xe0,0xff,0x74,0x67,0x2d,0xf5,0x82, +0xe4,0x34,0x9d,0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1e,0xec,0x25,0xe0,0x24,0xa4, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25, +0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4, +0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1e,0x22,0x74,0x01,0x2d,0xf5, +0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1e,0x44,0x80,0xfd,0x12, +0x74,0x0f,0xe5,0x1e,0x44,0x80,0xff,0x22,0xe4,0xf5,0x13,0xe5,0x13,0xb4,0x20,0x14, +0x90,0x9a,0xc5,0xe0,0x04,0xf0,0x90,0x95,0x01,0xe0,0xff,0x90,0x9a,0xc5,0xe0,0xb5, +0x07,0x02,0xe4,0xf0,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x4b,0x12,0x43,0x52,0xe0, +0x64,0x01,0x60,0x03,0x02,0x82,0x27,0xe5,0x13,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4, +0x34,0x93,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3,0x94,0x00,0xee,0x94,0x00,0x50,0x03, +0x02,0x82,0x27,0xe5,0x13,0x94,0x20,0x40,0x09,0x90,0x9a,0xc5,0xe0,0x60,0x03,0x02, +0x82,0x33,0xe5,0x13,0x75,0xf0,0x0a,0xa4,0x24,0x00,0xf9,0x74,0x90,0x35,0xf0,0x75, +0x18,0x01,0xf5,0x19,0x89,0x1a,0xe5,0x13,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34, +0x93,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x9e,0x6f,0xcf,0xf0,0xa3,0xef,0xf0,0xe5, +0x13,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xff,0xa3,0xe0, +0x90,0x9e,0x71,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x13,0xc3,0x94,0x20,0x50,0x14,0x74, +0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x9e,0x6b, +0xf0,0x80,0x12,0x74,0xa6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x54, +0x3f,0x90,0x9e,0x6b,0xf0,0x90,0x9e,0x6b,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0, +0x09,0xe5,0x13,0x90,0x96,0x48,0x12,0x43,0x52,0xe0,0x90,0x9e,0x74,0xf0,0x74,0xe6, +0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0xc1, +0xfd,0x90,0x9e,0x74,0xe0,0xff,0x90,0x9e,0x6c,0xe0,0x9f,0x40,0x13,0x90,0x9e,0x74, +0xe0,0x90,0x9e,0x6c,0xf0,0xee,0x54,0x40,0xfe,0x90,0x9e,0x6b,0xf0,0xef,0x4e,0xf0, +0x90,0x04,0xfd,0xe0,0x54,0x05,0x64,0x01,0x70,0x29,0x90,0x9e,0x6c,0xe0,0xff,0x90, +0x41,0x50,0x93,0xfe,0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0, +0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xe0,0x80,0x30,0x90,0x9e,0x6c,0xe0,0x90,0x40, +0xfc,0x80,0x27,0x90,0x9e,0x6c,0xe0,0xff,0x90,0x41,0x50,0x93,0xfe,0x74,0x44,0x25, +0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x41, +0x18,0x80,0x07,0x90,0x9e,0x6c,0xe0,0x90,0x41,0x34,0x93,0x90,0x9e,0x73,0xf0,0x90, +0x9e,0x73,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x56,0xf9,0x74,0x40,0x35,0xf0,0x75,0x15, +0xff,0xf5,0x16,0x89,0x17,0x90,0x9e,0x6b,0xe0,0x90,0x41,0xf8,0x93,0xff,0xd3,0x90, +0x9e,0x72,0xe0,0x9f,0x90,0x9e,0x71,0xe0,0x94,0x00,0x40,0x0a,0xe4,0xfd,0xaf,0x13, +0x12,0x75,0x64,0x02,0x81,0xbe,0xe5,0x13,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe0,0xf5,0x1b,0xa3,0xe0,0xf5,0x1c,0xab,0x15,0xaa,0x16,0xa9,0x17, +0x12,0x1f,0x04,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x12,0x42,0x6a,0xfd, +0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab, +0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0x7e,0x00,0xab,0x18, +0xaa,0x19,0xa9,0x1a,0x90,0x00,0x02,0x12,0x42,0x95,0xfd,0xac,0xf0,0x12,0x1f,0x4a, +0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17, +0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90, +0x00,0x04,0x12,0x42,0x95,0xfd,0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c, +0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x03,0x12,0x1f, +0x1d,0xff,0x7e,0x00,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x06,0x12,0x42,0x95, +0xfd,0xac,0xf0,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b, +0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0x7e,0x00,0xab, +0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x08,0x12,0x42,0x95,0xfd,0xac,0xf0,0x12,0x1f, +0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xab,0x15,0xaa,0x16,0xa9, +0x17,0x90,0x00,0x05,0x12,0x1f,0x1d,0xff,0x7e,0x00,0x90,0x9e,0x6f,0xe0,0xfc,0xa3, +0xe0,0xfd,0x12,0x1f,0x4a,0xd3,0xe5,0x1c,0x9f,0xe5,0x1b,0x9e,0x40,0x0c,0xe5,0x1c, +0x9f,0xf5,0x1c,0xe5,0x1b,0x9e,0xf5,0x1b,0x80,0x05,0xe4,0xf5,0x1b,0xf5,0x1c,0xe5, +0x13,0x25,0xe0,0x24,0xc2,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe5,0x1b,0xf0,0xa3, +0xe5,0x1c,0xf0,0x90,0x9e,0x6b,0xe0,0x25,0xe0,0x24,0x6c,0xf5,0x82,0xe4,0x34,0x41, +0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,0x95,0x1b,0x50,0x07,0xaf,0x13, +0x31,0xd2,0x02,0x81,0x92,0x90,0x9e,0x6b,0xe0,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4, +0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1c,0xe4,0x93,0x95,0x1b,0x50,0x03, +0x02,0x81,0x92,0x7d,0x01,0xaf,0x13,0x12,0x75,0x64,0x02,0x81,0x92,0x74,0xe6,0x25, +0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x03,0x02,0x80, +0x9b,0x90,0x96,0x43,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x9e,0x6c,0xe0,0xc3,0x94,0x19, +0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x9e,0x6c,0xe0,0xc3,0x94,0x11,0x40, +0x2e,0x80,0x1f,0x90,0x96,0x43,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x9e,0x6c,0xe0,0xc3, +0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x9e,0x6c,0xe0,0xc3,0x94,0x03, +0x40,0x0d,0x90,0x9a,0x84,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x9a,0x84,0xf0,0x74, +0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1d,0x74,0x44,0x25, +0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x03,0x02, +0x80,0x48,0x90,0x9a,0x84,0xe0,0x64,0x01,0x60,0x03,0x02,0x80,0x48,0x74,0x85,0x25, +0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05, +0xff,0xe4,0x33,0xfe,0x74,0x41,0x25,0x13,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0, +0xfd,0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff, +0xe4,0x33,0xfe,0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xd3, +0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x26,0x25,0x13,0xf5,0x82, +0xe4,0x34,0x9d,0xf5,0x83,0xe0,0xff,0x90,0x9e,0x6c,0xe0,0x6f,0x60,0x3d,0x74,0x44, +0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05, +0x75,0x1d,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1d,0x03,0x80,0x03, +0x75,0x1d,0x01,0x74,0x41,0x25,0x13,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xef,0xf0, +0x74,0x85,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a,0x80,0x29,0x74,0xe6,0x25,0x13,0xf5, +0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x85,0x25,0x13,0xf5,0x82,0xe4,0x34, +0x9a,0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1d,0x74,0xe6,0x25,0x13,0xf5, +0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x90,0x9e,0x6c,0xe0,0xff,0x74,0x26,0x25, +0x13,0xf5,0x82,0xe4,0x34,0x9d,0xf5,0x83,0xef,0xf0,0x74,0x84,0x25,0x13,0xf5,0x82, +0xe4,0x34,0x98,0xf5,0x83,0xe5,0x1d,0xf0,0x75,0xf0,0x09,0xe5,0x13,0x90,0x96,0x4c, +0x12,0x43,0x52,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1d,0x74,0xe6,0x25,0x13,0xf5,0x82, +0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0xad,0x1d,0x21,0x8d,0xec,0x64,0x06,0x60,0x02, +0x21,0x92,0xf5,0x1b,0xf5,0x1c,0x90,0x42,0x19,0x93,0xff,0x7e,0x00,0x90,0x9e,0x6f, +0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1f,0x4a,0x90,0x9e,0x6d,0xee,0xf0,0xa3,0xef,0xf0, +0x74,0x84,0x25,0x13,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe0,0xf5,0x1d,0xe4,0xf5, +0x14,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x75,0xf0,0x02,0xe5,0x14,0xa4,0xf5,0x82,0x85, +0xf0,0x83,0x12,0x42,0x95,0xfd,0xac,0xf0,0xe5,0x14,0x90,0x42,0x14,0x93,0xff,0x7e, +0x00,0x12,0x1f,0x4a,0xef,0x25,0x1c,0xf5,0x1c,0xee,0x35,0x1b,0xf5,0x1b,0xc3,0x90, +0x9e,0x6e,0xe0,0x95,0x1c,0x90,0x9e,0x6d,0xe0,0x95,0x1b,0x40,0x07,0x05,0x14,0xe5, +0x14,0xb4,0x05,0xbd,0xe5,0x14,0xc3,0x13,0xf5,0x14,0xe5,0x1d,0xb4,0x01,0x06,0xe5, +0x14,0x70,0x46,0x80,0x13,0xe5,0x1d,0xb4,0x03,0x15,0xe5,0x14,0x70,0x05,0x75,0x1d, +0x03,0x80,0x39,0xe5,0x14,0xb4,0x01,0x05,0x75,0x1d,0x01,0x80,0x2f,0x80,0x2a,0xe5, +0x1d,0xb4,0x05,0x28,0xe5,0x14,0x70,0x05,0x75,0x1d,0x05,0x80,0x0d,0xe5,0x14,0xb4, +0x01,0x05,0x75,0x1d,0x03,0x80,0x03,0x75,0x1d,0x01,0xd3,0x90,0x9e,0x72,0xe0,0x94, +0x03,0x90,0x9e,0x71,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1d,0xd3,0x90,0x9e,0x72, +0xe0,0x94,0x03,0x90,0x9e,0x71,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1d,0x74,0x84, +0x25,0x13,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe5,0x1d,0xf0,0xfd,0xaf,0x13,0x12, +0x79,0x92,0x74,0xe6,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0xd3,0x94, +0x05,0x74,0xe6,0x50,0x0e,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe0,0x04, +0xf0,0x80,0x0b,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0xab,0x18, +0xaa,0x19,0xa9,0x1a,0xe4,0xf5,0xf0,0x12,0x42,0xcd,0xab,0x18,0xaa,0x19,0xa9,0x1a, +0x90,0x00,0x02,0xe4,0xf5,0xf0,0x12,0x42,0xec,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12, +0x42,0xec,0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x42,0xec,0x90,0x00,0x08,0xe4,0xf5, +0xf0,0x12,0x42,0xec,0xe5,0x13,0x25,0xe0,0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5, +0x83,0xe4,0xf0,0xa3,0xf0,0xe5,0x13,0x25,0xe0,0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98, +0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xe5,0x13,0x25,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34, +0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x13,0xe5,0x13,0xc3,0x94,0x40,0x50,0x03, +0x02,0x7b,0xdb,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74, +0x0f,0xf0,0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, +0xe4,0xf0,0x0d,0xbd,0x10,0xf0,0xe4,0x90,0x9a,0xc5,0xf0,0x90,0x95,0x01,0x04,0xf0, +0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0, +0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, +0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed, +0x90,0x90,0x06,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90, +0x08,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x74,0x26,0x2d,0xf5,0x82,0xe4,0x34,0x9d, +0xf5,0x83,0x74,0x13,0xf0,0x74,0x85,0x2d,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4, +0xf0,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xed,0x25,0xe0, +0x24,0x80,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0, +0x24,0xc4,0xf5,0x82,0xe4,0x34,0x98,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0, +0x24,0xc4,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0, +0x24,0x44,0xf5,0x82,0xe4,0x34,0x99,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0, +0x24,0xc6,0xf5,0x82,0xe4,0x34,0x9a,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25,0xe0, +0x24,0x46,0xf5,0x82,0xe4,0x34,0x9b,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x86,0x2d, +0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4,0xf0,0x74,0x46,0x2d,0xf5,0x82,0xe4,0x34, +0x9c,0xf5,0x83,0xe4,0xf0,0x74,0xe6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0xe4, +0xf0,0x90,0x41,0xca,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x92,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xc2, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x75,0xf0,0x09,0xed, +0x90,0x96,0x4b,0x12,0x43,0x52,0x74,0x01,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x4a, +0x12,0x43,0x52,0x74,0x01,0xf0,0x74,0x82,0x2d,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x46,0x12,0x43,0x52,0x74,0xff,0xf0, +0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x44,0x12,0x43,0x52,0xe4,0xf0,0xa3,0x74, +0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x96,0x48,0x12,0x43,0x52,0x74,0x13,0xf0,0x75, +0xf0,0x09,0xed,0x90,0x96,0x49,0x12,0x43,0x52,0xe4,0xf0,0xed,0xc3,0x94,0x20,0x50, +0x0f,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x80,0x0d, +0x74,0xa6,0x2d,0xf5,0x82,0xe4,0x34,0x9c,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64, +0x40,0x60,0x02,0x41,0x62,0x22,0x12,0x1f,0x04,0xf5,0x13,0xc3,0x94,0x40,0x50,0x15, +0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x74,0x44,0x25,0x13,0xf5,0x82,0xe4,0x34,0x9a, +0xf5,0x83,0xef,0xf0,0x22,0xe5,0x13,0xb4,0x40,0x0a,0x90,0x00,0x02,0x12,0x1f,0x1d, +0x90,0x96,0x42,0xf0,0x22,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0x54,0x3f,0xfe,0xef, +0x54,0x80,0xc4,0x13,0x13,0x13,0x54,0x01,0xfd,0xaf,0x06,0x02,0x6e,0xc2,0x12,0x1f, +0x04,0x90,0x95,0x01,0xf0,0x22,0xe4,0x90,0x9d,0xa8,0xf0,0xa3,0xf0,0x90,0x01,0xaf, +0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90, +0x9e,0x9e,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0x9e,0x8d,0xf0,0x12,0x1f,0x04, +0x65,0x6a,0x60,0x03,0x12,0x4c,0xe3,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x1f,0x04,0xf5, +0x67,0x22,0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0x30,0xe0,0x25,0x12,0x1f,0x04,0x90, +0x9e,0x94,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e,0x95,0xf0,0xef,0xc3,0x13, +0x54,0x7f,0x90,0x9e,0x93,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0x9e,0x9a,0xf0, +0x22,0x90,0x9e,0x94,0x74,0x01,0xf0,0x90,0x9e,0x95,0x74,0x03,0xf0,0x90,0x9e,0x93, +0x74,0x14,0xf0,0x90,0x9e,0x9a,0x74,0x05,0xf0,0x22,0x12,0x1f,0x04,0x30,0xe0,0x18, +0xc3,0x13,0x54,0x7f,0x90,0x9e,0x99,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0x90, +0x9e,0x97,0xe4,0xf0,0xa3,0xef,0xf0,0x22,0x90,0x9e,0x99,0x74,0x07,0xf0,0x90,0x9e, +0x97,0xe4,0xf0,0xa3,0x74,0x0b,0xf0,0x22,0x12,0x1f,0x04,0x60,0x02,0x80,0x01,0xe4, +0x90,0x9e,0x96,0xf0,0x22,0x12,0x1f,0x04,0x30,0xe0,0x07,0x54,0x01,0x90,0x9e,0xa0, +0xf0,0x22,0x7d,0x10,0x7f,0x03,0x12,0x3a,0x71,0x7d,0x01,0x7f,0x02,0x02,0x3a,0xc5, +0x90,0x02,0x09,0xe0,0xfd,0x12,0x1f,0x04,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x9e,0xb4, +0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0xff,0xed,0x2f,0x90,0x9e,0xb5,0xf0,0x90,0x00, +0x02,0x12,0x1f,0x1d,0xff,0xed,0x2f,0x90,0x9e,0xb6,0xf0,0x90,0x00,0x03,0x12,0x1f, +0x1d,0xff,0xed,0x2f,0x90,0x9e,0xb7,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0xff,0xae, +0x05,0xed,0x2f,0x90,0x9e,0xb8,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x3f,0x90, +0xfd,0x50,0x74,0x0b,0xf0,0xa3,0x74,0x05,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0, +0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, +0x90,0xfd,0x54,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0xfd,0x55,0xf0,0x90,0x00, +0x04,0x12,0x1f,0x1d,0x90,0xfd,0x56,0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x22,0x90, +0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x0c,0xf0,0xa3,0x74,0x01,0xf0, +0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, +0x90,0xfd,0x58,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x17,0x90,0xfd,0x50, +0x74,0x0d,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0x90,0xfd, +0x58,0x74,0x01,0xf0,0x22,0x12,0x1f,0x04,0x30,0xe0,0x0e,0x90,0x07,0x78,0xe0,0x54, +0xfd,0xf0,0x90,0x9e,0x50,0x74,0x01,0xf0,0x22,0xe4,0x90,0x9e,0x50,0xf0,0x22,0x90, +0x07,0x78,0xe0,0x44,0x0c,0xf0,0x12,0x1f,0x04,0xff,0x30,0xe0,0x75,0x90,0xfd,0x58, +0xe0,0x20,0xe0,0x10,0x90,0xfd,0x50,0x74,0x14,0xf0,0xa3,0x74,0x01,0xf0,0xa3,0xf0, +0x90,0xfd,0x58,0xf0,0x90,0x9e,0x43,0xe0,0x44,0x08,0xf0,0xef,0x30,0xe1,0x0d,0xe0, +0x44,0x01,0xf0,0x90,0x07,0x78,0xe0,0x54,0xfd,0xf0,0x80,0x07,0x90,0x07,0x78,0xe0, +0x44,0x02,0xf0,0x12,0x1f,0x04,0xff,0x30,0xe2,0x1e,0x90,0x9e,0x43,0xe0,0x44,0x04, +0xf0,0x90,0x04,0x26,0xe0,0x44,0x40,0xf0,0x90,0x07,0x78,0xe0,0x54,0xef,0xf0,0x90, +0x07,0x83,0xe0,0x44,0x40,0xf0,0x80,0x07,0x90,0x07,0x78,0xe0,0x44,0x10,0xf0,0xef, +0x30,0xe4,0x63,0x90,0x9e,0x43,0xe0,0x44,0x02,0xf0,0x90,0x04,0x26,0xe0,0x44,0x80, +0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x12,0x90,0xfd,0x50,0x74,0x14,0xf0,0xa3, +0x74,0x01,0xf0,0xa3,0xe4,0xf0,0x90,0xfd,0x58,0x04,0xf0,0x90,0x9e,0x43,0xe0,0x54, +0xfe,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xf7,0xf0,0x90,0x07, +0x78,0xe0,0x54,0xe3,0xf0,0x90,0x07,0x83,0xe0,0x54,0x3f,0xf0,0x90,0x04,0x26,0xe0, +0x54,0x3f,0xf0,0x90,0x9e,0x4a,0x12,0x43,0x46,0x90,0x81,0x57,0x12,0x1f,0xd7,0x7f, +0x80,0x7e,0x08,0x12,0x34,0x55,0x22,0x12,0x1f,0x04,0xff,0x30,0xe0,0x4b,0x90,0x07, +0x78,0xe0,0x44,0x02,0xf0,0x90,0x07,0x83,0xe0,0x44,0x02,0xf0,0x90,0x07,0x78,0xe0, +0x44,0x80,0x54,0xbf,0xf0,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1a,0x90,0xfd,0x50,0x74, +0x1a,0xf0,0xa3,0x74,0x01,0xf0,0xa3,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, +0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0xef,0x30,0xe1,0x5f,0x90,0x9e,0x43,0xe0,0x44,0x02, +0xf0,0x90,0x07,0x95,0xe0,0x44,0x06,0xf0,0x22,0x90,0x9e,0x43,0xe0,0x54,0xfd,0xf0, +0x90,0x07,0x78,0xe0,0x54,0x3f,0xf0,0x90,0x07,0x83,0xe0,0x54,0xfd,0xf0,0x90,0x07, +0x95,0xe0,0x54,0xf9,0xf0,0x90,0x9e,0x4a,0x12,0x43,0x46,0x90,0x81,0x57,0x12,0x1f, +0xd7,0x7f,0x80,0x7e,0x08,0x12,0x34,0x55,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1a,0x90, +0xfd,0x50,0x74,0x1a,0xf0,0xa3,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0xef,0x70,0x21,0x12,0x1f,0x04, +0x30,0xe0,0x14,0x90,0x00,0x40,0xe0,0x44,0x20,0xf0,0xe0,0x54,0x3f,0xf0,0x90,0x07, +0x78,0xe0,0x44,0x01,0xf0,0x80,0x07,0x90,0x07,0x78,0xe0,0x54,0xfe,0xf0,0xef,0x64, +0x01,0x70,0x6a,0x12,0x1f,0x04,0x90,0x00,0x01,0x30,0xe0,0x2e,0x12,0x1f,0x1d,0x90, +0x06,0xc0,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x06,0xc1,0xf0,0x90,0x00,0x03, +0x12,0x1f,0x1d,0x90,0x06,0xc2,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x90,0x06,0xc3, +0xf0,0x90,0x06,0xcc,0xe0,0x54,0xfe,0xf0,0x80,0x2c,0x12,0x1f,0x1d,0x90,0x06,0xc4, +0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0x06,0xc5,0xf0,0x90,0x00,0x03,0x12,0x1f, +0x1d,0x90,0x06,0xc6,0xf0,0x90,0x00,0x04,0x12,0x1f,0x1d,0x90,0x06,0xc7,0xf0,0x90, +0x06,0xcc,0xe0,0x44,0x01,0xf0,0x90,0x06,0xcc,0xe0,0x44,0x02,0xf0,0xef,0xb4,0x02, +0x11,0x12,0x1f,0x04,0x90,0x06,0xc8,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x06, +0xc9,0xf0,0xef,0xb4,0x03,0x11,0x12,0x1f,0x04,0x90,0x06,0xca,0xf0,0x90,0x00,0x01, +0x12,0x1f,0x1d,0x90,0x06,0xcb,0xf0,0xef,0x64,0x04,0x70,0x1f,0x12,0x1f,0x04,0xff, +0x90,0x07,0x83,0x30,0xe0,0x06,0xe0,0x44,0x10,0xf0,0x80,0x04,0xe0,0x54,0x6f,0xf0, +0xef,0x30,0xe1,0x07,0x90,0x07,0x83,0xe0,0x44,0x80,0xf0,0x22,0x90,0x9e,0x76,0x12, +0x43,0x7e,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x37,0x90,0xfd,0x50,0x74,0x11,0xf0,0xa3, +0x74,0x03,0xf0,0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0, +0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, +0x90,0xfd,0x54,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x80,0x16, +0x43,0x57,0x01,0x78,0xaa,0x7c,0x9d,0x7d,0x01,0x90,0x9e,0x76,0x12,0x43,0x5e,0x7e, +0x00,0x7f,0x03,0x12,0x1e,0xde,0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0x60, +0x07,0x90,0x9e,0x51,0x74,0x01,0xf0,0x22,0xe4,0x90,0x9e,0x51,0xf0,0x22,0x90,0xfd, +0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x17,0xf0,0xa3,0x74,0x01,0xf0,0x12, +0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, +0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74, +0x18,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0, +0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0, +0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x19,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04, +0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, +0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1a,0xf0, +0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0, +0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0, +0x1f,0x90,0xfd,0x50,0x74,0x1b,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd, +0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0, +0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1c,0xf0,0xa3,0x74, +0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x2f,0x90, +0xfd,0x50,0x74,0x1d,0xf0,0xa3,0x74,0x03,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0, +0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, +0x90,0xfd,0x54,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90, +0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50,0x74,0x1e,0xf0,0xa3,0x74,0x01,0xf0, +0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x12,0x1f,0x04,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x18, +0x12,0x1f,0xc4,0xa8,0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x9e,0x4a,0x12,0x43, +0x46,0xec,0x54,0x03,0xfc,0x12,0x43,0x19,0x90,0x9e,0x46,0x02,0x1f,0xd7,0x90,0xfd, +0x58,0xe0,0x20,0xe0,0x3b,0x12,0x1f,0x04,0x90,0xfd,0x50,0xf0,0xa3,0x74,0x04,0xf0, +0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0xfd,0x52,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, +0x90,0xfd,0x53,0xf0,0x90,0x00,0x03,0x12,0x1f,0x1d,0x90,0xfd,0x54,0xf0,0x90,0x00, +0x04,0x12,0x1f,0x1d,0x90,0xfd,0x55,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0x04,0xf0, +0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x21,0x90,0xfd,0x50,0x74,0x1f,0xf0,0xa3,0x74, +0x01,0xf0,0x12,0x1f,0x04,0x54,0x01,0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0, +0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0, +0x21,0x90,0xfd,0x50,0x74,0x20,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x54,0x01, +0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, +0x04,0xf0,0x22,0x12,0x1f,0x04,0xff,0x30,0xe0,0x54,0x90,0xfd,0x58,0xe0,0x20,0xe0, +0x4d,0x90,0xfd,0x50,0x74,0x0a,0xf0,0xa3,0x74,0x06,0xf0,0x90,0x00,0x01,0x12,0x1f, +0x1d,0x90,0xfd,0x52,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d,0x90,0xfd,0x53,0xf0,0xa3, +0xe4,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x06,0xa3,0x74,0xa0,0xf0,0x80,0x06,0x90,0xfd, +0x55,0x74,0xc0,0xf0,0x90,0xfd,0x56,0x74,0x10,0xf0,0xa3,0x74,0x80,0xf0,0x90,0xfd, +0x50,0x74,0x0a,0xf0,0xa3,0x74,0x06,0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x90,0x00, +0x02,0x12,0x1f,0x1d,0xfe,0x90,0x00,0x01,0x12,0x1f,0x1d,0x7c,0x00,0x24,0x00,0xff, +0xec,0x3e,0xfe,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0xe4,0xfc,0x74,0x20,0x2f,0xff, +0xe4,0x3e,0xfe,0x90,0x9e,0x76,0xef,0xf0,0xee,0xf9,0x90,0x02,0x09,0xe0,0xc3,0x13, +0x90,0xfd,0x10,0xf0,0xec,0xc3,0x99,0x50,0x43,0xec,0x70,0x04,0x7d,0x04,0x80,0x02, +0xe4,0xfd,0xed,0xc3,0x94,0x20,0x50,0x07,0xaf,0x05,0x71,0xda,0x0d,0x80,0xf3,0x0c, +0x90,0xfd,0x10,0xe0,0x04,0xf0,0xec,0xb5,0x01,0xda,0xe4,0xfd,0xed,0x75,0xf0,0x08, +0xa4,0xff,0x90,0x9e,0x76,0xe0,0xfb,0xc3,0xef,0x9b,0x74,0x80,0xf8,0x65,0xf0,0x98, +0x50,0x07,0xaf,0x05,0x71,0xda,0x0d,0x80,0xe3,0x0c,0x80,0xb8,0x90,0x00,0x81,0xe0, +0x44,0x80,0x12,0x44,0xc9,0xd0,0xd0,0x92,0xaf,0x22,0x90,0xfd,0x58,0xe0,0x30,0xe0, +0x08,0x90,0x01,0xb8,0xe0,0x04,0xf0,0x80,0xf1,0xef,0x75,0xf0,0x08,0xa4,0x24,0x00, +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x50,0xf0,0xef,0x75,0xf0,0x08, +0xa4,0x24,0x01,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x51,0xf0,0xef, +0x75,0xf0,0x08,0xa4,0x24,0x02,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd, +0x52,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x03,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, +0xe0,0x90,0xfd,0x53,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x04,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x54,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24,0x05,0xf5, +0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x55,0xf0,0xef,0x75,0xf0,0x08,0xa4, +0x24,0x06,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x56,0xf0,0xef,0x75, +0xf0,0x08,0xa4,0x24,0x07,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x90,0xfd,0x57, +0xf0,0xa3,0x74,0x01,0xf0,0x22,0x12,0x1f,0x04,0x90,0xfe,0x10,0x60,0x05,0xe0,0x44, +0x01,0xf0,0x22,0xe0,0x54,0xfe,0xf0,0x22,0x90,0x01,0xb8,0xe0,0x04,0xf0,0x90,0xfd, +0x58,0xe0,0x90,0x01,0xb9,0xf0,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x1f,0x90,0xfd,0x50, +0x74,0x23,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x90,0xfd,0x52,0xf0,0xa3,0xe4, +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x04,0xf0,0x22,0x90,0x9e,0x7a, +0x12,0x43,0x7e,0x12,0x1f,0x04,0x20,0xe0,0x02,0xa1,0x9c,0xb1,0xe7,0x90,0x9e,0x7a, +0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x54,0x01,0xfe,0x90,0x9e,0x86,0xe0,0x54,0xfe, +0x4e,0xf0,0xef,0x54,0x02,0xff,0xe0,0x54,0xfd,0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54, +0x04,0xfe,0x90,0x9e,0x86,0xe0,0x54,0xfb,0x4e,0xf0,0xef,0x54,0x10,0xff,0xe0,0x54, +0xef,0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54,0x20,0xfe,0x90,0x9e,0x86,0xe0,0x54,0xdf, +0x4e,0xf0,0xef,0x54,0x40,0xff,0xe0,0x54,0xbf,0x4f,0xf0,0x90,0x00,0x01,0x12,0x1f, +0x1d,0xff,0xc3,0x94,0x17,0x50,0x12,0xef,0xc3,0x94,0x03,0x90,0x9e,0x87,0x50,0x05, +0x74,0x03,0xf0,0x80,0x0a,0xef,0xf0,0x80,0x06,0x90,0x9e,0x87,0x74,0x17,0xf0,0x90, +0x9e,0x7a,0x12,0x43,0x5e,0x90,0x00,0x02,0x12,0x1f,0x1d,0xff,0xc3,0x94,0x18,0x50, +0x12,0xef,0xc3,0x94,0x03,0x90,0x9e,0x88,0x50,0x05,0x74,0x03,0xf0,0x80,0x0a,0xef, +0xf0,0x80,0x06,0x90,0x9e,0x88,0x74,0x18,0xf0,0xe4,0x90,0x9e,0x50,0xf0,0x90,0x9e, +0x86,0xe0,0xc4,0x54,0x0f,0x30,0xe0,0x0d,0x75,0x69,0x04,0x90,0x05,0x00,0x74,0x1c, +0xf0,0xa3,0x74,0x11,0xf0,0x90,0x05,0x58,0x74,0x02,0xf0,0x22,0x90,0x9e,0x7a,0x12, +0x43,0x5e,0x12,0x1f,0x04,0xff,0x13,0x13,0x13,0x54,0x1f,0x90,0x9e,0x76,0x30,0xe0, +0x09,0x12,0x1f,0xe3,0x00,0x00,0x03,0x10,0x80,0x07,0x12,0x1f,0xe3,0x00,0x00,0x03, +0x00,0xb1,0xe7,0x90,0x00,0x40,0x74,0x24,0xf0,0x90,0x07,0x78,0x74,0x01,0xf0,0xfb, +0x7a,0x9e,0x79,0x76,0x12,0x4c,0x0d,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x00,0x74, +0x1c,0xf0,0xa3,0x74,0x43,0xf0,0x22,0x90,0x9e,0x86,0xe0,0x54,0xfe,0xf0,0xa3,0x74, +0x0b,0xf0,0xa3,0x74,0x08,0xf0,0xe4,0x90,0x9e,0x8b,0xf0,0xa3,0xf0,0x90,0x9e,0x86, +0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xef,0xf0,0xe0,0x54,0xf7,0xf0, +0xe0,0x54,0xdf,0xf0,0xe0,0x54,0xbf,0xf0,0x90,0x9e,0x89,0xe0,0x54,0xfe,0xf0,0xe0, +0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0x22,0x75,0xe8,0x07,0x90,0xfd,0x68,0x74,0x02,0xf0, +0x90,0x9e,0x43,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0x54,0xfd,0xf0,0x54,0xf7,0xf0, +0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0x12,0x1f,0xe3,0x00,0x00,0x00,0x00,0x7f,0x80,0x7e, +0x08,0x12,0x2c,0x87,0x90,0x9e,0x4a,0x12,0x1f,0xd7,0x90,0x00,0x2e,0xe0,0x90,0x9e, +0x4e,0xf0,0x90,0x00,0x2d,0xe0,0x90,0x9e,0x4f,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, +0x04,0x26,0xe0,0x44,0x10,0xf0,0x90,0x07,0x83,0xe4,0xf0,0x90,0x07,0x78,0x74,0x03, +0xf0,0xb1,0xe7,0x7d,0x04,0x7f,0x02,0x02,0x3a,0xdf,0x90,0xfd,0x58,0xe0,0x20,0xe0, +0x21,0x90,0xfd,0x50,0x74,0x24,0xf0,0xa3,0x74,0x01,0xf0,0x12,0x1f,0x04,0x54,0x01, +0x90,0xfd,0x52,0xf0,0xa3,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, +0x04,0xf0,0x22,0x12,0x1f,0x04,0xff,0x54,0x01,0xfe,0x90,0x9e,0x89,0xe0,0x54,0xfe, +0x4e,0xf0,0xef,0x54,0x02,0xff,0xe0,0x54,0xfd,0x4f,0xf0,0x90,0x00,0x01,0x12,0x1f, +0x1d,0x90,0x9e,0x8a,0xf0,0x22,0xe4,0x90,0x9f,0x11,0xf0,0xa3,0xf0,0x90,0x01,0xeb, +0xe0,0x54,0xc0,0x60,0x43,0xc3,0x90,0x9f,0x12,0xe0,0x94,0x88,0x90,0x9f,0x11,0xe0, +0x94,0x13,0x40,0x0a,0x90,0x01,0xc6,0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x90,0x9f, +0x11,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x7f,0x14,0x7e,0x00,0x12,0x3b,0x3b,0xd3, +0x90,0x9f,0x12,0xe0,0x94,0x64,0x90,0x9f,0x11,0xe0,0x94,0x00,0x40,0xbf,0x90,0x01, +0xc7,0xe0,0x30,0xe2,0xb8,0x7f,0x00,0x22,0x7f,0x01,0x22,0xd3,0x10,0xaf,0x01,0xc3, +0xc0,0xd0,0xef,0x54,0xfc,0xff,0x90,0x01,0xe8,0xf0,0xee,0xa3,0xf0,0x90,0x01,0xeb, +0x74,0x80,0xf0,0xd1,0xd6,0x90,0x01,0xec,0xe0,0xff,0x90,0x9f,0x0a,0x12,0x43,0x5e, +0x90,0x00,0x03,0xef,0x12,0x42,0x32,0x90,0x01,0xed,0xe0,0x90,0x00,0x02,0x12,0x42, +0x32,0x90,0x01,0xee,0xe0,0x90,0x00,0x01,0x12,0x42,0x32,0x90,0x01,0xef,0xe0,0x12, +0x42,0x20,0x90,0x9f,0x0a,0x12,0x43,0x5e,0x12,0x43,0x26,0xd0,0xd0,0x92,0xaf,0x22, +0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0x90,0x9e,0xe1,0x74,0x04,0xf0,0x22,0x12,0x57, +0x90,0x80,0xee,0x90,0x05,0x22,0x74,0xff,0xf0,0x90,0x05,0x27,0xe0,0x44,0x40,0xf0, +0x90,0x9e,0xe1,0x74,0x04,0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0x90,0x9e,0xdb, +0x74,0x05,0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0x90,0x9e,0xdb,0x74,0x02,0xf0, +0x22,0x90,0x05,0x27,0xe0,0x54,0xbf,0xf0,0x90,0x05,0x22,0x74,0x6f,0xf0,0x90,0x9e, +0xdb,0x74,0x06,0xf0,0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0xe4,0x90,0x9f,0x13,0xf0, +0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07, +0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x9f,0x14,0xe0,0x94,0xe8,0x90,0x9f, +0x13,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x3b,0x3b, +0x90,0x9f,0x13,0xe4,0x75,0xf0,0x01,0x12,0x42,0x54,0x80,0xc6,0xd3,0x10,0xaf,0x01, +0xc3,0xc0,0xd0,0x90,0x9f,0x1e,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0, +0x5f,0xf0,0x12,0x4f,0x6d,0x90,0x9f,0x1e,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb, +0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8, +0xf8,0xff,0x80,0x4c,0x90,0x9f,0x1e,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x62,0xe0,0x5f,0xf0, +0x12,0x4f,0x6d,0x90,0x9f,0x1e,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x60,0xe0,0xfb,0xe4,0xfe, +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, +0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x9f,0x16,0xed, +0xf0,0x90,0x9f,0x15,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90, +0x9f,0x15,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4, +0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x9f,0x15,0xe0,0xff,0x74,0x01, +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0, +0x12,0x4f,0x6d,0x90,0x9f,0x15,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x67,0x90,0x9f,0x15,0xe0,0x24,0xf8, +0xf0,0xa3,0xe0,0x70,0x1a,0x90,0x9f,0x15,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80, +0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x63,0xe0,0x5f,0xf0,0x80,0x17,0x90, +0x9f,0x15,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff, +0x90,0x00,0x63,0xe0,0x4f,0xf0,0x12,0x4f,0x6d,0x90,0x9f,0x15,0xe0,0xff,0x74,0x01, +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0x65,0x90,0x9f,0x15,0xe0, +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00, +0x62,0xe0,0x5f,0xf0,0x12,0x4f,0x6d,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01, +0xc3,0xc0,0xd0,0x90,0x9f,0x18,0xed,0xf0,0x90,0x9f,0x17,0xef,0xf0,0xd3,0x94,0x07, +0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4, +0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0x6d,0x90,0x9f,0x17,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f, +0xf0,0x12,0x4f,0x6d,0x90,0x9f,0x18,0xe0,0x60,0x16,0x90,0x9f,0x17,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x62, +0x90,0x9f,0x17,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, +0xf4,0xff,0x90,0x00,0x45,0x80,0x64,0x90,0x9f,0x17,0xe0,0x24,0xf8,0xf0,0xe0,0xff, +0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0x65,0x90,0x9f, +0x17,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90, +0x00,0x62,0xe0,0x4f,0xf0,0x12,0x4f,0x6d,0x90,0x9f,0x18,0xe0,0x60,0x18,0x90,0x9f, +0x17,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90, +0x00,0x61,0xe0,0x4f,0x80,0x17,0x90,0x9f,0x17,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x61,0xe0,0x5f,0xf0,0x12,0x4f, +0x6d,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x90,0xe0,0x44,0x01,0xf0,0x90,0x9e,0xcc, +0xe0,0x30,0xe0,0x31,0x90,0x9e,0xca,0xe0,0xff,0x90,0x9e,0xc9,0xe0,0xfe,0xc4,0x13, +0x54,0x01,0xfd,0x31,0x9c,0x90,0x9e,0xcb,0xe0,0x75,0xf0,0x20,0xa4,0xff,0xae,0xf0, +0x12,0x3b,0x3b,0x90,0x9e,0xca,0xe0,0xff,0x90,0x9e,0xc9,0xe0,0xfe,0xc4,0x13,0x54, +0x01,0xf4,0xfd,0x31,0x9c,0x22,0x90,0x9e,0x76,0x12,0x43,0x7e,0x12,0x1f,0x04,0x20, +0xe0,0x02,0x61,0xbe,0x90,0x9e,0x76,0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0x54,0x01, +0xfe,0x90,0x9e,0xc9,0xe0,0x54,0xfe,0x4e,0xf0,0xef,0x54,0x04,0xff,0xe0,0x54,0xfb, +0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54,0x02,0xfe,0x90,0x9e,0xc9,0xe0,0x54,0xfd,0x4e, +0xf0,0xef,0x54,0x08,0xff,0xe0,0x54,0xf7,0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54,0x10, +0xfe,0x90,0x9e,0xc9,0xe0,0x54,0xef,0x4e,0xf0,0xef,0x54,0x20,0xff,0xe0,0x54,0xdf, +0x4f,0xf0,0x12,0x1f,0x04,0xff,0x54,0x40,0xfe,0x90,0x9e,0xc9,0xe0,0x54,0xbf,0x4e, +0xf0,0xef,0x54,0x80,0xff,0xe0,0x54,0x7f,0x4f,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, +0x90,0x9e,0xcb,0xf0,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e,0xca,0xf0,0x90,0x00, +0x03,0x12,0x1f,0x1d,0xff,0x54,0x01,0xfe,0x90,0x9e,0xcc,0xe0,0x54,0xfe,0x4e,0xf0, +0xef,0x54,0x02,0xff,0xe0,0x54,0xfd,0x4f,0xf0,0xe4,0x12,0x44,0xc9,0x90,0x9e,0x76, +0x12,0x43,0x5e,0x12,0x1f,0x04,0xff,0xc3,0x13,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0, +0x44,0x02,0xf0,0xef,0x13,0x13,0x54,0x3f,0x30,0xe0,0x07,0x90,0x06,0x90,0xe0,0x44, +0x04,0xf0,0x12,0x1f,0x04,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x06,0x90, +0xe0,0x44,0x08,0xf0,0x90,0x9e,0xcc,0xe0,0x30,0xe0,0x12,0x90,0x9e,0xca,0xe0,0xff, +0x90,0x9e,0xc9,0xe0,0xfe,0xc4,0x13,0x54,0x01,0xf4,0xfd,0x31,0x9c,0x22,0x90,0x06, +0x90,0xe4,0xf0,0x71,0xcc,0x90,0x01,0x3f,0x74,0x04,0xf0,0x22,0x90,0x9e,0xc9,0xe0, +0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb,0xf0,0xe0,0x54,0xf7,0xf0,0xe0, +0x54,0xef,0xf0,0xe0,0x54,0xdf,0xf0,0xe0,0x54,0xbf,0xf0,0xe0,0x54,0x7f,0xf0,0xe4, +0xa3,0xf0,0xa3,0xf0,0xa3,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xfb, +0xf0,0x22,0x90,0x9e,0xc1,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0x7f,0xf0,0x90,0x01,0x17, +0xe0,0xfe,0x90,0x01,0x16,0xe0,0x7c,0x00,0x24,0x00,0xff,0xec,0x3e,0x90,0x9e,0xc7, +0xf0,0xa3,0xef,0xf0,0x90,0x01,0x04,0xe0,0x54,0x0f,0x90,0x9e,0x6b,0xf0,0xe0,0xff, +0x74,0x40,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, +0x90,0x9e,0xc6,0xf0,0xee,0x90,0x9e,0xc5,0xf0,0x80,0x81,0xd3,0x10,0xaf,0x01,0xc3, +0xc0,0xd0,0x12,0x1f,0x04,0x54,0x01,0xff,0x90,0x9e,0xc1,0xe0,0x54,0xfe,0x4f,0xf0, +0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e,0xc2,0xf0,0x90,0x00,0x02,0x12,0x1f,0x1d, +0x90,0x9e,0xc3,0xf0,0x90,0x9e,0xc1,0xe0,0x30,0xe0,0x20,0x90,0x06,0x09,0xe0,0x54, +0xfe,0xf0,0x90,0x02,0x86,0xe0,0x44,0x04,0xf0,0x43,0x57,0x04,0x7d,0x08,0xe4,0xff, +0x12,0x3a,0xc5,0x90,0x01,0x3f,0x74,0x04,0xf0,0x80,0x10,0x7d,0x08,0xe4,0xff,0x12, +0x3a,0x54,0x90,0x02,0x86,0xe0,0x54,0xfb,0xf0,0x71,0xbe,0xd0,0xd0,0x92,0xaf,0x22, +0xe5,0x68,0x30,0xe3,0x04,0xe4,0xff,0x80,0x02,0x7f,0x01,0x02,0x48,0x7d,0x90,0x9e, +0xbe,0xe0,0x30,0xe0,0x2d,0xe5,0x67,0xb4,0x01,0x28,0x90,0x9e,0xbd,0xe0,0x04,0xf0, +0xe0,0xb4,0x0a,0x0b,0x90,0x9e,0xc0,0xe0,0x04,0xf0,0xe4,0x90,0x9e,0xbd,0xf0,0x90, +0x9e,0xc0,0xe0,0xff,0x90,0x9e,0xbf,0xe0,0xb5,0x07,0x07,0x91,0xb0,0xe4,0x90,0x9e, +0xc0,0xf0,0x22,0x12,0x1f,0x04,0xff,0x54,0x01,0xfe,0x90,0x9e,0xbe,0xe0,0x54,0xfe, +0x4e,0xf0,0xef,0xc3,0x13,0x30,0xe0,0x0a,0x90,0x00,0x01,0x12,0x1f,0x1d,0x90,0x9e, +0xbf,0xf0,0x22,0x90,0x9e,0xc1,0xe0,0xc4,0x13,0x13,0x13,0x54,0x01,0x20,0xe0,0x07, +0x90,0x01,0x3f,0xe0,0x30,0xe2,0x0a,0x90,0x9e,0xc1,0xe0,0x44,0x80,0xf0,0x7f,0x00, +0x22,0x7f,0x01,0x22,0x90,0xfd,0x58,0xe0,0x20,0xe0,0x2d,0x90,0xfd,0x50,0x74,0x11, +0xf0,0xa3,0x74,0x04,0xf0,0x90,0x9d,0xaa,0xe0,0x90,0xfd,0x52,0xf0,0x90,0x9d,0xab, +0xe0,0x90,0xfd,0x53,0xf0,0x90,0x9d,0xac,0xe0,0x90,0xfd,0x54,0xf0,0xa3,0x74,0x28, +0xf0,0x90,0xfd,0x58,0x74,0x01,0xf0,0x22,0x43,0x57,0x01,0x22,0x90,0x9e,0xe6,0xe0, +0x54,0xf0,0x44,0x0a,0xf0,0x90,0xfd,0x60,0xe0,0x90,0x9e,0xe8,0xf0,0x90,0xfd,0x62, +0xe0,0x90,0x9e,0xe9,0xf0,0x90,0xfd,0x63,0xe0,0x90,0x9e,0xea,0xf0,0x90,0xfd,0x64, +0xe0,0x90,0x9e,0xeb,0xf0,0x90,0xfd,0x65,0xe0,0x90,0x9e,0xec,0xf0,0x90,0xfd,0x60, +0xe0,0x90,0x9e,0xe6,0x30,0xe6,0x08,0xe0,0x54,0x0f,0x44,0x50,0xf0,0x80,0x16,0xe0, +0x54,0x0f,0x44,0x70,0xf0,0x90,0xfd,0x66,0xe0,0x90,0x9e,0xed,0xf0,0x90,0xfd,0x67, +0xe0,0x90,0x9e,0xee,0xf0,0x7b,0x01,0x7a,0x9e,0x79,0xe8,0x90,0x9e,0xfe,0x12,0x43, +0x7e,0x7a,0x9e,0x79,0xe6,0x02,0x5d,0x37,0x90,0x9e,0x86,0xe0,0x30,0xe0,0x50,0xe0, +0xff,0xc4,0x13,0x13,0x54,0x03,0x90,0x07,0x78,0x30,0xe0,0x05,0x74,0x0d,0xf0,0x80, +0x03,0x74,0x09,0xf0,0x90,0x9e,0x52,0x12,0x1f,0xe3,0x00,0x00,0x03,0x10,0x7b,0x01, +0x7a,0x9e,0x79,0x52,0x12,0x4c,0x0d,0x90,0x9e,0x8b,0x74,0x01,0xf0,0x90,0x9e,0x86, +0xe0,0xc4,0x13,0x54,0x07,0x30,0xe0,0x06,0x90,0x05,0x22,0xe4,0xf0,0x22,0x90,0x9e, +0x86,0xe0,0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x05,0x22,0xe4,0x12,0x49,0x1c,0x22, +0x90,0x9e,0x86,0xe0,0x30,0xe0,0x41,0xe4,0xf5,0x48,0xa3,0xe0,0xf5,0x49,0xe4,0xfb, +0xfd,0x7f,0x60,0x7e,0x01,0x12,0x39,0xa9,0x90,0x01,0x63,0x74,0x05,0xf0,0x90,0x9e, +0x52,0x12,0x1f,0xe3,0x00,0x00,0x03,0x10,0x7b,0x01,0x7a,0x9e,0x79,0x52,0x12,0x4c, +0x0d,0x90,0x9e,0x8b,0x74,0x01,0xf0,0xa3,0xf0,0x90,0x9e,0x96,0xe0,0x90,0x05,0x22, +0x60,0x04,0x74,0x6f,0xf0,0x22,0xe4,0xf0,0x22,0x00,0x79,0x4e,}; + +u8 Rtl8723UFwBTImgArray[Rtl8723UBTImgArrayLength] = { +0x30,}; + + + //WiFi for BT MP New FW 0326 +const u8 Rtl8723SFwUMCBCutMPImgArray[Rtl8723SUMCBCutMPImgArrayLength] = { +0x02, 0x23, 0x02, 0x00, 0x22, 0x00, 0x00, 0x00, 0x05, 0x15, 0x14, 0x10, 0x14, 0x47, 0x01, 0x00, +0x74, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4A, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x61, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x67, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0x55, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x6F, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xE4, 0xFB, 0x90, 0x85, 0x76, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x50, 0x70, 0x03, +0x02, 0x43, 0x8F, 0xE5, 0x4D, 0x64, 0x01, 0x60, 0x03, 0x02, 0x43, 0x8F, 0xE5, 0x50, 0x14, 0x60, +0x2B, 0x24, 0xFD, 0x60, 0x27, 0x24, 0x02, 0x24, 0xFB, 0x50, 0x02, 0x80, 0x21, 0x90, 0x85, 0x59, +0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, 0xE0, 0x60, 0x14, 0x90, 0x85, 0x59, 0xE0, 0x70, 0x08, +0x90, 0x85, 0x70, 0xE0, 0x90, 0x85, 0x59, 0xF0, 0x7B, 0x01, 0x80, 0x02, 0x7B, 0x01, 0xEB, 0x70, +0x03, 0x02, 0x43, 0x8F, 0x43, 0x51, 0x10, 0x90, 0x85, 0x4F, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x44, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x85, 0x71, 0xE0, 0xC3, 0x9F, 0x50, 0x08, +0xE4, 0xF5, 0x48, 0x90, 0x85, 0x50, 0x80, 0x2D, 0x90, 0x85, 0x4F, 0xE0, 0xC4, 0x54, 0x07, 0xFF, +0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x85, 0x71, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, +0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x53, 0x80, 0x06, 0xE4, +0xF5, 0x48, 0x90, 0x85, 0x50, 0xE0, 0x80, 0x2D, 0x90, 0x85, 0x71, 0xE0, 0x64, 0x01, 0x60, 0x03, +0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x71, 0xE0, 0xFF, 0x90, 0x85, 0x68, 0xE0, 0x2F, +0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x71, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, +0x85, 0x68, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, +0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x4E, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, +0x7D, 0x01, 0x7F, 0x04, 0x12, 0x49, 0xC6, 0xE5, 0x4E, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x85, 0x2B, +0xE0, 0xFF, 0x90, 0x85, 0x71, 0xE0, 0xD3, 0x9F, 0x40, 0x08, 0x90, 0x85, 0x2C, 0xE0, 0x04, 0xF0, +0x80, 0x05, 0xE4, 0x90, 0x85, 0x2C, 0xF0, 0x90, 0x85, 0x71, 0xE0, 0x90, 0x85, 0x2B, 0xF0, 0xA3, +0xE0, 0xC3, 0x94, 0x05, 0x40, 0x46, 0xE4, 0xF0, 0x90, 0x85, 0x56, 0xE0, 0x60, 0x09, 0x90, 0x85, +0x6F, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x15, 0x90, 0x85, 0x72, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, +0x49, 0xC2, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x5E, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x6E, 0x80, 0x09, +0x43, 0x51, 0x01, 0x12, 0x50, 0xA5, 0x90, 0x85, 0x6A, 0x74, 0x01, 0xF0, 0x12, 0x84, 0xC4, 0x22, +0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, +0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, +0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, +0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, +0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, +0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, +0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, +0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xEF, 0x5B, 0xFF, +0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, +0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, +0xCC, 0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, +0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, +0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, +0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, +0xF9, 0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, +0x70, 0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, +0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, +0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, +0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, +0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, +0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, +0xA3, 0xA3, 0xA3, 0x80, 0xD8, 0x90, 0x85, 0x60, 0xE0, 0x60, 0x16, 0x90, 0x85, 0x63, 0xE0, 0x70, +0x10, 0x90, 0x85, 0x5D, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, +0xF0, 0x22, 0x22, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0xFB, 0x90, 0x85, 0x7A, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x50, 0x70, 0x03, 0x02, 0x45, 0xD5, 0xE5, 0x4D, 0x64, 0x01, +0x60, 0x03, 0x02, 0x45, 0xD5, 0x0B, 0x90, 0x85, 0x59, 0xF0, 0x04, 0x70, 0x03, 0x02, 0x45, 0xD5, +0x43, 0x51, 0x10, 0x90, 0x85, 0x4F, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, +0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x85, 0x71, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0xE4, 0xF5, 0x48, 0x90, +0x85, 0x50, 0xE0, 0xF5, 0x49, 0xE4, 0x1B, 0x80, 0x56, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x4F, 0xE0, +0x54, 0x0F, 0xFF, 0x90, 0x85, 0x71, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x85, +0x50, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0x80, 0x35, 0x90, 0x85, 0x71, 0xE0, 0x64, 0x01, +0x60, 0x03, 0xE0, 0x70, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x71, 0xE0, 0xFF, 0x90, 0x85, 0x68, +0xE0, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0x80, 0x17, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x71, 0xE0, 0x14, +0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x85, 0x68, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, +0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x4E, 0x54, +0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x49, 0xC6, 0x12, 0x84, 0xC4, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x85, 0x7A, 0xF0, 0xE5, 0x50, 0x70, 0x03, 0x02, +0x46, 0x8F, 0x90, 0x85, 0x73, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x51, 0xFD, 0xE5, 0x51, 0x54, +0x07, 0x60, 0x03, 0x02, 0x46, 0x8F, 0x02, 0x46, 0x8C, 0x90, 0x85, 0x5A, 0xE0, 0x04, 0xF0, 0x53, +0x51, 0xEF, 0x90, 0x85, 0x71, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0x4F, 0xE0, 0xC4, 0x13, 0x13, 0x13, +0x54, 0x01, 0x30, 0xE0, 0x3A, 0x90, 0x85, 0x71, 0xE0, 0xFF, 0x90, 0x85, 0x4F, 0xE0, 0x54, 0x0F, +0xB5, 0x07, 0x0A, 0x90, 0x85, 0x52, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, 0x90, 0x85, 0x4F, +0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x85, 0x71, +0xE0, 0xB5, 0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, +0x85, 0x4F, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, 0x85, 0x7A, 0x74, +0x5A, 0xF0, 0x90, 0x85, 0x7A, 0xE0, 0xFF, 0x90, 0x85, 0x61, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, +0x90, 0x85, 0x5A, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x0D, 0xE5, +0x4D, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x51, 0x63, 0x22, +0xE4, 0xF5, 0x51, 0xF5, 0x50, 0x75, 0x4F, 0x0C, 0x75, 0x4E, 0x0C, 0x90, 0x85, 0x72, 0xF0, 0x90, +0x85, 0x6E, 0xF0, 0x90, 0x85, 0x6B, 0xF0, 0x90, 0x85, 0x70, 0x04, 0xF0, 0x90, 0x85, 0x59, 0xF0, +0xE4, 0x90, 0x85, 0x73, 0xF0, 0x90, 0x85, 0x5B, 0xF0, 0x90, 0x85, 0x68, 0x74, 0x05, 0xF0, 0xE4, +0x90, 0x85, 0x5A, 0xF0, 0x90, 0x85, 0x66, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x85, 0x61, 0xF0, +0x90, 0x85, 0x64, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x5E, 0x74, 0x14, 0xF0, 0x90, 0x85, 0x69, 0x74, +0x05, 0xF0, 0xE4, 0x90, 0x85, 0x5C, 0xF0, 0x90, 0x85, 0x55, 0xF0, 0x90, 0x85, 0xC4, 0xF0, 0x90, +0x85, 0x65, 0xF0, 0x90, 0x85, 0x75, 0xF0, 0x90, 0x85, 0x71, 0xF0, 0x90, 0x85, 0x56, 0xF0, 0x90, +0x85, 0x6F, 0xF0, 0x90, 0x85, 0x60, 0xF0, 0x90, 0x85, 0x5D, 0xF0, 0x90, 0x85, 0x6A, 0xF0, 0x90, +0x85, 0x63, 0xF0, 0x90, 0x85, 0x5F, 0xF0, 0x90, 0x85, 0x74, 0xF0, 0x90, 0x85, 0x62, 0xF0, 0x90, +0x85, 0xC3, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x85, 0x4F, 0xE0, 0x54, +0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, +0x85, 0x53, 0xF0, 0x90, 0x85, 0x52, 0xF0, 0x22, 0xEF, 0x60, 0x5F, 0xAF, 0x05, 0x74, 0x21, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6B, +0x90, 0x85, 0x43, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, +0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x23, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xAF, 0x05, 0x74, 0x21, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, +0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0x74, +0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x22, 0x90, 0x85, 0x2D, 0xE0, +0x30, 0xE0, 0x22, 0x90, 0x85, 0x3E, 0xE0, 0x60, 0x09, 0x90, 0x01, 0xB9, 0x74, 0x40, 0xF0, 0x02, +0x48, 0x86, 0xE5, 0x4F, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x02, 0x80, 0x2F, 0x90, 0x85, 0x65, +0xE0, 0x60, 0x67, 0x80, 0x5D, 0x12, 0x50, 0xFB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, +0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x51, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, +0xF0, 0x80, 0x53, 0xE5, 0x4F, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, +0x04, 0xF0, 0x80, 0x42, 0xE5, 0x51, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, +0x35, 0xE5, 0x51, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x28, 0x90, 0x85, +0x5B, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, 0x85, 0x65, 0xE0, +0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, +0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0xE4, +0x90, 0x85, 0x76, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x85, 0x76, 0xF0, 0xE0, 0x54, 0xC0, 0x70, +0x18, 0x90, 0x85, 0x6A, 0xE0, 0x70, 0x03, 0x53, 0x51, 0xFE, 0x53, 0x51, 0xFD, 0x90, 0x85, 0x2D, +0xE0, 0x20, 0xE0, 0x14, 0x12, 0x51, 0x63, 0x80, 0x0F, 0x90, 0x85, 0x56, 0xE0, 0x60, 0x09, 0x90, +0x85, 0x6F, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x15, 0x90, 0x85, 0x76, 0xE0, 0x30, 0xE6, 0x1B, 0x43, +0x51, 0x01, 0x90, 0x85, 0x72, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x4E, 0x64, 0x0C, 0x60, 0x13, +0x12, 0x50, 0xA5, 0x80, 0x0E, 0x12, 0x4F, 0xD4, 0x80, 0x09, 0x90, 0x85, 0x6A, 0xE0, 0x70, 0x03, +0x53, 0x51, 0xFE, 0xE4, 0x90, 0x85, 0x6A, 0xF0, 0x90, 0x85, 0x76, 0xE0, 0x30, 0xE7, 0x2A, 0x43, +0x51, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x64, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x73, 0x74, 0x01, +0xF0, 0x90, 0x85, 0x32, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x53, 0x51, 0xFD, 0x22, 0x8E, 0x25, 0x8F, +0x26, 0xAD, 0x26, 0xAC, 0x25, 0xAF, 0x24, 0x12, 0x47, 0x48, 0xAF, 0x26, 0xAE, 0x25, 0x90, 0x04, +0x80, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, +0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, +0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, +0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, +0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x5C, 0x8D, +0x5D, 0xE5, 0x5C, 0x54, 0x0F, 0xFF, 0xE5, 0x4E, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x5C, 0x30, +0xE2, 0x30, 0xE5, 0x4E, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x50, 0xE1, 0xE5, 0x4E, 0x30, 0xE3, +0x10, 0xE5, 0x5C, 0x20, 0xE3, 0x0B, 0x12, 0x4C, 0xB2, 0xEF, 0x60, 0x53, 0x12, 0x51, 0x14, 0x80, +0x4E, 0xE5, 0x4E, 0x20, 0xE3, 0x49, 0xE5, 0x5C, 0x30, 0xE3, 0x44, 0xAF, 0x5D, 0x12, 0x50, 0xC6, +0x80, 0x3D, 0xE5, 0x4E, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x5C, 0x20, 0xE3, 0x09, 0x12, +0x4C, 0xB2, 0xEF, 0x60, 0x2A, 0x12, 0x51, 0x14, 0xE5, 0x4E, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, +0xE5, 0x5C, 0x20, 0xE2, 0x09, 0x12, 0x47, 0xEC, 0xEF, 0x60, 0x14, 0x12, 0x50, 0x7C, 0xE5, 0x4E, +0x54, 0x0F, 0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4B, 0x54, 0xEF, 0x60, 0x03, 0x12, 0x51, 0x44, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x02, 0x4A, 0x92, 0x02, 0x52, 0x40, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, +0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, +0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, +0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, +0x40, 0x80, 0x90, 0x4E, 0xD2, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, +0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, +0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, +0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, +0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x7D, 0x78, 0x7F, 0x02, +0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, 0x01, 0x36, 0x74, 0x03, 0xF0, +0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x01, 0x57, +0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x49, 0xC2, 0x90, 0x06, 0x04, 0xE0, 0x54, +0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B, 0xF0, +0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, +0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, +0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4E, 0x85, 0xE5, 0x4D, 0x20, 0xE0, 0x05, 0xE4, 0x90, +0x85, 0x5B, 0xF0, 0x22, 0x90, 0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x10, 0x12, 0x50, 0xFB, 0xEF, 0x64, +0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x5C, 0xE5, 0x14, 0x60, 0x08, 0x90, +0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x50, 0xE5, 0x4F, 0x54, 0x0F, 0xD3, 0x94, 0x01, 0x40, 0x08, +0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x3F, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x08, 0x90, 0x01, +0xB9, 0x74, 0x04, 0xF0, 0x80, 0x31, 0x90, 0x01, 0xAF, 0xE0, 0x60, 0x02, 0x80, 0x07, 0x90, 0x02, +0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, 0x90, 0x85, 0x5C, +0xE0, 0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, +0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, +0xE5, 0x4D, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x50, 0x60, 0x67, 0xE5, 0x50, 0x64, 0x02, 0x60, 0x06, +0xE5, 0x50, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x85, 0x59, 0xF0, 0x90, 0x06, +0xAA, 0xE0, 0x90, 0x85, 0x70, 0xF0, 0x90, 0x85, 0x59, 0xE0, 0x70, 0x07, 0x90, 0x85, 0x70, 0xE0, +0xFF, 0x80, 0x05, 0x90, 0x85, 0x59, 0xE0, 0xFF, 0x90, 0x85, 0x59, 0xEF, 0xF0, 0x90, 0x85, 0x5B, +0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x85, 0x5A, 0xF0, 0x90, 0x85, 0x71, 0xF0, 0x90, 0x05, +0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x53, +0x51, 0xFD, 0x53, 0x51, 0xEF, 0xE5, 0x50, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x48, +0x8F, 0x22, 0x90, 0x85, 0xC3, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, 0x90, 0x85, 0xC3, +0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0xE4, 0xFD, 0x7F, 0x93, 0x12, 0x53, 0x26, 0x90, 0x00, +0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x53, 0x26, 0x90, 0x00, 0x28, 0xE0, 0x54, 0xFC, +0xFD, 0x7F, 0x28, 0x12, 0x53, 0x26, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, +0x53, 0x26, 0x7F, 0x01, 0x12, 0x4D, 0xDE, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, 0xFD, 0xE4, 0xFF, +0x12, 0x53, 0x26, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, 0x53, 0x26, 0x90, +0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x53, 0x26, 0x7F, 0x14, 0x7E, 0x00, 0x02, +0x3B, 0x09, 0x90, 0x85, 0x2D, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x85, 0x32, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x49, 0x12, 0x50, 0xFB, 0xEF, +0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, 0x85, 0x6E, 0xE0, +0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x85, 0x6B, 0xE0, 0x60, 0x08, +0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x4F, 0x54, 0x0F, 0xD3, 0x94, 0x04, 0x40, +0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, +0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x85, +0xA1, 0x12, 0x44, 0x89, 0x12, 0x51, 0x57, 0x90, 0x85, 0xA1, 0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, +0xF5, 0x50, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, 0x70, 0x44, 0x7F, +0x01, 0x80, 0x3D, 0x90, 0x85, 0xA1, 0x12, 0x44, 0x69, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, +0xE4, 0xFF, 0x12, 0x4F, 0x96, 0x80, 0x29, 0x90, 0x85, 0xA1, 0x12, 0x44, 0x69, 0x90, 0x00, 0x02, +0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x4F, 0x96, 0x1F, 0x80, 0x14, 0x90, 0x85, 0xA1, 0x12, +0x44, 0x69, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x4F, 0x96, 0xE4, 0xFF, +0x12, 0x4A, 0xD7, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x24, 0x90, 0x85, 0x56, +0xE0, 0x60, 0x09, 0x90, 0x85, 0x6F, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x15, 0x90, 0x04, 0x1D, 0xE0, +0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x27, 0x74, 0xFF, 0xF0, 0x12, 0x5E, 0x51, 0xBF, 0x01, +0x0D, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x2E, 0x12, 0x49, 0x2D, 0x90, 0x05, +0x22, 0xE5, 0x27, 0xF0, 0x80, 0x0D, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x2E, +0x12, 0x49, 0x2D, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x60, +0xE4, 0x90, 0x86, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, +0x7F, 0x01, 0xEF, 0x65, 0x60, 0x60, 0x3E, 0xC3, 0x90, 0x86, 0x45, 0xE0, 0x94, 0x88, 0x90, 0x86, +0x44, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x86, +0x44, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xF7, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, +0x90, 0x86, 0x45, 0xE0, 0x94, 0x32, 0x90, 0x86, 0x44, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, +0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, 0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x20, 0x12, +0x53, 0x26, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, 0x54, 0xDF, 0xFD, +0xE4, 0xFF, 0x12, 0x53, 0x26, 0x90, 0x00, 0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, 0x28, 0x12, 0x53, +0x26, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x53, 0x26, 0xE4, 0xFF, 0x12, +0x4D, 0xDE, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, 0x44, 0xC0, 0xFD, +0x7F, 0x29, 0x02, 0x53, 0x26, 0xE4, 0xFF, 0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, 0x22, 0xE0, 0x30, +0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, 0xE3, 0x13, 0x7F, +0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, 0x02, 0x80, 0x02, +0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x85, 0x67, 0xE0, 0x9D, 0x90, 0x85, 0x66, 0xE0, 0x94, 0x00, +0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x85, 0x66, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, +0xF0, 0x22, 0x48, 0x85, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x85, 0xA9, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x85, 0xB1, 0x00, 0x41, 0x85, 0xC0, 0x00, +0x41, 0x85, 0xA6, 0x00, 0x41, 0x86, 0x4C, 0x00, 0x41, 0x85, 0x2B, 0x00, 0x41, 0x85, 0x2C, 0x00, +0x41, 0x84, 0x01, 0x00, 0x41, 0x84, 0x02, 0x00, 0x41, 0x84, 0x00, 0x00, 0x41, 0x86, 0x3D, 0x00, +0x41, 0x86, 0x4A, 0x00, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x6F, 0x74, +0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x86, 0x31, 0x12, 0x1F, 0xC9, 0x90, +0x86, 0x31, 0x12, 0x44, 0x45, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x86, 0x31, 0x12, 0x1F, 0xC9, 0x90, +0x86, 0x31, 0x12, 0x44, 0x45, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, +0x34, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x50, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x35, +0x90, 0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x2E, 0x90, 0x85, 0x56, 0xE0, 0x60, 0x09, 0x90, 0x85, 0x6F, +0xE0, 0x70, 0x03, 0x12, 0x4F, 0x15, 0x12, 0x84, 0xC4, 0x90, 0x85, 0x72, 0xE0, 0x60, 0x06, 0x7D, +0x01, 0x7F, 0x0C, 0x80, 0x0D, 0xE5, 0x4E, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, +0x7F, 0x04, 0x12, 0x49, 0xC6, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, 0x24, 0x02, 0x70, +0x32, 0x80, 0x0A, 0x90, 0x85, 0x70, 0x74, 0x01, 0xF0, 0x90, 0x85, 0x59, 0xF0, 0xE4, 0x90, 0x85, +0x75, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x85, 0x69, 0xE0, 0x90, 0x85, 0x70, 0xF0, 0x80, 0x05, +0x90, 0x85, 0x70, 0xED, 0xF0, 0x90, 0x85, 0x70, 0xE0, 0x90, 0x85, 0x59, 0xF0, 0x90, 0x85, 0x75, +0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, +0xF5, 0x48, 0x90, 0x85, 0x5E, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, +0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x85, +0x6B, 0x14, 0xF0, 0xE5, 0x4E, 0x54, 0x0F, 0xC3, 0x94, 0x0C, 0x50, 0x03, 0x12, 0x49, 0xC2, 0x22, +0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, +0x90, 0x85, 0x57, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, 0xFF, 0x74, 0x40, +0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x90, 0x85, +0x6D, 0xF0, 0xEE, 0x90, 0x85, 0x6C, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x85, 0xC2, 0xE0, 0x90, +0x86, 0x35, 0x60, 0x0B, 0x80, 0x12, 0x90, 0x85, 0xC2, 0xE0, 0x90, 0x86, 0x35, 0x60, 0x09, 0x12, +0x1F, 0xD5, 0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x01, 0x10, 0x7B, +0x01, 0x7A, 0x86, 0x79, 0x35, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x55, 0x11, 0x90, 0x01, 0x37, 0x74, +0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x5E, 0x51, 0xEF, 0x70, 0x06, 0x90, 0x01, +0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x12, 0x54, 0x08, 0x53, 0x4E, +0xF0, 0x43, 0x4E, 0x02, 0x22, 0x90, 0x85, 0x5F, 0xE0, 0x70, 0x1A, 0x90, 0x04, 0x1D, 0xE0, 0x70, +0x14, 0x90, 0x85, 0xBB, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, 0x2E, 0x8E, 0x5E, 0x8F, 0x5F, 0x90, +0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, +0xE5, 0x4D, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4D, 0x84, 0x53, 0x4E, 0xF0, 0x43, 0x4E, 0x0C, +0x22, 0x90, 0x86, 0x4D, 0xEF, 0xF0, 0x12, 0x66, 0x8A, 0x90, 0x86, 0x4D, 0xE0, 0x60, 0x05, 0x90, +0x05, 0x22, 0xE4, 0xF0, 0x53, 0x4E, 0xF0, 0x43, 0x4E, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, +0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, +0x02, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x4D, 0xB4, 0x01, 0x05, +0x7F, 0x01, 0x12, 0x4D, 0x84, 0x53, 0x4E, 0xF0, 0x43, 0x4E, 0x04, 0x22, 0xE5, 0x4F, 0x30, 0xE6, +0x12, 0xE5, 0x4F, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, +0x53, 0x4F, 0xBF, 0x22, 0x53, 0x4E, 0xF0, 0x43, 0x4E, 0x01, 0x12, 0x4C, 0x42, 0x12, 0x4E, 0x36, +0x53, 0x4E, 0xF0, 0x43, 0x4E, 0x02, 0x22, 0xE4, 0x90, 0x85, 0x73, 0xF0, 0x90, 0x85, 0x5A, 0xF0, +0xF5, 0x51, 0x22, 0x7D, 0x01, 0xAF, 0x4F, 0x02, 0x49, 0xC6, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xA3, +0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, 0x44, 0xB8, 0x51, 0x95, 0x00, +0x40, 0x51, 0xBD, 0x00, 0x80, 0x51, 0xE8, 0x01, 0x00, 0x51, 0xFC, 0x02, 0x00, 0x52, 0x14, 0x04, +0x00, 0x00, 0x00, 0x52, 0x31, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, +0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, 0xCE, 0xC3, 0x13, 0xCE, 0x13, +0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x80, 0x26, 0xED, 0x54, 0x7F, +0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, +0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x07, 0xC3, 0x33, 0xCE, 0x33, +0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, +0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, 0x35, 0xEC, 0x54, 0x01, 0x4D, +0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0xC3, 0x13, +0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x04, +0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, 0x00, 0x25, 0xE0, 0x25, 0xE0, +0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x22, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, +0xE4, 0x90, 0x85, 0x8C, 0xF0, 0xA3, 0xF0, 0x12, 0x60, 0xEF, 0x75, 0x8E, 0x02, 0x91, 0xDA, 0x12, +0x60, 0x4D, 0x90, 0x85, 0xC3, 0xEF, 0xF0, 0x12, 0x60, 0x60, 0x90, 0x85, 0xC5, 0xEF, 0xF0, 0x12, +0x60, 0x6C, 0x90, 0x85, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x14, 0xF5, 0x09, 0xF5, +0x4D, 0x90, 0x85, 0xC2, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x46, 0x90, 0x12, +0x37, 0x1C, 0x12, 0x77, 0x6C, 0x71, 0x3B, 0x12, 0x60, 0x11, 0x12, 0x60, 0x84, 0xF1, 0xEF, 0x12, +0x60, 0x2F, 0x12, 0x45, 0x02, 0x12, 0x60, 0xF7, 0x91, 0xC2, 0x90, 0x85, 0x8E, 0xE5, 0xD9, 0xF0, +0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x71, 0x99, 0x75, 0xE8, 0x03, 0x43, 0xA8, +0x85, 0x12, 0x83, 0x81, 0xD2, 0xAF, 0x51, 0x36, 0x12, 0x60, 0x99, 0x7D, 0xDD, 0x7F, 0x8F, 0x71, +0x26, 0x90, 0x85, 0x8C, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x40, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, +0xA3, 0xF0, 0xE5, 0x14, 0x30, 0xE0, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0xFE, 0x91, 0xEA, 0xD2, 0xAF, +0xE5, 0x14, 0x30, 0xE4, 0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xEF, 0xD2, 0xAF, 0x12, 0x76, 0x1E, 0xE5, +0x14, 0x30, 0xE7, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0x7F, 0xD2, 0xAF, 0xB1, 0x78, 0xC2, 0xAF, 0xE5, +0x4F, 0x54, 0x0F, 0xFF, 0xBF, 0x01, 0x0D, 0x90, 0x85, 0x5C, 0x74, 0x01, 0xF0, 0x31, 0x63, 0xE4, +0x90, 0x85, 0x5C, 0xF0, 0xD2, 0xAF, 0x90, 0x01, 0xBD, 0xE5, 0x4E, 0xF0, 0x90, 0x85, 0x72, 0xE0, +0x90, 0x01, 0xBC, 0xF0, 0x80, 0x9B, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, +0x83, 0x00, 0xED, 0xF0, 0x71, 0x99, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x3C, 0x74, 0xFF, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, +0x7F, 0x54, 0x71, 0x26, 0x7D, 0xFF, 0x7F, 0x55, 0x71, 0x26, 0x7D, 0xFF, 0x7F, 0x56, 0x71, 0x26, +0x7D, 0xFF, 0x7F, 0x57, 0x80, 0xC0, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x71, 0x26, +0xE4, 0xFD, 0x7F, 0x51, 0x71, 0x26, 0xE4, 0xFD, 0x7F, 0x52, 0x71, 0x26, 0xE4, 0xFD, 0x7F, 0x53, +0x80, 0x94, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8E, 0x53, 0x8F, 0x54, 0x8B, 0x55, 0x8A, +0x56, 0x89, 0x57, 0xE4, 0x90, 0x86, 0x4E, 0xF0, 0xEF, 0x90, 0x00, 0x31, 0xF0, 0x71, 0x99, 0xE5, +0x53, 0x54, 0x03, 0xFF, 0x90, 0x00, 0x32, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0x71, 0x99, 0x90, 0x00, +0x33, 0xE0, 0x54, 0x7F, 0xF0, 0x71, 0x99, 0x90, 0x00, 0x33, 0xE0, 0x20, 0xE7, 0x0E, 0x90, 0x86, +0x4E, 0xE0, 0xC3, 0x94, 0x64, 0x50, 0x05, 0xE0, 0x04, 0xF0, 0x80, 0xEB, 0x90, 0x86, 0x4E, 0xE0, +0xC3, 0x94, 0x64, 0x50, 0x10, 0x90, 0x00, 0x30, 0xE0, 0xAB, 0x55, 0xAA, 0x56, 0xA9, 0x57, 0x12, +0x43, 0xC3, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x85, 0xF7, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x85, 0xFB, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x00, 0x00, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x71, 0x99, 0x71, 0x92, 0x90, 0x00, +0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, +0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x85, 0x63, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, +0x74, 0x01, 0xF0, 0x90, 0x85, 0x56, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x85, 0x6F, 0xF0, 0xFF, 0x7E, +0x08, 0x12, 0x2C, 0x6E, 0x90, 0x85, 0xF7, 0x12, 0x1F, 0xC9, 0x90, 0x85, 0xF7, 0x12, 0x44, 0x45, +0xEC, 0x54, 0xFD, 0xFC, 0x90, 0x85, 0xF7, 0x12, 0x1F, 0xC9, 0x90, 0x85, 0xF7, 0x12, 0x44, 0x45, +0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x85, 0x60, +0xE0, 0x60, 0x22, 0xE4, 0xFF, 0x11, 0x48, 0x90, 0x85, 0x74, 0xE0, 0x60, 0x12, 0x90, 0x85, 0xFB, +0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xFB, 0xB1, 0x0D, 0x90, +0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x85, 0x6A, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0x86, 0x3E, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x86, 0x40, 0xF0, 0x90, 0x86, +0x3E, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x85, 0xBF, 0xF0, 0x90, +0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x61, 0x26, 0xE4, 0x7B, 0x01, 0x7A, 0x84, 0x79, +0x03, 0x12, 0x6D, 0x3F, 0xEF, 0xB4, 0x02, 0x14, 0x90, 0x86, 0x4A, 0xE0, 0x64, 0x04, 0x60, 0x07, +0x43, 0x14, 0x01, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x86, 0x4A, 0xF0, 0x22, 0x7F, 0x70, 0x7E, +0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, +0xEE, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, +0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, +0x01, 0xEE, 0xF0, 0x12, 0x1E, 0xF6, 0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, +0x12, 0x81, 0x7E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x84, 0x9C, 0xE0, 0xC3, 0x13, 0x30, 0xE0, +0x16, 0xEF, 0x7B, 0x01, 0xB4, 0x01, 0x06, 0x7A, 0x84, 0x79, 0xA3, 0x80, 0x04, 0x7A, 0x84, 0x79, +0x9F, 0x7F, 0x80, 0x7E, 0x08, 0xB1, 0x11, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, +0x97, 0xEF, 0x60, 0x4E, 0x90, 0x84, 0x01, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x06, 0xF9, 0x74, +0x84, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, +0x08, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xFA, 0x90, 0x86, 0x18, 0x12, 0x44, 0x89, 0xD0, 0x01, 0xD0, +0x02, 0xB1, 0xD7, 0x90, 0x84, 0x01, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0x90, +0x84, 0x02, 0xE0, 0xFF, 0x90, 0x84, 0x01, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, +0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x86, +0x15, 0x12, 0x44, 0x89, 0x90, 0x84, 0x00, 0xE0, 0x90, 0x00, 0x01, 0x12, 0x43, 0xD5, 0xF1, 0x97, +0xEF, 0x70, 0x02, 0xC1, 0x92, 0x90, 0x86, 0x15, 0x12, 0x44, 0x69, 0x8B, 0x20, 0x8A, 0x21, 0x89, +0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0xD1, 0x97, 0x90, 0x86, 0x18, 0x12, +0x44, 0x69, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x86, 0x15, 0x12, 0x44, 0x69, 0x12, 0x1E, +0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0xD1, 0x97, 0x90, +0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, 0x85, 0xC3, 0xE0, 0x64, 0x01, 0x70, 0x48, 0x90, 0x86, 0x15, +0x12, 0x44, 0x69, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0xFD, +0x79, 0x20, 0xD1, 0x97, 0x90, 0x86, 0x18, 0x12, 0x44, 0x69, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, +0x90, 0x86, 0x15, 0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, +0x01, 0x7A, 0xFD, 0x79, 0x22, 0xD1, 0x97, 0x90, 0x85, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, +0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x84, 0x00, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, +0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1D, +0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x86, 0x0F, 0x12, 0x44, 0x89, 0xAB, 0x20, 0xAA, 0x21, 0xA9, 0x22, +0x90, 0x86, 0x12, 0x12, 0x44, 0x89, 0xAF, 0x23, 0x15, 0x23, 0xEF, 0x60, 0x1E, 0x90, 0x86, 0x12, +0xE4, 0x75, 0xF0, 0x01, 0x12, 0x44, 0x72, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x86, 0x0F, 0xE4, 0x75, +0xF0, 0x01, 0x12, 0x44, 0x72, 0xEF, 0x12, 0x43, 0xC3, 0x80, 0xDB, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, +0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x86, 0x1B, +0x12, 0x44, 0x89, 0x90, 0x84, 0x02, 0xE0, 0xFF, 0x90, 0x84, 0x01, 0xE0, 0xB5, 0x07, 0x07, 0x7D, +0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x84, 0x01, 0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, +0x60, 0x0B, 0x90, 0x84, 0x01, 0xE0, 0x14, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x0D, 0xF1, 0x97, 0xEF, +0x60, 0x70, 0xB1, 0x78, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x90, 0x84, 0x02, 0xE0, 0x75, 0xF0, +0x0F, 0xA4, 0x24, 0x06, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0x90, 0x86, +0x1B, 0x12, 0x44, 0x69, 0x7E, 0x00, 0x7F, 0x02, 0x12, 0x1E, 0xD0, 0x90, 0x84, 0x02, 0xE0, 0x75, +0xF0, 0x0F, 0xA4, 0x24, 0x08, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, +0x02, 0xC0, 0x01, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x69, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, +0x86, 0x1B, 0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0xD0, 0x01, +0xD0, 0x02, 0xD0, 0x03, 0xD1, 0x97, 0x90, 0x84, 0x02, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, +0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x86, 0x39, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x86, 0x39, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, +0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, 0x90, 0x86, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x86, 0x3B, +0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, +0x86, 0x3B, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xF7, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, +0x80, 0xC6, 0x7F, 0x01, 0x22, 0x8F, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, +0x01, 0x64, 0x74, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xC4, +0x74, 0xF6, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, +0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, 0xE0, +0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3, +0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, 0x2B, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0x54, +0xEF, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x62, +0xE0, 0x54, 0x03, 0x4F, 0x90, 0x85, 0x7E, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x54, 0x3F, 0x25, 0xE0, +0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x85, 0x7F, 0xF0, 0x90, 0x85, +0x7E, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xE4, 0xFF, 0x90, 0x86, 0x21, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, +0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x86, 0x26, +0xF0, 0xD1, 0x4B, 0xBF, 0x01, 0x02, 0x11, 0xFB, 0x90, 0x86, 0x26, 0xE0, 0x90, 0x05, 0x22, 0xF0, +0x80, 0x02, 0x11, 0xFB, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x85, 0xBE, 0xE0, 0xFF, +0x7D, 0x01, 0x11, 0x2E, 0x90, 0x86, 0x24, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x86, +0x21, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x86, 0x2B, 0xF0, 0xEF, 0x60, 0x10, 0x74, +0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0E, 0x74, +0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, +0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x11, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, 0x16, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0xAE, 0x05, 0x74, 0x22, 0x2E, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEB, 0xF0, 0x90, 0x86, 0x2B, 0xE0, 0xFF, 0x74, 0x23, 0x2E, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x85, 0x7A, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, +0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x4A, 0x12, 0x85, 0x10, 0x90, 0x85, 0x3F, 0xE0, 0x64, +0x01, 0x60, 0x02, 0x41, 0xBD, 0x90, 0x85, 0x32, 0xE0, 0x30, 0xE0, 0x18, 0xE0, 0xC3, 0x13, 0x30, +0xE0, 0x02, 0x80, 0x0A, 0x90, 0x85, 0x32, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0xA3, 0xE0, +0x90, 0x85, 0x7A, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x7A, 0xE0, 0x24, 0x03, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, +0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x85, 0x3F, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, +0x03, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, +0x85, 0x2E, 0xE0, 0xFF, 0x90, 0x85, 0x3D, 0xE0, 0xC3, 0x9F, 0x90, 0x85, 0x43, 0xF0, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x30, 0xE0, 0x6E, 0x90, 0x85, 0x43, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, +0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xC8, 0x80, +0x51, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x85, 0x32, 0xE0, 0x54, +0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x49, 0xC6, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x85, 0x34, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, +0xE4, 0x90, 0x85, 0x42, 0xF0, 0x90, 0x85, 0x3F, 0xF0, 0x90, 0x85, 0x35, 0x74, 0x06, 0xF0, 0x90, +0x85, 0x65, 0xE0, 0x60, 0x07, 0x90, 0x85, 0x34, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, +0x6F, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x4A, 0xA1, 0xBB, 0x90, 0x85, 0x3F, +0xE0, 0x64, 0x02, 0x60, 0x02, 0x61, 0x9C, 0x90, 0x85, 0x31, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, +0x30, 0xE0, 0x08, 0xD1, 0x4B, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x08, 0xE4, 0xFF, 0xD1, 0xF5, 0x90, +0x85, 0x32, 0xE0, 0x30, 0xE0, 0x1F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x85, +0x32, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x90, 0x85, 0x7A, 0xF0, 0x90, 0x85, +0x32, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x2E, 0xE0, 0x24, 0x03, 0xFF, 0x90, +0x85, 0x7A, 0xE0, 0x2F, 0xFF, 0x90, 0x85, 0x3D, 0xE0, 0xC3, 0x9F, 0xFF, 0x90, 0x85, 0x7B, 0xE0, +0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, +0x74, 0x05, 0xF0, 0xE4, 0xFF, 0xD1, 0x92, 0x90, 0x85, 0x3F, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0x2D, +0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, +0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x20, 0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x4F, 0x12, 0x49, 0xC6, 0x80, 0x0B, 0xE5, 0x50, +0x60, 0x0D, 0xE4, 0xFD, 0xAF, 0x4F, 0x12, 0x49, 0xC6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, +0x85, 0x30, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, +0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x4A, 0xC1, 0x45, 0x90, 0x85, 0x3F, 0xE0, +0x64, 0x03, 0x60, 0x02, 0x81, 0xF0, 0x7F, 0x01, 0xD1, 0xF5, 0x90, 0x85, 0x31, 0xE0, 0xFF, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x66, 0x8A, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x20, 0xE0, 0x02, 0x81, 0x4C, 0x90, 0x85, 0x37, 0xE0, 0xFF, 0x90, 0x85, 0x41, 0xE0, +0xD3, 0x9F, 0x40, 0x4D, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x85, 0x39, 0xE0, 0xFE, 0xC3, +0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x85, 0x2F, 0xE0, 0xD3, 0x9D, 0xEC, +0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0x85, 0x7D, 0xF0, 0x80, 0x06, +0x90, 0x85, 0x7D, 0x74, 0x03, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x7D, 0xE0, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x85, 0x3F, 0xE0, 0x04, 0xF0, 0x80, +0x24, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x3A, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x85, 0x35, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x85, 0x3F, 0xF0, 0x90, +0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x85, 0x41, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, +0x85, 0x7C, 0xE0, 0xFF, 0x90, 0x85, 0x2F, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, +0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x85, 0x3F, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x63, 0x74, +0x05, 0xF0, 0x7F, 0x01, 0xD1, 0x92, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, +0x2F, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0x85, 0x32, 0xE0, 0x44, +0x20, 0xF0, 0x90, 0x85, 0x65, 0xE0, 0x60, 0x02, 0x80, 0x0F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, +0x01, 0x7F, 0x0C, 0x80, 0x08, 0xE5, 0x50, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x49, 0xC6, +0x90, 0x85, 0x65, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x85, 0x2D, 0xE0, 0xFF, 0x13, 0x13, +0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x50, 0xA5, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x85, 0x30, +0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x4A, 0x7F, 0x01, 0xC1, 0x47, +0x90, 0x85, 0x3F, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xA1, 0xC1, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, +0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x85, +0x3F, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, +0x85, 0x2F, 0xE0, 0xFF, 0x90, 0x85, 0x3D, 0xE0, 0xC3, 0x9F, 0x90, 0x85, 0x43, 0xF0, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x30, 0xE0, 0x6E, 0x90, 0x85, 0x43, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, +0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xC8, 0x80, +0x51, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x85, 0x32, 0xE0, 0x54, +0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x49, 0xC6, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x85, 0x34, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, +0xE4, 0x90, 0x85, 0x42, 0xF0, 0x90, 0x85, 0x3F, 0xF0, 0x90, 0x85, 0x35, 0x74, 0x07, 0xF0, 0x90, +0x85, 0x65, 0xE0, 0x60, 0x07, 0x90, 0x85, 0x34, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, +0x6F, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x4A, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x22, 0x90, 0x85, 0x3F, 0xE0, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x4A, 0x90, 0x85, 0x31, 0xE0, 0xFF, +0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xD1, 0x4B, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x08, 0xE4, +0xFF, 0xD1, 0xF5, 0xD1, 0x92, 0xE4, 0x90, 0x85, 0x3F, 0xF0, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x85, 0x2D, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, +0xE0, 0x14, 0xE4, 0xFD, 0xAF, 0x4F, 0x12, 0x49, 0xC6, 0x80, 0x0B, 0xE5, 0x50, 0x60, 0x0D, 0xE4, +0xFD, 0xAF, 0x4F, 0x12, 0x49, 0xC6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x85, 0x30, 0xE0, +0x30, 0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x13, 0x13, 0x13, +0x54, 0x01, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x55, 0x58, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, +0xF0, 0xE4, 0x90, 0x86, 0x48, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, +0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x86, +0x49, 0xE0, 0x94, 0xE8, 0x90, 0x86, 0x48, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, 0x7F, +0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x86, 0x48, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xF7, +0x80, 0xC6, 0x90, 0x86, 0x2C, 0xEF, 0xF0, 0x12, 0x86, 0xB9, 0x90, 0x85, 0x30, 0xE0, 0xFF, 0xC4, +0x13, 0x54, 0x07, 0x20, 0xE0, 0x08, 0x90, 0x86, 0x2C, 0xE0, 0xFF, 0x12, 0x50, 0x48, 0x90, 0x86, +0x2D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x90, 0x86, 0x2C, 0xE0, 0xB4, 0x01, 0x10, 0x90, +0x85, 0x2D, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x80, 0x0A, 0x90, +0x85, 0x2D, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x86, 0x2D, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x86, 0x79, 0x2D, 0x12, 0x55, 0x0D, 0x90, 0x86, 0x2C, 0xE0, +0x90, 0x85, 0x3E, 0xF0, 0x22, 0xEF, 0x64, 0x03, 0x60, 0x02, 0xE1, 0xC3, 0x90, 0x86, 0x07, 0x74, +0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0x13, 0x13, 0x13, 0x54, +0x1F, 0x30, 0xE0, 0x30, 0x90, 0x86, 0x0B, 0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0xA3, 0x74, +0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, +0x90, 0x86, 0x07, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, +0x55, 0xF0, 0x80, 0x2D, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x17, 0x90, 0x86, +0x07, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, +0xA3, 0x74, 0x5A, 0x80, 0x05, 0x90, 0x86, 0x0B, 0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0x90, 0x86, 0x07, 0xE0, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x86, 0x08, 0xE0, 0x90, 0x06, 0xC1, +0xF0, 0x90, 0x86, 0x09, 0xE0, 0x90, 0x06, 0xC2, 0xF0, 0x90, 0x86, 0x0A, 0xE0, 0x90, 0x06, 0xC3, +0xF0, 0x90, 0x86, 0x0B, 0xE0, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x86, 0x0C, 0xE0, 0x90, 0x06, 0xC5, +0xF0, 0x90, 0x86, 0x0D, 0xE0, 0x90, 0x06, 0xC6, 0xF0, 0x90, 0x86, 0x0E, 0xE0, 0x90, 0x06, 0xC7, +0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x17, +0xE4, 0xF0, 0x22, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEF, 0x90, 0x06, +0xCC, 0xB4, 0x01, 0x03, 0xE4, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x57, 0xF6, 0xBF, 0x01, +0x0F, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x2E, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, 0xE0, 0x02, 0x7D, +0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90, 0x01, 0x30, 0xE5, +0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B, 0xF0, 0x22, 0x75, +0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x43, 0x32, 0x20, 0x90, 0x01, +0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, 0x22, 0x90, 0x00, 0xF4, +0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x00, 0x22, +0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x85, 0xC5, 0xE0, +0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, 0x22, 0x7E, +0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, +0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x85, 0x8F, 0xF0, 0xA3, 0xF0, +0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, +0xC3, 0x90, 0x85, 0x90, 0xE0, 0x94, 0x88, 0x90, 0x85, 0x8F, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, +0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x85, 0x8F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, +0xF7, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x85, 0x90, 0xE0, 0x94, 0x32, 0x90, +0x85, 0x8F, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, +0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, +0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, +0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, +0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, +0x0C, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, +0x85, 0x76, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, +0x60, 0x07, 0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3C, 0x90, 0x85, 0x76, 0x74, 0x01, 0xF0, 0xA3, +0x74, 0x3D, 0xF0, 0x79, 0x40, 0x90, 0x85, 0x76, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, +0x83, 0xE0, 0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x85, 0xB1, 0xF0, 0x22, 0x90, 0x85, 0xB1, +0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0C, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, +0xE0, 0x03, 0x12, 0x5F, 0xDB, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, +0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x96, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x90, 0x01, 0x34, +0xE0, 0x55, 0x28, 0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, +0x2E, 0xA3, 0xE0, 0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x41, 0x65, 0x90, 0x01, +0x34, 0x74, 0x01, 0xF0, 0x85, 0xD1, 0x0A, 0x85, 0xD3, 0x0C, 0x85, 0xD4, 0x0D, 0x85, 0xD5, 0x0E, +0x85, 0xD6, 0x0F, 0x85, 0xD7, 0x10, 0x85, 0xD9, 0x11, 0x85, 0xD2, 0x0B, 0x75, 0x20, 0x00, 0x75, +0x21, 0x00, 0x75, 0x22, 0x0A, 0x75, 0x23, 0x08, 0xFB, 0x7A, 0x85, 0x79, 0xB2, 0x12, 0x56, 0x97, +0xE5, 0x50, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x46, 0x90, 0x85, 0x72, 0xE0, 0x60, 0x37, 0x90, +0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x12, 0x50, 0xFB, 0xEF, 0x64, 0x01, +0x70, 0x2D, 0xF5, 0x48, 0x90, 0x85, 0x5E, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, +0x90, 0x85, 0x6E, 0xF0, 0x80, 0x09, 0x12, 0x50, 0xFB, 0xBF, 0x01, 0x03, 0x12, 0x51, 0x63, 0x90, +0x86, 0x4B, 0xE0, 0x04, 0xF0, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0x07, 0x90, 0x01, 0x34, 0x74, +0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, 0x0B, 0x75, +0x58, 0x88, 0x75, 0x59, 0x0F, 0x75, 0x5A, 0x0F, 0x80, 0x09, 0x75, 0x58, 0xC0, 0x75, 0x59, 0x08, +0x75, 0x5A, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x5A, 0xF5, 0x12, 0x90, 0x04, 0x7E, 0xE0, 0x55, +0x5A, 0xF5, 0x13, 0x65, 0x12, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x12, 0x75, 0xF0, 0x08, 0xA4, 0x25, +0x58, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x15, 0x2F, +0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x15, +0x75, 0x23, 0x08, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xA9, 0x12, 0x56, 0x97, 0x90, 0x85, 0xA9, 0xE0, +0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xB1, 0xBF, 0xE5, 0x12, 0x24, 0x01, +0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x59, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, 0x12, 0x90, +0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x13, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, +0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x14, 0x10, +0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, +0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x53, 0x66, 0x90, +0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x53, 0x99, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x06, +0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x81, 0x0F, 0x90, 0x85, 0xC4, +0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, +0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x12, 0x42, 0x20, 0x90, +0x85, 0x45, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0x06, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, +0x12, 0x50, 0x48, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x85, 0x45, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0xFF, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9F, 0x40, 0x30, 0xE0, 0x54, 0xFE, +0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x90, 0x85, 0x4A, 0x12, 0x44, 0x45, 0x90, 0x81, 0x57, 0x12, 0x1F, +0xC9, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x85, 0x46, 0x12, 0x44, 0x45, 0x90, 0x81, +0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x80, 0x1B, 0x90, 0x85, 0x45, +0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0xFE, +0x25, 0xE0, 0x4F, 0xF0, 0x80, 0x02, 0xD1, 0x14, 0xB1, 0x84, 0x90, 0x85, 0xC4, 0xE4, 0xF0, 0xE5, +0x2E, 0x30, 0xE1, 0x41, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0xF1, 0x0B, 0x31, 0x27, 0x90, 0x85, +0x75, 0xE0, 0x60, 0x1D, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, +0x3A, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x85, 0x70, 0xE0, 0x90, 0x05, 0x73, +0xF0, 0x05, 0x08, 0xE5, 0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, +0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x43, 0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, +0x12, 0x4B, 0xD0, 0x90, 0x85, 0x75, 0xE0, 0x60, 0x34, 0x90, 0x85, 0x70, 0xE0, 0xFF, 0x90, 0x85, +0x59, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x85, 0x70, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, +0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, +0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x85, 0x59, 0xE0, 0x14, 0xF0, 0xE5, 0x2E, 0x30, +0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x4D, 0x64, 0x01, 0x70, 0x28, 0xE5, 0x50, +0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x75, 0x48, 0x00, +0x90, 0x85, 0x64, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, +0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, +0xF0, 0xE5, 0x4D, 0xB4, 0x01, 0x20, 0xE5, 0x50, 0x60, 0x1C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, +0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x85, 0x73, 0xE4, 0xF0, 0x53, 0x51, 0xFD, 0xE5, 0x51, 0x54, +0x07, 0x70, 0x03, 0x12, 0x51, 0x63, 0xE5, 0x2E, 0x30, 0xE5, 0x25, 0x90, 0x01, 0x36, 0x74, 0x20, +0xF0, 0xE5, 0x4D, 0xB4, 0x01, 0x1A, 0xE5, 0x50, 0x60, 0x16, 0x90, 0x85, 0x72, 0xE0, 0x64, 0x02, +0x60, 0x0B, 0xE5, 0x4E, 0x64, 0x0C, 0x60, 0x08, 0x12, 0x50, 0xA5, 0x80, 0x03, 0x12, 0x4F, 0xD4, +0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, 0xF0, 0xE5, 0x4D, 0xB4, 0x01, 0x10, +0xE5, 0x50, 0x60, 0x0C, 0x53, 0x51, 0xFE, 0xE5, 0x51, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x63, +0xE5, 0x2F, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x12, 0x4F, 0x57, 0x74, 0x96, +0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, +0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x86, 0x3E, 0xE0, 0x30, 0xE0, 0x2E, 0xE5, 0x4D, 0xB4, 0x01, 0x29, +0x90, 0x86, 0x3D, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x86, 0x40, 0xE0, 0x04, 0xF0, +0xE4, 0x90, 0x86, 0x3D, 0xF0, 0x90, 0x86, 0x40, 0xE0, 0xFF, 0x90, 0x86, 0x3F, 0xE0, 0xD3, 0x9F, +0x50, 0x07, 0xB1, 0xBA, 0xE4, 0x90, 0x86, 0x40, 0xF0, 0x22, 0xE4, 0xFF, 0x02, 0x4D, 0x84, 0x90, +0x85, 0x76, 0xE0, 0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, +0x00, 0x79, 0x15, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x0B, 0x7A, 0x85, 0x79, 0x76, 0x02, 0x56, +0xE6, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x12, 0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x86, 0x3E, +0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xE0, 0x30, 0xE0, 0x02, 0xB1, 0xBA, 0x90, 0x85, 0x9A, 0x12, 0x44, +0x69, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, +0x86, 0x3F, 0xF0, 0x22, 0x90, 0x85, 0x2D, 0xE0, 0x30, 0xE0, 0x6E, 0x7F, 0x01, 0x12, 0x5E, 0xF5, +0x90, 0x85, 0x31, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xD1, 0x8A, 0x7F, 0x01, +0x12, 0x5E, 0x92, 0x90, 0x85, 0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x29, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0x85, 0x32, 0xE0, 0x44, 0x20, 0xF0, 0x90, +0x85, 0x65, 0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x49, 0xC6, 0x90, 0x85, 0x65, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, +0x74, 0x6F, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x58, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x85, 0xEF, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x85, 0xF3, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, +0xFF, 0xF0, 0x90, 0x85, 0x63, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x85, +0x56, 0xE0, 0x60, 0x14, 0x12, 0x50, 0xFB, 0xBF, 0x01, 0x0B, 0x90, 0x85, 0x2D, 0xE0, 0xFF, 0xC4, +0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0x4F, 0x15, 0x90, 0x85, 0x45, 0xE0, 0x20, 0xE0, 0x24, 0x90, +0x85, 0x60, 0xE0, 0x60, 0x1E, 0x7F, 0x01, 0x12, 0x50, 0x48, 0x90, 0x85, 0x74, 0xE0, 0x60, 0x13, +0x90, 0x85, 0xF3, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xF3, +0x12, 0x55, 0x0D, 0x12, 0x53, 0x92, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x85, 0x76, 0xF0, +0x90, 0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0xE1, 0xAD, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x2A, 0xE4, 0xF5, 0x48, 0x90, 0x85, 0x39, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, +0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x85, +0x35, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x85, 0x41, 0xF0, 0x90, 0x85, 0x3F, 0xF0, 0x80, 0x20, 0xE4, +0xF5, 0x48, 0x90, 0x85, 0x76, 0xE0, 0xFF, 0x90, 0x85, 0x2E, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x85, 0x3F, 0x74, 0x01, 0xF0, 0x90, +0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x3E, 0x74, 0x01, 0xF0, 0x90, 0x85, 0x65, 0xE0, 0x60, +0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x85, 0x2D, 0xE0, 0xFF, 0x13, 0x13, +0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x50, 0xA5, 0xE4, 0x90, 0x86, 0x4B, 0xF0, 0x22, 0xC0, 0xE0, +0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x7D, +0xAE, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0x53, 0x91, 0xEF, 0x90, 0x00, +0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, 0x52, 0xE0, 0xFE, 0x90, +0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, 0x00, 0x55, 0x74, 0x10, +0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, 0xE5, 0x3D, 0x30, 0xE6, +0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, 0x90, 0x00, 0x55, 0x74, +0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, 0xF0, 0xE5, 0x3E, 0x30, +0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, 0x06, 0x90, 0x00, 0x56, +0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, 0x08, 0xF0, 0x90, 0x01, +0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, +0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, +0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, +0xC0, 0x07, 0x75, 0x5B, 0x00, 0x90, 0x01, 0xC4, 0x74, 0x55, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x53, +0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31, 0xF5, 0x35, +0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34, 0x30, 0xE0, +0x06, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0xE5, 0x34, 0x30, 0xE1, 0x10, 0x90, 0x01, 0x3C, 0x74, +0x02, 0xF0, 0x90, 0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x45, 0xD6, 0xE5, 0x34, 0x30, 0xE2, +0x36, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, 0x75, 0x48, +0x00, 0x90, 0x85, 0x5E, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, +0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, +0x85, 0x6E, 0xE4, 0xF0, 0x12, 0x51, 0x63, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, 0x3C, 0x74, +0x08, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x85, 0x5E, 0xE0, +0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, +0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x85, 0x6B, 0xE4, 0xF0, 0x12, +0x51, 0x63, 0xE5, 0x34, 0x30, 0xE4, 0x3C, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x90, 0x85, 0x45, +0xE0, 0x30, 0xE0, 0x24, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0x48, 0x90, +0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, +0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x80, 0x03, 0x12, 0x59, 0xA6, 0x90, 0x85, 0x4E, 0xE0, 0x60, +0x02, 0x51, 0xE8, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, +0x30, 0xE0, 0x18, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xF5, 0x4F, 0x90, +0x01, 0xBB, 0xE5, 0x4F, 0xF0, 0x12, 0x51, 0x2C, 0x12, 0x51, 0x63, 0xE5, 0x35, 0x30, 0xE2, 0x06, +0x90, 0x01, 0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, +0xF0, 0x90, 0x85, 0xC0, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, +0x90, 0x05, 0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x01, +0xF0, 0xE5, 0x36, 0x30, 0xE1, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0xE5, 0x36, 0x30, 0xE3, +0x09, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0x12, 0x84, 0xF2, 0xE5, 0x36, 0x30, 0xE4, 0x06, 0x90, +0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x76, 0x90, 0x01, 0x3E, 0x74, 0x04, 0xF0, +0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE7, 0x13, 0x74, 0x80, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x04, 0xF0, +0xA3, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0xFF, 0x12, 0x55, 0x58, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE6, +0x12, 0x74, 0x40, 0xF0, 0x90, 0x07, 0x7C, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x07, 0x80, 0xE0, 0xFF, +0x12, 0x84, 0x9C, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE5, 0x14, 0x74, 0x20, 0xF0, 0xE4, 0xFF, 0x12, +0x55, 0x58, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, +0x95, 0xE0, 0x30, 0xE2, 0x0D, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0x7F, 0x01, 0x12, +0x55, 0x58, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE0, 0x07, 0x74, 0x01, 0xF0, 0xFF, 0x12, 0x55, 0x58, +0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, 0x30, 0xE6, 0x06, +0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x80, +0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, 0x14, 0x80, 0xE5, +0x37, 0x30, 0xE4, 0x1E, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x45, 0x09, 0x90, 0x85, 0x70, +0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x12, 0x66, 0x14, 0x12, +0x65, 0x84, 0x74, 0x55, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, +0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, +0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x01, 0x63, 0xE4, 0xF0, 0x90, 0x81, 0x57, +0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x7F, 0x01, +0x02, 0x55, 0x58, 0x12, 0x1E, 0xF6, 0x90, 0x85, 0x4E, 0xF0, 0x70, 0x02, 0x51, 0xE8, 0x22, 0x90, +0x85, 0x97, 0x12, 0x44, 0x89, 0xEF, 0x12, 0x44, 0x92, 0x6B, 0xAC, 0x01, 0x6B, 0xA4, 0x02, 0x6B, +0xF3, 0x03, 0x6B, 0xFC, 0x10, 0x6C, 0x04, 0x11, 0x6C, 0x0C, 0x12, 0x6C, 0x14, 0x16, 0x6C, 0x1E, +0x17, 0x6C, 0x28, 0x18, 0x6C, 0x32, 0x19, 0x6C, 0x3B, 0x1D, 0x6C, 0x45, 0x1E, 0x6C, 0x50, 0x21, +0x6C, 0x58, 0x22, 0x6C, 0x60, 0x23, 0x6C, 0x68, 0x24, 0x6C, 0x70, 0x25, 0x6C, 0x78, 0x26, 0x6C, +0x80, 0x27, 0x6C, 0x88, 0x28, 0x6C, 0x90, 0x29, 0x6B, 0xB5, 0x2D, 0x6B, 0xBE, 0x2E, 0x6C, 0x99, +0x2F, 0x6C, 0xF9, 0x30, 0x6C, 0xA9, 0x32, 0x6C, 0xA1, 0x33, 0x6B, 0xD0, 0x34, 0x6C, 0xB1, 0x36, +0x6C, 0xBA, 0x37, 0x6C, 0xC3, 0x38, 0x6C, 0xCB, 0x3A, 0x6B, 0xC7, 0x3B, 0x6C, 0xD4, 0x3E, 0x6C, +0xDC, 0x3F, 0x6C, 0xE5, 0x41, 0x6D, 0x02, 0x46, 0x6B, 0xD8, 0x47, 0x6B, 0xEA, 0x48, 0x6B, 0xE1, +0x49, 0x6D, 0x1C, 0x4B, 0x6D, 0x0B, 0x4E, 0x6C, 0xEE, 0x52, 0x6C, 0xF1, 0x53, 0x6D, 0x13, 0x54, +0x00, 0x00, 0x6D, 0x25, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0xED, 0x90, 0x85, 0x97, 0x12, +0x44, 0x69, 0x02, 0x77, 0x78, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x78, 0x59, 0x90, 0x85, +0x97, 0x12, 0x44, 0x69, 0x02, 0x78, 0xA1, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x78, 0xDA, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0xF3, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x79, +0x0C, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x79, 0xCC, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, +0x02, 0x80, 0xE2, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x79, 0xDD, 0x90, 0x85, 0x97, 0x12, +0x44, 0x69, 0xA1, 0x2D, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xA1, 0x33, 0x90, 0x85, 0x97, 0x12, +0x44, 0x69, 0xA1, 0x39, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x7F, 0x01, 0x80, 0x2F, 0x90, 0x85, +0x97, 0x12, 0x44, 0x69, 0x7F, 0x02, 0x80, 0x25, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x7F, 0x03, +0x80, 0x1B, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x7B, 0x07, 0x90, 0x85, 0x97, 0x12, 0x44, +0x69, 0xE4, 0xFF, 0x80, 0x08, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x7F, 0x04, 0x02, 0x7A, 0x25, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xC1, 0xE5, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xC1, 0xFD, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x15, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x2D, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x45, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x5D, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x75, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0x8D, +0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x7B, 0x3F, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xC1, +0xD6, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0xA5, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, +0xBD, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x7B, 0x67, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, +0x02, 0x7D, 0x1A, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xA1, 0xCC, 0x90, 0x85, 0x97, 0x12, 0x44, +0x69, 0x02, 0x7D, 0x2C, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0xE1, 0xD5, 0x90, 0x85, 0x97, 0x12, +0x44, 0x69, 0x02, 0x80, 0x43, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x80, 0x7E, 0x02, 0x80, +0x97, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x61, 0x03, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, +0x65, 0xE1, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x73, 0xE3, 0x90, 0x85, 0x97, 0x12, 0x44, +0x69, 0xA1, 0xEE, 0x90, 0x85, 0x97, 0x12, 0x44, 0x69, 0x02, 0x80, 0xEA, 0x90, 0x85, 0x97, 0x12, +0x44, 0x69, 0x02, 0x81, 0x6C, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x05, 0x7F, +0x0B, 0x80, 0x10, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0A, 0x7D, 0x01, 0x7F, 0x0D, 0x80, 0x04, 0x7D, +0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x86, 0x41, 0x12, 0x44, 0x89, +0xE4, 0xFE, 0x90, 0x00, 0xA3, 0xE0, 0x54, 0xF8, 0x44, 0x05, 0xF0, 0x90, 0x00, 0xA0, 0xE0, 0x54, +0x0F, 0x64, 0x04, 0x70, 0x5A, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x49, 0x90, 0xFD, 0x50, 0xEF, +0xF0, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0x86, 0x41, 0x12, 0x44, 0x69, 0x8E, +0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, +0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0F, 0x74, 0x52, 0x2E, +0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0x90, 0xFD, 0x58, 0x74, +0x01, 0xF0, 0xFF, 0x80, 0x12, 0x90, 0x01, 0x43, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, 0x08, 0x90, +0x01, 0x42, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x85, 0x9A, 0x12, +0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, +0x7F, 0x23, 0xB1, 0x43, 0xEF, 0xB4, 0x03, 0x05, 0x7F, 0xFF, 0x12, 0x75, 0x82, 0x22, 0x90, 0x85, +0x9A, 0x12, 0x44, 0x89, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x9D, 0x74, 0x0A, +0xF0, 0x90, 0x85, 0x9D, 0xE0, 0xFF, 0x70, 0x02, 0xC1, 0xD1, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, +0x02, 0xC1, 0xC8, 0x90, 0xFD, 0x50, 0x74, 0x86, 0xF0, 0xA3, 0xE4, 0xF0, 0xEF, 0xB4, 0x0A, 0x05, +0xA3, 0x74, 0x10, 0x80, 0x75, 0x90, 0x85, 0x9D, 0xE0, 0xFF, 0xB4, 0x09, 0x0E, 0x90, 0xFD, 0x52, +0x74, 0x0C, 0xF0, 0x90, 0xFD, 0x54, 0x74, 0x83, 0xF0, 0x80, 0x77, 0xEF, 0xB4, 0x08, 0x0D, 0x90, +0xFD, 0x52, 0xE4, 0xF0, 0x90, 0xFD, 0x54, 0x74, 0x1D, 0xF0, 0x80, 0x66, 0xEF, 0xB4, 0x07, 0x07, +0x90, 0xFD, 0x52, 0x74, 0x04, 0x80, 0x43, 0xEF, 0xB4, 0x06, 0x0E, 0x90, 0xFD, 0x52, 0x74, 0x20, +0xF0, 0x90, 0xFD, 0x54, 0x74, 0x70, 0xF0, 0x80, 0x49, 0xEF, 0xB4, 0x05, 0x0E, 0x90, 0xFD, 0x52, +0x74, 0x0C, 0xF0, 0x90, 0xFD, 0x54, 0x74, 0x03, 0xF0, 0x80, 0x37, 0xEF, 0xB4, 0x04, 0x07, 0x90, +0xFD, 0x52, 0x74, 0x24, 0x80, 0x14, 0xEF, 0xB4, 0x03, 0x07, 0x90, 0xFD, 0x52, 0x74, 0x30, 0x80, +0x09, 0xEF, 0xB4, 0x02, 0x0D, 0x90, 0xFD, 0x52, 0x74, 0x28, 0xF0, 0x90, 0xFD, 0x54, 0xE4, 0xF0, +0x80, 0x10, 0xEF, 0xB4, 0x01, 0x0C, 0x90, 0xFD, 0x52, 0x74, 0x10, 0xF0, 0x90, 0xFD, 0x54, 0x74, +0x80, 0xF0, 0x90, 0xFD, 0x53, 0xE4, 0xF0, 0x90, 0xFD, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0x04, 0xF0, 0x90, 0x85, 0x9D, 0xE0, 0x14, 0xF0, 0x7F, 0x46, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xC1, +0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xE9, 0x24, 0x01, 0xF9, 0xE4, 0x3A, +0xFA, 0x7D, 0x04, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, 0x7F, 0x17, 0xA1, 0x43, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, +0x01, 0x7F, 0x18, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, 0x7F, 0x19, 0xA1, 0x43, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, +0x01, 0x7F, 0x1A, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, 0x7F, 0x1B, 0xA1, 0x43, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, +0x01, 0x7F, 0x1C, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x03, 0x7F, 0x1D, 0xA1, 0x43, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, +0x01, 0x7F, 0x1E, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, 0x7F, 0x1F, 0xA1, 0x43, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, +0x01, 0x7F, 0x20, 0xA1, 0x43, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, +0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x7D, 0x01, 0x7F, 0x24, 0xA1, 0x43, 0x12, 0x1E, 0xF6, +0xF5, 0x4D, 0x22, 0x90, 0x85, 0x9A, 0x02, 0x44, 0x89, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x53, 0x91, 0xBF, 0x90, 0xFD, 0x68, 0xE0, 0x20, 0xE0, 0x02, +0x41, 0xB9, 0x90, 0x85, 0xA6, 0xE0, 0x70, 0x16, 0x90, 0x00, 0x2E, 0xE0, 0x90, 0x84, 0xA7, 0xF0, +0x90, 0x00, 0x2D, 0xE0, 0x90, 0x84, 0xA8, 0xF0, 0x90, 0x85, 0xA6, 0x74, 0x01, 0xF0, 0x90, 0xFD, +0x60, 0xE0, 0x54, 0x3F, 0xD3, 0x94, 0x09, 0x50, 0x02, 0x91, 0x92, 0x90, 0xFD, 0x60, 0xE0, 0x64, +0x0E, 0x60, 0x02, 0x01, 0xF9, 0x90, 0x84, 0x9C, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, +0xE0, 0x02, 0x01, 0xF9, 0x90, 0xFD, 0x62, 0xE0, 0x54, 0xC0, 0xFE, 0x90, 0x07, 0x90, 0xE0, 0x54, +0x3F, 0x4E, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x07, 0x91, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, +0x07, 0x92, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x07, 0x93, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x01, +0xF0, 0xEF, 0x20, 0xE0, 0x44, 0x90, 0x84, 0x9C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x19, +0x90, 0x07, 0x78, 0x12, 0x58, 0x8E, 0x90, 0x84, 0x9C, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x49, +0x90, 0x07, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x80, 0x40, 0x90, 0x84, 0x9C, 0xE0, 0xFF, 0xC3, 0x13, +0x30, 0xE0, 0x11, 0xE4, 0xFF, 0x12, 0x55, 0x58, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, +0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, 0x78, 0x80, 0x14, 0x90, 0x84, 0x9C, 0xE0, 0xFF, 0x13, 0x13, +0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x12, 0x58, 0x8E, 0x80, 0x0C, 0xE0, 0x44, 0x10, +0xF0, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x0F, 0x0A, +0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x71, 0x4D, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x15, +0x70, 0x76, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x85, 0x81, 0xF0, 0xE0, 0x30, 0xE6, 0x1C, 0xF4, 0x54, +0x3F, 0x04, 0xFF, 0x90, 0x84, 0xA7, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9F, 0x90, 0x85, 0x80, +0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x20, 0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x84, 0xA7, 0xE0, 0x13, 0x13, +0x54, 0x3F, 0xFF, 0x90, 0x85, 0x81, 0xE0, 0x54, 0x3F, 0x2F, 0x90, 0x85, 0x80, 0xF0, 0xD3, 0x94, +0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0x85, 0x80, 0xE0, 0xFF, 0x90, 0x01, 0xE7, 0xF0, 0xEF, +0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFF, 0x90, 0x85, 0x80, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, +0x90, 0x85, 0x82, 0xF0, 0x90, 0x00, 0x2E, 0xF0, 0xEE, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x84, 0xA8, +0xE0, 0x54, 0x0F, 0x4F, 0x90, 0x00, 0x2D, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x21, 0x07, 0x90, +0xFD, 0x62, 0xE0, 0xFF, 0x51, 0xD4, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x22, 0x02, 0x51, 0xFC, 0x90, +0xFD, 0x60, 0xE0, 0x64, 0x23, 0x70, 0x7A, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x85, 0x44, 0x30, 0xE0, +0x05, 0x74, 0x01, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE1, 0x5B, 0x90, +0x85, 0x45, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x60, 0x7E, 0x08, +0x12, 0x2C, 0x6E, 0x90, 0x85, 0x4A, 0x12, 0x1F, 0xC9, 0xE4, 0xFF, 0x12, 0x50, 0x48, 0x7F, 0x70, +0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x85, 0x46, 0x12, 0x1F, 0xC9, 0x90, 0x81, 0x57, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x01, 0xBE, 0xE0, +0x04, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x85, 0x45, 0x30, 0xE2, 0x08, 0xE0, 0x54, 0x1F, 0x44, +0x20, 0xF0, 0x80, 0x06, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0xFF, 0xB1, +0x82, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x24, 0x02, 0x71, 0x24, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x25, +0x13, 0x90, 0xFD, 0x62, 0xE0, 0x60, 0x0D, 0x90, 0x85, 0x34, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x85, +0x3C, 0x74, 0x04, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x26, 0x04, 0x7F, 0x01, 0x91, 0xFE, 0x90, +0xFD, 0x60, 0xE0, 0xB4, 0x30, 0x07, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0x71, 0x78, 0x90, 0x85, 0x4E, +0xE0, 0x60, 0x4F, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x31, 0x70, 0x47, 0x90, 0xFD, 0x62, 0xE0, 0x30, +0xE0, 0x36, 0x90, 0x01, 0x63, 0xE4, 0xF0, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0xE4, 0xFF, 0x12, 0x50, 0x48, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, +0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0xE4, 0xFF, 0x12, 0x55, 0x58, +0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x80, 0x0A, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE1, 0x03, 0x12, +0x6A, 0xE8, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, +0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xF0, 0xD0, 0xE0, 0x32, 0xAD, 0x07, 0x90, 0x85, 0x83, 0xE0, 0x54, 0xF0, 0x44, 0x09, 0xF0, 0x54, +0x0F, 0x44, 0x10, 0xF0, 0x90, 0x85, 0x85, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x85, 0x90, +0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0x83, 0x02, 0x56, 0xE6, 0x90, 0x00, 0x75, 0xE0, +0x44, 0x01, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0x74, 0x03, 0xF0, +0x7F, 0x02, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0xE4, 0xF0, 0x90, 0x00, 0x75, 0xE0, +0x54, 0xFE, 0xF0, 0x22, 0x90, 0x85, 0x83, 0xE0, 0x54, 0xF0, 0x44, 0x0D, 0xF0, 0x54, 0x0F, 0x44, +0x10, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x85, 0x85, 0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x85, +0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0x83, 0x02, 0x56, 0xE6, 0xAE, 0x07, 0x90, +0x85, 0x83, 0xE0, 0x54, 0xF0, 0x44, 0x04, 0xF0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x85, 0x85, +0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x85, 0x90, 0x86, 0x1E, 0x12, 0x44, +0x89, 0x7A, 0x85, 0x79, 0x83, 0x02, 0x56, 0xE6, 0xAC, 0x07, 0x90, 0x85, 0xDE, 0xE0, 0x44, 0x0F, +0xF0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x85, 0xE0, 0xEC, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, +0xE0, 0x90, 0x85, 0xE1, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0x85, 0xE2, 0xF0, 0x90, 0xFD, 0x64, +0xE0, 0x90, 0x85, 0xE3, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x85, 0xE4, 0xF0, 0x90, 0xFD, 0x66, +0xE0, 0x90, 0x85, 0xE5, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x85, 0xE6, 0xF0, 0x80, 0x11, 0x90, +0x85, 0xE1, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0x7B, 0x01, 0x7A, 0x85, 0x79, 0xE0, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0xDE, +0x02, 0x56, 0xE6, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1E, 0xF6, 0x90, 0x85, 0x9A, +0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x9B, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0x90, 0x85, 0x9C, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x9D, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x9E, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, +0x58, 0xE0, 0x20, 0xE0, 0x14, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x9A, 0x7F, 0x30, 0x91, 0x48, 0x90, +0x85, 0x9A, 0xE0, 0xFB, 0x7D, 0x01, 0xE4, 0x80, 0x07, 0x90, 0x85, 0x9A, 0xE0, 0xFB, 0xE4, 0xFD, +0xFF, 0x71, 0x78, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x85, 0xA1, 0x12, 0x44, 0x89, 0xE4, 0xFE, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x2F, 0x90, 0xFD, +0x50, 0xEF, 0xF0, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0x85, 0xA1, 0x12, 0x44, 0x69, 0x8E, +0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, +0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0x85, 0x83, 0xE0, 0x54, 0xF0, 0x44, 0x0A, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, +0x85, 0x85, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x85, 0x86, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, +0x85, 0x87, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x85, 0x88, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, +0x85, 0x89, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x85, 0x83, 0x30, 0xE6, 0x08, 0xE0, 0x54, 0x0F, +0x44, 0x50, 0xF0, 0x80, 0x16, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, +0x85, 0x8A, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x85, 0x8B, 0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, +0x85, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0x83, 0x02, 0x56, 0xE6, 0xAD, 0x07, +0x90, 0x85, 0x83, 0xE0, 0x54, 0xF0, 0x44, 0x0E, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, +0x90, 0x85, 0x86, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x85, 0x87, 0xF0, 0x90, 0xFD, 0x64, 0xE0, +0x90, 0x85, 0x88, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x85, 0x89, 0xF0, 0x90, 0xFD, 0x66, 0xE0, +0x90, 0x85, 0x8A, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x85, 0x8B, 0xF0, 0xED, 0xB4, 0x01, 0x11, +0x90, 0x85, 0x83, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x85, 0x85, 0x74, 0x01, 0xF0, 0x80, +0x13, 0xED, 0xB4, 0x02, 0x0F, 0x90, 0x85, 0x83, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x85, +0x85, 0x74, 0x02, 0xF0, 0x90, 0x85, 0x83, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x13, 0x7B, 0x01, +0x7A, 0x85, 0x79, 0x85, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0x83, 0x12, 0x56, +0xE6, 0x22, 0xAD, 0x07, 0x90, 0x85, 0xFF, 0xE0, 0x54, 0xF0, 0x44, 0x0C, 0xF0, 0x54, 0x0F, 0xF0, +0x90, 0xFD, 0x62, 0xE0, 0x90, 0x86, 0x01, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x86, 0x02, 0xF0, +0x90, 0xFD, 0x64, 0xE0, 0x90, 0x86, 0x03, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x86, 0x04, 0xF0, +0x90, 0xFD, 0x66, 0xE0, 0x90, 0x86, 0x05, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x86, 0x06, 0xF0, +0xED, 0xB4, 0x02, 0x0B, 0x90, 0x85, 0xFF, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x80, 0x3C, 0xED, +0xB4, 0x04, 0x0B, 0x90, 0x85, 0xFF, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x80, 0x2D, 0xED, 0xF4, +0x70, 0x29, 0x90, 0x85, 0xFF, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x90, 0x85, 0x44, 0xE0, 0x60, +0x08, 0x90, 0x86, 0x01, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x86, 0x01, 0xF0, 0xE4, 0x90, +0x86, 0x02, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x86, 0x79, +0x01, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, 0xFF, 0x02, 0x56, 0xE6, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x85, 0x8F, 0xF0, 0x90, +0x85, 0x8F, 0xE0, 0xFD, 0x70, 0x02, 0xE1, 0x67, 0x90, 0x86, 0x4C, 0xE0, 0xFF, 0x74, 0x01, 0x7E, +0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, +0x70, 0x02, 0xE1, 0x60, 0x90, 0x86, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x44, +0x5D, 0xE0, 0x90, 0x85, 0x90, 0xF0, 0x75, 0x20, 0x01, 0x75, 0x21, 0x85, 0x75, 0x22, 0x90, 0x75, +0x23, 0x01, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x91, 0x12, 0x56, 0x97, 0x90, 0x85, 0x91, 0xE0, 0xFF, +0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x86, 0x4C, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, 0x02, +0x90, 0x00, 0x88, 0x12, 0x44, 0x5D, 0xE0, 0x90, 0x85, 0x92, 0xF0, 0x90, 0x86, 0x4C, 0xE0, 0x75, +0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x44, 0x5D, 0xE0, 0x90, 0x85, 0x93, 0xF0, 0x90, 0x86, 0x4C, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x44, 0x5D, 0xE0, 0x90, 0x85, 0x94, 0xF0, 0x90, +0x86, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x44, 0x5D, 0xE0, 0x90, 0x85, 0x95, +0xF0, 0x90, 0x86, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x44, 0x5D, 0xE0, 0x90, +0x85, 0x96, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x44, 0x5D, 0xE0, +0x90, 0x85, 0x92, 0xF0, 0x90, 0x86, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x44, +0x5D, 0xE0, 0x90, 0x85, 0x93, 0xF0, 0x90, 0x86, 0x4C, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, +0x12, 0x44, 0x5D, 0xE0, 0x90, 0x85, 0x94, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, 0x85, +0x79, 0x92, 0x12, 0x6B, 0x0F, 0x90, 0x85, 0x8F, 0xE0, 0xFF, 0x90, 0x86, 0x4C, 0xE0, 0xFE, 0x74, +0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x85, 0x8F, 0xF0, +0x90, 0x86, 0x4C, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, +0x90, 0x01, 0xCC, 0xF0, 0x90, 0x86, 0x4C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0xC1, 0x2F, +0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x84, 0x01, +0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, +0x85, 0x9A, 0x12, 0x44, 0x69, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x72, 0xF0, 0x90, +0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x55, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, +0x54, 0x01, 0x90, 0x85, 0x56, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x85, 0x60, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x85, 0x5D, 0xF0, 0xEF, 0x13, +0x13, 0x13, 0x54, 0x01, 0x90, 0x85, 0x63, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, +0x54, 0x01, 0x90, 0x85, 0x5F, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x85, 0x74, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x85, 0x62, 0xF0, 0xE0, +0x70, 0x38, 0x90, 0x85, 0x60, 0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0x48, 0x90, 0x85, 0x9D, 0x12, +0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0x48, 0x90, 0x85, 0x9D, +0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x45, 0x90, 0x81, 0x57, +0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x85, 0x56, 0xE0, 0x70, 0x03, +0x12, 0x4F, 0x15, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x12, 0x4D, 0x1E, 0x90, 0x85, 0x72, 0xE0, +0x90, 0x01, 0xE6, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, +0x30, 0xE0, 0x25, 0x12, 0x1E, 0xF6, 0x90, 0x85, 0x61, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, +0x90, 0x85, 0x64, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x85, 0x5E, 0xF0, 0x90, 0x00, 0x03, +0x12, 0x1F, 0x0F, 0x90, 0x85, 0x69, 0xF0, 0x22, 0x90, 0x85, 0x61, 0x74, 0x03, 0xF0, 0x90, 0x85, +0x64, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x5E, 0x74, 0x14, 0xF0, 0x90, 0x85, 0x69, 0x74, 0x05, 0xF0, +0x22, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x85, 0x68, 0xF0, 0x90, +0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x85, 0x66, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, +0x90, 0x85, 0x68, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x66, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, +0x85, 0x66, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x85, 0x65, +0xF0, 0x60, 0x20, 0x90, 0x85, 0x2D, 0xE0, 0x20, 0xE0, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x49, +0xC6, 0x90, 0x85, 0x56, 0xE0, 0x60, 0x09, 0x90, 0x85, 0x6F, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x15, +0x12, 0x44, 0xE5, 0x90, 0x85, 0x65, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0xFF, +0x54, 0x80, 0xFE, 0x90, 0x85, 0x4F, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xFF, 0xE0, +0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x70, 0xFF, 0x90, 0x85, 0x4F, 0xE0, 0x54, 0x8F, +0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x51, 0xF0, 0x90, 0x00, 0x03, 0x12, +0x1F, 0x0F, 0x90, 0x85, 0x52, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x53, 0xF0, +0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x43, 0x90, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xD3, +0x94, 0x20, 0x50, 0x08, 0x90, 0x85, 0x50, 0x74, 0x01, 0xF0, 0x80, 0x57, 0xEF, 0xD3, 0x94, 0x40, +0x50, 0x08, 0x90, 0x85, 0x50, 0x74, 0x02, 0xF0, 0x80, 0x49, 0xEF, 0xD3, 0x94, 0x60, 0x50, 0x08, +0x90, 0x85, 0x50, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0x85, +0x50, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, 0x94, 0xA0, 0x50, 0x08, 0x90, 0x85, 0x50, 0x74, +0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, 0x50, 0x08, 0x90, 0x85, 0x50, 0x74, 0x06, 0xF0, +0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x85, 0x50, 0x50, 0x05, 0x74, 0x07, 0xF0, 0x80, 0x03, +0x74, 0x08, 0xF0, 0x90, 0x85, 0x50, 0xE0, 0x90, 0x85, 0x54, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x60, +0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x02, 0x09, +0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x85, 0xBA, 0xF0, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x85, 0xBB, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x85, 0xBC, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0xED, +0x2F, 0x90, 0x85, 0xBD, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xAE, 0x05, 0xED, 0x2F, +0x90, 0x85, 0xBE, 0xF0, 0x22, 0xEF, 0x70, 0x21, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x14, 0x90, 0x00, +0x40, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x01, 0xF0, +0x80, 0x07, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x6A, 0x12, 0x1E, +0xF6, 0x90, 0x00, 0x01, 0x30, 0xE0, 0x2E, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x00, +0x02, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, +0xC2, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC3, 0xF0, 0x90, 0x06, 0xCC, 0xE0, +0x54, 0xFE, 0xF0, 0x80, 0x2C, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x00, 0x02, 0x12, +0x1F, 0x0F, 0x90, 0x06, 0xC5, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC6, 0xF0, +0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x01, +0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x02, 0xF0, 0xEF, 0xB4, 0x02, 0x11, 0x12, 0x1E, 0xF6, 0x90, +0x06, 0xC8, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC9, 0xF0, 0xEF, 0xB4, 0x03, +0x11, 0x12, 0x1E, 0xF6, 0x90, 0x06, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, +0xCB, 0xF0, 0xEF, 0x64, 0x04, 0x70, 0x1F, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x07, 0x83, 0x30, 0xE0, +0x06, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0x6F, 0xF0, 0xEF, 0x30, 0xE1, 0x07, 0x90, +0x07, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, +0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, 0x90, 0x84, 0x03, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, +0x90, 0x84, 0x04, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x84, 0x05, 0xF0, 0x90, 0x85, +0x9A, 0x12, 0x44, 0x69, 0x12, 0x6D, 0x3F, 0xEF, 0xB4, 0x02, 0x03, 0x43, 0x14, 0x01, 0x22, 0x12, +0x1E, 0xF6, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x1F, 0xB6, 0xA8, 0x04, 0xA9, 0x05, +0xAA, 0x06, 0xAB, 0x07, 0x90, 0x84, 0xA3, 0x12, 0x44, 0x45, 0xEC, 0x54, 0x03, 0xFC, 0x12, 0x44, +0x1A, 0x90, 0x84, 0x9F, 0x02, 0x1F, 0xC9, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xBC, +0xF0, 0xEF, 0x30, 0xE0, 0x5C, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x4E, 0x90, 0xFD, 0x50, 0x74, +0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x52, 0xF0, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x53, 0xF0, 0xA3, 0xE4, 0xF0, 0x12, 0x1E, 0xF6, +0xC3, 0x13, 0x90, 0xFD, 0x55, 0x30, 0xE0, 0x05, 0x74, 0xA0, 0xF0, 0x80, 0x03, 0x74, 0xC0, 0xF0, +0x90, 0xFD, 0x56, 0x74, 0x10, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, +0xA3, 0x74, 0x06, 0xF0, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x01, +0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x7C, 0x00, +0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFC, 0x74, +0x20, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x85, 0x9A, 0xEF, 0xF0, 0xEE, 0xF9, 0x90, 0x01, 0xBD, +0xE0, 0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xEC, 0xC3, +0x99, 0x50, 0x43, 0xEC, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x02, 0xE4, 0xFD, 0xED, 0xC3, 0x94, 0x20, +0x50, 0x07, 0xAF, 0x05, 0x91, 0x6E, 0x0D, 0x80, 0xF3, 0x0C, 0x90, 0xFD, 0x10, 0xE0, 0x04, 0xF0, +0xEC, 0xB5, 0x01, 0xDA, 0xE4, 0xFD, 0xED, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0x85, 0x9A, 0xE0, +0xFB, 0xC3, 0xEF, 0x9B, 0x74, 0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x07, 0xAF, 0x05, 0x91, 0x6E, +0x0D, 0x80, 0xE3, 0x0C, 0x80, 0xB8, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x81, 0x12, +0x53, 0x26, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, +0x58, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0xF1, 0xEF, 0x75, 0xF0, +0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, +0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, +0xFD, 0x51, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x90, 0xFD, 0x52, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x53, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x54, 0xF0, 0xEF, 0x75, 0xF0, 0x08, +0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x55, 0xF0, 0xEF, +0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, +0x56, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x90, 0xFD, 0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0xFE, 0x10, +0x60, 0x05, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x9E, 0x12, 0x44, 0x89, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, +0x90, 0x85, 0x2D, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, +0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x85, 0x2D, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, +0xEF, 0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x20, 0xFE, +0x90, 0x85, 0x2D, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, +0xF0, 0x12, 0x1E, 0xF6, 0xFC, 0x54, 0x80, 0xFF, 0x90, 0x85, 0x2D, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, +0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFD, 0x54, 0x01, 0xFF, 0x90, 0x85, 0x30, 0xE0, 0x54, 0xFE, +0x4F, 0xF0, 0xED, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0xFD, 0x54, 0x04, 0xFF, 0x90, 0x85, 0x30, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x10, +0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, +0x90, 0x85, 0x30, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, +0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x80, 0xFF, 0x90, 0x85, 0x30, 0xE0, 0x54, 0x7F, +0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x85, 0x31, 0xE0, +0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x85, 0x31, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, +0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, +0x04, 0xFE, 0x90, 0x85, 0x31, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, +0xF7, 0x4F, 0xF0, 0xEC, 0x20, 0xE0, 0x02, 0xE1, 0xA6, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x13, 0x90, +0x85, 0x3D, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0x85, 0x9E, +0x12, 0x44, 0x69, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x2E, 0xF0, 0x90, 0x00, 0x02, +0x12, 0x1F, 0x0F, 0x90, 0x85, 0x2F, 0xF0, 0x80, 0x4E, 0x90, 0x85, 0x9E, 0x12, 0x44, 0x69, 0x90, +0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, +0x85, 0x2E, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x85, 0x2E, +0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, +0xC3, 0x94, 0x03, 0x90, 0x85, 0x2F, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, +0x06, 0x90, 0x85, 0x2F, 0x74, 0x2A, 0xF0, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x30, 0xE0, 0x3D, 0x90, 0x85, 0x2E, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x85, 0x36, 0xF0, 0xE0, +0xC3, 0x13, 0xA3, 0xF0, 0x90, 0x85, 0x2F, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x85, 0x38, 0xF0, +0x90, 0x85, 0x2E, 0xE0, 0xC3, 0x13, 0x90, 0x85, 0x39, 0xF0, 0x90, 0x85, 0x2F, 0xE0, 0xC3, 0x13, +0x90, 0x85, 0x3A, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, +0xE4, 0x90, 0x84, 0xA9, 0xF0, 0x90, 0x85, 0x9E, 0x12, 0x44, 0x69, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x14, 0x12, 0x1E, 0xF6, 0x13, 0x13, 0x13, 0x54, +0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x80, 0x02, 0xE4, 0xFF, 0x12, 0x50, 0x48, 0x90, 0x85, 0x2D, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x18, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, +0xE0, 0x03, 0x75, 0x4F, 0x04, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, +0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x85, 0x35, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x85, 0x3F, 0x74, +0x01, 0xF0, 0x80, 0x2B, 0x90, 0x85, 0x35, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x85, 0x3F, 0x74, 0x04, +0xF0, 0x80, 0x1C, 0x90, 0x85, 0x35, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x85, 0x3F, 0x74, 0x02, 0xF0, +0x80, 0x0D, 0x90, 0x85, 0x35, 0xE0, 0xB4, 0x07, 0x06, 0x90, 0x85, 0x3F, 0x74, 0x05, 0xF0, 0xE4, +0x90, 0x85, 0x35, 0xF0, 0x80, 0x65, 0x90, 0x85, 0x9E, 0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, 0xFF, +0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x85, 0x9A, 0x30, 0xE0, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, +0x03, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x12, 0x83, 0xE4, 0x90, 0x00, +0x40, 0x74, 0x20, 0xF0, 0x90, 0x85, 0x9E, 0x12, 0x44, 0x69, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, +0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, +0x74, 0x01, 0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x9A, 0x12, 0x55, 0x0D, 0x90, 0x05, 0x22, 0xE4, +0xF0, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x85, 0x32, 0xE0, 0x54, +0xDF, 0xF0, 0xE4, 0x90, 0x85, 0x3E, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x09, 0x90, 0x84, 0x9C, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, +0x55, 0x58, 0x90, 0x84, 0x9C, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x5E, 0xF5, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x85, 0x32, 0xE0, 0x54, 0xFE, +0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, +0x04, 0xFE, 0x90, 0x85, 0x32, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, +0xF7, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0x33, 0xF0, 0x22, 0x90, 0x85, +0x9A, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, +0x7D, 0x03, 0x7F, 0x26, 0x02, 0x6D, 0x43, 0x90, 0x00, 0xCC, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x00, +0x6A, 0xE4, 0xF0, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x44, +0x04, 0xF0, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x10, 0xF0, +0x90, 0x00, 0x32, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x05, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0x00, +0x6A, 0x74, 0x15, 0xF0, 0x90, 0x00, 0xFA, 0xE0, 0x44, 0x04, 0xF0, 0x7D, 0xDD, 0x7F, 0x81, 0x02, +0x53, 0x26, 0x12, 0x1E, 0xF6, 0x90, 0x85, 0xC2, 0xF0, 0x22, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x89, +0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x90, 0x85, 0x9D, 0x12, 0x44, 0x89, 0xE4, 0x90, 0x85, 0xA1, +0xF0, 0x90, 0x85, 0x9A, 0x12, 0x44, 0x69, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0xA2, +0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0xA3, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0x90, 0x85, 0xA4, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0xA5, 0xF0, 0x90, +0x85, 0x9D, 0x12, 0x44, 0x69, 0x12, 0x1E, 0xF6, 0x70, 0x12, 0x90, 0x85, 0xA0, 0x74, 0x3C, 0xF0, +0x7B, 0x01, 0x7A, 0x85, 0x79, 0xA0, 0x7D, 0x06, 0x7F, 0x87, 0x80, 0x1C, 0x90, 0x85, 0x9D, 0x12, +0x44, 0x69, 0x12, 0x1E, 0xF6, 0xB4, 0x01, 0x13, 0x90, 0x85, 0xA0, 0x74, 0x40, 0xF0, 0x7B, 0x01, +0x7A, 0x85, 0x79, 0xA0, 0x7D, 0x04, 0x7F, 0xC7, 0x12, 0x6D, 0x43, 0x22, 0x12, 0x1E, 0xF6, 0x90, +0x85, 0xC0, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x85, 0xC1, 0xF0, 0x22, 0xE4, 0x90, +0x86, 0x46, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, 0x60, 0x43, 0xC3, 0x90, 0x86, +0x47, 0xE0, 0x94, 0x88, 0x90, 0x86, 0x46, 0xE0, 0x94, 0x13, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, +0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x86, 0x46, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xF7, +0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x86, 0x47, 0xE0, 0x94, 0x64, 0x90, 0x86, +0x46, 0xE0, 0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, +0x7F, 0x01, 0x22, 0x90, 0x85, 0xE7, 0x12, 0x1F, 0xC9, 0x90, 0x85, 0xEB, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x00, 0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x85, 0xEB, 0x12, 0x44, 0x51, 0xD3, +0x12, 0x44, 0x34, 0x50, 0x41, 0x90, 0x85, 0xEB, 0x12, 0x44, 0x45, 0xA9, 0x07, 0x90, 0x85, 0xE7, +0x12, 0x44, 0x45, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, +0x7B, 0x01, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x44, 0x34, 0x60, 0x1B, 0x90, 0x85, 0xEB, 0x12, 0x44, +0x45, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x85, +0xEB, 0x12, 0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x85, 0xEB, 0x02, 0x44, 0x45, 0x90, 0x85, 0xC6, 0x12, +0x1F, 0xC9, 0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x85, 0xCA, 0x12, 0x44, 0x51, 0xC3, 0x12, +0x44, 0x34, 0x90, 0x85, 0xC6, 0x60, 0x67, 0x12, 0x44, 0x45, 0x12, 0x2C, 0x6E, 0x90, 0x85, 0xD2, +0x12, 0x1F, 0xC9, 0x90, 0x85, 0xCA, 0x12, 0x44, 0x45, 0x31, 0xD3, 0x90, 0x85, 0xD6, 0x12, 0x1F, +0xC9, 0x90, 0x85, 0xCA, 0x12, 0x44, 0x45, 0x12, 0x44, 0x27, 0x90, 0x85, 0xD2, 0x12, 0x44, 0x51, +0x12, 0x44, 0x0D, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x85, 0xD6, 0x12, 0x44, +0x45, 0xA9, 0x07, 0x90, 0x85, 0xCE, 0x12, 0x44, 0x45, 0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, +0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0x1A, 0x90, 0x85, 0xDA, 0x12, 0x1F, 0xC9, 0x90, +0x85, 0xC6, 0x12, 0x44, 0x45, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x85, 0xDA, 0x80, 0x0A, 0x12, 0x44, +0x45, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x85, 0xCE, 0x12, 0x44, 0x45, 0x90, 0x81, 0x57, 0x12, 0x1F, +0xC9, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x86, 0x4F, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x47, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, +0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x12, 0x53, +0x99, 0x90, 0x86, 0x4F, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, +0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, +0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4C, +0x90, 0x86, 0x4F, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, +0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, 0xF0, 0x12, 0x53, 0x99, 0x90, +0x86, 0x4F, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, +0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x90, 0x84, 0x9C, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, +0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, 0x1F, 0xD5, 0x20, 0x08, 0x30, 0x70, 0x90, 0x84, +0xA3, 0x12, 0x1F, 0xD5, 0xC0, 0x08, 0x30, 0x70, 0xE4, 0x90, 0x84, 0xA9, 0xF0, 0xA3, 0xF0, 0x43, +0xE8, 0x04, 0x90, 0xFD, 0x68, 0x74, 0x02, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x44, 0x10, 0xF0, 0x90, +0x07, 0x83, 0xE4, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x04, 0x64, 0xE4, 0xF0, 0x90, +0x00, 0x40, 0x74, 0x20, 0xF0, 0x71, 0xE4, 0x90, 0x85, 0x44, 0x74, 0x01, 0xF0, 0x7D, 0x04, 0x7F, +0x02, 0x02, 0x3A, 0xAD, 0x90, 0x85, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, +0x74, 0x08, 0xF0, 0xE4, 0x90, 0x85, 0x3E, 0xF0, 0xA3, 0xF0, 0x90, 0x85, 0x2D, 0xE0, 0x54, 0xFD, +0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, +0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, +0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, +0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, +0xF0, 0x90, 0x85, 0x40, 0x74, 0x02, 0xF0, 0x90, 0x85, 0x32, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, +0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x85, 0x3D, 0xF0, 0x90, 0x85, 0x34, +0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x85, 0x3B, 0xF0, 0xA3, 0xF0, 0x90, 0x85, 0x41, 0xF0, 0xA3, +0xF0, 0x90, 0x85, 0x34, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x85, 0x31, 0xE0, +0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x85, 0x45, 0xE0, 0x54, +0xFE, 0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0xE4, 0x90, 0x85, 0x4E, 0xF0, 0x22, 0xAD, 0x07, 0x90, 0x85, +0x7A, 0xE0, 0x54, 0xF0, 0x44, 0x05, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, 0x85, 0x7C, 0xEF, +0xF0, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0x7C, 0x90, 0x86, 0x1E, 0x12, 0x44, 0x89, 0x7A, 0x85, 0x79, +0x7A, 0x02, 0x56, 0xE6, 0x90, 0x85, 0x60, 0xE0, 0x60, 0x27, 0x90, 0x85, 0x63, 0xE0, 0x70, 0x21, +0x90, 0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, +0x22, 0x90, 0x85, 0x5D, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, +0xF0, 0x22, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, 0x85, +0x34, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0x22, +0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xC1, 0xB8, 0x90, 0x85, +0x35, 0xE0, 0x64, 0x01, 0x70, 0x39, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x86, 0x4B, +0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x85, 0x41, 0xE0, 0x04, 0xF0, 0xE4, +0x90, 0x86, 0x4B, 0xF0, 0x90, 0x85, 0x36, 0xE0, 0xFF, 0x90, 0x85, 0x41, 0xE0, 0xB5, 0x07, 0x02, +0x80, 0x02, 0xC1, 0xA3, 0xE4, 0x90, 0x85, 0x35, 0xF0, 0x90, 0x85, 0x3F, 0x04, 0xF0, 0x22, 0x90, +0x85, 0x35, 0xE0, 0x64, 0x04, 0x70, 0x3A, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x86, +0x4B, 0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x85, 0x41, 0xE0, 0x04, 0xF0, +0xE4, 0x90, 0x86, 0x4B, 0xF0, 0x90, 0x85, 0x38, 0xE0, 0xFF, 0x90, 0x85, 0x41, 0xE0, 0xB5, 0x07, +0x02, 0x80, 0x02, 0xC1, 0xA3, 0xE4, 0x90, 0x85, 0x35, 0xF0, 0x90, 0x85, 0x3F, 0x74, 0x04, 0xF0, +0x22, 0x90, 0x85, 0x35, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xC1, 0x67, 0x90, 0x85, 0x42, 0xE0, 0xB4, +0x04, 0x0F, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x85, 0x3F, 0x30, 0xE0, 0x4E, 0xC1, +0xB5, 0x90, 0x85, 0x34, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, 0xE0, 0x54, 0xFB, 0xF0, +0xE4, 0xA3, 0xF0, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xC1, 0x76, 0x90, +0x85, 0x42, 0xE0, 0xFF, 0x90, 0x85, 0x41, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, +0x03, 0x12, 0x1F, 0x3C, 0x90, 0x85, 0x39, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, +0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x90, 0x85, 0x3F, 0x40, 0x02, 0xC1, 0xB5, 0x74, 0x02, 0xF0, +0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4D, 0x84, 0x90, 0x85, 0x42, 0xE0, +0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, +0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x85, 0x42, 0xE0, 0xFF, 0x90, 0x85, 0x41, 0xE0, +0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, 0x90, 0x85, 0x39, 0xE0, +0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x58, +0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x85, 0x35, 0xE0, 0x64, 0x07, 0x70, 0x49, 0x90, +0x85, 0x42, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0x85, 0x3F, 0x80, 0x3A, 0x90, 0x85, 0x34, 0xE0, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x85, 0x3F, +0x80, 0x23, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4D, 0x84, 0x90, 0x85, 0x42, +0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, +0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x3C, 0x90, 0x85, +0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, +0x22, 0x90, 0x85, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xE0, 0x13, 0x13, 0x54, 0x3F, +0x90, 0x07, 0x78, 0x30, 0xE0, 0x24, 0x80, 0x0E, 0x90, 0x85, 0x30, 0xE0, 0xC3, 0x13, 0x90, 0x07, +0x78, 0x30, 0xE0, 0x02, 0x80, 0x14, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x85, 0x31, 0xE0, 0xC4, 0x13, +0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x03, 0xF0, 0x22, 0x74, 0x01, +0xF0, 0x22, 0xBB, 0x72, +}; + +u8 Rtl8723UFwUMCBCutImgArrayWithBT[Rtl8723UUMCBCutImgArrayWithBTLength] = { +0x02, 0x23, 0x02, 0x00, 0x25, 0x00, 0x00, 0x00, 0x06, 0x27, 0x22, 0x20, 0xFC, 0x5E, 0x01, 0x00, +0x17, 0x25, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4A, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x61, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x67, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x67, 0xA9, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x6A, 0x89, 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, +0x00, 0x04, 0x06, 0x05, 0x04, 0x02, 0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, +0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, +0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, 0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, +0x00, 0x18, 0x22, 0x21, 0x20, 0x18, 0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, +0x20, 0x08, 0x00, 0x20, 0x22, 0x21, 0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, +0x22, 0x20, 0x18, 0x08, 0x00, 0x20, 0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, +0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, +0x10, 0x00, 0x00, 0x30, 0x31, 0x20, 0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, +0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, +0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, +0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, +0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, 0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, +0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, +0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, +0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, +0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, +0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, +0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, +0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, +0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, +0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, +0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, +0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, +0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, +0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, +0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, +0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, +0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, +0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, +0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, +0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, +0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, +0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, +0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, +0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, +0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, +0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, +0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, +0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, +0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, +0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, +0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, +0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, +0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, +0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, +0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, +0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, +0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, +0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, +0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, +0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, +0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, +0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, +0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, +0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, +0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0xFB, 0x90, 0x93, 0x64, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, +0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xF0, 0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0xF0, +0x0B, 0x90, 0x93, 0x41, 0xF0, 0x04, 0x70, 0x03, 0x02, 0x44, 0xF0, 0x43, 0x66, 0x10, 0x90, 0x93, +0x37, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0xE0, 0x54, 0x0F, 0xFF, 0x90, +0x93, 0x59, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x38, 0xE0, 0xF5, 0x49, +0xE4, 0x1B, 0x80, 0x56, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, +0x59, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x38, 0xE0, 0x04, 0x2F, 0xF5, +0x49, 0xE4, 0xFB, 0x80, 0x35, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x13, +0xE4, 0xF5, 0x48, 0x90, 0x93, 0x59, 0xE0, 0xFF, 0x90, 0x93, 0x50, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, +0xFB, 0x80, 0x17, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x59, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, +0x90, 0x93, 0x50, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, +0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, +0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x12, 0x9C, 0x26, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x22, 0xE4, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x93, 0x42, 0xF0, 0xF5, 0x66, 0x22, 0x22, 0xE4, 0xFF, +0x02, 0x4E, 0x27, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0xFB, 0x90, 0x93, 0x5E, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x62, 0x64, 0x01, +0x60, 0x03, 0x02, 0x46, 0x78, 0xE5, 0x65, 0x14, 0x60, 0x2B, 0x24, 0xFD, 0x60, 0x27, 0x24, 0x02, +0x24, 0xFB, 0x50, 0x02, 0x80, 0x21, 0x90, 0x93, 0x41, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, +0xE0, 0x60, 0x14, 0x90, 0x93, 0x41, 0xE0, 0x70, 0x08, 0x90, 0x93, 0x58, 0xE0, 0x90, 0x93, 0x41, +0xF0, 0x7B, 0x01, 0x80, 0x02, 0x7B, 0x01, 0xEB, 0x70, 0x03, 0x02, 0x46, 0x78, 0x43, 0x66, 0x10, +0x90, 0x93, 0x37, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, 0xE0, 0x54, 0x0F, +0xFF, 0x90, 0x93, 0x59, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x38, 0x80, +0x2D, 0x90, 0x93, 0x37, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, +0xFE, 0x90, 0x93, 0x59, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x08, +0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3B, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x38, 0xE0, 0x80, +0x2D, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, +0x93, 0x59, 0xE0, 0xFF, 0x90, 0x93, 0x50, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, +0x59, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x50, 0xE0, 0x04, 0x2F, 0xF5, 0x49, +0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, +0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, +0xE5, 0x63, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x93, 0x13, 0xE0, 0xFF, 0x90, 0x93, 0x59, 0xE0, 0xD3, +0x9F, 0x40, 0x08, 0x90, 0x93, 0x14, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0x14, 0xF0, +0x90, 0x93, 0x59, 0xE0, 0x90, 0x93, 0x13, 0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x46, 0xE4, +0xF0, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x57, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, +0x90, 0x93, 0x5A, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, 0x4A, 0x65, 0xE4, 0xF5, 0x48, 0x90, 0x93, +0x46, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, +0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x56, 0x80, 0x09, 0x43, 0x66, 0x01, 0x12, 0x51, 0x48, 0x90, +0x93, 0x52, 0x74, 0x01, 0xF0, 0x12, 0x9C, 0x26, 0x22, 0xE4, 0x90, 0x93, 0x64, 0xF0, 0xE5, 0x65, +0x70, 0x03, 0x02, 0x47, 0x32, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, +0xE5, 0x66, 0x54, 0x07, 0x60, 0x03, 0x02, 0x47, 0x32, 0x02, 0x47, 0x2F, 0x90, 0x93, 0x42, 0xE0, +0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, 0x59, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0xC4, +0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0x90, 0x93, 0x59, 0xE0, 0xFF, 0x90, 0x93, 0x37, +0xE0, 0x54, 0x0F, 0xB5, 0x07, 0x0A, 0x90, 0x93, 0x3A, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, +0x90, 0x93, 0x37, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, +0x90, 0x93, 0x59, 0xE0, 0xB5, 0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, +0x03, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, +0x93, 0x64, 0x74, 0x5A, 0xF0, 0x90, 0x93, 0x64, 0xE0, 0xFF, 0x90, 0x93, 0x49, 0xE0, 0x2F, 0xFF, +0xE4, 0x33, 0xFE, 0x90, 0x93, 0x42, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, +0x40, 0x0D, 0xE5, 0x62, 0xB4, 0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, +0x52, 0x17, 0x22, 0xE4, 0xF5, 0x66, 0xF5, 0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, +0x5A, 0xF0, 0x90, 0x93, 0x56, 0xF0, 0x90, 0x93, 0x53, 0xF0, 0x90, 0x93, 0x58, 0x04, 0xF0, 0x90, +0x93, 0x41, 0xF0, 0xE4, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x93, 0x43, 0xF0, 0x90, 0x93, 0x50, 0x74, +0x05, 0xF0, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x93, 0x4E, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, +0x93, 0x49, 0xF0, 0x90, 0x93, 0x4C, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x46, 0x74, 0x14, 0xF0, 0x90, +0x93, 0x51, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x44, 0xF0, 0x90, 0x93, 0x3D, 0xF0, 0x90, 0x93, +0xB4, 0xF0, 0x90, 0x93, 0x4D, 0xF0, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x59, 0xF0, 0x90, 0x93, +0x3E, 0xF0, 0x90, 0x93, 0x57, 0xF0, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x93, 0x45, 0xF0, 0x90, 0x93, +0x52, 0xF0, 0x90, 0x93, 0x4B, 0xF0, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x93, 0x5C, 0xF0, 0x90, 0x93, +0x4A, 0xF0, 0x90, 0x93, 0xB3, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, +0x37, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0x93, 0x3B, 0xF0, 0x90, 0x93, 0x3A, 0xF0, 0x22, 0xEF, 0x60, 0x5F, 0xAF, 0x05, +0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x93, +0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, +0x30, 0xE0, 0x6B, 0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xE0, 0x25, 0xE0, 0x25, +0xE0, 0xFF, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, +0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xAF, 0x05, 0x74, +0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x19, +0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, +0xE0, 0x0C, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x22, 0x90, +0x93, 0x15, 0xE0, 0x30, 0xE0, 0x22, 0x90, 0x93, 0x26, 0xE0, 0x60, 0x09, 0x90, 0x01, 0xB9, 0x74, +0x40, 0xF0, 0x02, 0x49, 0x29, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x02, 0x80, 0x2F, +0x90, 0x93, 0x4D, 0xE0, 0x60, 0x67, 0x80, 0x5D, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, +0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, +0xB9, 0x74, 0x02, 0xF0, 0x80, 0x53, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, +0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x42, 0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, +0x08, 0xF0, 0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, +0x28, 0x90, 0x93, 0x43, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, +0x93, 0x4D, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, +0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, +0x00, 0x22, 0xE4, 0x90, 0x93, 0x5E, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x5E, 0xF0, 0xE0, +0x54, 0xC0, 0x70, 0x18, 0x90, 0x93, 0x52, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, +0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x14, 0x12, 0x52, 0x17, 0x80, 0x0F, 0x90, 0x93, 0x3E, 0xE0, +0x60, 0x09, 0x90, 0x93, 0x57, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x5E, 0xE0, 0x30, +0xE6, 0x1B, 0x43, 0x66, 0x01, 0x90, 0x93, 0x5A, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, +0x0C, 0x60, 0x13, 0x12, 0x51, 0x48, 0x80, 0x0E, 0x12, 0x50, 0x77, 0x80, 0x09, 0x90, 0x93, 0x52, +0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x93, 0x5E, 0xE0, 0x30, +0xE7, 0x2A, 0x43, 0x66, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, +0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x93, +0x5B, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, +0x8E, 0x25, 0x8F, 0x26, 0xAD, 0x26, 0xAC, 0x25, 0xAF, 0x24, 0x12, 0x47, 0xEB, 0xAF, 0x26, 0xAE, +0x25, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, +0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x8F, 0x68, 0x8D, 0x69, 0xE5, 0x68, 0x54, 0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, +0xE5, 0x68, 0x30, 0xE2, 0x30, 0xE5, 0x63, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0xA1, 0xE5, +0x63, 0x30, 0xE3, 0x10, 0xE5, 0x68, 0x20, 0xE3, 0x0B, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x53, 0x12, +0x51, 0xD4, 0x80, 0x4E, 0xE5, 0x63, 0x20, 0xE3, 0x49, 0xE5, 0x68, 0x30, 0xE3, 0x44, 0xAF, 0x69, +0x12, 0x51, 0x86, 0x80, 0x3D, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x68, 0x20, +0xE3, 0x09, 0x12, 0x4D, 0x55, 0xEF, 0x60, 0x2A, 0x12, 0x51, 0xD4, 0xE5, 0x63, 0x54, 0x0F, 0xFF, +0xBF, 0x04, 0x0E, 0xE5, 0x68, 0x20, 0xE2, 0x09, 0x12, 0x48, 0x8F, 0xEF, 0x60, 0x14, 0x12, 0x51, +0x1F, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4B, 0xF7, 0xEF, 0x60, 0x03, 0x12, +0x52, 0x04, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x02, 0x4B, 0x35, 0x02, 0x52, 0xF4, 0xE4, 0x93, 0xA3, +0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, +0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, +0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, +0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4F, 0x75, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, +0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, +0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, +0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, +0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x7D, +0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, 0x01, 0x36, +0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, +0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x4A, 0x65, 0x90, 0x06, +0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, +0x74, 0x7B, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, +0x03, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, +0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4F, 0x28, 0xE5, 0x62, 0x20, 0xE0, +0x05, 0xE4, 0x90, 0x93, 0x43, 0xF0, 0x22, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x10, 0x12, 0x51, +0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x5C, 0xE5, 0x14, +0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x50, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, +0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x3F, 0x90, 0x02, 0x87, 0xE0, 0x60, +0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x31, 0x90, 0x01, 0xAF, 0xE0, 0x60, 0x02, 0x80, +0x07, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, +0x90, 0x93, 0x44, 0xE0, 0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, +0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, +0x7F, 0x00, 0x22, 0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, 0x64, +0x02, 0x60, 0x06, 0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, 0x41, +0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x93, 0x58, 0xF0, 0x90, 0x93, 0x41, 0xE0, 0x70, 0x07, 0x90, +0x93, 0x58, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x93, 0x41, 0xE0, 0xFF, 0x90, 0x93, 0x41, 0xEF, 0xF0, +0x90, 0x93, 0x43, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x93, 0x59, +0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, +0x02, 0xF0, 0x53, 0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, +0x03, 0x12, 0x49, 0x32, 0x22, 0x90, 0x93, 0xB3, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, +0x90, 0x93, 0xB3, 0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0xE4, 0xFD, 0x7F, 0x93, 0x12, 0x54, +0x1B, 0x90, 0x00, 0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x54, 0x1B, 0x90, 0x00, 0x28, +0xE0, 0x54, 0xFC, 0xFD, 0x7F, 0x28, 0x12, 0x54, 0x1B, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, +0x7F, 0x08, 0x12, 0x54, 0x1B, 0x7F, 0x01, 0x12, 0x4E, 0x81, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, +0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x1B, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, +0x54, 0x1B, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x54, 0x1B, 0x7F, 0x14, +0x7E, 0x00, 0x02, 0x3B, 0x09, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x93, 0x1A, 0xE0, +0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x49, 0x12, +0x51, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, +0x93, 0x56, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x53, +0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, 0xD3, +0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, +0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, +0x22, 0x90, 0x93, 0x8B, 0x12, 0x43, 0xC8, 0x12, 0x44, 0xF1, 0x90, 0x93, 0x8B, 0x12, 0x43, 0xA8, +0x12, 0x1E, 0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, +0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x8B, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, +0x1F, 0x0F, 0xFD, 0xE4, 0xFF, 0x12, 0x50, 0x39, 0x80, 0x29, 0x90, 0x93, 0x8B, 0x12, 0x43, 0xA8, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x50, 0x39, 0x1F, 0x80, 0x14, 0x90, +0x93, 0x8B, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x50, +0x39, 0xE4, 0xFF, 0x12, 0x4B, 0x7A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x24, +0x90, 0x93, 0x3E, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x57, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x90, +0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x27, 0x74, 0xFF, 0xF0, 0x12, 0x5E, +0x9B, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0xAC, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x2A, 0x12, 0x49, +0xD0, 0x90, 0x05, 0x22, 0xE5, 0x27, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0xAC, 0xE0, 0xFF, 0x7D, 0x01, +0x12, 0x58, 0x2A, 0x12, 0x49, 0xD0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x8F, 0x6C, 0xE4, 0x90, 0x94, 0x3E, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, +0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6C, 0x60, 0x3E, 0xC3, 0x90, 0x94, 0x3F, 0xE0, 0x94, +0x88, 0x90, 0x94, 0x3E, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, +0x22, 0x90, 0x94, 0x3E, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, +0x3B, 0x09, 0xD3, 0x90, 0x94, 0x3F, 0xE0, 0x94, 0x32, 0x90, 0x94, 0x3E, 0xE0, 0x94, 0x00, 0x40, +0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, 0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, +0x7F, 0x20, 0x12, 0x54, 0x1B, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, +0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x54, 0x1B, 0x90, 0x00, 0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, +0x28, 0x12, 0x54, 0x1B, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x54, 0x1B, +0xE4, 0xFF, 0x12, 0x4E, 0x81, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, +0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x54, 0x1B, 0xE4, 0xFF, 0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, +0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, +0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, +0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, 0x4F, 0xE0, 0x9D, 0x90, 0x93, 0x4E, +0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x4E, 0xE0, 0xA3, 0xE0, +0x90, 0x05, 0x58, 0xF0, 0x22, 0x48, 0x93, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x48, 0x93, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0xA0, 0x00, 0x41, +0x93, 0xB0, 0x00, 0x41, 0x93, 0x95, 0x00, 0x41, 0x94, 0x46, 0x00, 0x41, 0x93, 0x13, 0x00, 0x41, +0x93, 0x14, 0x00, 0x41, 0x92, 0x69, 0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, 0x41, +0x94, 0x37, 0x00, 0x41, 0x94, 0x44, 0x00, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x93, 0x57, 0x74, 0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x94, 0x2B, 0x12, +0x1F, 0xC9, 0x90, 0x94, 0x2B, 0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x94, 0x2B, 0x12, +0x1F, 0xC9, 0x90, 0x94, 0x2B, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, +0x7E, 0x08, 0x12, 0x34, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, +0x02, 0x80, 0x35, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x2E, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x09, +0x90, 0x93, 0x57, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x9C, 0x26, 0x90, 0x93, 0x5A, 0xE0, +0x60, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0D, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, +0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, +0x24, 0x02, 0x70, 0x32, 0x80, 0x0A, 0x90, 0x93, 0x58, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x41, 0xF0, +0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x51, 0xE0, 0x90, 0x93, 0x58, +0xF0, 0x80, 0x05, 0x90, 0x93, 0x58, 0xED, 0xF0, 0x90, 0x93, 0x58, 0xE0, 0x90, 0x93, 0x41, 0xF0, +0x90, 0x93, 0x5D, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, +0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x46, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, +0xF0, 0x90, 0x93, 0x53, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x0C, 0x50, 0x03, 0x12, +0x4A, 0x65, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, +0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x3F, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, +0xFF, 0x74, 0x40, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, +0xF9, 0x90, 0x93, 0x55, 0xF0, 0xEE, 0x90, 0x93, 0x54, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x93, +0xB2, 0xE0, 0x90, 0x94, 0x2F, 0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0xB2, 0xE0, 0x90, 0x94, 0x2F, +0x60, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, +0x01, 0x10, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x2F, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x95, 0x86, 0x90, +0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x5E, 0x9B, 0xEF, 0x70, +0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x12, 0x99, +0x48, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x90, 0x93, 0x47, 0xE0, 0x70, 0x1A, 0x90, 0x04, +0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0xAB, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, 0x2A, 0x8E, 0x6A, +0x8F, 0x6B, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x48, 0xE0, 0x60, 0x16, 0x90, +0x93, 0x4B, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x45, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, +0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xEF, 0x60, 0x0A, +0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x0C, +0x22, 0x90, 0x94, 0x47, 0xEF, 0xF0, 0x12, 0x95, 0xCC, 0x90, 0x94, 0x47, 0xE0, 0x60, 0x05, 0x90, +0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, +0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, +0x02, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x05, +0x7F, 0x01, 0x12, 0x4E, 0x27, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0xE5, 0x64, 0x30, 0xE6, +0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, +0x53, 0x64, 0xBF, 0x22, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0xE5, 0x12, 0x4E, 0xD9, +0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x7D, 0x01, 0xAF, 0x64, 0x02, 0x4A, 0x69, 0x90, 0x02, +0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, 0x43, +0xF7, 0x52, 0x49, 0x00, 0x40, 0x52, 0x71, 0x00, 0x80, 0x52, 0x9C, 0x01, 0x00, 0x52, 0xB0, 0x02, +0x00, 0x52, 0xC8, 0x04, 0x00, 0x00, 0x00, 0x52, 0xE5, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, 0xFF, +0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, 0xCE, +0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x80, +0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, 0x2D, +0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x07, +0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, 0xFE, +0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, 0x35, +0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, 0x2D, +0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, 0xFF, +0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, 0x00, +0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x25, 0xF0, +0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x76, 0xF0, 0xA3, 0xF0, 0xF1, 0xBA, 0x75, 0x8E, 0x02, +0xF1, 0x99, 0x12, 0x60, 0x51, 0x90, 0x93, 0xB3, 0xEF, 0xF0, 0xF1, 0xDA, 0x90, 0x93, 0xB5, 0xEF, +0xF0, 0x12, 0x60, 0x64, 0x90, 0x93, 0x96, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x14, 0xF5, +0x09, 0xF5, 0x62, 0x90, 0x93, 0xB2, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x88, +0x60, 0x12, 0x47, 0x33, 0x12, 0x37, 0x1C, 0xF1, 0xE6, 0x71, 0xF2, 0x12, 0x60, 0x15, 0x12, 0x60, +0x7C, 0xF1, 0xB3, 0x12, 0x60, 0x33, 0x12, 0x44, 0xFD, 0x12, 0x60, 0xE7, 0xF1, 0xC2, 0x90, 0x93, +0x78, 0xE5, 0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x63, 0x75, +0xE8, 0x03, 0x43, 0xA8, 0x85, 0x12, 0x97, 0x59, 0xD2, 0xAF, 0x51, 0xEA, 0x12, 0x60, 0x91, 0x90, +0x93, 0x76, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xF4, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, 0xA3, 0xF0, +0xE5, 0x14, 0x30, 0xE0, 0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xFE, 0x12, 0x9A, 0xE3, 0xD2, 0xAF, 0x90, +0x93, 0xA9, 0xE0, 0xB4, 0x01, 0x07, 0x91, 0xD2, 0xE4, 0x90, 0x93, 0xA9, 0xF0, 0xE5, 0x14, 0x30, +0xE4, 0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xEF, 0xD2, 0xAF, 0x12, 0x6F, 0x9E, 0xE5, 0x14, 0x30, 0xE6, +0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xBF, 0xD2, 0xAF, 0x12, 0x80, 0x5D, 0xE5, 0x14, 0x30, 0xE7, 0x09, +0xC2, 0xAF, 0x53, 0x14, 0x7F, 0xD2, 0xAF, 0xD1, 0xEC, 0xC2, 0xAF, 0xE5, 0x64, 0x54, 0x0F, 0xFF, +0xBF, 0x01, 0x0D, 0x90, 0x93, 0x44, 0x74, 0x01, 0xF0, 0x51, 0x17, 0xE4, 0x90, 0x93, 0x44, 0xF0, +0xD2, 0xAF, 0x90, 0x01, 0xBD, 0xE5, 0x63, 0xF0, 0x90, 0x93, 0x5A, 0xE0, 0x90, 0x01, 0xBC, 0xF0, +0x61, 0x6F, 0x90, 0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x91, 0x1B, 0x7D, 0xFF, 0x7F, 0x55, 0x91, +0x1B, 0x7D, 0xFF, 0x7F, 0x56, 0x91, 0x1B, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x91, 0x63, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x91, 0x1B, 0xE4, 0xFD, 0x7F, 0x51, 0x91, 0x1B, +0xE4, 0xFD, 0x7F, 0x52, 0x91, 0x1B, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0x90, 0x00, 0x02, 0xE0, +0x44, 0x01, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0x8E, 0x57, 0x8F, 0x58, 0x8B, 0x59, 0x8A, 0x5A, 0x89, 0x5B, 0xE4, 0x90, 0x93, +0x7C, 0xF0, 0xEF, 0x90, 0x00, 0x31, 0xF0, 0x91, 0x63, 0xE5, 0x57, 0x54, 0x03, 0xFF, 0x90, 0x00, +0x32, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0x91, 0x63, 0x90, 0x00, 0x33, 0xE0, 0x54, 0x7F, 0xF0, 0x91, +0x63, 0x90, 0x00, 0x33, 0xE0, 0x20, 0xE7, 0x0E, 0x90, 0x93, 0x7C, 0xE0, 0xC3, 0x94, 0x64, 0x50, +0x05, 0xE0, 0x04, 0xF0, 0x80, 0xEB, 0x90, 0x93, 0x7C, 0xE0, 0xC3, 0x94, 0x64, 0x50, 0x10, 0x90, +0x00, 0x30, 0xE0, 0xAB, 0x59, 0xAA, 0x5A, 0xA9, 0x5B, 0x12, 0x42, 0x53, 0x7F, 0x01, 0x22, 0x7F, +0x00, 0x22, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x79, 0x7F, 0xF5, 0x7E, 0x01, 0x91, 0x73, 0xBF, 0x01, +0x06, 0x90, 0x93, 0x79, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x79, 0x7F, 0xF6, 0x7E, +0x01, 0x91, 0x73, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x79, 0xE0, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x93, +0x7A, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xAE, 0x07, 0x90, 0x93, 0x7C, 0xE0, 0x54, 0xF0, 0xF0, 0x54, +0x0F, 0x44, 0x50, 0xF0, 0x90, 0x93, 0x7E, 0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x7B, 0x01, 0x7A, 0x93, +0x79, 0x7E, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x7C, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x10, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, +0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x92, 0x69, 0xE0, +0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, 0xFF, 0xA3, 0xE0, +0xB5, 0x07, 0x0D, 0xF1, 0x4B, 0xEF, 0x60, 0x70, 0xD1, 0xEC, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, +0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xA8, +0x01, 0xFC, 0x7D, 0x01, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x7E, 0x00, 0x7F, 0x02, 0x12, 0x1E, +0xD0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, +0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0x13, 0x12, 0x43, 0xA8, 0x8B, +0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, +0x54, 0x0F, 0xF5, 0x23, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xB1, 0xDD, 0x90, 0x92, 0x6A, 0xE0, +0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x94, 0x04, 0x12, 0x43, 0xC8, +0xAB, 0x20, 0xAA, 0x21, 0xA9, 0x22, 0x90, 0x94, 0x07, 0x12, 0x43, 0xC8, 0xAF, 0x23, 0x15, 0x23, +0xEF, 0x60, 0x1E, 0x90, 0x94, 0x07, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0x12, 0x1E, 0xF6, +0xFF, 0x90, 0x94, 0x04, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, 0x12, 0x42, 0x53, 0x80, +0xDB, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x0A, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x68, 0xE0, 0x90, 0x00, 0x01, +0x12, 0x42, 0x65, 0xF1, 0x4B, 0xEF, 0x70, 0x02, 0xC1, 0xE7, 0x90, 0x94, 0x0A, 0x12, 0x43, 0xA8, +0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0xB1, +0xDD, 0x90, 0x94, 0x0D, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x0A, +0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0x01, +0x79, 0xA2, 0xB1, 0xDD, 0x90, 0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0xB3, 0xE0, 0x64, 0x01, +0x70, 0x48, 0x90, 0x94, 0x0A, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, +0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x20, 0xB1, 0xDD, 0x90, 0x94, 0x0D, 0x12, 0x43, 0xA8, 0x8B, +0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x0A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, +0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x22, 0xB1, 0xDD, 0x90, 0x93, 0x96, 0xE0, +0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x92, 0x68, 0xE0, 0x04, 0xF0, +0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0xF1, 0x4B, 0xEF, 0x60, 0x4E, 0x90, 0x92, 0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, +0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, +0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x90, 0x94, 0x0D, 0x12, 0x43, +0xC8, 0xD0, 0x01, 0xD0, 0x02, 0xD1, 0x2C, 0x90, 0x92, 0x69, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, +0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, +0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xAF, 0x7E, 0x01, 0x90, +0x94, 0x33, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0x33, 0xE0, +0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, 0xC3, 0x90, 0x94, 0x36, 0xE0, 0x94, +0xE8, 0x90, 0x94, 0x35, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, +0x7F, 0x00, 0x22, 0x90, 0x94, 0x35, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x0A, 0x7E, +0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x93, 0xAF, 0xF0, 0x90, 0x00, +0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x81, 0x1B, 0x8F, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, +0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, +0xF0, 0x22, 0x90, 0x94, 0x38, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x94, 0x3A, 0xF0, 0x90, 0x94, +0x38, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, +0x30, 0xE3, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xAF, +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xC4, 0x74, 0xF2, 0xF0, 0x74, +0x57, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, +0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, +0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, +0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, 0x2B, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, +0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xFD, +0x63, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x62, 0xE0, 0x54, 0x03, 0x4F, +0x90, 0x93, 0x68, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, +0xFD, 0x63, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x69, 0xF0, 0x90, 0x93, 0x68, 0xE0, 0xFD, 0xA3, +0xE0, 0xFB, 0xE4, 0xFF, 0x90, 0x94, 0x16, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, +0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, 0x1B, 0xF0, 0xD1, 0x95, 0xBF, +0x01, 0x02, 0x11, 0xF7, 0x90, 0x94, 0x1B, 0xE0, 0x90, 0x05, 0x22, 0xF0, 0x80, 0x02, 0x11, 0xF7, +0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0xAE, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x2A, +0x90, 0x94, 0x19, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x94, 0x16, 0xE0, 0xFF, 0xA3, +0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x94, 0x25, 0xF0, 0xEF, 0x60, 0x10, 0x74, 0x21, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0E, 0x74, 0x21, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, 0x06, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x54, 0x03, 0xF0, 0xAE, 0x05, 0x74, 0x22, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xEB, 0xF0, 0x90, 0x94, 0x25, 0xE0, 0xFF, 0x74, 0x23, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x04, +0xF0, 0x22, 0xE4, 0x90, 0x93, 0x64, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x20, +0xE0, 0x02, 0xC1, 0x45, 0x12, 0x9C, 0x54, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, +0xB9, 0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x18, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, +0x90, 0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0xA3, 0xE0, 0x90, 0x93, 0x64, 0xF0, +0xE4, 0xF5, 0x48, 0x90, 0x93, 0x64, 0xE0, 0x24, 0x03, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, +0x54, 0x0F, 0x90, 0x93, 0x27, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, +0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0x93, 0x16, 0xE0, 0xFF, +0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6E, +0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, +0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xC4, 0x80, 0x51, 0x90, 0x93, 0x15, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, +0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, +0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x2A, +0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x06, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0x60, +0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x93, +0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x45, 0xA1, 0xB7, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x02, 0x60, +0x02, 0x61, 0x98, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xD1, +0x95, 0xBF, 0x01, 0x03, 0x12, 0x99, 0x48, 0xE4, 0xFF, 0xD1, 0x67, 0x90, 0x93, 0x1A, 0xE0, 0x30, +0xE0, 0x1F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x93, 0x1A, 0xE0, 0xC4, 0x54, +0x0F, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x90, 0x93, 0x64, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xEF, +0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x16, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0x93, 0x64, 0xE0, 0x2F, +0xFF, 0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0xFF, 0x90, 0x93, 0x65, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0xE4, +0xFF, 0xD1, 0xDC, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, 0x15, 0xE0, +0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, +0x14, 0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, 0xE4, 0xFD, +0xAF, 0x64, 0x12, 0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x30, +0xE0, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x20, 0xE0, 0x02, 0xC1, 0x45, 0xC1, 0x41, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x03, 0x60, 0x02, +0x81, 0xEC, 0x7F, 0x01, 0xD1, 0x67, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, +0xE0, 0x03, 0x12, 0x95, 0xCC, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, +0x02, 0x81, 0x48, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xD3, 0x9F, 0x40, 0x4D, +0xE0, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, +0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0x17, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, +0x80, 0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0x93, 0x67, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x67, 0x74, +0x03, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x67, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x80, 0x24, 0xE4, 0xF5, 0x48, +0x90, 0x93, 0x22, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, +0x90, 0x93, 0x1D, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, +0xF0, 0xE4, 0x90, 0x93, 0x29, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x66, 0xE0, 0xFF, +0x90, 0x93, 0x17, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, +0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x7F, 0x01, +0xD1, 0xDC, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x2F, 0x90, 0x93, 0x15, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, +0x4D, 0xE0, 0x60, 0x02, 0x80, 0x0F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x80, +0x08, 0xE5, 0x65, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x4D, 0xE0, +0x60, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, +0x03, 0x12, 0x51, 0x48, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, +0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0x45, 0x7F, 0x01, 0xC1, 0x43, 0x90, 0x93, 0x27, 0xE0, +0x64, 0x04, 0x60, 0x02, 0xA1, 0xBD, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, +0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0x93, 0x17, 0xE0, 0xFF, +0x90, 0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, +0x54, 0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6E, +0x90, 0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, +0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0xC4, 0x80, 0x51, 0x90, 0x93, 0x15, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, +0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, +0x27, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x2A, +0xF0, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x07, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0x60, +0x07, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x93, +0x18, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x45, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x27, +0xE0, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x45, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, +0x30, 0xE0, 0x08, 0xD1, 0x95, 0xBF, 0x01, 0x03, 0x12, 0x99, 0x48, 0xE4, 0xFF, 0xD1, 0x67, 0xD1, +0xDC, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, +0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, +0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x14, 0xE4, 0xFD, +0xAF, 0x64, 0x12, 0x4A, 0x69, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, 0xE4, 0xFD, 0xAF, 0x64, 0x12, +0x4A, 0x69, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x30, 0xE0, 0x05, 0x90, +0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, +0x04, 0xE4, 0xFF, 0xD1, 0x46, 0x22, 0x90, 0x93, 0x04, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x17, 0xEF, +0x7B, 0x01, 0xB4, 0x01, 0x06, 0x7A, 0x93, 0x79, 0x0B, 0x80, 0x04, 0x7A, 0x93, 0x79, 0x07, 0x7F, +0x80, 0x7E, 0x08, 0x12, 0x95, 0x86, 0x22, 0xEF, 0xB4, 0x03, 0x12, 0x90, 0x93, 0x18, 0xE0, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x17, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x19, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEF, 0x90, 0x06, 0xCC, 0xB4, 0x01, 0x03, 0xE4, 0xF0, +0x22, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0x90, 0x94, 0x42, 0xF0, +0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, +0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x94, 0x43, 0xE0, 0x94, 0xE8, 0x90, 0x94, +0x42, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, +0x90, 0x94, 0x42, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x80, 0xC6, 0x90, 0x94, 0x26, 0xEF, +0xF0, 0x12, 0x9D, 0xFD, 0x90, 0x93, 0x18, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x08, +0x90, 0x94, 0x26, 0xE0, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x94, 0x27, 0x12, 0x1F, 0xD5, 0x00, 0x00, +0x03, 0x10, 0x90, 0x94, 0x26, 0xE0, 0xB4, 0x01, 0x10, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x13, +0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x80, 0x0A, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC3, 0x13, +0x30, 0xE0, 0x0A, 0x90, 0x94, 0x27, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, +0x94, 0x79, 0x27, 0x12, 0x95, 0x82, 0x90, 0x94, 0x26, 0xE0, 0x90, 0x93, 0x26, 0xF0, 0x22, 0x90, +0x93, 0x15, 0xE0, 0x30, 0xE0, 0x72, 0x7F, 0x01, 0xD1, 0x67, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, +0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x95, 0xCC, 0x7F, 0x01, 0xD1, 0xDC, 0x90, 0x93, 0x15, +0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x05, 0x12, 0x95, 0xCC, 0x80, 0x29, 0x90, 0x93, +0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x20, 0xF0, 0x90, +0x93, 0x4D, 0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x4A, 0x69, 0x90, 0x93, 0x4D, 0xE0, 0x90, 0x05, 0x22, 0x60, 0x05, +0x74, 0x6F, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0xD1, 0x46, 0x22, 0x12, 0x57, 0xF2, 0xBF, 0x01, 0x0F, 0x90, +0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x2A, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, +0x01, 0x63, 0xE4, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7F, 0x70, +0x7E, 0x08, 0x12, 0x34, 0x30, 0x7F, 0x01, 0xC1, 0x46, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x36, 0xF0, +0x70, 0x02, 0xF1, 0xCF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, +0x30, 0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, +0x90, 0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, +0x2B, 0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x43, +0x32, 0x20, 0x90, 0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, +0x22, 0x90, 0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, 0x02, +0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xB5, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, +0xE7, 0x05, 0x7E, 0xFD, 0x7F, 0x33, 0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, +0x30, 0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, +0x22, 0xE4, 0x90, 0x93, 0x79, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, +0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, 0x7A, 0xE0, 0x94, 0x88, 0x90, +0x93, 0x79, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, +0x93, 0x79, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, +0xD3, 0x90, 0x93, 0x7A, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, +0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, +0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, +0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, +0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, +0x0C, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, +0x93, 0x5E, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, +0x60, 0x07, 0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3C, 0x90, 0x93, 0x5E, 0x74, 0x01, 0xF0, 0xA3, +0x74, 0x3D, 0xF0, 0x79, 0x40, 0x90, 0x93, 0x5E, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, +0x83, 0xE0, 0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0xA0, 0xF0, 0x22, 0x90, 0x93, 0xA0, +0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0C, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, +0xE0, 0x03, 0x12, 0x5F, 0xB9, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, +0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x86, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x90, 0x01, 0x34, +0xE0, 0x55, 0x28, 0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, +0x2E, 0xA3, 0xE0, 0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x61, 0x80, 0x90, 0x01, +0x34, 0x74, 0x01, 0xF0, 0x85, 0xD1, 0x0A, 0x85, 0xD3, 0x0C, 0x85, 0xD4, 0x0D, 0x85, 0xD5, 0x0E, +0x85, 0xD6, 0x0F, 0x85, 0xD7, 0x10, 0x85, 0xD9, 0x11, 0x85, 0xD2, 0x0B, 0x75, 0x20, 0x00, 0x75, +0x21, 0x00, 0x75, 0x22, 0x0A, 0x75, 0x23, 0x08, 0xFB, 0x7A, 0x93, 0x79, 0xA1, 0x12, 0x55, 0xDD, +0x90, 0x93, 0xA2, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x01, +0x6E, 0x70, 0x02, 0x61, 0x2B, 0x90, 0x93, 0xA2, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x02, 0x61, 0x2B, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, 0x93, 0xA3, 0xE0, 0x54, 0x3F, +0xF5, 0x4E, 0x90, 0x93, 0xA5, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x80, 0xF5, +0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xE5, 0x4E, 0xD3, 0x94, +0x04, 0x40, 0x03, 0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, +0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, +0xA5, 0xE0, 0x54, 0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, +0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0x90, 0x93, 0xA2, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2F, 0x90, 0x93, 0xA5, 0xE0, +0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, +0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA4, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, +0x01, 0x30, 0xE0, 0x67, 0xAF, 0x4D, 0x12, 0x7A, 0x9C, 0x80, 0x60, 0x90, 0x93, 0xA2, 0xE0, 0xFF, +0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x53, 0x90, 0x93, 0xA5, 0xE0, 0x54, 0x1F, 0xFF, 0xFD, +0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8D, 0xF0, +0x12, 0x42, 0x87, 0x90, 0x93, 0xA4, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, +0x0F, 0xEE, 0x54, 0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, 0x12, 0x7A, 0x38, 0x80, 0x1B, +0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, +0x0A, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, 0xE5, 0x65, 0x14, 0x24, 0xFD, +0x50, 0x02, 0x80, 0x46, 0x90, 0x93, 0x5A, 0xE0, 0x60, 0x37, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, +0x01, 0x3C, 0x74, 0x04, 0xF0, 0x12, 0x51, 0xBB, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xF5, 0x48, 0x90, +0x93, 0x46, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, +0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x56, 0xF0, 0x80, +0x09, 0x12, 0x51, 0xBB, 0xBF, 0x01, 0x03, 0x12, 0x52, 0x17, 0x90, 0x94, 0x45, 0xE0, 0x04, 0xF0, +0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x81, 0x22, 0x90, 0x01, 0x34, 0x74, 0x02, 0xF0, 0x90, 0xFD, 0x10, +0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, 0x0B, 0x75, 0x4F, 0x88, 0x75, 0x50, 0x0F, +0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, 0x75, 0x50, 0x08, 0x75, 0x51, 0x07, 0x90, 0x04, +0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x12, 0x90, 0x04, 0x7E, 0xE0, 0x55, 0x51, 0xF5, 0x13, 0x65, 0x12, +0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x12, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x4F, 0x2F, 0x24, 0x00, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x15, 0x2F, 0xF8, 0xA6, 0x06, 0x0F, 0xBF, +0x08, 0xE2, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, 0x75, 0x22, 0x15, 0x75, 0x23, 0x08, 0x7B, 0x01, +0x7A, 0x93, 0x79, 0x98, 0x12, 0x55, 0xDD, 0x90, 0x93, 0x98, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, +0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0xA9, 0xE5, 0x12, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0xAD, +0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, 0x12, 0x90, 0x04, 0x7F, 0xEF, 0xF0, 0xB5, +0x13, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, +0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, 0x14, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, +0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, +0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x54, 0x30, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, +0xF0, 0x12, 0x54, 0x63, 0x80, 0xFE, 0xE5, 0x2C, 0x30, 0xE6, 0x06, 0x90, 0x01, 0x34, 0x74, 0x40, +0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0xA1, 0x30, 0x90, 0x93, 0xB4, 0x74, 0x01, 0xF0, 0x90, 0x01, +0x36, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x02, +0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x12, 0x45, 0x09, 0x90, 0x93, 0x2D, 0xE0, 0x20, 0xE0, +0x02, 0xA1, 0x26, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x07, +0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, +0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0xE0, 0xFE, +0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9F, 0x40, 0x35, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xE1, 0xF0, +0x90, 0x93, 0x32, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x60, 0x7E, 0x08, +0x12, 0x34, 0x30, 0x90, 0x93, 0x2E, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, +0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x2D, +0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0xFE, +0x25, 0xE0, 0x4F, 0xF0, 0x80, 0x03, 0x12, 0x5F, 0x3F, 0xD1, 0xCB, 0x90, 0x93, 0xB4, 0xE4, 0xF0, +0xE5, 0x2E, 0x30, 0xE1, 0x45, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x43, 0x14, 0x40, 0x12, 0x9E, +0x56, 0x31, 0x17, 0x90, 0x93, 0x5D, 0xE0, 0x60, 0x1D, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x16, +0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, +0x58, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, 0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, 0x90, +0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x43, 0x90, +0x01, 0x36, 0x74, 0x04, 0xF0, 0x12, 0x4C, 0x73, 0x90, 0x93, 0x5D, 0xE0, 0x60, 0x34, 0x90, 0x93, +0x58, 0xE0, 0xFF, 0x90, 0x93, 0x41, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x58, 0xE0, 0x90, 0x05, +0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, 0x01, +0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x41, 0xE0, +0x14, 0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x62, 0x64, +0x01, 0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, +0x02, 0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x4C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, +0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, 0x60, 0x1C, 0x90, +0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x5B, 0xE4, 0xF0, 0x53, +0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2E, 0x30, 0xE5, 0x25, +0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x1A, 0xE5, 0x65, 0x60, 0x16, 0x90, +0x93, 0x5A, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x08, 0x12, 0x51, 0x48, +0x80, 0x03, 0x12, 0x50, 0x77, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, 0xF0, +0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, 0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, 0x66, 0x54, 0x07, +0x70, 0x03, 0x12, 0x52, 0x17, 0xE5, 0x2F, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, +0x12, 0x4F, 0xFA, 0x74, 0x86, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, +0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, +0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x5E, 0xE0, 0x54, 0xF0, 0x44, +0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x15, 0x90, 0x94, 0x13, +0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x5E, 0x02, 0x55, 0x2C, 0x90, 0x94, 0x38, 0xE0, 0x30, +0xE0, 0x2F, 0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x94, 0x37, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, +0x0B, 0x90, 0x94, 0x3A, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x37, 0xF0, 0x90, 0x94, 0x3A, 0xE0, +0xFF, 0x90, 0x94, 0x39, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x44, 0xFE, 0xE4, 0x90, 0x94, 0x3A, +0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, +0x06, 0xC0, 0x07, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0x53, +0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, 0x00, +0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, 0x90, +0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, 0xF0, +0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, 0x06, +0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, 0x01, +0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, 0xE2, +0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, 0x74, +0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, +0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, 0x56, 0x00, 0x90, 0x01, 0xC4, 0x74, 0xA9, 0xF0, 0x74, +0x67, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, +0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, +0xE5, 0x34, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0xE5, 0x34, 0x30, 0xE1, 0x10, +0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x46, 0x79, +0xE5, 0x34, 0x30, 0xE2, 0x3A, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE5, 0x65, 0x60, 0x30, 0x90, +0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x46, 0xE0, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, +0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x56, 0xE4, 0xF0, 0x12, 0x52, 0x17, 0xE5, +0x34, 0x30, 0xE3, 0x3A, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE5, 0x65, 0x60, 0x30, 0x90, 0x06, +0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x46, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, +0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, +0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x53, 0xE4, 0xF0, 0x12, 0x52, 0x17, 0xE5, 0x34, +0x30, 0xE4, 0x3D, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x30, 0xE0, 0x24, +0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x07, 0x78, 0x74, 0x01, +0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, +0x34, 0x30, 0x80, 0x03, 0x12, 0x59, 0xA2, 0x90, 0x93, 0x36, 0xE0, 0x60, 0x03, 0x12, 0x5F, 0xCF, +0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, +0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, +0x64, 0xF0, 0x12, 0x51, 0xEC, 0x12, 0x52, 0x17, 0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, +0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, +0xB0, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, +0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0xE5, 0x36, +0x30, 0xE1, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0xE5, 0x36, 0x30, 0xE3, 0x08, 0x90, 0x01, +0x3E, 0x74, 0x08, 0xF0, 0x51, 0x43, 0xE5, 0x36, 0x30, 0xE4, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x10, +0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x75, 0x90, 0x01, 0x3E, 0x74, 0x04, 0xF0, 0x90, 0x07, 0x8F, 0xE0, +0x30, 0xE7, 0x13, 0x74, 0x80, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x44, 0x04, +0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x46, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE6, 0x11, 0x74, 0x40, 0xF0, +0x90, 0x07, 0x7C, 0xE0, 0xB4, 0x06, 0x07, 0x90, 0x07, 0x80, 0xE0, 0xFF, 0x51, 0x61, 0x90, 0x07, +0x8F, 0xE0, 0x30, 0xE5, 0x14, 0x74, 0x20, 0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x46, 0x90, 0x07, 0x95, +0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE2, 0x0D, +0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0x7F, 0x01, 0x12, 0x5E, 0x46, 0x90, 0x07, 0x95, +0xE0, 0x30, 0xE0, 0x07, 0x74, 0x01, 0xF0, 0xFF, 0x12, 0x5E, 0x46, 0xE5, 0x36, 0x30, 0xE5, 0x06, +0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, 0x30, 0xE6, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, +0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, +0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, 0x14, 0x80, 0xE5, 0x37, 0x30, 0xE4, 0x1E, 0x90, +0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x44, 0x24, 0x90, 0x93, 0x58, 0xE0, 0x90, 0x05, 0x73, 0xF0, +0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x12, 0x5F, 0x3F, 0x12, 0x66, 0xCB, 0x74, 0xA9, 0x04, +0x90, 0x01, 0xC4, 0xF0, 0x74, 0x67, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, +0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, +0xD0, 0xE0, 0x32, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, +0x93, 0x1C, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, +0x22, 0xAD, 0x07, 0x90, 0x93, 0x64, 0xE0, 0x54, 0xF0, 0x44, 0x05, 0xF0, 0x54, 0x0F, 0x44, 0x10, +0xF0, 0x90, 0x93, 0x66, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x66, 0x90, 0x94, 0x13, 0x12, +0x43, 0xC8, 0x7A, 0x93, 0x79, 0x64, 0x02, 0x55, 0x2C, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, +0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x53, 0x91, 0xBF, 0x90, 0xFD, 0x68, 0xE0, 0x20, 0xE0, 0x02, +0xA1, 0x59, 0x90, 0x93, 0x95, 0xE0, 0x70, 0x16, 0x90, 0x00, 0x2E, 0xE0, 0x90, 0x93, 0x0F, 0xF0, +0x90, 0x00, 0x2D, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x95, 0x74, 0x01, 0xF0, 0x90, 0xFD, +0x60, 0xE0, 0x54, 0x3F, 0xD3, 0x94, 0x09, 0x50, 0x02, 0xF1, 0x32, 0x90, 0xFD, 0x60, 0xE0, 0x64, +0x0E, 0x60, 0x02, 0x61, 0x89, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, +0xE0, 0x02, 0x61, 0x89, 0x90, 0xFD, 0x62, 0xE0, 0x54, 0xC0, 0xFE, 0x90, 0x07, 0x90, 0xE0, 0x54, +0x3F, 0x4E, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x07, 0x91, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, +0x07, 0x92, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x07, 0x93, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x01, +0xF0, 0xEF, 0x20, 0xE0, 0x44, 0x90, 0x93, 0x04, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x19, +0x90, 0x07, 0x78, 0x12, 0x58, 0x8A, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x49, +0x90, 0x07, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x80, 0x40, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, +0x30, 0xE0, 0x11, 0xE4, 0xFF, 0x12, 0x5E, 0x46, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, +0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, 0x78, 0x80, 0x14, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, +0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x12, 0x58, 0x8A, 0x80, 0x0C, 0xE0, 0x44, 0x10, +0xF0, 0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x0F, 0x0A, +0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xB1, 0xED, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x15, +0x70, 0x76, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6B, 0xF0, 0xE0, 0x30, 0xE6, 0x1C, 0xF4, 0x54, +0x3F, 0x04, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9F, 0x90, 0x93, 0x6A, +0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x20, 0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, +0x54, 0x3F, 0xFF, 0x90, 0x93, 0x6B, 0xE0, 0x54, 0x3F, 0x2F, 0x90, 0x93, 0x6A, 0xF0, 0xD3, 0x94, +0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0x93, 0x6A, 0xE0, 0xFF, 0x90, 0x01, 0xE7, 0xF0, 0xEF, +0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x6A, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, +0x90, 0x93, 0x6C, 0xF0, 0x90, 0x00, 0x2E, 0xF0, 0xEE, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x93, 0x10, +0xE0, 0x54, 0x0F, 0x4F, 0x90, 0x00, 0x2D, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x21, 0x07, 0x90, +0xFD, 0x62, 0xE0, 0xFF, 0xB1, 0x74, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x22, 0x02, 0xB1, 0x9C, 0x90, +0xFD, 0x60, 0xE0, 0x64, 0x23, 0x60, 0x02, 0x81, 0xC0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x2C, +0x30, 0xE0, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, +0x13, 0x54, 0x03, 0x20, 0xE0, 0x62, 0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE1, 0x5B, 0x90, 0x93, 0x2D, +0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x2C, +0x6E, 0x90, 0x93, 0x32, 0x12, 0x1F, 0xC9, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x7F, 0x70, 0x7E, 0x08, +0x12, 0x2C, 0x6E, 0x90, 0x93, 0x2E, 0x12, 0x1F, 0xC9, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x01, 0xBE, 0xE0, 0x04, 0xF0, +0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x2D, 0x30, 0xE2, 0x08, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, +0x80, 0x06, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0xFF, 0x12, 0x9B, 0x06, +0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x24, 0x02, 0xB1, 0xC4, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x25, 0x13, +0x90, 0xFD, 0x62, 0xE0, 0x60, 0x0D, 0x90, 0x93, 0x1C, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0x24, +0x74, 0x04, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x26, 0x05, 0x7F, 0x01, 0x12, 0x9B, 0xA2, 0x90, +0xFD, 0x60, 0xE0, 0xB4, 0x30, 0x07, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0xD1, 0x18, 0x90, 0x93, 0x36, +0xE0, 0x60, 0x4F, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x31, 0x70, 0x47, 0x90, 0xFD, 0x62, 0xE0, 0x30, +0xE0, 0x36, 0x90, 0x01, 0x63, 0xE4, 0xF0, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, +0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0xE4, 0xFF, 0x12, 0x5E, 0x46, +0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x80, 0x0A, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE1, 0x03, 0x12, +0x5F, 0xCF, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, +0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, +0xF0, 0xD0, 0xE0, 0x32, 0xAD, 0x07, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0xF0, 0x44, 0x09, 0xF0, 0x54, +0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x6F, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6F, 0x90, +0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6D, 0x02, 0x55, 0x2C, 0x90, 0x00, 0x75, 0xE0, +0x44, 0x01, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0x74, 0x03, 0xF0, +0x7F, 0x02, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0xE4, 0xF0, 0x90, 0x00, 0x75, 0xE0, +0x54, 0xFE, 0xF0, 0x22, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0xF0, 0x44, 0x0D, 0xF0, 0x54, 0x0F, 0x44, +0x10, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6F, +0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6D, 0x02, 0x55, 0x2C, 0xAE, 0x07, 0x90, +0x93, 0x6D, 0xE0, 0x54, 0xF0, 0x44, 0x04, 0xF0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x6F, +0xEE, 0xF0, 0xA3, 0xED, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6F, 0x90, 0x94, 0x13, 0x12, 0x43, +0xC8, 0x7A, 0x93, 0x79, 0x6D, 0x02, 0x55, 0x2C, 0xAC, 0x07, 0x90, 0x93, 0xDB, 0xE0, 0x44, 0x0F, +0xF0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x93, 0xDD, 0xEC, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, +0xE0, 0x90, 0x93, 0xDE, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0x93, 0xDF, 0xF0, 0x90, 0xFD, 0x64, +0xE0, 0x90, 0x93, 0xE0, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xE1, 0xF0, 0x90, 0xFD, 0x66, +0xE0, 0x90, 0x93, 0xE2, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0xE3, 0xF0, 0x80, 0x11, 0x90, +0x93, 0xDE, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0x7B, 0x01, 0x7A, 0x93, 0x79, 0xDD, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0xDB, +0x02, 0x55, 0x2C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x84, +0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x85, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0x90, 0x93, 0x86, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x87, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x88, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, +0x58, 0xE0, 0x20, 0xE0, 0x14, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x84, 0x7F, 0x30, 0xD1, 0xE8, 0x90, +0x93, 0x84, 0xE0, 0xFB, 0x7D, 0x01, 0xE4, 0x80, 0x07, 0x90, 0x93, 0x84, 0xE0, 0xFB, 0xE4, 0xFD, +0xFF, 0xD1, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x93, 0x8B, 0x12, 0x43, 0xC8, 0xE4, 0xFE, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x2F, 0x90, 0xFD, +0x50, 0xEF, 0xF0, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0x93, 0x8B, 0x12, 0x43, 0xA8, 0x8E, +0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, +0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0xF0, 0x44, 0x0A, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, +0x93, 0x6F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, +0x93, 0x71, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, +0x93, 0x73, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x93, 0x6D, 0x30, 0xE6, 0x08, 0xE0, 0x54, 0x0F, +0x44, 0x50, 0xF0, 0x80, 0x16, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, +0x93, 0x74, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0x75, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, +0x6F, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6D, 0x02, 0x55, 0x2C, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x79, 0xF0, 0x90, +0x93, 0x79, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x70, 0xE9, 0x90, 0x94, 0x46, 0xE0, 0xFF, 0x74, 0x01, +0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, +0x5D, 0x70, 0x03, 0x02, 0x70, 0xE2, 0x90, 0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, +0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7A, 0xF0, 0x75, 0x20, 0x01, 0x75, 0x21, 0x93, 0x75, 0x22, +0x7A, 0x75, 0x23, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7B, 0x12, 0x55, 0xDD, 0x90, 0x93, 0x7B, +0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x94, 0x46, 0x30, 0xE0, 0x59, 0xE0, 0x75, +0xF0, 0x02, 0x90, 0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x46, +0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0x90, +0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7E, +0xF0, 0x90, 0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, +0x93, 0x7F, 0xF0, 0x90, 0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, +0xE0, 0x90, 0x93, 0x80, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, +0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, +0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0x90, 0x94, 0x46, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7E, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, +0x7A, 0x93, 0x79, 0x7C, 0x11, 0xEE, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x90, 0x94, 0x46, 0xE0, 0xFE, +0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, 0x79, +0xF0, 0x90, 0x94, 0x46, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, +0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x94, 0x46, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x02, +0x6F, 0xAF, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, +0x81, 0x12, 0x43, 0xC8, 0xEF, 0x12, 0x43, 0xD1, 0x71, 0x98, 0x01, 0x71, 0x8F, 0x02, 0x71, 0xE0, +0x03, 0x71, 0xE9, 0x05, 0x71, 0xF2, 0x06, 0x73, 0x46, 0x07, 0x71, 0xFA, 0x0B, 0x72, 0x03, 0x10, +0x72, 0x0B, 0x11, 0x72, 0x13, 0x12, 0x72, 0x1B, 0x16, 0x72, 0x25, 0x17, 0x72, 0x2F, 0x18, 0x72, +0x39, 0x19, 0x73, 0x09, 0x1B, 0x73, 0x12, 0x1C, 0x72, 0x42, 0x1D, 0x72, 0x4C, 0x1E, 0x72, 0x57, +0x21, 0x72, 0x60, 0x22, 0x72, 0x69, 0x23, 0x72, 0x72, 0x24, 0x72, 0x7B, 0x25, 0x72, 0x84, 0x26, +0x72, 0x8D, 0x27, 0x72, 0x96, 0x28, 0x72, 0x9F, 0x29, 0x71, 0xA1, 0x2D, 0x71, 0xAA, 0x2E, 0x72, +0xA8, 0x2F, 0x73, 0x1B, 0x30, 0x72, 0xB9, 0x32, 0x72, 0xB0, 0x33, 0x71, 0xBC, 0x34, 0x72, 0xC2, +0x36, 0x72, 0xCB, 0x37, 0x72, 0xD4, 0x38, 0x72, 0xDC, 0x3A, 0x71, 0xB3, 0x3B, 0x72, 0xE5, 0x3E, +0x72, 0xEE, 0x3F, 0x72, 0xF7, 0x41, 0x73, 0x24, 0x46, 0x71, 0xC5, 0x47, 0x71, 0xD7, 0x48, 0x71, +0xCE, 0x49, 0x73, 0x2D, 0x4B, 0x73, 0x36, 0x51, 0x73, 0x00, 0x53, 0x00, 0x00, 0x73, 0x3F, 0x90, +0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8B, 0xA0, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8B, +0xA6, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8C, 0x87, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, +0x02, 0x8C, 0xCF, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0x08, 0x90, 0x93, 0x81, 0x12, +0x43, 0xA8, 0x02, 0x8D, 0x3A, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8D, 0x40, 0x90, 0x93, +0x81, 0x12, 0x43, 0xA8, 0x02, 0x8E, 0x00, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x98, 0x29, +0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8E, 0x11, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, +0x8A, 0x5A, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x81, 0x17, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, +0x02, 0x8A, 0xD0, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x61, 0x47, 0x90, 0x93, 0x81, 0x12, 0x43, +0xA8, 0x61, 0x4D, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x61, 0x53, 0x90, 0x93, 0x81, 0x12, 0x43, +0xA8, 0x7F, 0x01, 0x80, 0x2F, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x7F, 0x02, 0x80, 0x25, 0x90, +0x93, 0x81, 0x12, 0x43, 0xA8, 0x7F, 0x03, 0x80, 0x1B, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, +0x8F, 0x43, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0xE4, 0xFF, 0x80, 0x08, 0x90, 0x93, 0x81, 0x12, +0x43, 0xA8, 0x7F, 0x04, 0x02, 0x8E, 0x61, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x7B, +0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x94, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, +0x8F, 0xAD, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xC6, 0x90, 0x93, 0x81, 0x12, 0x43, +0xA8, 0x02, 0x8F, 0xDF, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0xF8, 0x90, 0x93, 0x81, +0x12, 0x43, 0xA8, 0x02, 0x90, 0x11, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x2A, 0x90, +0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x43, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x81, 0x08, +0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x6B, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, +0x90, 0x84, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x9D, 0x90, 0x93, 0x81, 0x12, 0x43, +0xA8, 0x02, 0x92, 0x50, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x61, 0xE6, 0x90, 0x93, 0x81, 0x12, +0x43, 0xA8, 0x02, 0x92, 0x62, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x97, 0xBC, 0x90, 0x93, +0x81, 0x12, 0x43, 0xA8, 0x02, 0x97, 0xD5, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x98, 0x10, +0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x5F, 0xE9, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, +0x8A, 0x9F, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0x86, 0x90, 0x93, 0x81, 0x12, 0x43, +0xA8, 0x02, 0x9A, 0xAF, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x6E, 0x83, 0x90, 0x93, 0x81, +0x12, 0x43, 0xA8, 0x02, 0x98, 0x31, 0x90, 0x93, 0x81, 0x12, 0x43, 0xA8, 0x02, 0x8E, 0x59, 0x90, +0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x05, 0x7F, 0x0B, 0x80, 0x10, 0x7D, 0x01, 0x7F, +0x0C, 0x80, 0x0A, 0x7D, 0x01, 0x7F, 0x0D, 0x80, 0x04, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x3B, 0x12, 0x43, 0xC8, 0xE4, 0xFE, 0x90, 0x00, 0xA3, 0xE0, +0x54, 0xF8, 0x44, 0x05, 0xF0, 0x90, 0x00, 0xA0, 0xE0, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x5A, 0x90, +0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x49, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, +0x9D, 0x50, 0x1E, 0x90, 0x94, 0x3B, 0x12, 0x43, 0xA8, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, +0x0F, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, +0xDD, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0F, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, +0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xFF, 0x80, 0x12, 0x90, +0x01, 0x43, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, 0x08, 0x90, 0x01, 0x42, 0xE0, 0x04, 0xF0, 0x7F, +0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, +0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x23, 0x71, 0x5D, 0xEF, 0xB4, +0x03, 0x05, 0x7F, 0xFF, 0x12, 0x9B, 0x06, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xE9, 0x24, 0x01, 0xF9, +0xE4, 0x3A, 0xFA, 0x7D, 0x04, 0x61, 0x5D, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x1F, +0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0x90, 0x93, 0x84, 0xEF, 0xF0, +0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, +0x12, 0x1F, 0x0F, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x00, 0x04, 0x12, +0x1F, 0x0F, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, 0x84, +0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAD, 0x82, 0xAC, 0x83, 0x90, +0x93, 0x8B, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, +0x8A, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xA8, +0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x8D, 0x12, 0x43, 0xA8, 0xEF, +0x12, 0x42, 0x53, 0x90, 0x93, 0x86, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, +0x90, 0x93, 0x8D, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x90, 0x93, 0x86, +0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x8B, 0xE0, 0xFC, 0xA3, +0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0x8D, 0x82, 0x8C, 0x83, 0xA3, +0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x24, 0xC2, 0xF5, 0x82, 0xE4, +0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x85, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, +0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8B, 0x12, 0x43, +0x9C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, +0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x8F, 0x57, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, +0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, 0x57, 0x75, 0xF0, 0x02, 0xA4, 0x24, 0x02, 0xF9, +0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0x75, 0xF0, 0x09, 0xE5, 0x57, +0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, 0x85, 0x83, 0x5D, 0x8F, 0x5E, 0xE5, 0x57, 0x75, +0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0x75, 0x5F, 0x01, 0xF5, 0x60, 0x89, +0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x12, 0x43, 0xD1, +0x75, 0xA5, 0x00, 0x75, 0xBA, 0x01, 0x75, 0xCF, 0x02, 0x75, 0xE4, 0x03, 0x76, 0x0D, 0x04, 0x76, +0x22, 0x05, 0x76, 0x37, 0x06, 0x76, 0x5D, 0x0C, 0x76, 0x8A, 0x0D, 0x76, 0xB7, 0x0E, 0x76, 0xE4, +0x0F, 0x00, 0x00, 0x77, 0x18, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, +0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, +0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80, 0x27, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, +0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, 0xE1, 0x18, 0xE5, 0x57, 0x25, +0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF5, +0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, +0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, +0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xE1, 0x18, 0x90, 0x04, 0x47, +0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x46, 0xE0, 0xAB, 0x5A, +0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x45, 0xE0, 0x85, 0x59, +0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, 0xE1, 0x0F, 0x90, 0x04, 0x4B, 0xE0, 0xAB, 0x5A, +0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4A, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, +0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x49, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, +0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, +0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, +0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, +0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, +0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, +0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x50, 0xE0, +0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xC0, 0x03, +0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x12, 0x1E, +0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0xAB, 0x5A, 0xE5, 0x5C, 0x24, +0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, +0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x5F, 0xD0, 0x01, 0xD0, +0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xC0, 0x83, 0xC0, 0x82, +0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, +0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, +0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x57, +0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, +0x60, 0x4C, 0x90, 0x93, 0x90, 0x74, 0x0B, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xC3, 0x94, 0x00, +0x50, 0x03, 0x02, 0x78, 0x5E, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, +0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, +0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x0A, 0x90, 0x93, 0x90, 0xE0, +0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x90, 0xE0, 0x14, 0xF0, 0x80, 0xBA, 0xE5, 0x57, +0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, +0x60, 0x47, 0x90, 0x93, 0x90, 0x74, 0x0F, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xC3, 0x94, 0x00, +0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, +0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x90, 0xE0, 0xA3, 0xF0, 0x80, +0x0D, 0x90, 0x93, 0x90, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0xE5, 0x57, +0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, +0x60, 0x46, 0xE4, 0x90, 0x93, 0x90, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, +0x02, 0x21, 0x17, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, +0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, 0x93, 0x90, 0xE0, 0x80, 0x63, +0x90, 0x93, 0x90, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, +0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x90, +0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, +0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, +0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, +0x60, 0x08, 0x90, 0x93, 0x90, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, 0x93, 0x90, 0xE0, 0x04, 0xF0, +0x80, 0xBF, 0xE4, 0x90, 0x93, 0x92, 0xF0, 0x90, 0x93, 0x91, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0xE5, +0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, 0x90, 0x93, 0x92, 0xE0, 0xFE, 0x75, 0xF0, +0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xE5, 0x57, 0xC3, 0x94, 0x20, +0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, +0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, +0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x92, 0xE0, 0xA3, 0xF0, 0x80, 0x37, 0x80, 0x2D, 0x74, 0x27, +0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x91, 0xE0, 0xFE, +0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x93, 0xEE, 0xF0, 0x80, 0x17, 0x90, 0x93, 0x92, 0xE0, +0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x91, 0xE0, 0x90, +0x93, 0x93, 0xF0, 0x90, 0x93, 0x93, 0xE0, 0xFD, 0xAF, 0x57, 0x31, 0xEF, 0x90, 0x93, 0x93, 0xE0, +0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, +0x91, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x03, 0xF0, 0x22, 0xEF, +0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x03, +0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x8A, 0x83, 0xF0, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x0E, 0x74, 0x84, 0x2F, 0xF5, +0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, 0x29, 0x74, 0x27, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0xCE, 0xEF, 0xF0, 0x24, 0x27, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0xCF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xCE, 0x7D, +0x02, 0x71, 0xB4, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0xE5, 0x53, 0x54, 0x1F, +0x90, 0x93, 0x60, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x90, +0x93, 0x5E, 0xF0, 0x90, 0x93, 0x61, 0x74, 0x01, 0xF0, 0xEB, 0xC3, 0x94, 0x01, 0x40, 0x02, 0x80, +0x3B, 0x90, 0x93, 0x5E, 0xE0, 0x25, 0x55, 0xFF, 0xA3, 0xF0, 0xA3, 0xE0, 0x90, 0x41, 0xA4, 0x93, +0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x13, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, +0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x21, 0xEF, 0x90, 0x93, 0x5F, 0xE0, 0xFF, 0x74, 0x01, +0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x75, 0xF0, +0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x63, 0xF0, 0x74, 0x28, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, 0x93, 0x62, 0xF0, 0x74, 0xE8, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x5D, 0x74, 0xE8, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, +0x83, 0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEF, 0xF0, 0x74, +0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, +0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xC6, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x0D, 0x74, 0xC6, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, 0x93, 0x63, 0xE0, 0xFF, 0x90, 0x93, 0x62, +0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, 0x62, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, +0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, +0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, +0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, 0x90, 0x93, 0x62, 0xE0, 0xFD, +0x31, 0xEF, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x12, 0x90, 0x04, 0x30, 0xE0, +0x70, 0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0x04, 0xCF, 0x04, 0xF0, 0x90, 0x93, +0x62, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x1C, 0x12, 0x43, +0xC8, 0x90, 0x94, 0x1F, 0xE0, 0x54, 0xF0, 0x44, 0x06, 0xFF, 0xF0, 0xED, 0x54, 0x0F, 0xC4, 0x54, +0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x94, 0x1C, 0x12, 0x43, 0xA8, 0x90, 0x94, 0x13, +0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x1F, 0x12, 0x55, 0x2C, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, +0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x89, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2C, 0xF5, +0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x89, +0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x8C, 0xF0, 0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x89, 0x12, +0x43, 0x9C, 0xE0, 0x90, 0x93, 0x8E, 0xF0, 0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x88, 0x12, 0x43, +0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x8F, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, +0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x90, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEC, +0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, +0x93, 0x92, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, 0xC6, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, +0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, 0x90, 0x93, 0x8F, 0xE0, 0x90, 0x93, 0x8C, 0xF0, +0x90, 0x93, 0x89, 0xF0, 0xED, 0x70, 0x02, 0xA1, 0x6B, 0x90, 0x93, 0x8D, 0xED, 0xF0, 0x90, 0x93, +0x89, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x8C, 0xE0, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x8D, +0xE0, 0x14, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0x70, 0x02, 0xA1, 0x6B, 0x90, 0x93, 0x8C, 0xE0, 0xFF, +0xD3, 0x94, 0x00, 0x50, 0x02, 0xA1, 0x6B, 0xE4, 0x90, 0x93, 0x8B, 0xF0, 0xEF, 0x14, 0x90, 0x93, +0x8A, 0xF0, 0x90, 0x93, 0x8E, 0xE0, 0xFD, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, +0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x92, 0xE0, 0x5E, 0xFE, +0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, +0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0xFF, 0x90, 0x93, 0x90, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x93, 0x8A, +0xE0, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x8B, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0xFF, +0x90, 0x93, 0x8B, 0xE0, 0x6F, 0x60, 0x08, 0x90, 0x93, 0x8A, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, +0x93, 0x8D, 0xE0, 0xFF, 0x90, 0x93, 0x8B, 0xE0, 0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x93, 0x8A, 0xE0, +0xB5, 0x05, 0x08, 0x90, 0x93, 0x8E, 0xE0, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFF, +0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, +0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, +0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, +0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, +0x93, 0x89, 0xE0, 0xFD, 0x31, 0xEF, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x22, 0xEF, 0xC3, 0x94, 0x20, +0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, 0xF0, 0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, +0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, +0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, +0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x4D, 0xF0, 0x22, 0xAD, 0x07, 0xED, 0xC3, +0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, +0x7F, 0x90, 0x93, 0x89, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, +0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xF9, 0x54, 0x1F, 0xA3, +0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFF, 0x90, 0x93, 0x8C, +0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, +0xE0, 0x90, 0x93, 0x8D, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, +0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8F, 0xCB, 0xF0, 0xA3, 0xEB, +0xF0, 0x90, 0x93, 0x8A, 0xE0, 0xFE, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, +0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xEE, 0xC3, 0x9F, 0x40, 0x02, 0xE1, 0x59, +0x90, 0x93, 0x8A, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, +0xF0, 0xEF, 0x04, 0x90, 0x93, 0x8B, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8B, 0xE0, +0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xE1, 0x93, 0xEE, 0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0, +0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, +0xF9, 0xFF, 0x90, 0x93, 0x8D, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, +0x8B, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8F, 0xE0, 0x5E, 0xFE, 0xA3, +0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x8B, 0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x93, 0x8E, 0xE0, +0x30, 0xE7, 0x06, 0x90, 0x93, 0x8B, 0x74, 0x17, 0xF0, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0x64, 0x13, +0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, 0x8D, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x8B, +0x74, 0x18, 0xF0, 0x90, 0x93, 0x8B, 0xE0, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, 0x89, 0xF0, 0x80, +0x42, 0x90, 0x93, 0x8B, 0xE0, 0x04, 0xF0, 0xC1, 0xB7, 0x90, 0x93, 0x8C, 0xE0, 0xFC, 0x90, 0x93, +0x8A, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, +0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x10, +0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x8A, 0xE0, 0x44, 0x40, 0x90, 0x93, 0x89, 0xF0, 0x80, 0x03, +0xAF, 0x01, 0x22, 0x90, 0x93, 0x8A, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, +0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, 0x93, 0x8A, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90, +0x93, 0x8C, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, +0x90, 0x93, 0x8A, 0xEF, 0xF0, 0x90, 0x93, 0x89, 0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24, +0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, +0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, +0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, +0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0x90, 0x93, 0x89, 0xE0, 0x44, +0x80, 0xFD, 0x12, 0x79, 0xEF, 0x90, 0x93, 0x89, 0xE0, 0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x93, +0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, 0x03, 0x02, 0x88, 0x5F, 0xEF, +0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, 0x90, 0x89, 0x01, 0xE0, 0xFF, 0x90, 0x8F, +0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, +0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x88, 0x56, 0xEF, 0x25, 0xE0, +0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, +0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x88, 0x56, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x20, 0x40, 0x09, +0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x88, 0x5F, 0x90, 0x93, 0x79, 0xE0, 0x75, 0xF0, 0x0A, +0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0xE0, +0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, 0xE0, +0x90, 0x93, 0x7E, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, +0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x80, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, +0x90, 0x93, 0x79, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x7A, 0xF0, 0x80, 0x14, 0x90, 0x93, 0x79, +0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x7A, +0xF0, 0x90, 0x93, 0x7A, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x75, +0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x83, 0xF0, 0x74, 0x67, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x61, 0xF4, 0x90, +0x93, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x7B, 0xE0, 0x9F, 0x40, 0x13, 0x90, 0x93, 0x83, 0xE0, 0x90, +0x93, 0x7B, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, 0x93, 0x7A, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0x93, +0x7B, 0xE0, 0xFF, 0x90, 0x41, 0x18, 0x93, 0xFE, 0x90, 0x93, 0x79, 0xE0, 0x24, 0x85, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, 0x90, 0x40, 0xE0, 0x80, 0x07, +0x90, 0x93, 0x7B, 0xE0, 0x90, 0x40, 0xFC, 0x93, 0x90, 0x93, 0x82, 0xF0, 0x90, 0x93, 0x82, 0xE0, +0x75, 0xF0, 0x06, 0xA4, 0x24, 0x56, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x8B, 0x57, +0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, +0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7C, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, +0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x9D, 0xFD, 0xAC, +0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7C, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, +0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, +0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, +0x7C, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x02, +0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x04, 0x12, +0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7C, 0xEE, 0x8F, 0xF0, 0x12, 0x42, +0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x06, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, +0x1F, 0x3C, 0x90, 0x93, 0x7C, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, +0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, +0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7C, 0xEE, +0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x05, 0x12, 0x1F, +0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7E, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0xD3, +0x90, 0x93, 0x7D, 0xE0, 0x9F, 0x90, 0x93, 0x7C, 0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, +0x90, 0x93, 0x7C, 0xE0, 0x9E, 0xF0, 0x80, 0x07, 0xE4, 0x90, 0x93, 0x7C, 0xF0, 0xA3, 0xF0, 0x90, +0x93, 0x7C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, +0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x7A, 0xE0, 0x25, +0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, +0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, 0x61, 0xC3, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, +0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, 0x40, 0x03, 0xEF, 0x80, 0x1C, 0x90, 0x93, 0x79, +0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x82, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x93, +0x84, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, 0x23, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, 0xC6, +0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x01, 0x40, 0x0F, 0x74, 0xC6, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x14, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x79, 0xE0, +0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, +0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x60, 0x02, 0xE1, 0x04, 0x12, 0x7D, +0xFC, 0xE1, 0x04, 0x90, 0x93, 0x7A, 0xE0, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, +0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC3, 0x90, 0x93, 0x7D, 0xE0, 0x9F, 0x90, +0x93, 0x7C, 0xE0, 0x9E, 0x40, 0x02, 0xE1, 0x04, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x7D, 0x01, 0x12, +0x7B, 0xF1, 0xE1, 0x04, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, +0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xA1, 0xD2, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, +0x03, 0x0B, 0x90, 0x93, 0x7B, 0xE0, 0xC3, 0x94, 0x19, 0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, +0x0B, 0x90, 0x93, 0x7B, 0xE0, 0xC3, 0x94, 0x11, 0x40, 0x2E, 0x80, 0x1F, 0x90, 0x8A, 0x83, 0xE0, +0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x7B, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, +0x70, 0x11, 0x90, 0x93, 0x7B, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x0D, 0x90, 0x8E, 0xC5, 0x74, 0x01, +0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFE, 0x24, 0xC4, 0xF5, +0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x74, 0x85, 0x2E, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30, 0x50, 0x0A, 0xE4, 0x90, 0x93, 0x88, +0xF0, 0x74, 0x67, 0x2F, 0xA1, 0x7D, 0x90, 0x8E, 0xC5, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x72, +0x90, 0x93, 0x79, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x0A, +0x60, 0x5B, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0xEE, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x41, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, +0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x79, 0xE0, 0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, +0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, +0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, 0x93, 0x79, 0xE0, 0x24, 0xA7, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x7B, 0xE0, 0x6F, 0x60, 0x56, 0x90, 0x93, 0x79, +0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, +0x08, 0x90, 0x93, 0x88, 0x74, 0x05, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0x39, 0x90, 0x93, 0x88, +0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, +0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, +0x8F, 0x80, 0x2F, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, +0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, +0x80, 0x14, 0xE4, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0xFE, 0x90, 0x93, 0x79, 0xE0, 0xFF, +0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFE, +0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, +0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x11, 0xE4, 0x90, 0x93, 0x88, 0xF0, 0x74, +0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFD, +0xE1, 0x01, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xE1, 0x04, 0x90, 0x93, 0x7C, 0xF0, 0xA3, 0xF0, 0x90, +0x41, 0xE1, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7E, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, +0x3C, 0x90, 0x93, 0x86, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x24, 0xC4, 0xF5, +0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0xE4, 0x90, 0x93, 0x85, 0xF0, +0x90, 0x93, 0x85, 0xE0, 0xFF, 0xD3, 0x94, 0x04, 0x50, 0x47, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, +0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, +0xEF, 0x90, 0x41, 0xDC, 0x93, 0xFF, 0x7E, 0x00, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7C, 0xEE, 0x8F, +0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x86, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x7D, +0xE0, 0x9F, 0x90, 0x93, 0x7C, 0xE0, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x85, 0xE0, 0x04, 0xF0, 0x80, +0xAF, 0x90, 0x93, 0x85, 0xE0, 0xC3, 0x13, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, +0x90, 0x93, 0x85, 0xE0, 0x70, 0x5D, 0x90, 0x93, 0x88, 0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, +0x1D, 0x90, 0x93, 0x85, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x88, 0x74, 0x03, 0xF0, 0x80, 0x48, +0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x88, 0x74, 0x01, 0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, 0x93, +0x88, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, 0x85, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x88, +0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, 0x88, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, +0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x81, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x80, 0xE0, 0x94, +0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x88, 0xF0, 0xD3, 0x90, 0x93, 0x81, 0xE0, 0x94, 0x03, 0x90, +0x93, 0x80, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x88, 0xE0, +0xFD, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xED, +0xF0, 0x12, 0x7D, 0xBC, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, +0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, +0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x79, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x80, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, +0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, 0x93, 0x79, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x47, +0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, 0x50, +0x1C, 0x90, 0x93, 0x80, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x80, 0x14, 0x90, 0x93, 0x79, +0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, +0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, +0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, 0xFF, 0x9D, 0xFB, 0x74, 0xFF, 0x9C, 0xFA, 0xEF, +0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, +0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x79, 0xE0, 0x50, 0x13, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, 0x42, 0x87, 0x80, 0x10, 0x25, 0xE0, 0x24, 0xC7, +0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, +0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, +0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, +0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, 0x12, +0x43, 0x1F, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x04, 0xF0, 0x02, 0x80, 0x62, 0x22, +0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE4, +0xF0, 0x90, 0x93, 0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x14, 0x74, +0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0x04, +0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, 0x90, 0x89, 0x01, 0x04, 0xF0, 0xE4, 0x90, 0x93, +0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, 0x02, 0x41, 0x59, 0x75, 0xF0, +0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, +0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, +0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, +0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x9C, +0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, +0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC4, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, +0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, +0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x05, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, +0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, +0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8E, 0x04, +0xF0, 0x90, 0x41, 0x92, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x90, 0x41, 0x5A, 0x74, 0x01, 0x93, +0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0x90, 0x93, 0x79, 0xE0, 0xFD, +0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, +0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x75, 0xF0, 0x09, +0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x74, 0xC2, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x86, 0x12, 0x43, +0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x84, 0x12, 0x43, 0x9C, +0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, +0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xED, +0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0x74, +0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, +0xF0, 0x90, 0x93, 0x79, 0xE0, 0x04, 0xF0, 0x01, 0xA2, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xC3, 0x94, +0x40, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, 0x40, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x3F, 0xFE, +0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFD, 0xAF, 0x06, 0x02, 0x74, 0x2B, 0x12, +0x1E, 0xF6, 0x90, 0x89, 0x01, 0xF0, 0x22, 0x90, 0x93, 0x90, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x93, +0xE0, 0x54, 0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, 0x93, 0x90, 0x12, 0x43, +0xA8, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x93, 0x02, 0x55, 0x2C, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, +0x94, 0x40, 0x40, 0x02, 0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, +0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, +0x84, 0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, +0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x86, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, +0x74, 0xFF, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, +0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x8A, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, +0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x8C, 0xF0, 0xEE, 0xA3, +0xF0, 0xA3, 0xEC, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x84, 0x41, 0xA7, +0x12, 0x1E, 0xF6, 0xF5, 0x62, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x84, +0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x84, +0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x00, 0x03, +0x12, 0x1F, 0x0F, 0x90, 0x93, 0x3D, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x01, +0x90, 0x93, 0x3E, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x1F, 0x0F, 0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x45, 0xF0, 0xEF, 0x13, 0x13, 0x13, +0x54, 0x01, 0x90, 0x93, 0x4B, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, 0x01, +0x90, 0x93, 0x47, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x5C, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x4A, 0xF0, 0xE0, 0x70, 0x38, +0x90, 0x93, 0x48, 0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x87, 0x12, 0x1F, 0xD5, +0x00, 0x00, 0x03, 0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x87, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x03, 0x00, 0x90, 0x93, 0x87, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, +0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x3E, 0xE0, 0x70, 0x03, 0x12, 0x4F, +0xB8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x12, 0x4D, 0xC1, 0x90, 0x93, 0x5A, 0xE0, 0x90, 0x01, +0xE6, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, 0xE0, +0x25, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x49, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, +0x4C, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x46, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0x90, 0x93, 0x51, 0xF0, 0x22, 0x90, 0x93, 0x49, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4C, 0x74, +0x05, 0xF0, 0x90, 0x93, 0x46, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x51, 0x74, 0x05, 0xF0, 0x22, 0x12, +0x1E, 0xF6, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x50, 0xF0, 0x90, 0x00, 0x01, +0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x4E, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, 0x93, +0x50, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x4E, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4E, +0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x4D, 0xF0, 0x60, +0x20, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x69, 0x90, +0x93, 0x3E, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x57, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xB8, 0x12, 0x51, +0x69, 0x90, 0x93, 0x4D, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x93, 0x84, 0x02, 0x43, 0xC8, +0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x37, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, +0x54, 0x0F, 0xFF, 0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x70, 0xFF, 0x90, 0x93, +0x37, 0xE0, 0x54, 0x8F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x39, 0xF0, +0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, +0x90, 0x93, 0x3B, 0xF0, 0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, 0x90, 0x00, 0x01, 0x12, +0x1F, 0x0F, 0xFF, 0xD3, 0x94, 0x20, 0x50, 0x08, 0x90, 0x93, 0x38, 0x74, 0x01, 0xF0, 0x80, 0x57, +0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0x93, 0x38, 0x74, 0x02, 0xF0, 0x80, 0x49, 0xEF, 0xD3, +0x94, 0x60, 0x50, 0x08, 0x90, 0x93, 0x38, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0xEF, 0xD3, 0x94, 0x80, +0x50, 0x08, 0x90, 0x93, 0x38, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, 0x94, 0xA0, 0x50, 0x08, +0x90, 0x93, 0x38, 0x74, 0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, 0x50, 0x08, 0x90, 0x93, +0x38, 0x74, 0x06, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, 0x38, 0x50, 0x05, 0x74, +0x07, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x93, 0x38, 0xE0, 0x90, 0x93, 0x3C, 0xF0, 0x22, +0x12, 0x1E, 0xF6, 0x60, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, +0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, +0xAA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAB, 0xF0, 0x90, +0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAC, 0xF0, 0x90, 0x00, 0x03, 0x12, +0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, +0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0xAE, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xA9, 0xF0, +0x22, 0xEF, 0x70, 0x21, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x40, 0xE0, 0x44, 0x20, +0xF0, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x07, 0x90, 0x07, +0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x6A, 0x12, 0x1E, 0xF6, 0x90, 0x00, 0x01, +0x30, 0xE0, 0x2E, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, +0x90, 0x06, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC2, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC3, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x54, 0xFE, 0xF0, 0x80, +0x2C, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x06, +0xC5, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC6, 0xF0, 0x90, 0x00, 0x04, 0x12, +0x1F, 0x0F, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x06, 0xCC, +0xE0, 0x44, 0x02, 0xF0, 0xEF, 0xB4, 0x02, 0x11, 0x12, 0x1E, 0xF6, 0x90, 0x06, 0xC8, 0xF0, 0x90, +0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC9, 0xF0, 0xEF, 0xB4, 0x03, 0x11, 0x12, 0x1E, 0xF6, +0x90, 0x06, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xCB, 0xF0, 0xEF, 0x64, +0x04, 0x70, 0x1F, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x07, 0x83, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x10, +0xF0, 0x80, 0x04, 0xE0, 0x54, 0x6F, 0xF0, 0xEF, 0x30, 0xE1, 0x07, 0x90, 0x07, 0x83, 0xE0, 0x44, +0x80, 0xF0, 0x22, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x12, +0x1E, 0xF6, 0x90, 0x92, 0x6B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6C, 0xF0, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6D, 0xF0, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, +0x12, 0x73, 0x59, 0xEF, 0xB4, 0x02, 0x03, 0x43, 0x14, 0x01, 0x22, 0x90, 0x93, 0x84, 0x12, 0x43, +0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, +0x17, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, +0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x18, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, +0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, +0x01, 0x7F, 0x19, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, +0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1A, 0x02, 0x73, 0x5D, 0x90, +0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, +0xA8, 0x7D, 0x01, 0x7F, 0x1B, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, +0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1C, 0x02, 0x73, +0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, +0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x1D, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, +0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1E, +0x02, 0x73, 0x5D, 0x12, 0x1E, 0xF6, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x1F, 0xB6, +0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0x0B, 0x12, 0x43, 0x84, 0xEC, 0x54, +0x03, 0xFC, 0x12, 0x43, 0x59, 0x90, 0x93, 0x07, 0x02, 0x1F, 0xC9, 0x90, 0x93, 0x84, 0x12, 0x43, +0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, +0x1F, 0x02, 0x73, 0x5D, 0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, +0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x20, 0x02, 0x73, 0x5D, 0x12, 0x1E, 0xF6, +0xFF, 0x54, 0x01, 0x90, 0x01, 0xBC, 0xF0, 0xEF, 0x30, 0xE0, 0x5C, 0x90, 0xFD, 0x58, 0xE0, 0x20, +0xE0, 0x4E, 0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, 0x00, 0x01, 0x12, +0x1F, 0x0F, 0x90, 0xFD, 0x52, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x53, 0xF0, +0xA3, 0xE4, 0xF0, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x90, 0xFD, 0x55, 0x30, 0xE0, 0x05, 0x74, 0xA0, +0xF0, 0x80, 0x03, 0x74, 0xC0, 0xF0, 0x90, 0xFD, 0x56, 0x74, 0x10, 0xF0, 0xA3, 0x74, 0x80, 0xF0, +0x90, 0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, +0x90, 0x01, 0xBD, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0xE4, 0xFC, 0x74, 0x20, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x93, 0x84, 0xEF, +0xF0, 0xEE, 0xF9, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, +0x90, 0xFD, 0x10, 0xF0, 0xEC, 0xC3, 0x99, 0x50, 0x43, 0xEC, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x02, +0xE4, 0xFD, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x07, 0xAF, 0x05, 0x31, 0xA4, 0x0D, 0x80, 0xF3, 0x0C, +0x90, 0xFD, 0x10, 0xE0, 0x04, 0xF0, 0xEC, 0xB5, 0x01, 0xDA, 0xE4, 0xFD, 0xED, 0x75, 0xF0, 0x08, +0xA4, 0xFF, 0x90, 0x93, 0x84, 0xE0, 0xFB, 0xC3, 0xEF, 0x9B, 0x74, 0x80, 0xF8, 0x65, 0xF0, 0x98, +0x50, 0x07, 0xAF, 0x05, 0x31, 0xA4, 0x0D, 0x80, 0xE3, 0x0C, 0x80, 0xB8, 0x90, 0x00, 0x81, 0xE0, +0x44, 0x80, 0xFD, 0x7F, 0x81, 0x12, 0x54, 0x1B, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0xE0, 0x04, +0xF0, 0x80, 0xF1, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x51, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x52, 0xF0, 0xEF, 0x75, 0xF0, 0x08, +0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x53, 0xF0, 0xEF, +0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, +0x54, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x90, 0xFD, 0x55, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x56, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, +0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, +0x12, 0x1E, 0xF6, 0x90, 0xFE, 0x10, 0x60, 0x05, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xE0, 0x54, 0xFE, +0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x88, 0x12, 0x43, 0xC8, 0x12, +0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, +0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, +0x15, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x12, +0x1E, 0xF6, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, +0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x15, +0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x01, 0xFE, 0x90, +0x93, 0x18, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, +0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFB, +0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, +0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x80, 0xFF, 0x90, +0x93, 0x18, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, +0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, +0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x19, 0xE0, +0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x04, +0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, +0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, +0x07, 0xB1, 0xCC, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x88, 0x12, 0x43, 0xA8, 0x12, 0x1E, +0xF6, 0x20, 0xE0, 0x02, 0x81, 0xE7, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x25, 0xF0, +0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x16, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, +0x90, 0x93, 0x16, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x17, 0xF0, 0x80, 0x48, +0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, +0x90, 0x93, 0x16, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, +0x16, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, +0xEF, 0xC3, 0x94, 0x03, 0x90, 0x93, 0x17, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, +0x80, 0x06, 0x90, 0x93, 0x17, 0x74, 0x2A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, +0x03, 0x30, 0xE0, 0x3D, 0x90, 0x93, 0x16, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x1E, 0xF0, +0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x20, +0xF0, 0x90, 0x93, 0x16, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x21, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0xC3, +0x13, 0x90, 0x93, 0x22, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, +0xAD, 0xE4, 0x90, 0x93, 0x11, 0xF0, 0x90, 0x93, 0x88, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, +0x1F, 0x0F, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x14, 0x12, 0x1E, 0xF6, 0x13, 0x13, 0x13, +0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x80, 0x02, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, +0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x18, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, +0x30, 0xE0, 0x03, 0x75, 0x64, 0x04, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, +0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x27, +0x74, 0x01, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x93, 0x27, 0x74, +0x04, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x93, 0x27, 0x74, 0x02, +0xF0, 0x80, 0x0D, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x07, 0x06, 0x90, 0x93, 0x27, 0x74, 0x05, 0xF0, +0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x80, 0x63, 0x90, 0x93, 0x88, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, +0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x93, 0x84, 0x30, 0xE0, 0x09, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x03, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0xD1, 0xA1, 0x90, 0x00, +0x40, 0x74, 0x20, 0xF0, 0x90, 0x93, 0x88, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, +0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, +0x74, 0x01, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x84, 0xB1, 0x82, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, +0xF0, 0xE4, 0x90, 0x93, 0x26, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x09, 0x90, 0x93, 0x04, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x5E, +0x46, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x5E, 0x67, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x7F, 0x70, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x54, 0xFC, +0xFF, 0x90, 0x01, 0xE8, 0xF0, 0xEE, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, +0x90, 0x01, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xED, 0xF0, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEE, 0xF0, 0x12, 0x1E, 0xF6, 0x90, 0x01, 0xEF, 0xF0, 0x90, +0x01, 0xEB, 0x74, 0x40, 0xF0, 0xD1, 0x4C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xEC, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xF0, +0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, +0x00, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x4B, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, +0x90, 0x93, 0x3E, 0xE0, 0x60, 0x14, 0x12, 0x51, 0xBB, 0xBF, 0x01, 0x0B, 0x90, 0x93, 0x15, 0xE0, +0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0x4F, 0xB8, 0x90, 0x93, 0x2D, 0xE0, 0x20, 0xE0, +0x23, 0x90, 0x93, 0x48, 0xE0, 0x60, 0x1D, 0x7F, 0x01, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x5C, 0xE0, +0x60, 0x12, 0x90, 0x93, 0xF0, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7B, 0x01, 0x7A, 0x93, +0x79, 0xF0, 0xB1, 0x82, 0x12, 0x54, 0x5C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x94, 0x40, +0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, 0x60, 0x43, 0xC3, 0x90, 0x94, 0x41, 0xE0, +0x94, 0x88, 0x90, 0x94, 0x40, 0xE0, 0x94, 0x13, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, +0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x40, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, +0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x94, 0x41, 0xE0, 0x94, 0x64, 0x90, 0x94, 0x40, 0xE0, +0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, +0x22, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, +0xE4, 0x90, 0x93, 0x26, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, +0xFB, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, +0x7F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, +0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, +0xF0, 0xA3, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, +0x28, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, +0x54, 0xDF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFE, +0xF0, 0xE4, 0x90, 0x93, 0x23, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x29, 0xF0, 0xA3, 0xF0, 0x90, 0x93, +0x1C, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xEF, 0xF0, +0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, +0x54, 0xE1, 0xF0, 0xE4, 0x90, 0x93, 0x36, 0xF0, 0x22, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFE, 0xF0, +0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, +0x1F, 0xD5, 0x20, 0x08, 0x30, 0x70, 0x90, 0x93, 0x0B, 0x12, 0x1F, 0xD5, 0xC0, 0x08, 0x30, 0x70, +0xE4, 0x90, 0x93, 0x11, 0xF0, 0xA3, 0xF0, 0x43, 0xE8, 0x04, 0x90, 0xFD, 0x68, 0x74, 0x02, 0xF0, +0x90, 0x04, 0x26, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x07, 0x83, 0xE4, 0xF0, 0x90, 0x07, 0x78, 0x74, +0x03, 0xF0, 0x90, 0x04, 0x64, 0xE4, 0xF0, 0x90, 0x00, 0x40, 0x74, 0x20, 0xF0, 0xD1, 0xA1, 0x90, +0x93, 0x2C, 0x74, 0x01, 0xF0, 0x7D, 0x04, 0x7F, 0x02, 0x02, 0x3A, 0xAD, 0x90, 0x93, 0x84, 0x12, +0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, 0x7D, 0x01, +0x7F, 0x24, 0x02, 0x73, 0x5D, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x1A, 0xE0, +0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, +0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, +0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x1B, 0xF0, 0x22, +0x90, 0x93, 0x84, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x84, 0x12, +0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x26, 0x02, 0x73, 0x5D, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xB2, 0xF0, +0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, +0xB1, 0xF0, 0x22, 0x90, 0x93, 0xE4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xE8, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x00, 0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xE8, 0x12, 0x43, 0x90, 0xD3, +0x12, 0x43, 0x73, 0x50, 0x41, 0x90, 0x93, 0xE8, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xE4, +0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, +0x7B, 0x01, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, 0x1B, 0x90, 0x93, 0xE8, 0x12, 0x43, +0x84, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, +0xE8, 0x12, 0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xE8, 0x02, 0x43, 0x84, 0x90, 0x93, 0xB6, 0x12, +0x1F, 0xC9, 0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xBA, 0x12, 0x43, 0x90, 0xC3, 0x12, +0x43, 0x73, 0x90, 0x93, 0xB6, 0x60, 0x67, 0x12, 0x43, 0x84, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xC2, +0x12, 0x1F, 0xC9, 0x90, 0x93, 0xBA, 0x12, 0x43, 0x84, 0x11, 0x43, 0x90, 0x93, 0xC6, 0x12, 0x1F, +0xC9, 0x90, 0x93, 0xBA, 0x12, 0x43, 0x84, 0x12, 0x43, 0x66, 0x90, 0x93, 0xC2, 0x12, 0x43, 0x90, +0x12, 0x43, 0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xC6, 0x12, 0x43, +0x84, 0xA9, 0x07, 0x90, 0x93, 0xBE, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, +0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, 0x90, 0x93, 0xCA, 0x12, 0x1F, 0xC9, 0x90, +0x93, 0xB6, 0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xCA, 0x80, 0x0A, 0x12, 0x43, +0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xBE, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, +0xC9, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x93, 0xF4, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xF8, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x00, 0x00, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x54, 0x63, 0x12, 0x54, 0x5C, +0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, +0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4B, 0xE0, 0x60, 0x06, 0x90, +0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x57, 0xF0, +0xFF, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xF4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF4, 0x12, +0x43, 0x84, 0xEC, 0x54, 0xFD, 0xFC, 0x90, 0x93, 0xF4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF4, 0x12, +0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, +0x93, 0x48, 0xE0, 0x60, 0x24, 0xE4, 0xFF, 0x12, 0x50, 0xEB, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x13, +0x90, 0x93, 0xF8, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xF8, +0x12, 0x95, 0x82, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x52, 0xE0, 0x60, 0x02, 0xE4, +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x48, +0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x47, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, +0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x63, 0x90, +0x94, 0x48, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, +0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4C, 0x90, 0x94, +0x48, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, +0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x63, 0x90, 0x94, 0x48, +0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, +0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, +0x93, 0x84, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x94, 0x38, 0xE0, 0x54, +0xFE, 0x4F, 0xF0, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x44, 0xFE, 0x90, 0x93, 0x84, 0x12, 0x43, 0xA8, +0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x94, +0x39, 0xF0, 0x22, 0xE4, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x6B, 0x12, 0x73, 0x59, 0xEF, 0xB4, 0x02, +0x14, 0x90, 0x94, 0x44, 0xE0, 0x64, 0x04, 0x60, 0x07, 0x43, 0x14, 0x01, 0xE0, 0x04, 0xF0, 0x22, +0xE4, 0x90, 0x94, 0x44, 0xF0, 0x22, 0xAD, 0x07, 0x90, 0x93, 0xFC, 0xE0, 0x54, 0xF0, 0x44, 0x0C, +0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0xFE, 0xF0, 0x90, 0xFD, 0x63, 0xE0, +0x90, 0x93, 0xFF, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x94, 0x00, 0xF0, 0x90, 0xFD, 0x65, 0xE0, +0x90, 0x94, 0x01, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x94, 0x02, 0xF0, 0x90, 0xFD, 0x67, 0xE0, +0x90, 0x94, 0x03, 0xF0, 0xED, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0xFC, 0xE0, 0x54, 0x0F, 0x44, 0x20, +0xF0, 0x80, 0x3C, 0xED, 0xB4, 0x04, 0x0B, 0x90, 0x93, 0xFC, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, +0x80, 0x2D, 0xED, 0xF4, 0x70, 0x29, 0x90, 0x93, 0xFC, 0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x90, +0x93, 0x2C, 0xE0, 0x60, 0x08, 0x90, 0x93, 0xFE, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, +0xFE, 0xF0, 0xE4, 0x90, 0x93, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, +0x01, 0x7A, 0x93, 0x79, 0xFE, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0xFC, 0x02, +0x55, 0x2C, 0xAD, 0x07, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0xF0, 0x44, 0x0E, 0xF0, 0x54, 0x0F, 0xF0, +0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0x71, 0xF0, +0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x73, 0xF0, +0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0x75, 0xF0, +0xED, 0xB4, 0x01, 0x11, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x6F, +0x74, 0x01, 0xF0, 0x80, 0x13, 0xED, 0xB4, 0x02, 0x0F, 0x90, 0x93, 0x6D, 0xE0, 0x54, 0x0F, 0x44, +0x70, 0xF0, 0x90, 0x93, 0x6F, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x6D, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, +0x60, 0x13, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6F, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0x7A, 0x93, +0x79, 0x6D, 0x12, 0x55, 0x2C, 0x22, 0x90, 0x93, 0x48, 0xE0, 0x60, 0x27, 0x90, 0x93, 0x4B, 0xE0, +0x70, 0x21, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, +0x03, 0xF0, 0x22, 0x90, 0x93, 0x45, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, 0x0D, 0xF0, 0x22, +0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, +0xA1, 0xFC, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x01, 0x70, 0x39, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, +0x06, 0x90, 0x94, 0x45, 0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x29, +0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x45, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFF, 0x90, 0x93, 0x29, +0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0xE7, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, 0x27, +0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x04, 0x70, 0x3A, 0x90, 0x06, 0x92, 0xE0, 0x20, +0xE2, 0x06, 0x90, 0x94, 0x45, 0xE0, 0x60, 0x21, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, +0x29, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x45, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x90, 0x93, +0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0xE7, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, +0x27, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xA1, 0xAB, 0x90, +0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x27, +0x30, 0xE0, 0x4E, 0xA1, 0xF9, 0x90, 0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, +0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, +0x02, 0xA1, 0xBA, 0x90, 0x93, 0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, +0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, +0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x90, 0x93, 0x27, 0x40, 0x02, 0xA1, +0xF9, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x27, +0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x2A, 0xE0, 0xFF, +0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, +0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, +0x94, 0x80, 0x40, 0x58, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, +0x07, 0x70, 0x49, 0x90, 0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0x93, 0x27, 0x80, 0x3A, 0x90, +0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, +0xF0, 0x90, 0x93, 0x27, 0x80, 0x23, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, +0x27, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, +0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x64, 0x01, +0x70, 0x3C, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x90, 0x07, +0x78, 0x74, 0x0D, 0xF0, 0x22, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xE0, +0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x24, 0x80, 0x0E, 0x90, 0x93, 0x18, 0xE0, +0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x02, 0x80, 0x14, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, +0x19, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x03, +0xF0, 0x22, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x5E, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x20, +0xE0, 0x02, 0xC1, 0xF8, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2A, +0xE4, 0xF5, 0x48, 0x90, 0x93, 0x21, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, +0x12, 0x39, 0x77, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0xE4, +0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x5E, +0xE0, 0xFF, 0x90, 0x93, 0x16, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, +0x90, 0x93, 0x26, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0x60, 0x08, 0x90, 0x05, 0x22, 0x74, +0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, +0x12, 0x51, 0x48, 0xE4, 0x90, 0x94, 0x45, 0xF0, 0x22, 0x00, 0xAA, 0x13 +}; + + +u8 Rtl8723UFwUMCBCutImgArrayWithoutBT[Rtl8723UUMCBCutImgArrayWithoutBTLength] = { +0x02, 0x23, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x02, 0x01, 0x10, 0x06, 0xE0, 0x4A, 0x01, 0x00, +0x03, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4A, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x59, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x61, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x61, 0xDA, 0x00, 0x00, +0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, 0x00, 0x04, 0x06, 0x05, 0x04, 0x02, +0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, 0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, +0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, +0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x18, 0x22, 0x21, 0x20, 0x18, +0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, 0x20, 0x08, 0x00, 0x20, 0x22, 0x21, +0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, 0x22, 0x20, 0x18, 0x08, 0x00, 0x20, +0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, 0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, +0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, 0x10, 0x00, 0x00, 0x30, 0x31, 0x20, +0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, +0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, +0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, +0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, +0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, +0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, +0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, +0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, +0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, +0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, +0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, +0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, +0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, +0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, 0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, +0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, +0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, +0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, 0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, +0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, +0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, +0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, +0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, +0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, +0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, +0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, +0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, +0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, +0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, +0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, +0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, +0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, +0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, +0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, +0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, +0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, +0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, +0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, +0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, +0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, +0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, +0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, +0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, +0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, +0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, +0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, +0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, +0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, +0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, +0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, +0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0x90, 0x93, 0x07, 0xF0, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xDD, +0x90, 0x93, 0x51, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x60, +0x03, 0x02, 0x44, 0xDD, 0x02, 0x44, 0xDA, 0x90, 0x93, 0x38, 0xE0, 0x04, 0xF0, 0x53, 0x66, 0xEF, +0x90, 0x93, 0x4F, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x3A, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x0F, 0xB5, 0x07, +0x0A, 0x90, 0x93, 0x30, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, 0x90, 0x93, 0x2D, 0xE0, 0xC4, +0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x4F, 0xE0, 0xB5, +0x07, 0x0B, 0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x2D, +0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x07, 0x74, 0x5A, 0xF0, +0x90, 0x93, 0x07, 0xE0, 0xFF, 0x90, 0x93, 0x3F, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, +0x38, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x0D, 0xE5, 0x62, 0xB4, +0x01, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x51, 0x9C, 0x22, 0xEF, 0x60, +0x0F, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, +0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x02, +0x55, 0xE5, 0x22, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0xA3, 0x12, +0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0xAB, 0xE5, 0x62, 0x64, +0x01, 0x60, 0x03, 0x02, 0x46, 0xAB, 0xE5, 0x65, 0x14, 0x60, 0x29, 0x24, 0xFD, 0x60, 0x25, 0x24, +0x02, 0x24, 0xFB, 0x50, 0x02, 0x80, 0x23, 0x90, 0x93, 0x37, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, +0xA3, 0xE0, 0x60, 0x16, 0x90, 0x93, 0x37, 0xE0, 0x70, 0x0A, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x93, +0x37, 0xF0, 0x80, 0x00, 0x90, 0x93, 0x01, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, +0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x91, +0xEF, 0x70, 0x04, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x93, 0x01, 0xE0, 0x70, 0x03, 0x02, 0x46, 0x9B, +0x43, 0x66, 0x10, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, +0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, +0x93, 0x2E, 0x80, 0x2D, 0x90, 0x93, 0x2D, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, +0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, +0x98, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x31, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, +0x2E, 0xE0, 0x80, 0x2D, 0x90, 0x93, 0x4F, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, +0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, +0x48, 0x90, 0x93, 0x4F, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x04, +0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, +0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, +0x12, 0x48, 0xF4, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x6F, 0x90, 0x93, 0x2B, 0xE0, 0xFF, 0x90, 0x93, +0x4F, 0xE0, 0xD3, 0x9F, 0x40, 0x08, 0x90, 0x93, 0x2C, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, +0x93, 0x2C, 0xF0, 0x90, 0x93, 0x4F, 0xE0, 0x90, 0x93, 0x2B, 0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, +0x40, 0x46, 0xE4, 0xF0, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x4D, 0xE0, 0x70, 0x03, +0x12, 0x4F, 0x63, 0x90, 0x93, 0x50, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x12, 0x48, 0xF0, 0xE4, 0xF5, +0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, +0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x4C, 0x80, 0x09, 0x43, 0x66, 0x01, 0x12, +0x51, 0x2B, 0x90, 0x93, 0x48, 0x74, 0x01, 0xF0, 0x12, 0x51, 0x4C, 0x90, 0x93, 0x98, 0xE0, 0x30, +0xE0, 0x09, 0x12, 0x67, 0x4A, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x07, +0xF0, 0xA3, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x47, 0xA2, +0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x47, 0xA2, 0x90, 0x93, 0x07, 0x04, 0xF0, 0xE4, 0x90, +0x93, 0x37, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x16, 0xA3, 0xE0, 0xB4, 0x06, 0x05, 0xE4, +0x90, 0x93, 0x07, 0xF0, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x04, 0x90, 0x93, 0x07, 0xF0, +0x90, 0x93, 0x07, 0xE0, 0x70, 0x03, 0x02, 0x47, 0xA2, 0x43, 0x66, 0x10, 0x90, 0x93, 0x2D, 0xE0, +0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x32, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, +0xE0, 0xD3, 0x9F, 0x50, 0x09, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x2E, 0xE0, 0x80, 0x4A, 0xE4, 0xF5, +0x48, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, +0x03, 0xA4, 0xFF, 0x90, 0x93, 0x2E, 0xE0, 0x04, 0x2F, 0x80, 0x2D, 0x90, 0x93, 0x4F, 0xE0, 0x64, +0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0xFF, 0x90, 0x93, +0x46, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x4F, 0xE0, 0x14, 0x75, 0xF0, 0x03, +0xA4, 0xFF, 0x90, 0x93, 0x46, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, +0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x12, 0x51, 0x4C, 0x90, 0x05, 0x22, +0xE4, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x09, 0x12, 0x67, 0x4A, 0x90, 0x05, 0x22, 0x74, +0xFF, 0xF0, 0x22, 0xE4, 0xF5, 0x66, 0xF5, 0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, +0x50, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x93, 0x49, 0xF0, 0x90, 0x93, 0x4E, 0x04, 0xF0, 0x90, +0x93, 0x37, 0xF0, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x93, 0x46, 0x74, +0x05, 0xF0, 0xE4, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x93, 0x44, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, +0x93, 0x3F, 0xF0, 0x90, 0x93, 0x42, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x3C, 0x74, 0x14, 0xF0, 0x90, +0x93, 0x47, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x93, 0x33, 0xF0, 0x90, 0x93, +0x71, 0xF0, 0x90, 0x93, 0x43, 0xF0, 0x90, 0x93, 0x53, 0xF0, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x93, +0x34, 0xF0, 0x90, 0x93, 0x4D, 0xF0, 0x90, 0x93, 0x3E, 0xF0, 0x90, 0x93, 0x3B, 0xF0, 0x90, 0x93, +0x48, 0xF0, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x3D, 0xF0, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x93, +0x40, 0xF0, 0x90, 0x93, 0x70, 0xE0, 0xB4, 0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, +0x2D, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, 0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x93, 0x30, 0xF0, 0x22, 0x8E, 0x69, 0x8F, 0x6A, 0xAD, +0x6A, 0xAC, 0x69, 0xAF, 0x68, 0x12, 0x44, 0xDE, 0xAF, 0x6A, 0xAE, 0x69, 0x90, 0x04, 0x80, 0xE0, +0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, +0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, +0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, +0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, +0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, +0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, +0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, +0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, +0x7D, 0x01, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x6C, 0x8D, 0x6D, 0xE5, +0x6C, 0x54, 0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x6C, 0x30, 0xE2, 0x30, +0xE5, 0x63, 0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0x69, 0xE5, 0x63, 0x30, 0xE3, 0x10, 0xE5, +0x6C, 0x20, 0xE3, 0x0B, 0x12, 0x4D, 0x9D, 0xEF, 0x60, 0x53, 0x12, 0x51, 0x05, 0x80, 0x4E, 0xE5, +0x63, 0x20, 0xE3, 0x49, 0xE5, 0x6C, 0x30, 0xE3, 0x44, 0xAF, 0x6D, 0x12, 0x50, 0x8A, 0x80, 0x3D, +0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x6C, 0x20, 0xE3, 0x09, 0x12, 0x4D, 0x9D, +0xEF, 0x60, 0x2A, 0x12, 0x51, 0x05, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, 0xE5, 0x6C, +0x20, 0xE2, 0x09, 0x12, 0x4B, 0x16, 0xEF, 0x60, 0x14, 0x12, 0x50, 0xB3, 0xE5, 0x63, 0x54, 0x0F, +0xFF, 0xBF, 0x02, 0x09, 0x12, 0x4C, 0x72, 0xEF, 0x60, 0x03, 0x12, 0x51, 0xB0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xE4, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x01, 0xF0, 0xE0, +0x54, 0xC0, 0x70, 0x11, 0x90, 0x93, 0x48, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, +0x12, 0x51, 0x9C, 0x80, 0x0F, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x4D, 0xE0, 0x70, +0x03, 0x12, 0x4F, 0x63, 0x90, 0x93, 0x01, 0xE0, 0x30, 0xE6, 0x15, 0x43, 0x66, 0x01, 0x90, 0x93, +0x50, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x51, 0x2B, 0x80, 0x0E, 0x12, 0x4F, 0x1D, 0x80, 0x09, +0x90, 0x93, 0x48, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x93, +0x01, 0xE0, 0x30, 0xE7, 0x23, 0x43, 0x66, 0x02, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x42, 0xE0, 0xF5, +0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, +0xF0, 0x90, 0x93, 0x51, 0x74, 0x01, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, 0xEF, 0x64, 0x01, 0x70, +0x48, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, +0x01, 0x36, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, +0x3A, 0x3F, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x48, 0xF0, +0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x67, 0x4A, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, +0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B, 0xF0, 0xA3, +0x74, 0x02, 0xF0, 0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, +0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x06, +0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x12, 0x4E, 0x3E, 0xE5, 0x62, 0x20, 0xE0, 0x05, 0xE4, 0x90, 0x93, +0x39, 0xF0, 0x22, 0x02, 0x4A, 0xD1, 0x02, 0x52, 0xA5, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, +0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, +0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, +0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, +0x80, 0x90, 0x4F, 0xE3, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, +0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, +0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, +0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, +0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, +0xB9, 0x74, 0x01, 0xF0, 0x80, 0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, +0x02, 0xF0, 0x80, 0x53, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, 0x01, 0xB9, +0x74, 0x04, 0xF0, 0x80, 0x42, 0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, +0x80, 0x35, 0xE5, 0x66, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x28, 0x90, +0x93, 0x39, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, 0x93, 0x43, +0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, +0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, +0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, 0x64, 0x02, 0x60, 0x06, +0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, 0x37, 0xF0, 0x90, 0x06, +0xAA, 0xE0, 0x90, 0x93, 0x4E, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x70, 0x07, 0x90, 0x93, 0x4E, 0xE0, +0xFF, 0x80, 0x05, 0x90, 0x93, 0x37, 0xE0, 0xFF, 0x90, 0x93, 0x37, 0xEF, 0xF0, 0x90, 0x93, 0x39, +0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x05, +0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x53, +0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x49, +0x82, 0x22, 0x90, 0x93, 0x70, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, 0x0C, 0x90, 0x93, 0x70, +0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0x7D, 0x40, 0x7F, 0x93, 0x12, 0x53, 0xB6, 0x90, 0x00, +0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x28, 0xE0, 0x54, 0xFC, +0xFD, 0x7F, 0x28, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, +0x53, 0xB6, 0x7F, 0x01, 0x12, 0x4D, 0x45, 0x90, 0x00, 0x00, 0xE0, 0x44, 0x20, 0xFD, 0xE4, 0xFF, +0x12, 0x53, 0xB6, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, 0x12, 0x53, 0xB6, 0x90, +0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x53, 0xB6, 0x7F, 0x14, 0x7E, 0x00, 0x02, +0x3B, 0x09, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, +0x80, 0x54, 0xE5, 0x18, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x48, 0xE5, 0x64, +0x54, 0x0F, 0xD3, 0x94, 0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x37, 0x90, +0x02, 0x87, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x29, 0x90, 0x02, 0x86, +0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x1A, 0x90, 0x93, 0x3A, 0xE0, +0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, +0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, +0x93, 0x21, 0x12, 0x43, 0xC8, 0x12, 0x51, 0xC3, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x12, 0x1E, +0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, 0x03, 0x70, 0x44, +0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, +0xFD, 0xE4, 0xFF, 0x12, 0x4F, 0xA5, 0x80, 0x29, 0x90, 0x93, 0x21, 0x12, 0x43, 0xA8, 0x90, 0x00, +0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x4F, 0xA5, 0x1F, 0x80, 0x14, 0x90, 0x93, 0x21, +0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x4F, 0xA5, 0xE4, +0xFF, 0x12, 0x4A, 0x0C, 0x22, 0x8F, 0x70, 0xE4, 0x90, 0x93, 0xE3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, +0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x70, 0x60, 0x3E, 0xC3, 0x90, +0x93, 0xE4, 0xE0, 0x94, 0x88, 0x90, 0x93, 0xE3, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, +0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0xE3, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, +0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0xE4, 0xE0, 0x94, 0x32, 0x90, 0x93, 0xE3, +0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x12, 0x51, 0x83, +0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, 0x90, 0x93, 0x4C, +0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, 0x49, 0xE0, 0x60, +0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x04, +0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, +0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, +0x00, 0x20, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x20, 0x12, 0x53, 0xB6, 0x7F, 0xF4, 0x7E, 0x01, 0x12, +0x3B, 0x09, 0x90, 0x00, 0x00, 0xE0, 0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x53, 0xB6, 0x90, 0x00, +0x28, 0xE0, 0x44, 0x03, 0xFD, 0x7F, 0x28, 0x12, 0x53, 0xB6, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, +0xFD, 0x7F, 0x08, 0x12, 0x53, 0xB6, 0xE4, 0xFF, 0x12, 0x4D, 0x45, 0x7F, 0x64, 0x7E, 0x00, 0x12, +0x3B, 0x09, 0x90, 0x00, 0x29, 0xE0, 0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x53, 0xB6, 0xE4, 0xFF, +0x90, 0x00, 0x6A, 0xE0, 0x30, 0xE2, 0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, +0x00, 0x60, 0xE0, 0x7F, 0x02, 0x30, 0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, +0x7F, 0x03, 0x30, 0xE3, 0x06, 0x7F, 0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, +0x45, 0xE0, 0x9D, 0x90, 0x93, 0x44, 0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, +0x90, 0x93, 0x44, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, +0xC0, 0xD0, 0x8F, 0x68, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x6B, +0x74, 0xFF, 0xF0, 0x12, 0x8A, 0x65, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0x69, 0xE0, 0xFF, 0x7D, 0x01, +0x12, 0x58, 0x95, 0x12, 0x48, 0x5B, 0x90, 0x05, 0x22, 0xE5, 0x6B, 0xF0, 0x80, 0x0D, 0x90, 0x93, +0x69, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x95, 0x12, 0x48, 0x5B, 0x90, 0x04, 0x1F, 0x74, 0x20, +0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x3D, 0x90, +0x93, 0x50, 0xE0, 0x60, 0x27, 0x12, 0x48, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, +0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, +0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x22, 0xE5, 0x63, 0x54, 0x0F, +0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x22, 0x90, 0x01, 0x5F, +0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, 0xF5, +0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, +0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x49, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, +0xC3, 0x94, 0x0C, 0x50, 0x0D, 0x12, 0x48, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x03, 0x12, +0x67, 0x4A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x4D, 0x74, 0x01, 0xF0, +0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xD3, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xD3, +0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x93, 0xD3, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xD3, +0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, 0x16, 0x24, 0x02, 0x70, 0x32, +0x80, 0x0A, 0x90, 0x93, 0x4E, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x37, 0xF0, 0xE4, 0x90, 0x93, 0x53, +0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x47, 0xE0, 0x90, 0x93, 0x4E, 0xF0, 0x80, 0x05, 0x90, +0x93, 0x4E, 0xED, 0xF0, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x93, 0x37, 0xF0, 0x90, 0x93, 0x53, 0x74, +0x01, 0xF0, 0x22, 0x48, 0x93, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x93, +0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0x5E, 0x00, 0x41, 0x93, 0x6D, +0x00, 0x41, 0x93, 0xE9, 0x00, 0x41, 0x93, 0x2B, 0x00, 0x41, 0x93, 0x2C, 0x00, 0x41, 0x92, 0x69, +0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, 0x41, 0x93, 0xDF, 0x00, 0x00, 0x90, 0x01, +0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x93, +0x35, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, 0x0F, 0xFF, 0x74, 0x40, 0x7E, 0x00, +0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x90, 0x93, 0x4B, 0xF0, +0xEE, 0x90, 0x93, 0x4A, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, 0x93, 0x6F, 0xE0, 0x90, 0x93, 0xD7, +0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0x6F, 0xE0, 0x90, 0x93, 0xD7, 0x60, 0x09, 0x12, 0x1F, 0xD5, +0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x01, 0x10, 0x7B, 0x01, 0x7A, +0x93, 0x79, 0xD7, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x56, 0x9D, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, +0xF0, 0xEF, 0x60, 0x0A, 0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x8B, 0x53, 0x63, +0xF0, 0x43, 0x63, 0x0C, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x07, 0x90, 0x05, 0x27, 0xE0, 0x54, +0x7F, 0xF0, 0x22, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, +0x8A, 0x65, 0xEF, 0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, +0x3A, 0x93, 0x12, 0x54, 0x14, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0xE5, 0x64, 0x30, 0xE6, +0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, 0xF0, +0x53, 0x64, 0xBF, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x83, 0xE0, 0x30, 0xE0, +0x03, 0x75, 0x64, 0x02, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, +0x05, 0x7F, 0x01, 0x12, 0x4E, 0x8B, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x90, 0x93, 0x98, 0xE0, +0x30, 0xE0, 0x07, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x3D, 0xE0, 0x70, +0x1A, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0x68, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, +0x95, 0x8E, 0x6E, 0x8F, 0x6F, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x3E, 0xE0, +0x60, 0x16, 0x90, 0x93, 0x41, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x3B, 0xE0, 0x90, 0x07, 0x78, 0x60, +0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0xEA, 0xEF, 0xF0, 0x12, 0x56, +0x14, 0x90, 0x93, 0xEA, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, +0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, +0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x98, 0xE0, +0x30, 0xE0, 0x05, 0xAF, 0x64, 0x02, 0x5F, 0x72, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, 0xF4, 0x22, +0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0x02, 0x12, 0x4D, 0xEF, 0x53, 0x63, 0xF0, 0x43, +0x63, 0x02, 0x22, 0xE4, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x38, 0xF0, 0xF5, 0x66, 0x22, 0x90, +0x02, 0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, +0x43, 0xF7, 0x51, 0xFA, 0x00, 0x40, 0x52, 0x22, 0x00, 0x80, 0x52, 0x4D, 0x01, 0x00, 0x52, 0x61, +0x02, 0x00, 0x52, 0x79, 0x04, 0x00, 0x00, 0x00, 0x52, 0x96, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, +0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, +0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0x80, 0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, +0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, +0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, +0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, +0x35, 0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, +0x2D, 0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, +0xFF, 0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, +0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1F, +0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x0C, 0xF0, 0xA3, 0xF0, 0x12, 0x60, 0xFB, 0x75, +0x8E, 0x02, 0x91, 0xE6, 0x12, 0x60, 0x52, 0x90, 0x93, 0x70, 0xEF, 0xF0, 0x12, 0x60, 0x65, 0x90, +0x93, 0x72, 0xEF, 0xF0, 0x12, 0x60, 0x71, 0x90, 0x93, 0x54, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, +0xF5, 0x18, 0xF5, 0x0D, 0xF5, 0x62, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, +0xF0, 0x12, 0x7E, 0x58, 0x12, 0x47, 0xA3, 0x12, 0x37, 0x1C, 0x7F, 0x03, 0x12, 0x88, 0x1B, 0x71, +0x8D, 0x12, 0x60, 0x16, 0x12, 0x60, 0x89, 0x12, 0x60, 0x9E, 0x12, 0x60, 0x34, 0x12, 0x45, 0x02, +0x12, 0x61, 0x03, 0x91, 0xCE, 0x90, 0x93, 0x0E, 0xE5, 0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, +0xE0, 0x44, 0x40, 0xF0, 0x71, 0xFE, 0x75, 0xE8, 0x03, 0x43, 0xA8, 0x85, 0xD2, 0xAF, 0x12, 0x82, +0xBB, 0x51, 0x9B, 0x12, 0x60, 0xA5, 0x90, 0x93, 0x0C, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xA5, 0x90, +0x01, 0xC4, 0xF0, 0x74, 0x52, 0xA3, 0xF0, 0xE5, 0x18, 0x30, 0xE4, 0x0A, 0xC2, 0xAF, 0x53, 0x18, +0xEF, 0xD2, 0xAF, 0x12, 0x67, 0x8F, 0xE5, 0x18, 0x30, 0xE6, 0x0A, 0xC2, 0xAF, 0x53, 0x18, 0xBF, +0xD2, 0xAF, 0x12, 0x76, 0x54, 0xE5, 0x18, 0x30, 0xE7, 0x0A, 0xC2, 0xAF, 0x53, 0x18, 0x7F, 0xD2, +0xAF, 0x12, 0x82, 0x61, 0xC2, 0xAF, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0xBF, 0x01, 0x0D, 0x90, 0x93, +0x3A, 0x74, 0x01, 0xF0, 0x31, 0x9C, 0xE4, 0x90, 0x93, 0x3A, 0xF0, 0xD2, 0xAF, 0x90, 0x01, 0xBD, +0xE5, 0x63, 0xF0, 0x90, 0x93, 0x50, 0xE0, 0x90, 0x01, 0xBC, 0xF0, 0x80, 0x99, 0x90, 0x01, 0x3C, +0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0xFD, 0x7F, 0x54, 0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x55, 0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x56, +0x71, 0xB6, 0x7D, 0xFF, 0x7F, 0x57, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, +0x83, 0x00, 0xED, 0xF0, 0x71, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0xFD, 0x7F, 0x50, 0x71, 0xB6, 0xE4, 0xFD, 0x7F, 0x51, 0x71, 0xB6, 0xE4, 0xFD, 0x7F, 0x52, 0x71, +0xB6, 0xE4, 0xFD, 0x7F, 0x53, 0x80, 0xBF, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xF0, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, +0x22, 0x74, 0xFF, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xB4, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xB8, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, +0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x71, 0xFE, 0x71, 0xF7, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, +0xF0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, +0x44, 0x20, 0xF0, 0x90, 0x93, 0x41, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, +0x93, 0x34, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x4D, 0xF0, 0xFF, 0x7E, 0x08, 0x12, 0x2C, 0x6E, +0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0xEC, 0x54, 0xFD, 0xFC, +0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, +0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x22, 0xE4, +0xFF, 0x11, 0x56, 0x90, 0x93, 0x52, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xB8, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB8, 0xD1, 0x99, 0x90, 0x07, 0x78, 0x74, 0x01, +0xF0, 0x90, 0x93, 0x48, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, +0xE0, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x93, 0xE2, 0xF0, 0x90, 0x93, 0xE0, 0xE0, 0x54, 0x7F, +0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x6C, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, +0x80, 0xFD, 0x7F, 0x80, 0x61, 0xB6, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x8A, 0x65, 0xEF, +0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x91, 0x14, 0x90, 0x93, 0x9F, 0x74, 0x02, 0xF0, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x9F, 0xE0, 0x90, 0x93, 0xEB, 0xF0, +0x6F, 0x70, 0x02, 0xA1, 0xDC, 0xEF, 0x14, 0x60, 0x3B, 0x14, 0x60, 0x5F, 0x14, 0x70, 0x02, 0xA1, +0xB6, 0x24, 0x03, 0x60, 0x02, 0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x03, 0x04, 0xD1, 0xE4, +0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x02, 0x04, 0xD1, 0xFC, 0xA1, 0xDC, 0x90, 0x93, 0xEB, +0xE0, 0xB4, 0x04, 0x04, 0xF1, 0x00, 0xA1, 0xDC, 0x90, 0x93, 0xEB, 0xE0, 0x64, 0x01, 0x70, 0x7C, +0xD1, 0xE6, 0x80, 0x78, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x03, 0x04, 0xF1, 0x35, 0x80, 0x6C, +0xEF, 0xB4, 0x02, 0x04, 0xF1, 0x04, 0x80, 0x64, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x04, 0x04, +0xF1, 0x1A, 0x80, 0x58, 0xEF, 0x70, 0x55, 0xD1, 0x01, 0x80, 0x51, 0x90, 0x93, 0xEB, 0xE0, 0xB4, +0x03, 0x04, 0xF1, 0x25, 0x80, 0x46, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x01, 0x04, 0x91, 0xF6, 0x80, +0x3B, 0x90, 0x93, 0xEB, 0xE0, 0xB4, 0x04, 0x04, 0xF1, 0x11, 0x80, 0x30, 0x90, 0x93, 0xEB, 0xE0, +0x70, 0x2A, 0xB1, 0xE1, 0x80, 0x26, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, 0x01, 0x04, 0xB1, 0xE5, +0x80, 0x1A, 0xEF, 0xB4, 0x02, 0x04, 0xB1, 0xFD, 0x80, 0x12, 0x90, 0x93, 0xEB, 0xE0, 0xFF, 0xB4, +0x04, 0x05, 0x12, 0x44, 0xFF, 0x80, 0x05, 0xEF, 0x70, 0x02, 0xB1, 0xF9, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD1, 0x01, 0x81, 0xF6, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, +0xBF, 0xF0, 0x90, 0x93, 0x9F, 0x74, 0x03, 0xF0, 0x22, 0xD1, 0x01, 0x80, 0xE8, 0xD1, 0x14, 0x80, +0xE4, 0x90, 0x01, 0x3E, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, 0x90, 0x93, 0x9F, +0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xAC, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xB0, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, +0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x41, 0xE0, +0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x0A, 0x31, 0x83, +0xEF, 0x64, 0x01, 0x60, 0x03, 0x12, 0x4F, 0x63, 0x90, 0x93, 0x3E, 0xE0, 0x60, 0x1C, 0x7F, 0x01, +0x11, 0x56, 0x90, 0x93, 0x52, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xB0, 0x12, 0x1F, 0xD5, 0x00, 0x00, +0x03, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB0, 0xD1, 0x99, 0x71, 0xF7, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x90, 0x93, 0xEC, 0xEF, 0xF0, 0xD1, 0x14, 0x90, 0x93, 0xEC, 0xE0, 0x60, 0x05, 0x90, 0x05, +0x22, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x22, 0x7F, 0x70, 0x7E, 0x08, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, 0xEE, 0x44, 0xF0, 0xA3, +0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0x90, 0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEE, 0xF0, 0x12, +0x1E, 0xF6, 0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, 0x12, 0x88, 0x6C, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x35, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x3A, 0x3F, 0x90, 0x05, 0x27, +0xE4, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x93, 0x9F, 0xF0, 0x22, 0xF1, 0x04, 0x80, 0xE6, +0xF1, 0x1A, 0x80, 0xE2, 0xD1, 0x14, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x9F, 0x04, 0xF0, +0x22, 0x91, 0x14, 0x90, 0x93, 0x9F, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, +0x93, 0x9F, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x0E, 0x90, 0x93, +0x9F, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, +0xF0, 0x90, 0x93, 0x9F, 0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x93, 0xED, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x46, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, +0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x5F, 0xF0, 0x71, 0xFE, +0x90, 0x93, 0xED, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, +0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, +0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0x80, 0x4B, 0x90, +0x93, 0xED, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, +0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, 0xF0, 0x71, 0xFE, 0x90, 0x93, 0xED, +0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, +0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, +0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x8B, 0x21, 0x8A, 0x22, 0x89, 0x23, 0x90, 0x93, 0xBC, 0x12, 0x43, 0xC8, 0xAB, 0x24, 0xAA, 0x25, +0xA9, 0x26, 0x90, 0x93, 0xBF, 0x12, 0x43, 0xC8, 0xAF, 0x27, 0x15, 0x27, 0xEF, 0x60, 0x1E, 0x90, +0x93, 0xBF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x93, 0xBC, +0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, 0x12, 0x42, 0x53, 0x80, 0xDB, 0xAB, 0x21, 0xAA, +0x22, 0xA9, 0x23, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x01, 0xC4, 0x74, 0x48, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, +0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, +0xC7, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x11, 0x48, 0xBF, 0x01, 0x0F, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x95, 0x90, 0x04, +0x1F, 0x74, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, +0x30, 0xE0, 0x02, 0x7B, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, +0xF0, 0xED, 0x60, 0x0E, 0x74, 0x0F, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, +0x80, 0xF0, 0xAF, 0x03, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, +0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, +0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, 0x13, +0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x93, 0x01, +0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, 0x07, +0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3B, 0x90, 0x93, 0x01, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x3D, +0xF0, 0x79, 0x40, 0x90, 0x93, 0x01, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, 0xE0, +0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0x5E, 0xF0, 0x22, 0x90, 0x93, 0x5E, 0xE0, 0x04, +0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0B, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, 0x02, +0x11, 0x80, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, +0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, +0x90, 0x01, 0xC4, 0x74, 0x63, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x28, +0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, 0xA3, 0xE0, +0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x61, 0x57, 0x90, 0x01, 0x34, 0x74, 0x01, +0xF0, 0x85, 0xD1, 0x0E, 0x85, 0xD3, 0x10, 0x85, 0xD4, 0x11, 0x85, 0xD5, 0x12, 0x85, 0xD6, 0x13, +0x85, 0xD7, 0x14, 0x85, 0xD9, 0x15, 0x85, 0xD2, 0x0F, 0x75, 0x24, 0x00, 0x75, 0x25, 0x00, 0x75, +0x26, 0x0E, 0x75, 0x27, 0x08, 0xFB, 0x7A, 0x93, 0x79, 0x5F, 0x12, 0x57, 0xF9, 0x90, 0x93, 0x60, +0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x70, 0x02, +0x61, 0x08, 0x90, 0x93, 0x60, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, +0x61, 0x08, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, 0x93, 0x61, 0xE0, 0x54, 0x3F, 0xF5, 0x4E, 0x90, +0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, +0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xE5, 0x4E, 0xD3, 0x94, 0x04, 0x40, 0x03, +0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0x75, 0xF0, +0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x63, 0xE0, 0x54, +0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, +0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, +0x60, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2F, 0x90, 0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, +0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, +0x12, 0x42, 0x87, 0x90, 0x93, 0x62, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, +0x67, 0xAF, 0x4D, 0x12, 0x71, 0x11, 0x80, 0x60, 0x90, 0x93, 0x60, 0xE0, 0xFF, 0xC4, 0x13, 0x13, +0x54, 0x03, 0x30, 0xE0, 0x53, 0x90, 0x93, 0x63, 0xE0, 0x54, 0x1F, 0xFF, 0xFD, 0xE5, 0x4D, 0x25, +0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8D, 0xF0, 0x12, 0x42, 0x87, +0x90, 0x93, 0x62, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0F, 0xEE, 0x54, +0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, 0x12, 0x70, 0xAD, 0x80, 0x1B, 0x90, 0x01, 0x02, +0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, 0x0A, 0xE4, 0xF0, +0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, 0x80, +0x46, 0x90, 0x93, 0x50, 0xE0, 0x60, 0x37, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, +0x04, 0xF0, 0x12, 0x51, 0x83, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xF5, 0x48, 0x90, 0x93, 0x3C, 0xE0, +0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, +0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x80, 0x09, 0x12, 0x51, +0x83, 0xBF, 0x01, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0xF9, 0x90, 0x01, +0x34, 0x74, 0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, 0xE5, +0x0B, 0x75, 0x4F, 0x88, 0x75, 0x50, 0x0F, 0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, 0x75, +0x50, 0x08, 0x75, 0x51, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x16, 0x90, 0x04, 0x7E, +0xE0, 0x55, 0x51, 0xF5, 0x17, 0x65, 0x16, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x16, 0x75, 0xF0, 0x08, +0xA4, 0x25, 0x4F, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, +0x19, 0x2F, 0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x24, 0x00, 0x75, 0x25, 0x00, 0x75, +0x26, 0x19, 0x75, 0x27, 0x08, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x56, 0x12, 0x57, 0xF9, 0x90, 0x93, +0x56, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0x9F, 0xE5, 0x16, +0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, 0x8F, +0x16, 0x90, 0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x17, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, 0x01, +0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, 0x43, +0x18, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, 0x54, +0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, 0x53, +0xCB, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x53, 0xFE, 0x80, 0xFE, 0xE5, 0x2C, 0x30, +0xE6, 0x06, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x30, 0xE0, 0x52, 0x90, 0x93, 0x71, +0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x93, 0x6E, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, +0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x9E, 0xE0, +0x30, 0xE0, 0x0D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x06, 0x90, 0x93, 0xA0, 0x74, 0x01, 0xF0, +0x90, 0x93, 0x98, 0xE0, 0xFF, 0x30, 0xE0, 0x0D, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x06, 0x90, +0x93, 0x9A, 0x74, 0x01, 0xF0, 0x12, 0x45, 0x09, 0xF1, 0xBF, 0x90, 0x93, 0x71, 0xE4, 0xF0, 0xE5, +0x2E, 0x30, 0xE1, 0x7D, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, +0x05, 0x61, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xF5, 0x0A, 0xEC, 0x3E, 0xF5, 0x09, 0x90, 0x05, 0x22, +0xE0, 0xB4, 0xFF, 0x06, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x01, +0xE4, 0xF0, 0x43, 0x18, 0x40, 0x11, 0xF5, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0C, 0xE4, 0xFF, +0xD1, 0x91, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x53, 0xE0, 0x60, 0x1D, +0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, +0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, +0x08, 0xC3, 0x94, 0xFF, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, +0xF0, 0xE5, 0x2E, 0x30, 0xE2, 0x7B, 0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x62, 0xE0, +0xFE, 0x90, 0x05, 0x61, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xF5, 0x0C, 0xEC, 0x3E, 0xF5, 0x0B, 0xD3, +0xE5, 0x0C, 0x95, 0x0A, 0xE5, 0x0B, 0x95, 0x09, 0x40, 0x06, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, +0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x0D, 0x90, 0x93, 0x39, 0xE4, 0xF0, 0x90, 0x93, 0x99, 0xE0, +0x64, 0x06, 0x60, 0x3D, 0x12, 0x4B, 0x90, 0x90, 0x93, 0x53, 0xE0, 0x60, 0x34, 0x90, 0x93, 0x4E, +0xE0, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x4E, 0xE0, 0x90, 0x05, 0x73, +0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x7D, 0x01, 0x7F, +0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, 0x93, 0x37, 0xE0, 0x14, +0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, 0xE5, 0x62, 0x64, 0x01, +0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, +0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x42, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, 0x30, 0xE4, 0x2B, 0x90, +0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, 0x60, 0x1C, 0x90, 0x01, +0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x51, 0xE4, 0xF0, 0x53, 0x66, +0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2E, 0x30, 0xE5, 0x1F, 0x90, +0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x14, 0xE5, 0x65, 0x60, 0x10, 0x90, 0x93, +0x50, 0xE0, 0x64, 0x02, 0x60, 0x05, 0x12, 0x51, 0x2B, 0x80, 0x03, 0x12, 0x4F, 0x1D, 0xE5, 0x2E, +0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, 0x74, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, +0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x9C, 0xE5, 0x2F, +0x30, 0xE1, 0x18, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x08, +0x90, 0x93, 0x9D, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x12, 0x4E, 0xD6, 0x74, 0x63, 0x04, 0x90, 0x01, +0xC4, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, +0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, +0x32, 0x8F, 0x71, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, +0x93, 0x01, 0xE0, 0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, +0x00, 0x79, 0x19, 0x90, 0x93, 0xCB, 0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x01, 0xD3, 0x10, +0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, 0xFF, +0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, 0x92, +0x69, 0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, 0xFF, +0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0x12, 0x81, 0x51, 0xEF, 0x60, 0x72, 0x12, 0x82, 0x61, 0x90, 0x01, +0x3F, 0x74, 0x02, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6B, 0xF9, 0x74, +0x92, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xA8, 0x7E, 0x00, +0x7F, 0x02, 0x12, 0x1E, 0xD0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6D, 0xF9, +0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xCB, +0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, 0x93, 0xC8, 0x12, 0x43, 0xA8, 0x12, +0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x27, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x57, +0xF9, 0x90, 0x92, 0x6A, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xAE, 0x07, 0xE4, 0xFF, 0xD1, 0x91, 0xEF, 0x60, 0x19, 0x90, 0x93, 0x98, 0xE0, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0D, 0xAF, 0x06, 0x7D, 0x01, 0x12, 0x48, 0xF4, 0x12, 0x67, +0x4A, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x26, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x29, +0xE0, 0x54, 0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, 0x93, 0x26, 0x12, 0x43, +0xA8, 0x90, 0x93, 0xCB, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x29, 0xC1, 0xBE, 0x90, +0x93, 0xE0, 0xE0, 0x30, 0xE0, 0x2F, 0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x93, 0xDF, 0xE0, 0x04, +0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x93, 0xE2, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0xDF, 0xF0, +0x90, 0x93, 0xE2, 0xE0, 0xFF, 0x90, 0x93, 0xE1, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x8A, 0xA6, +0xE4, 0x90, 0x93, 0xE2, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, +0xEF, 0x30, 0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, +0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, +0x2B, 0x90, 0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, +0xE5, 0x2B, 0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, +0x43, 0x32, 0x20, 0x90, 0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, +0xF0, 0x22, 0x90, 0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, +0x02, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, 0xE3, 0x02, 0x7F, 0x01, +0x22, 0x90, 0x93, 0x72, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, 0x05, 0x7E, +0xFD, 0x7F, 0x33, 0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, 0xE2, 0x0D, +0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, +0x64, 0x74, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, +0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, 0x10, +0xE0, 0x94, 0x88, 0x90, 0x93, 0x0F, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, +0x80, 0xF0, 0x22, 0x90, 0x93, 0x0F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, +0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0x10, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x0F, 0xE0, 0x94, +0x00, 0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, +0x01, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, +0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, +0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, +0x04, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, +0xC0, 0x06, 0xC0, 0x07, 0x7D, 0x33, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x61, 0xFF, 0xA3, 0xF0, +0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, 0x3D, 0x90, +0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, 0xE4, 0x06, +0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, 0x74, 0x20, +0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, 0x30, 0xE7, +0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, 0x56, 0x74, +0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, 0x3E, 0x30, +0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, 0x00, 0x56, +0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, +0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, +0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, +0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, 0x56, 0x00, 0x90, 0x01, 0xC4, 0x74, 0xDA, 0xF0, +0x74, 0x61, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, +0xE0, 0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, 0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, +0x37, 0xE5, 0x34, 0x30, 0xE0, 0x1A, 0x90, 0x01, 0x3C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x98, 0xE0, +0x30, 0xE0, 0x0D, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0xE5, 0x34, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x12, 0x44, 0x24, 0xE5, 0x34, +0x30, 0xE2, 0x36, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, +0x75, 0x48, 0x00, 0x90, 0x93, 0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, +0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, +0x08, 0x90, 0x93, 0x4C, 0xE4, 0xF0, 0x12, 0x51, 0x9C, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, +0x3C, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, +0x3C, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, +0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x49, 0xE4, +0xF0, 0x12, 0x51, 0x9C, 0xE5, 0x34, 0x30, 0xE4, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0xE5, +0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, 0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, 0x90, +0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, 0x64, +0xF0, 0x12, 0x50, 0xDC, 0x12, 0x51, 0x9C, 0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, 0x74, +0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x6D, +0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, +0x04, 0xF0, 0xE5, 0x36, 0x20, 0xE0, 0x02, 0x61, 0xAF, 0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0x90, +0x93, 0x9E, 0xE0, 0x30, 0xE0, 0x13, 0xA3, 0xE0, 0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x5E, +0x91, 0xEF, 0x60, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x11, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x5F, +0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x60, 0x3B, 0x91, 0x86, 0x90, 0x93, 0x99, 0xE0, 0xFF, 0x64, +0x06, 0x60, 0x30, 0xEF, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x04, +0xE4, 0xFF, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, 0x90, +0x93, 0x99, 0xE0, 0xB4, 0x02, 0x04, 0x7F, 0x01, 0x91, 0xDA, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, +0xF4, 0xF1, 0x4A, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x75, 0x48, 0x00, 0x75, 0x49, 0x03, 0xE4, +0xFB, 0xFD, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x53, 0x74, 0x05, 0xF0, 0xE5, +0x36, 0x30, 0xE1, 0x3C, 0x90, 0x01, 0x3E, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0x30, 0xE0, +0x13, 0xA3, 0xE0, 0x64, 0x03, 0x60, 0x0D, 0x7F, 0x01, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x05, 0x7F, +0x02, 0x12, 0x55, 0x11, 0x90, 0x93, 0x98, 0xE0, 0x30, 0xE0, 0x15, 0x12, 0x89, 0xF6, 0x90, 0x93, +0x99, 0xE0, 0x64, 0x06, 0x60, 0x0A, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, 0x70, 0x02, 0x91, 0xA8, +0xE5, 0x36, 0x30, 0xE3, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xE5, 0x36, 0x30, 0xE4, 0x06, +0x90, 0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x04, +0xF0, 0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, 0x30, 0xE6, +0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, 0x3E, 0x74, +0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, 0x18, 0x80, +0xE5, 0x37, 0x30, 0xE4, 0x1B, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x46, 0xAC, 0x90, 0x93, +0x4E, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x12, 0x5F, 0xBF, +0x74, 0xDA, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, +0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, +0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x98, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x30, 0xE0, 0x0A, 0xA3, 0xE0, 0x64, 0x06, 0x60, 0x04, 0x7F, 0x06, 0x91, 0xDA, 0x90, 0x93, 0x99, +0xE0, 0x64, 0x06, 0x60, 0x02, 0xF1, 0x29, 0x22, 0x90, 0x93, 0x39, 0xE0, 0x60, 0x16, 0x90, 0x93, +0x99, 0xE0, 0x70, 0x04, 0x7F, 0x05, 0x80, 0x1F, 0x90, 0x93, 0x99, 0xE0, 0x64, 0x01, 0x70, 0x19, +0x7F, 0x02, 0x80, 0x13, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x08, 0x90, +0x93, 0x99, 0xE0, 0x70, 0x04, 0x7F, 0x04, 0x91, 0xDA, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, +0xD0, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xC1, 0xAC, 0xEF, 0x12, 0x43, 0xD1, 0x65, +0x08, 0x00, 0x65, 0x43, 0x01, 0x65, 0x8A, 0x02, 0x65, 0xC5, 0x03, 0x65, 0xFE, 0x04, 0x66, 0x37, +0x05, 0x66, 0x73, 0x06, 0x00, 0x00, 0x66, 0xAC, 0xEE, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, +0x81, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xFF, 0xB4, 0x05, 0x04, 0xD1, 0xBB, 0xC1, 0xAC, 0xEF, +0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x06, +0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xD1, +0xF0, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, +0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, +0xD1, 0xE6, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, +0xC1, 0xAC, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xD1, 0xB1, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, +0x64, 0x02, 0x60, 0x02, 0xC1, 0xAC, 0xD1, 0xC5, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, +0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, +0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, 0xD1, 0xE6, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xFE, +0xB4, 0x06, 0x06, 0x7F, 0x01, 0xD1, 0xD0, 0x80, 0x08, 0xEE, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0xD1, +0xB1, 0xF1, 0x1C, 0xC1, 0xAC, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, +0x81, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, +0x70, 0x04, 0xD1, 0xE6, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, +0xD1, 0xD0, 0x80, 0x06, 0xEE, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xF1, 0x05, 0xC1, 0xAC, 0x90, 0x93, +0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, 0xFF, 0xD1, 0xD0, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, +0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0x90, +0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0xF0, 0x80, 0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, +0x02, 0xD1, 0xBB, 0xD1, 0xFB, 0x80, 0x75, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xB4, 0x06, 0x06, 0xE4, +0xFF, 0xD1, 0xD0, 0x80, 0x13, 0xEE, 0xB4, 0x03, 0x06, 0x7F, 0x01, 0xD1, 0xB1, 0x80, 0x09, 0x90, +0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x01, 0x04, 0xD1, +0xF0, 0x80, 0x0C, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x05, 0x7F, 0x01, 0x12, 0x56, 0x81, 0xF1, +0x0F, 0x80, 0x39, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x07, 0x7F, 0x01, 0x12, 0x56, 0x81, 0x80, +0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, 0x02, 0xD1, 0xBB, 0x90, 0x93, 0x99, 0xE0, 0x70, 0x04, +0xD1, 0xE6, 0x80, 0x16, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x06, 0xE4, 0xFF, 0xD1, 0xB1, 0x80, +0x09, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x02, 0xD1, 0xC5, 0xF1, 0x36, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x12, 0x51, 0x69, 0x90, 0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x90, 0x93, 0x99, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x99, 0x04, 0xF0, 0x22, +0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0xEF, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, +0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x51, 0x05, 0x90, 0x93, 0x99, 0x74, 0x01, 0xF0, 0x22, +0x7F, 0x01, 0x12, 0x50, 0x8A, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x22, 0x12, 0x54, 0x0E, 0x90, 0x93, +0x99, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x50, 0xB3, 0x90, 0x93, 0x99, 0x74, 0x03, 0xF0, 0x22, 0x90, +0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, +0xFF, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x93, 0x9D, 0xE0, 0xB4, 0x01, 0x05, +0xE4, 0xF0, 0x12, 0x4E, 0xD6, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x05, 0x22, +0x74, 0x6F, 0xF0, 0x90, 0x93, 0x99, 0x74, 0x06, 0xF0, 0x22, 0x90, 0x93, 0x99, 0xE0, 0x64, 0x06, +0x60, 0x3C, 0xE5, 0x63, 0x54, 0x0F, 0x14, 0x60, 0x2E, 0x14, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x0E, +0x24, 0xF8, 0x70, 0x2A, 0xE4, 0x90, 0x93, 0x99, 0xF0, 0x90, 0x05, 0x22, 0xF0, 0x22, 0x90, 0x93, +0x99, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x99, 0x74, 0x03, 0xF0, +0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x0F, 0xF0, +0x90, 0x93, 0x0F, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x68, 0xDA, 0x90, 0x93, 0xE9, 0xE0, 0xFF, 0x74, +0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, +0xEF, 0x5D, 0x70, 0x03, 0x02, 0x68, 0xD3, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, +0xD0, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x75, 0x24, 0x01, 0x75, 0x25, 0x93, 0x75, +0x26, 0x10, 0x75, 0x27, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x11, 0x12, 0x57, 0xF9, 0x90, 0x93, +0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0xE9, 0x30, 0xE0, 0x59, 0xE0, +0x75, 0xF0, 0x02, 0x90, 0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x12, 0xF0, 0x90, 0x93, +0xE9, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x13, 0xF0, +0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, +0x14, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, +0x90, 0x93, 0x15, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, +0x9C, 0xE0, 0x90, 0x93, 0x16, 0xF0, 0x80, 0x33, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, +0x43, 0x9C, 0xE0, 0x90, 0x93, 0x12, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, +0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x13, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x75, 0xF0, 0x04, +0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x14, 0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, +0x01, 0x7A, 0x93, 0x79, 0x12, 0x11, 0xDF, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x90, 0x93, 0xE9, 0xE0, +0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, +0x0F, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, +0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x93, 0xE9, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, +0x02, 0x67, 0xA0, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, +0x93, 0x17, 0x12, 0x43, 0xC8, 0xEF, 0x12, 0x43, 0xD1, 0x69, 0x2E, 0x01, 0x69, 0x26, 0x02, 0x69, +0x73, 0x03, 0x69, 0x7C, 0x05, 0x69, 0x85, 0x06, 0x69, 0xC8, 0x07, 0x69, 0x8D, 0x08, 0x69, 0x96, +0x0B, 0x69, 0x9F, 0x1B, 0x69, 0xA7, 0x1C, 0x69, 0x37, 0x2D, 0x69, 0x40, 0x2E, 0x69, 0xAF, 0x30, +0x69, 0x52, 0x34, 0x69, 0x49, 0x3B, 0x69, 0x5A, 0x47, 0x69, 0x6B, 0x48, 0x69, 0x63, 0x49, 0x69, +0xB8, 0x4B, 0x00, 0x00, 0x69, 0xC1, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xB9, 0x90, 0x93, +0x17, 0x12, 0x43, 0xA8, 0x02, 0x82, 0xC7, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x83, 0xA8, +0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x83, 0xF0, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, +0x84, 0x29, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xBF, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, +0x02, 0x84, 0x54, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xD5, 0x90, 0x93, 0x17, 0x12, 0x43, +0xA8, 0xE1, 0xCD, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x85, 0x14, 0x90, 0x93, 0x17, 0x12, +0x43, 0xA8, 0x02, 0x80, 0x54, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x80, 0x3C, 0x90, 0x93, 0x17, +0x12, 0x43, 0xA8, 0x02, 0x85, 0x5C, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x80, 0x80, 0x90, +0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xC5, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0xE1, 0xA1, 0x90, +0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x8A, 0xAB, 0x90, 0x93, 0x17, 0x12, 0x43, 0xA8, 0x02, 0x88, +0x5A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, +0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, 0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0x90, 0x93, 0x1A, +0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, +0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x1F, 0x0F, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, 0x20, 0xF0, 0x90, +0x93, 0x1A, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAD, 0x82, 0xAC, +0x83, 0x90, 0x93, 0x21, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, +0xF9, 0x74, 0x8A, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1C, 0x12, +0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x23, 0x12, 0x43, +0xA8, 0xEF, 0x12, 0x42, 0x53, 0x90, 0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0xFF, 0x90, 0x93, 0x23, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x90, +0x93, 0x1C, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x21, 0xE0, +0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0x8D, 0x82, 0x8C, +0x83, 0xA3, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0xFF, 0x24, 0xC2, 0xF5, +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFE, 0x75, 0xF0, 0x09, +0xEF, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8B, +0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, +0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0x8F, 0x57, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, +0xE4, 0x34, 0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, 0x57, 0x75, 0xF0, 0x02, 0xA4, 0x24, +0x02, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0x75, 0xF0, 0x09, +0xE5, 0x57, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, 0x85, 0x83, 0x5D, 0x8F, 0x5E, 0xE5, +0x57, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0x75, 0x5F, 0x01, 0xF5, +0x60, 0x89, 0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x12, +0x43, 0xD1, 0x6B, 0x57, 0x00, 0x6B, 0x6C, 0x01, 0x6B, 0x81, 0x02, 0x6B, 0x96, 0x03, 0x6B, 0xBF, +0x04, 0x6B, 0xD4, 0x05, 0x6B, 0xE9, 0x06, 0x6C, 0x0F, 0x0C, 0x6C, 0x3C, 0x0D, 0x6C, 0x69, 0x0E, +0x6C, 0x96, 0x0F, 0x00, 0x00, 0x6C, 0xCA, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, 0x80, 0x3C, 0xE5, 0x57, 0x25, 0xE0, +0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80, +0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, +0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, +0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0x8F, 0xF0, 0x81, 0xCA, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, +0x74, 0xF5, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, +0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0xE5, 0x57, 0x25, 0xE0, +0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x81, 0xCA, 0x90, +0x04, 0x47, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x46, 0xE0, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x45, 0xE0, +0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, 0x81, 0xC1, 0x90, 0x04, 0x4B, 0xE0, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4A, 0xE0, 0xAB, 0x5A, 0xAA, +0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x49, 0xE0, 0x85, 0x59, 0x82, +0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, 0x04, 0x4F, 0xE0, 0xAB, 0x5A, 0xAA, +0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, +0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, +0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, +0x12, 0x42, 0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, +0x12, 0x42, 0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, +0x50, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, +0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, +0x12, 0x1E, 0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0xAB, 0x5A, 0xE5, +0x5C, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, +0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x5F, 0xD0, +0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xC0, 0x83, +0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, +0xD0, 0x83, 0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, +0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, +0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, +0xE0, 0x4E, 0x60, 0x4B, 0x90, 0x93, 0x26, 0x74, 0x0B, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, +0x94, 0x00, 0x50, 0x02, 0xC1, 0x0F, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, +0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x0A, 0x90, 0x93, 0x26, +0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x26, 0xE0, 0x14, 0xF0, 0x80, 0xBB, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, +0x4E, 0x60, 0x47, 0x90, 0x93, 0x26, 0x74, 0x0F, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, +0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, +0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x26, 0xE0, 0xA3, 0xF0, +0x80, 0x0D, 0x90, 0x93, 0x26, 0xE0, 0x14, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, +0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x26, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, 0x10, +0x40, 0x02, 0xC1, 0xC8, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, +0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, +0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x06, 0x90, 0x93, 0x26, 0xE0, 0x80, +0x63, 0x90, 0x93, 0x26, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, +0x26, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, 0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, +0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, +0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, +0x4E, 0x60, 0x08, 0x90, 0x93, 0x26, 0xE0, 0x24, 0x10, 0x80, 0x09, 0x90, 0x93, 0x26, 0xE0, 0x04, +0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x28, 0xF0, 0x90, 0x93, 0x27, 0xE0, 0xFF, 0x75, 0xF0, 0x09, +0xE5, 0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, 0x90, 0x93, 0x28, 0xE0, 0xFE, 0x75, +0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xE5, 0x57, 0xC3, 0x94, +0x20, 0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, +0x9F, 0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, +0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x28, 0xE0, 0xA3, 0xF0, 0x80, 0x37, 0x80, 0x2D, 0x74, +0x27, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x27, 0xE0, +0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x29, 0xEE, 0xF0, 0x80, 0x17, 0x90, 0x93, 0x28, +0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x27, 0xE0, +0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, 0x29, 0xE0, 0xFD, 0xAF, 0x57, 0x12, 0x70, 0x63, 0x90, 0x93, +0x29, 0xE0, 0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, +0x90, 0x93, 0x27, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x03, 0xF0, +0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3, +0x94, 0x03, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x8A, 0x83, 0xF0, +0x22, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x80, 0xC4, 0x13, +0x13, 0x13, 0x54, 0x01, 0xFD, 0xAF, 0x06, 0x21, 0xDD, 0x12, 0x1E, 0xF6, 0xF5, 0x62, 0x22, 0x90, +0x93, 0x1A, 0x02, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0x90, 0x89, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, +0x90, 0x93, 0x6F, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x60, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, +0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xCE, +0x12, 0x43, 0xC8, 0x90, 0x93, 0xD1, 0xE0, 0x54, 0xF0, 0x44, 0x06, 0xFF, 0xF0, 0xED, 0x54, 0x0F, +0xC4, 0x54, 0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x93, 0xCE, 0x12, 0x43, 0xA8, 0x90, +0x93, 0xCB, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xD1, 0x12, 0x5E, 0xBE, 0xD0, 0xD0, +0x92, 0xAF, 0x22, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, +0xF0, 0xFD, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, +0x54, 0x0F, 0x80, 0x10, 0xEF, 0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, +0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, +0x4D, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x0E, +0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, 0x2A, 0x74, 0x27, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0x8B, 0xEF, 0xF0, 0x24, +0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x8C, 0xF0, 0x7B, 0x01, 0x7A, +0x93, 0x79, 0x8B, 0x7D, 0x02, 0x12, 0x6F, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, +0x53, 0xE5, 0x53, 0x54, 0x1F, 0x90, 0x93, 0x03, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0x88, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x01, 0xF0, 0x90, 0x93, 0x04, 0x74, 0x01, 0xF0, 0xEB, 0xC3, +0x94, 0x01, 0x40, 0x02, 0x80, 0x3B, 0x90, 0x93, 0x01, 0xE0, 0x25, 0x55, 0xFF, 0xA3, 0xF0, 0xA3, +0xE0, 0x90, 0x41, 0x9E, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x13, 0x74, 0x01, 0x25, 0x52, 0xF5, +0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x01, 0x63, 0x90, 0x93, +0x02, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEF, 0xF0, +0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, +0x06, 0xF0, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, +0x93, 0x05, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, +0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x5D, +0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, +0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x25, +0xE0, 0x25, 0xE0, 0xFF, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, +0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x0D, +0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, 0x93, 0x06, +0xE0, 0xFF, 0x90, 0x93, 0x05, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, 0x05, 0xE0, +0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, +0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, +0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, +0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, +0x90, 0x93, 0x05, 0xE0, 0xFD, 0x11, 0x63, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, +0x12, 0x90, 0x04, 0x30, 0xE0, 0x70, 0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0x04, +0xCF, 0x04, 0xF0, 0x90, 0x93, 0x05, 0xE0, 0xFF, 0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, +0x13, 0x74, 0x84, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, +0x1F, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, +0x7F, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x22, 0xF0, +0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x24, 0xF0, 0x75, +0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x25, 0xF0, 0xEC, +0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, +0x93, 0x26, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, +0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x28, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, +0xC6, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, +0x90, 0x93, 0x25, 0xE0, 0x90, 0x93, 0x22, 0xF0, 0x90, 0x93, 0x1F, 0xF0, 0xED, 0x70, 0x02, 0x61, +0xA3, 0x90, 0x93, 0x23, 0xED, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x22, +0xE0, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0x14, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0x70, +0x02, 0x61, 0xA3, 0x90, 0x93, 0x22, 0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0x61, 0xA3, 0xE4, +0x90, 0x93, 0x21, 0xF0, 0xEF, 0x14, 0x90, 0x93, 0x20, 0xF0, 0x90, 0x93, 0x24, 0xE0, 0xFD, 0x90, +0x93, 0x20, 0xE0, 0xFF, 0xD3, 0x9D, 0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, +0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, +0xF9, 0xFF, 0x90, 0x93, 0x28, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, +0x20, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, +0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x26, 0xE0, 0x5E, 0xFE, 0xA3, +0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, 0x93, 0x20, 0xE0, 0x90, 0x93, 0x1F, 0xF0, 0x90, 0x93, 0x21, +0xE0, 0x04, 0xF0, 0x90, 0x93, 0x23, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0x6F, 0x60, 0x08, 0x90, +0x93, 0x20, 0xE0, 0x14, 0xF0, 0x80, 0x83, 0x90, 0x93, 0x23, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, +0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x93, 0x20, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x93, 0x24, 0xE0, 0x90, +0x93, 0x1F, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, +0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, +0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x90, 0x93, 0x1F, 0xE0, 0xFD, 0x11, 0x63, 0x90, 0x93, +0x1F, 0xE0, 0xFF, 0x22, 0xAD, 0x07, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x11, 0x74, +0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x1F, 0xF0, +0x90, 0x93, 0x1F, 0xE0, 0xF9, 0x54, 0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, +0x12, 0x43, 0x9C, 0xE0, 0xFF, 0x90, 0x93, 0x22, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, +0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x23, 0xCB, 0xF0, 0xA3, 0xEB, +0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, +0xE0, 0x90, 0x93, 0x25, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFE, 0x25, 0xE0, +0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, +0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, +0xF0, 0xEE, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0x51, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x74, 0x28, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x93, 0x21, 0xF0, 0x90, +0x93, 0x22, 0xE0, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xA1, 0x8B, 0xEE, +0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x23, 0xE0, 0x5E, 0xFE, +0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x21, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, +0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0xFF, 0x90, 0x93, 0x25, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x21, +0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x93, 0x24, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x93, 0x21, 0x74, 0x17, +0xF0, 0x90, 0x93, 0x21, 0xE0, 0xFF, 0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, +0x23, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x21, 0x74, 0x18, 0xF0, 0x90, 0x93, 0x21, 0xE0, 0x90, +0x93, 0x20, 0xF0, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x42, 0x90, 0x93, 0x21, 0xE0, 0x04, 0xF0, 0x81, +0xAF, 0x90, 0x93, 0x22, 0xE0, 0xFC, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, +0x8A, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x20, 0xE0, +0x44, 0x40, 0x90, 0x93, 0x1F, 0xF0, 0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x93, 0x20, 0xE0, 0xFF, +0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, +0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, +0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, +0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, +0x93, 0x20, 0xE0, 0xD3, 0x9C, 0x40, 0x5E, 0x90, 0x93, 0x22, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x20, 0xEF, 0xF0, 0x90, 0x93, 0x1F, +0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, +0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, +0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, +0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, +0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, +0xF0, 0xAF, 0x05, 0x90, 0x93, 0x1F, 0xE0, 0x44, 0x80, 0xFD, 0x11, 0x63, 0x90, 0x93, 0x1F, 0xE0, +0x44, 0x80, 0xFF, 0x22, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, 0x94, +0x40, 0x40, 0x03, 0x02, 0x7E, 0x57, 0xEF, 0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, +0x90, 0x89, 0x01, 0xE0, 0xFF, 0x90, 0x8F, 0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, +0x0F, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, +0x03, 0x02, 0x7E, 0x4E, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, +0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x7E, 0x4E, 0x90, +0x93, 0x0F, 0xE0, 0x94, 0x20, 0x40, 0x09, 0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x7E, 0x57, +0x90, 0x93, 0x0F, 0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, +0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, +0x87, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x93, 0x14, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, +0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, +0x93, 0x16, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, +0x13, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, +0x10, 0xF0, 0x80, 0x14, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, +0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x10, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, +0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, +0x90, 0x93, 0x19, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, +0x94, 0x05, 0x40, 0x03, 0x02, 0x79, 0xEC, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x90, 0x93, 0x11, 0xE0, +0x9F, 0x40, 0x13, 0x90, 0x93, 0x19, 0xE0, 0x90, 0x93, 0x11, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, +0x93, 0x10, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0x93, 0x11, 0xE0, 0xFF, 0x90, 0x41, 0x12, 0x93, 0xFE, +0x90, 0x93, 0x0F, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, +0x40, 0x06, 0xEF, 0x90, 0x40, 0xDA, 0x80, 0x07, 0x90, 0x93, 0x11, 0xE0, 0x90, 0x40, 0xF6, 0x93, +0x90, 0x93, 0x18, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x50, 0xF9, 0x74, +0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x8B, 0x57, 0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x0F, 0xE0, +0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, +0x93, 0x12, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, +0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x9D, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, +0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, +0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, +0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, +0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, +0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x04, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, +0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, +0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, +0x06, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, +0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, +0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, +0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, +0x58, 0xA9, 0x59, 0x90, 0x00, 0x05, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x14, 0xE0, +0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0xD3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, +0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0xF0, 0x80, 0x07, +0xE4, 0x90, 0x93, 0x12, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x12, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, +0x93, 0x0F, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, +0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x10, 0xE0, 0x25, 0xE0, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x41, +0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, +0x21, 0xBB, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, +0xE0, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, +0x40, 0x03, 0xEF, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, +0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, +0xC3, 0x9E, 0x90, 0x93, 0x1A, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, +0x23, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, +0xD3, 0x94, 0x01, 0x40, 0x0F, 0x74, 0xC6, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, +0x14, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, +0x83, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, +0x83, 0xE0, 0x60, 0x02, 0x81, 0xFC, 0x12, 0x73, 0xF4, 0x81, 0xFC, 0x90, 0x93, 0x10, 0xE0, 0x25, +0xE0, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, +0xFF, 0xC3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0x40, 0x02, 0x81, 0xFC, +0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x72, 0x29, 0x81, 0xFC, 0x90, 0x93, 0x0F, 0xE0, +0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, +0x61, 0xCA, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x03, 0x0B, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, +0x19, 0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, 0x02, 0x0B, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, 0x11, +0x40, 0x2E, 0x80, 0x1F, 0x90, 0x8A, 0x83, 0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x11, 0xE0, +0xC3, 0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, 0xEE, 0x70, 0x11, 0x90, 0x93, 0x11, 0xE0, 0xC3, 0x94, +0x03, 0x40, 0x0D, 0x90, 0x8E, 0xC5, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, +0x90, 0x93, 0x0F, 0xE0, 0xFE, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, +0x93, 0x1E, 0xF0, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, +0x94, 0x30, 0x50, 0x0A, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x74, 0x67, 0x2F, 0x61, 0x75, 0x90, 0x8E, +0xC5, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x6A, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x06, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x5B, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xEE, +0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, +0xE0, 0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x0F, +0xE0, 0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, +0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, +0x93, 0x0F, 0xE0, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, +0x11, 0xE0, 0x6F, 0x60, 0x56, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, +0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, 0x40, 0x08, 0x90, 0x93, 0x1E, 0x74, 0x05, 0xF0, 0x80, +0x11, 0xEF, 0xD3, 0x94, 0x39, 0x90, 0x93, 0x1E, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, +0x01, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, +0xE0, 0xFE, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, +0x0F, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x80, 0x2F, 0x90, 0x93, 0x0F, 0xE0, 0xFF, +0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x14, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x90, +0x93, 0x0F, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, +0x11, 0xE0, 0xFE, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, +0x83, 0xEE, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFE, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, +0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, +0x01, 0x11, 0xE4, 0x90, 0x93, 0x1E, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, +0x83, 0xE4, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFD, 0x81, 0xF9, 0xEC, 0x64, 0x06, 0x60, 0x02, 0x81, +0xFC, 0x90, 0x93, 0x12, 0xF0, 0xA3, 0xF0, 0x90, 0x41, 0xDB, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, +0x14, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x1C, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, +0x93, 0x1E, 0xF0, 0xE4, 0x90, 0x93, 0x1B, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0xD3, 0x94, 0x04, +0x50, 0x47, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, +0xF0, 0x83, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0xEF, 0x90, 0x41, 0xD6, 0x93, 0xFF, 0x7E, 0x00, +0x12, 0x1F, 0x3C, 0x90, 0x93, 0x12, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x1C, 0xE0, +0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x13, 0xE0, 0x9F, 0x90, 0x93, 0x12, 0xE0, 0x9E, 0x50, +0x08, 0x90, 0x93, 0x1B, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x93, 0x1B, 0xE0, 0xC3, 0x13, 0xF0, +0x90, 0x93, 0x1E, 0xE0, 0xFF, 0xB4, 0x01, 0x0D, 0x90, 0x93, 0x1B, 0xE0, 0x70, 0x5D, 0x90, 0x93, +0x1E, 0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, 0x03, 0x1D, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0x70, 0x08, +0x90, 0x93, 0x1E, 0x74, 0x03, 0xF0, 0x80, 0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x1E, 0x74, +0x01, 0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, 0x93, 0x1E, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, +0x1B, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x1E, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, +0x1E, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x17, +0xE0, 0x94, 0x03, 0x90, 0x93, 0x16, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x1E, 0xF0, +0xD3, 0x90, 0x93, 0x17, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x16, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, +0x90, 0x93, 0x1E, 0xF0, 0x90, 0x93, 0x1E, 0xE0, 0xFD, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x24, 0xC4, +0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xED, 0xF0, 0x12, 0x70, 0x23, 0x90, 0x93, 0x0F, 0xE0, +0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, +0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, +0x93, 0x0F, 0xE0, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, +0x16, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, +0x93, 0x0F, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, +0xFA, 0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, 0x50, 0x1C, 0x90, 0x93, 0x16, 0xE0, 0xFE, 0xA3, 0xE0, +0xFF, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, +0x12, 0x42, 0x87, 0x80, 0x14, 0x90, 0x93, 0x0F, 0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x25, 0xE0, +0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, +0xFF, 0x9D, 0xFB, 0x74, 0xFF, 0x9C, 0xFA, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, +0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x0F, 0xE0, 0x50, +0x13, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, +0x42, 0x87, 0x80, 0x10, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, +0xFF, 0xF0, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, +0x00, 0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, +0x1F, 0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0x25, +0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, +0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, +0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, +0x0F, 0xE0, 0x04, 0xF0, 0x02, 0x76, 0x59, 0x22, 0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, +0xF0, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, +0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x14, 0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, +0x83, 0xE4, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, +0x90, 0x89, 0x01, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0xFF, 0xC3, +0x94, 0x40, 0x40, 0x03, 0x02, 0x80, 0x53, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, +0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, +0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, +0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x06, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, +0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, +0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, +0xA3, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8E, 0x04, 0xF0, 0x90, 0x41, 0x8C, 0x93, 0xFE, 0x74, +0x01, 0x93, 0xFF, 0x90, 0x41, 0x54, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, +0xFE, 0xEF, 0x13, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, +0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, +0x74, 0x01, 0xF0, 0x74, 0xC2, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, +0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, +0xF0, 0x09, 0xED, 0x90, 0x8A, 0x84, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, +0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, +0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x04, 0xF0, +0x02, 0x7E, 0x9A, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x90, 0x00, 0x02, +0x12, 0x1F, 0x0F, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, +0x22, 0xEF, 0xB4, 0x40, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, +0x94, 0x40, 0x40, 0x02, 0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, +0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, +0x1A, 0xF0, 0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, +0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x1C, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, +0x74, 0xFF, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, +0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x20, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, +0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x22, 0xF0, 0xEE, 0xA3, +0xF0, 0xA3, 0xEC, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x1A, 0x02, 0x5F, +0x97, 0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x93, 0xDB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0x93, 0xDB, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2C, +0xC3, 0x90, 0x93, 0xDE, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0xDD, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, +0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xDD, 0xE4, 0x75, 0xF0, 0x01, +0x12, 0x42, 0x87, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, 0x7F, 0x01, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x68, 0xE0, +0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x31, 0x51, 0xEF, 0x70, 0x02, 0x41, +0x5C, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x75, 0x27, 0x02, +0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x57, 0xF9, 0x90, 0x93, 0xC5, 0x12, 0x43, 0xA8, 0x8B, +0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, 0x93, 0xC2, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, +0x54, 0x0F, 0xF5, 0x27, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0x12, 0x57, 0xF9, 0x90, 0x01, 0xAF, +0x74, 0xFF, 0xF0, 0x90, 0x93, 0x70, 0xE0, 0x64, 0x01, 0x70, 0x4A, 0x90, 0x93, 0xC2, 0x12, 0x43, +0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x75, 0x27, 0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, 0x20, +0x12, 0x57, 0xF9, 0x90, 0x93, 0xC5, 0x12, 0x43, 0xA8, 0x8B, 0x24, 0x8A, 0x25, 0x89, 0x26, 0x90, +0x93, 0xC2, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x27, 0x7B, 0x01, +0x7A, 0xFD, 0x79, 0x22, 0x12, 0x57, 0xF9, 0x90, 0x93, 0x54, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, +0x8E, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, +0x24, 0x6B, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, +0xF0, 0x0F, 0xA4, 0x24, 0x6D, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x90, 0x93, 0xC5, 0x12, 0x43, +0xC8, 0xD0, 0x01, 0xD0, 0x02, 0x31, 0x9F, 0x90, 0x92, 0x69, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, +0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, +0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, +0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, +0x1A, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x1D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, +0x1A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x50, 0xF0, 0x90, 0x00, +0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x33, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, +0x01, 0x90, 0x93, 0x34, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x3E, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x3B, 0xF0, 0xEF, 0x13, 0x13, +0x13, 0x54, 0x01, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, +0x01, 0x90, 0x93, 0x3D, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x52, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x40, 0xF0, 0xE0, 0x70, +0x38, 0x90, 0x93, 0x3E, 0xE0, 0x70, 0x10, 0xFF, 0x12, 0x50, 0x56, 0x90, 0x93, 0x1D, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, 0x0F, 0x7F, 0x01, 0x12, 0x50, 0x56, 0x90, 0x93, 0x1D, 0x12, +0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x90, 0x93, 0x1D, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, +0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x34, 0xE0, 0x70, 0x03, 0x12, +0x4F, 0x63, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x4C, 0xDF, 0x90, 0x93, 0x50, 0xE0, 0x90, +0x01, 0xE6, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, +0xE0, 0x25, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x3F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, +0x93, 0x42, 0xF0, 0xEF, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x00, 0x03, 0x12, +0x1F, 0x0F, 0x90, 0x93, 0x47, 0xF0, 0x22, 0x90, 0x93, 0x3F, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x42, +0x74, 0x05, 0xF0, 0x90, 0x93, 0x3C, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x47, 0x74, 0x05, 0xF0, 0x22, +0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x19, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x46, 0xF0, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x44, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, +0x93, 0x46, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x44, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, +0x44, 0xE0, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x43, 0xF0, +0x60, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x48, 0xF4, 0x90, 0x93, 0x34, 0xE0, 0x60, 0x09, 0x90, +0x93, 0x4D, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0x63, 0x12, 0x51, 0x4C, 0x90, 0x93, 0x43, 0xE0, 0x90, +0x01, 0xE7, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x2D, 0xE0, 0x54, +0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xFF, 0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, +0x70, 0xFF, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0x8F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, +0x90, 0x93, 0x2F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x30, 0xF0, 0x90, 0x00, +0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, +0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xD3, 0x94, 0x20, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, +0x01, 0xF0, 0x80, 0x57, 0xEF, 0xD3, 0x94, 0x40, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x02, 0xF0, +0x80, 0x49, 0xEF, 0xD3, 0x94, 0x60, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x03, 0xF0, 0x80, 0x3B, +0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, +0x94, 0xA0, 0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x05, 0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, +0x50, 0x08, 0x90, 0x93, 0x2E, 0x74, 0x06, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, +0x2E, 0x50, 0x05, 0x74, 0x07, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x93, 0x2E, 0xE0, 0x90, +0x93, 0x32, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, +0x2E, 0x90, 0x93, 0x67, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, +0x68, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x69, 0xF0, 0x90, +0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x6A, 0xF0, 0x90, 0x00, 0x04, 0x12, +0x1F, 0x0F, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x6B, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, +0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xC8, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x12, 0x1E, +0xF6, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xC1, 0xB6, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, +0xF6, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0x93, 0x9E, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, +0x01, 0xFF, 0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x08, 0xFD, 0xEF, +0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x93, 0x9E, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, +0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0x93, +0x9E, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xC1, 0xA2, +0x90, 0x93, 0x1D, 0x74, 0x21, 0xF0, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, +0x13, 0x13, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x9E, 0xE0, 0xFD, 0x13, 0x13, 0x54, 0x01, 0x6E, 0x60, +0x31, 0xEF, 0x54, 0x04, 0xFF, 0xED, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, +0xE0, 0x15, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x3A, 0x93, 0x90, 0x93, +0x1D, 0xE0, 0x44, 0x08, 0xF0, 0x80, 0x0B, 0xE4, 0x90, 0x93, 0xA0, 0xF0, 0x7D, 0x40, 0xFF, 0x12, +0x3A, 0x22, 0x90, 0x93, 0x9E, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, +0x93, 0x1D, 0xE0, 0x44, 0x12, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, +0xE0, 0x44, 0x14, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x90, +0x93, 0x1D, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x93, 0x9E, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, +0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x1D, 0xE0, 0x90, 0x05, 0x27, +0xF0, 0x90, 0x93, 0x9F, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x11, 0x90, 0x93, 0x9E, 0xE0, +0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x0E, 0x7F, 0x01, 0x12, 0x5E, +0x91, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x55, 0x11, 0x7F, 0x02, 0x02, +0x88, 0x14, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0xE4, 0xFF, 0x12, 0x55, +0x11, 0x7F, 0x03, 0x02, 0x88, 0x14, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, +0x54, 0x02, 0xFE, 0x90, 0x93, 0x98, 0xE0, 0x54, 0xFD, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x01, 0xFF, +0xEE, 0x54, 0xFE, 0x4F, 0xFF, 0xF0, 0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, +0x4D, 0xFF, 0x90, 0x93, 0x98, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, +0x12, 0x1E, 0xF6, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x93, 0x98, 0xF0, +0xEE, 0x54, 0x04, 0xFE, 0xEF, 0x54, 0xFB, 0x4E, 0xF0, 0x20, 0xE0, 0x02, 0xE1, 0xC7, 0x90, 0x93, +0x1D, 0x74, 0x31, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x15, 0x90, +0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x3A, 0x93, 0x90, 0x93, 0x1D, 0xE0, 0x44, +0x08, 0xF0, 0x80, 0x0B, 0xE4, 0x90, 0x93, 0x9A, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x3A, 0x22, 0x90, +0x93, 0x98, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, +0x44, 0x02, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x93, 0x1D, 0xE0, 0x44, 0x04, +0xF0, 0x90, 0x93, 0x1D, 0xE0, 0x54, 0x0E, 0x60, 0x0C, 0x90, 0x01, 0x3E, 0x74, 0x03, 0xF0, 0xFD, +0x7F, 0x02, 0x12, 0x3A, 0xAD, 0x90, 0x93, 0x1D, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0x93, 0x98, +0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0D, 0xA3, 0xE0, 0x64, 0x06, 0x60, 0x33, +0x7F, 0x06, 0x12, 0x64, 0xDA, 0x80, 0x2C, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, +0x99, 0xE0, 0xB4, 0x06, 0x1B, 0x7F, 0x01, 0x12, 0x64, 0xDA, 0xE4, 0xFF, 0x12, 0x5E, 0x91, 0xEF, +0x60, 0x09, 0x7D, 0x01, 0xAF, 0x64, 0x12, 0x48, 0xF4, 0x80, 0x05, 0x12, 0x64, 0xA8, 0x80, 0x03, +0x12, 0x67, 0x4A, 0x7F, 0x01, 0x80, 0x4D, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, +0xF0, 0x7D, 0x03, 0x7F, 0x02, 0x12, 0x3A, 0x3F, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x06, 0x02, 0x80, +0x1B, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x04, 0x02, 0x80, 0x07, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x05, +0x04, 0xE4, 0xFF, 0x80, 0x14, 0x90, 0x93, 0x99, 0xE0, 0xB4, 0x03, 0x04, 0x7F, 0x01, 0x80, 0x09, +0x90, 0x93, 0x99, 0xE0, 0xB4, 0x02, 0x05, 0x7F, 0x01, 0x12, 0x64, 0xDA, 0x12, 0x67, 0x29, 0x12, +0x51, 0x9C, 0x7F, 0x03, 0x11, 0x1B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0xEF, 0x64, 0x01, +0x60, 0x04, 0xEF, 0xB4, 0x03, 0x15, 0x90, 0x93, 0x9E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, +0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xED, 0x64, 0x02, 0x60, 0x04, +0xED, 0xB4, 0x03, 0x15, 0x90, 0x93, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x6D, +0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x6E, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xE5, +0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, 0x60, 0x43, 0xC3, 0x90, 0x93, 0xE6, 0xE0, +0x94, 0x88, 0x90, 0x93, 0xE5, 0xE0, 0x94, 0x13, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, +0xF0, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xE5, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, +0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x93, 0xE6, 0xE0, 0x94, 0x64, 0x90, 0x93, 0xE5, 0xE0, +0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, +0x22, 0x90, 0x93, 0xA4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xA8, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, +0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x90, 0xD3, 0x12, 0x43, +0x73, 0x50, 0x41, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xA4, 0x12, 0x43, +0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x7B, 0x01, +0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, 0x1B, 0x90, 0x93, 0xA8, 0x12, 0x43, 0x84, 0xEF, +0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0xA8, 0x12, +0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xA8, 0x02, 0x43, 0x84, 0x90, 0x93, 0x73, 0x12, 0x1F, 0xC9, +0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0x77, 0x12, 0x43, 0x90, 0xC3, 0x12, 0x43, 0x73, +0x90, 0x93, 0x73, 0x60, 0x67, 0x12, 0x43, 0x84, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x7F, 0x12, 0x1F, +0xC9, 0x90, 0x93, 0x77, 0x12, 0x43, 0x84, 0x11, 0xC1, 0x90, 0x93, 0x83, 0x12, 0x1F, 0xC9, 0x90, +0x93, 0x77, 0x12, 0x43, 0x84, 0x12, 0x43, 0x66, 0x90, 0x93, 0x7F, 0x12, 0x43, 0x90, 0x12, 0x43, +0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x83, 0x12, 0x43, 0x84, 0xA9, +0x07, 0x90, 0x93, 0x7B, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xB6, 0xD0, 0x03, 0xD0, 0x02, +0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, 0x90, 0x93, 0x87, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0x73, +0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x87, 0x80, 0x0A, 0x12, 0x43, 0x84, 0xC0, +0x06, 0xC0, 0x07, 0x90, 0x93, 0x7B, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0xD0, +0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x9F, 0x74, +0x04, 0xF0, 0x22, 0x12, 0x56, 0x01, 0x80, 0xEE, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x05, +0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0x9F, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x56, 0x14, 0x90, +0x93, 0x9F, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x3C, 0x90, 0x01, 0x57, 0xE4, +0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x51, 0xE0, 0x60, 0x07, 0xE4, 0xF0, 0x53, +0x66, 0xFD, 0x80, 0x24, 0x90, 0x93, 0x38, 0xE0, 0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, 0x3F, +0xE0, 0xFF, 0x90, 0x93, 0x38, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0xE5, 0x62, 0xB4, 0x01, 0x09, 0x90, +0x93, 0x39, 0xE0, 0x70, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x5B, 0xE0, 0x60, 0x10, 0x90, 0x01, +0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x4C, 0xF0, 0x90, 0x01, +0x5F, 0xE0, 0x60, 0x10, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, +0x90, 0x93, 0x49, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xE7, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, +0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, +0x22, 0xD3, 0x90, 0x93, 0xE8, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0xE7, 0xE0, 0x94, 0x03, 0x40, 0x03, +0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x93, 0xE7, 0xE4, 0x75, 0xF0, +0x01, 0x12, 0x42, 0x87, 0x80, 0xC6, 0xE4, 0xFF, 0x02, 0x4E, 0x8B, 0x90, 0x93, 0x1A, 0x12, 0x43, +0xC8, 0x12, 0x1E, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x93, 0xE0, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xE0, +0x30, 0xE0, 0x02, 0x51, 0xA6, 0x90, 0x93, 0x1A, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xC3, 0x13, +0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0xE1, 0xF0, 0x22, 0x7E, 0xBF, +}; + +#ifdef CONFIG_MP_INCLUDED//BT_MP 16980 const u1Byte Rtl8723EFwBTImgArray[Rtl8723EBTImgArrayLength] = { +u8 Rtl8723EFwBTImgArray[Rtl8723EBTImgArrayLength] = { +0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x55,0xB2,0xCD,0xF7,0x12,0x6B,0x6B,0xEB,0x51,0xB7,0x60,0xCA,0x53,0xB2,0x64,0xF3,0x13,0x6B,0x6B,0xEB,0xE8,0x4F,0x60,0xCA,0x51,0xB2,0x00,0x6B,0x40,0xF0,0x6C,0xC7,0x60,0xC2,0xC0,0xF0,0x58,0x9F,0x4F,0xB3,0x51,0xB0,0x00,0x69,0x6D,0xEA,0xC0,0xF0,0x58,0xDF,0x45,0xF1,0x09,0x6A,0x00,0xF1,0x50,0xCF,0x0E,0xF0,0x1D,0x6A,0x80,0xF1,0x62,0xA7,0x43,0xDF,0x48,0xB2,0x25,0xDF,0x26,0xDF,0x44,0xDF,0x68,0x32,0x69,0xE2,0x46,0xB3,0x44,0x32,0x27,0xDF,0x28,0xDF,0x29,0xDF,0x40,0xCB,0x90,0x67,0xB1,0x67,0x30,0x6E,0x00,0x18,0x64,0x2E,0x04,0xD7,0x01,0x6A,0x4B,0xEA,0x47,0xD8,0x41,0xB3,0x40,0x98,0x42,0xB4,0xB1,0x67,0x6D,0xEA,0x40,0xD8,0x0A,0x6A,0x4C,0xC0,0x08,0x6A,0x4D,0xC0,0x3D,0xB2,0x0C,0x6E,0x00,0x18,0x64,0x2E,0x20,0xC2,0x30,0xB3,0x03,0x6A,0x30,0xB5,0x80,0x9B,0x02,0x6B,0x6B,0xEB,0x6C,0xEC,0x4B,0xEA,0x4C,0xEC,0x05,0x6A,0x4B,0xEA,0x4C,0xEC,0x40,0x9D,0x6C,0xEA,0x40,0xDD,0x04,0x97,0x0E,0xF0,0x1D,0x6A,0x34,0xB3,0x43,0xDF,0x32,0xB2,0x60,0xDA,0x34,0xB3,0x33,0xB2,0x60,0xDA,0x35,0xB3,0x33,0xB2,0x60,0xDA,0x35,0xB3,0x34,0xB2,0x60,0xDA,0x36,0xB3,0x34,0xB2,0x60,0xDA,0x36,0xB3,0x35,0xB2,0x60,0xDA,0x37,0xB3,0x35,0xB2,0x60,0xDA,0x37,0xB3,0x36,0xB2,0x60,0xDA,0x38,0xB3,0x36,0xB2,0x60,0xDA,0x38,0xB3,0x37,0xB2,0x60,0xDA,0x39,0xB3,0x37,0xB2,0x60,0xDA,0x39,0xB3,0x38,0xB2,0x60,0xDA,0x3A,0xB3,0x38,0xB2,0x60,0xDA,0x3A,0xB3,0x39,0xB2,0x60,0xDA,0x3B,0xB3,0x39,0xB2,0x60,0xDA,0x3B,0xB3,0x3A,0xB2,0x60,0xDA,0x3B,0xB2,0x3C,0xB3,0x20,0xCA,0x3A,0xB2,0x60,0xDA,0x3B,0xB2,0x08,0xF1,0x11,0x6B,0x6B,0xEB,0x20,0xCA,0x3A,0xB2,0x60,0xCA,0x3A,0xB2,0x20,0xDA,0x3A,0xB2,0x20,0xDA,0x3A,0xB2,0x06,0xB3,0x4C,0xEC,0x39,0xB2,0x4D,0xEC,0x80,0x18,0x5A,0x37,0x80,0xDB,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0xF4,0x00,0x11,0x80,0xF0,0x00,0x11,0x80,0xD0,0x04,0x11,0x80,0xD2,0x04,0x11,0x80,0xCA,0xA0,0x11,0x80,0x00,0x00,0x00,0x18,0x58,0xC5,0xC8,0x19,0x08,0xA1,0x11,0x80,0xCC,0xA0,0x11,0x80,0x00,0x00,0x00,0x70,0x1C,0xA1,0x11,0x80,0xFC,0xA0,0x11,0x80,0xBC,0x00,0x11,0x80,0x51,0xA9,0x10,0x80,0x44,0x00,0x11,0x80,0x4D,0xA3,0x10,0x80,0x4C,0x05,0x11, +0x80,0x55,0xAE,0x10,0x80,0x44,0x05,0x11,0x80,0x59,0xD1,0x10,0x80,0x58,0x09,0x11,0x80,0xF5,0xD4,0x10,0x80,0x3C,0x00,0x11,0x80,0x35,0xA6,0x10,0x80,0xA0,0x05,0x11,0x80,0x51,0xAB,0x10,0x80,0xC4,0x05,0x11,0x80,0xF1,0xA9,0x10,0x80,0x5C,0x05,0x11,0x80,0xBD,0xDB,0x10,0x80,0x90,0x06,0x11,0x80,0x7D,0xCA,0x10,0x80,0x98,0x07,0x11,0x80,0xB5,0xCD,0x10,0x80,0xA0,0x07,0x11,0x80,0x1D,0xCF,0x10,0x80,0x9C,0x07,0x11,0x80,0xC5,0xCF,0x10,0x80,0xEC,0x04,0x11,0x80,0xB5,0xAF,0x10,0x80,0x80,0x00,0x11,0x80,0xCD,0xD2,0x10,0x80,0x6C,0x06,0x11,0x80,0x29,0xD4,0x10,0x80,0x0A,0xA1,0x11,0x80,0xD4,0x04,0x11,0x80,0x25,0xD3,0x10,0x80,0xC8,0xA0,0x11,0x80,0x0C,0xA1,0x11,0x80,0x10,0xA1,0x11,0x80,0x14,0xA1,0x11,0x80,0xFF,0xFF,0x1F,0xFF,0x00,0x00,0x60,0x00,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x04,0x67,0x2F,0x24,0x80,0x98,0x00,0x6A,0x00,0xF4,0x24,0x98,0xBD,0x67,0x00,0xF4,0x44,0xD8,0xE1,0xF7,0x1F,0x6A,0x4C,0xEC,0x00,0x18,0x2A,0xDF,0x10,0x4D,0x12,0x2A,0x5D,0x67,0x68,0xAA,0xFF,0xF7,0x1F,0x6A,0x4C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x0E,0xB3,0x48,0x32,0x69,0xE2,0xE0,0xF0,0x4B,0xA2,0x01,0x72,0x0A,0x60,0x0B,0xB2,0xB0,0x67,0x00,0x18,0xE0,0x1D,0x83,0x9A,0x07,0x2A,0x00,0x18,0x6A,0x1E,0x11,0x67,0x04,0x10,0x00,0x18,0x7B,0x57,0x90,0x67,0x11,0x67,0xD1,0x29,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0x9C,0x31,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0xFF,0x6B,0x6C,0xEE,0x04,0x76,0x0A,0xD4,0x04,0xD6,0x2B,0x61,0x40,0xA4,0x6C,0xEA,0x03,0x72,0x27,0x61,0x22,0xA4,0x6C,0xE9,0x24,0x29,0x44,0xA4,0x03,0xA4,0x6C,0xEA,0x6C,0xE8,0x40,0x32,0x00,0x1C,0xDD,0x31,0x4D,0xE8,0x13,0xB3,0x1A,0x65,0x40,0xAB,0x0E,0xEA,0x14,0x2A,0x11,0xB2,0x98,0x67,0x00,0x9A,0x20,0xDA,0x10,0xB2,0x20,0xDA,0x08,0xF1,0x11,0x6A,0x4B,0xEA,0x00,0x1C,0xE5,0x31,0x40,0xCB,0x00,0x18,0xA9,0x1D,0x01,0x6C,0x07,0x20,0x80,0x18,0x8A,0x28,0x90,0x67,0x03,0x10,0x00,0x1C,0xE5,0x31,0x98,0x67,0x0A,0x94,0x00,0x18,0xBD,0x89,0x04,0x95,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x0C,0xA1,0x11,0x80,0x10,0xA1,0x11,0x80,0x14,0xA1,0x11,0x80,0x03,0xB2, +0x01,0x6B,0x40,0x9A,0x52,0x32,0x20,0xE8,0x6C,0xEA,0x50,0x60,0x00,0xB0,0x03,0xB2,0x01,0x6B,0x40,0x9A,0x4A,0x32,0x20,0xE8,0x6C,0xEA,0x50,0x60,0x00,0xB0,0xF3,0x63,0x18,0x62,0x17,0xD1,0x16,0xD0,0x7D,0x67,0x00,0x6A,0x20,0xF0,0x50,0xC3,0xA6,0xB3,0x9D,0x67,0x00,0x69,0x58,0xAB,0x40,0xF0,0x48,0xCC,0x20,0xF0,0x5A,0xA3,0x20,0xF0,0x79,0xA3,0x40,0x32,0x4D,0xEB,0xA1,0xB2,0x0D,0xD3,0x01,0x6B,0x40,0x9A,0x0F,0xD2,0xA0,0xB2,0x40,0x9A,0x0E,0xD2,0x9F,0xB2,0x00,0x9A,0x9F,0xB2,0x40,0x9A,0x10,0xD2,0x0E,0x92,0x6C,0xEA,0x3A,0x22,0xBD,0x67,0x83,0x67,0x30,0x4D,0x00,0x6E,0x00,0x18,0x71,0x23,0x23,0x67,0x02,0x2A,0x03,0x69,0x0B,0x11,0x9D,0x67,0x20,0xF0,0x70,0xA4,0x0F,0x94,0xFF,0x6A,0x4C,0xEB,0x80,0xF7,0x82,0x32,0x2C,0xEA,0x4E,0xEB,0x94,0xB4,0x1B,0x2B,0x92,0xB2,0x4D,0xE8,0x40,0x9C,0x56,0x32,0x2C,0xEA,0x02,0x2A,0x91,0xB2,0x4D,0xE8,0x7D,0x67,0x40,0xF0,0x68,0xAB,0x01,0xF0,0x00,0x6A,0x05,0x69,0x6C,0xEA,0xFF,0xF7,0x1F,0x6B,0x6C,0xEA,0x04,0x22,0x00,0x18,0xA4,0x1D,0x0D,0x94,0x0D,0x10,0x00,0x18,0xA9,0x1D,0x0D,0x94,0x09,0x10,0x88,0xB2,0x4C,0xE8,0x40,0x9C,0x56,0x32,0x2C,0xEA,0x02,0x2A,0x86,0xB2,0x4C,0xE8,0x09,0x69,0x0E,0x94,0x01,0x6F,0x86,0x32,0xEC,0xEA,0x41,0x22,0x7F,0xB3,0x40,0x9B,0x56,0x32,0xEC,0xEA,0x3C,0x22,0xBD,0x67,0x10,0x6A,0xC7,0x67,0x02,0x6C,0x30,0x4D,0x14,0xD7,0x00,0x18,0x71,0x23,0x4D,0xE9,0x14,0x97,0x06,0x2A,0x20,0x6A,0x4D,0xE9,0xFF,0xF7,0x1F,0x6C,0x8C,0xE9,0xC0,0x10,0x0F,0x94,0x5D,0x67,0x20,0xF0,0x70,0xA2,0x40,0xF7,0x82,0x32,0xEC,0xEA,0x4E,0xEB,0x70,0xB2,0x80,0x9A,0x19,0x2B,0x6F,0xB2,0x4D,0xE8,0x44,0x67,0xEC,0xEA,0x02,0x2A,0x6B,0xB2,0x4D,0xE8,0x7D,0x67,0x40,0xF0,0x68,0xAB,0x01,0xF0,0x00,0x6A,0xFF,0xF7,0x1F,0x6C,0x6C,0xEA,0x8C,0xEA,0x04,0x22,0x00,0x18,0xA4,0x1D,0x0D,0x94,0x0B,0x10,0x00,0x18,0xA9,0x1D,0x0D,0x94,0x07,0x10,0x65,0xB2,0x4C,0xE8,0x44,0x67,0xEC,0xEA,0x02,0x2A,0x61,0xB2,0x4C,0xE8,0x0E,0x93,0x01,0x6C,0x6A,0x32,0x8C,0xEA,0x3C,0x22,0x5C,0xB3,0x40,0x9B,0x0F,0x6B,0x46,0xEC,0x6C,0xEA,0x03,0x72,0x35,0x60,0xFF,0x6A,0xBD,0x67,0x01,0x4A,0x04,0x6C,0x30,0x4D,0x02,0x6E,0x00,0x18,0x71,0x23,0x4D,0xE9,0x03,0x2A,0x00,0xF2,0x00,0x6A,0x40, +0x10,0x9D,0x67,0x20,0xF0,0x50,0xA4,0x50,0xB3,0x80,0x9B,0x11,0x22,0x53,0xB2,0x03,0x6B,0x4D,0xE8,0x82,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x60,0x96,0x32,0x01,0x6C,0x8C,0xEA,0x02,0x2A,0x4E,0xB2,0x4D,0xE8,0x00,0xF4,0x00,0x6A,0x10,0x10,0x4C,0xB2,0x03,0x6B,0x4C,0xE8,0x82,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x60,0x96,0x32,0x01,0x6B,0x6C,0xEA,0x02,0x2A,0x47,0xB2,0x4C,0xE8,0x01,0xF0,0x00,0x6A,0x4D,0xE9,0x0E,0x94,0x01,0x6B,0x8E,0x32,0x6C,0xEA,0x18,0x22,0x3B,0xB2,0x40,0x9A,0x46,0xEB,0x0F,0x6B,0x6C,0xEA,0x03,0x72,0x11,0x60,0xBD,0x67,0x02,0xF0,0x00,0x6A,0x08,0x6C,0x30,0x4D,0x03,0x6E,0x00,0x18,0x71,0x23,0x4D,0xE9,0x07,0x2A,0x04,0xF0,0x00,0x6A,0x4D,0xE9,0xFF,0xF7,0x1F,0x6A,0x4C,0xE9,0x37,0x10,0x04,0x6A,0x2C,0xEA,0x08,0x2A,0x34,0xB2,0x4C,0xE8,0x34,0xB2,0x4C,0xE8,0x2E,0xB2,0x4C,0xE8,0x2E,0xB2,0x4C,0xE8,0xC0,0xF5,0x02,0x32,0x01,0x6B,0x6C,0xEA,0x0C,0x22,0x27,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x61,0x25,0xB2,0x4C,0xE8,0x25,0xB2,0x4C,0xE8,0x29,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x0C,0x2A,0x1F,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x04,0x61,0x1F,0xB2,0x4D,0xE8,0x1F,0xB2,0x4D,0xE8,0x22,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x03,0x2A,0x00,0x18,0xBB,0x30,0x00,0x6C,0x12,0xB2,0x00,0xDA,0x05,0x6A,0x10,0x94,0x04,0xD2,0x0B,0x0A,0x05,0xD2,0x0E,0x93,0x0F,0x92,0x0A,0xD4,0xFA,0x6D,0x04,0x6C,0xE1,0xF3,0x09,0x6E,0xA1,0xF1,0x1A,0x6F,0x06,0xD1,0x09,0xD0,0x07,0xD2,0x20,0x18,0x1B,0x32,0x08,0xD3,0x18,0x97,0x17,0x91,0x16,0x90,0x00,0xEF,0x0D,0x63,0x41,0x00,0x00,0x00,0xDC,0x00,0x11,0x80,0x44,0xA0,0x00,0xB0,0x40,0x60,0x00,0xB0,0x40,0xA0,0x00,0xB0,0x50,0xA0,0x00,0xB0,0x00,0x00,0x80,0x00,0x6C,0x1D,0x11,0x80,0x00,0x00,0x40,0x00,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xBF,0xFF,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xEF,0xFF,0x00,0x00,0xC0,0x00,0x00,0x00,0x30,0x00,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0x65,0xB2,0x01,0x6F,0x20,0x9A,0x2A,0x65,0x36,0x36,0xEC,0xEE,0x0B,0x2E,0x63,0xB4,0x03,0x6B,0x6B,0xEB,0x40,0x9C,0x6C,0xEA,0x40,0xDC,0x61,0xB4,0x02,0x6B,0x40,0x9C, +0x6D,0xEA,0x40,0xDC,0x5F,0xB2,0x00,0x6B,0x0A,0xD3,0xA3,0x67,0x60,0x9A,0x5E,0xB2,0x40,0x9A,0x0A,0x65,0x5D,0xB2,0x00,0x9A,0x51,0x67,0xEC,0xEA,0x10,0x22,0x80,0xF7,0x62,0x32,0x88,0x67,0x8E,0xEA,0xEC,0xEA,0x01,0x5A,0xA7,0x67,0x08,0x60,0x58,0xB2,0x03,0x6D,0x4D,0xE8,0x03,0x2E,0x57,0xB2,0x07,0x6D,0x4D,0xE8,0x0A,0xD7,0x29,0x67,0xC0,0x99,0x01,0x6C,0xD6,0x32,0x8C,0xEA,0x1E,0x22,0x08,0x6A,0x4D,0xED,0x02,0x32,0x52,0x32,0x8C,0xEA,0xFF,0xF7,0x1F,0x6F,0x16,0x22,0x28,0x67,0x26,0x32,0x40,0xF7,0x62,0x33,0x4E,0xEB,0x8C,0xEB,0x83,0xEB,0x0E,0x60,0x10,0x6A,0x4D,0xED,0x49,0xB2,0xEC,0xED,0x4D,0xE8,0x46,0x67,0x8C,0xEA,0x05,0x2A,0x45,0xB2,0x4D,0xE8,0x20,0x6A,0x4D,0xED,0xEC,0xED,0x0A,0xD4,0x68,0x67,0x6A,0x32,0x01,0x6E,0xCC,0xEA,0x16,0x22,0x40,0x6A,0x29,0x67,0x4D,0xED,0x80,0x99,0x3F,0xB2,0x03,0x6B,0x4D,0xE8,0x82,0x32,0x4A,0x32,0x6C,0xEA,0xCA,0xEA,0x03,0x60,0x96,0x32,0xCC,0xEA,0x07,0x2A,0x80,0x6A,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x4C,0xED,0x38,0xB2,0x4D,0xE8,0x02,0x6A,0xAC,0xEA,0x08,0x2A,0x37,0xB2,0x4C,0xE8,0x37,0xB2,0x4C,0xE8,0x37,0xB2,0x4C,0xE8,0x37,0xB2,0x4C,0xE8,0x29,0xB3,0x03,0x69,0x40,0x9B,0x42,0x32,0x4A,0x32,0x2C,0xEA,0x01,0x72,0x04,0x61,0x31,0xB2,0x4C,0xE8,0x2E,0xB2,0x4C,0xE8,0x31,0xB2,0x88,0x67,0x06,0xD5,0x07,0xD4,0xFA,0x6D,0x04,0x6C,0xA1,0xF4,0x0C,0x6E,0xA1,0xF1,0x19,0x6F,0x04,0xD1,0x05,0xD2,0x20,0x18,0x1B,0x32,0x08,0xD0,0x0A,0x92,0x12,0x22,0x29,0xB3,0x50,0x67,0x6C,0xEA,0x6E,0xEA,0x0B,0x2A,0x18,0xB3,0x40,0x9B,0x42,0x32,0x4A,0x32,0x2C,0xEA,0x01,0x72,0x04,0x61,0x1C,0xB2,0x4D,0xE8,0x1C,0xB2,0x4D,0xE8,0x17,0xB2,0x00,0xDA,0x21,0xB2,0x01,0x6C,0xA0,0x9A,0xBE,0x32,0x8C,0xEA,0x17,0x22,0x40,0xF5,0x02,0x32,0x8C,0xEA,0x07,0x22,0x1D,0xB2,0x00,0x6B,0x80,0xC2,0x1D,0xB2,0x60,0xC2,0x1D,0xB2,0x60,0xC2,0xA2,0x32,0x8C,0xEA,0x05,0x22,0x00,0x18,0xA5,0x23,0x00,0x65,0x18,0xB3,0x40,0xC3,0x16,0xB2,0x00,0x18,0x04,0x24,0x80,0xA2,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0x6C,0x1D,0x11,0x80,0x30,0x60,0x00,0xB0,0x34,0x60,0x00,0xB0,0x44,0xA0,0x00,0xB0,0x50,0x60,0x00,0xB0,0x40,0xA0,0x00,0xB0,0x00,0x00,0x80,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20, +0x00,0x00,0x00,0x10,0x00,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xBF,0xFF,0xF0,0xA5,0x10,0x80,0x00,0x00,0xC0,0x00,0x54,0x45,0x11,0x80,0x17,0x00,0x11,0x80,0x16,0x00,0x11,0x80,0x18,0x00,0x11,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x34,0xB2,0x00,0x6E,0x01,0x6B,0x20,0x6C,0xFF,0xF7,0x1F,0x6D,0x0A,0x65,0xE6,0x67,0x06,0x67,0x4B,0x65,0x2C,0x65,0x6D,0x65,0x2D,0xB1,0xC8,0x32,0x15,0xE1,0x10,0x27,0x68,0x67,0x69,0xE2,0x80,0x9A,0x6A,0x67,0x64,0xEF,0x86,0xEF,0x80,0xDD,0x41,0x9A,0xFF,0x4B,0x29,0x67,0x6C,0xEA,0xEF,0xE1,0x44,0xEB,0x4D,0xEC,0x80,0xDD,0x04,0x10,0x68,0x67,0x69,0xE2,0x40,0x9A,0x40,0xDD,0x01,0x4E,0xFF,0x69,0x2C,0xEE,0x10,0x76,0x11,0x61,0x88,0x67,0x1E,0xB5,0x01,0x4F,0x60,0x9C,0x2C,0xEF,0x4A,0x67,0x44,0xEF,0x11,0xE5,0xFF,0x4A,0xA9,0x67,0x4C,0xEB,0xEB,0xE5,0x64,0xEA,0x40,0x9C,0x00,0x6E,0x6D,0xEA,0x40,0xDC,0x04,0x48,0x4B,0x67,0x4C,0xE8,0x00,0xF4,0x01,0x58,0xCC,0x61,0x13,0xB4,0xFF,0x6E,0x55,0x6D,0x00,0xF4,0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x0F,0xB4,0xFF,0x6E,0x00,0x6D,0x00,0xF5,0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x0B,0xB4,0xFF,0x6E,0xB1,0x67,0x00,0xF6,0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x07,0xB4,0xFF,0x6E,0x0F,0x6D,0x00,0xF7,0x00,0x4C,0x00,0x18,0x64,0x2E,0x01,0x4E,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63,0x00,0x00,0x00,0xF8,0x10,0x80,0xDC,0xF4,0x04,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x11,0xB2,0x00,0x68,0xEE,0x6C,0x00,0xDA,0x10,0xB2,0x07,0x6D,0x00,0xDA,0x00,0x18,0x9A,0x33,0x00,0x65,0x0E,0xB4,0x4A,0xF5,0x16,0x6B,0x6B,0xEB,0xFF,0xF7,0x1F,0x6A,0x01,0x48,0x4C,0xE8,0x00,0xF4,0x00,0x58,0x60,0xCC,0xFA,0x61,0x07,0xB2,0x03,0x6B,0x05,0x97,0x60,0xDA,0x04,0x90,0x03,0xB2,0x01,0x6B,0x60,0xDA,0x00,0xEF,0x03,0x63,0x00,0x00,0x10,0xA3,0x00,0xB0,0x20,0xA3,0x00,0xB0,0xF0,0x00,0x00,0xB6,0xFD,0x63,0x04,0x62,0x17,0xB3,0x16,0xB2,0x80,0x18,0x3F,0x2A,0x60,0xDA,0x16,0xB3,0x16,0xB2,0x21,0xB4,0x04,0x97,0x52,0xDB,0x15,0xB2,0x55,0xDB,0x15,0xB2,0x49,0xDB,0x15,0xB2,0x4C,0xDB,0x15,0xB2,0x4F,0xDB,0x15,0xB2,0x46,0xDB,0x15,0xB2,0x5B,0xDB,0x15,0xB2,0x40,0xDB,0x15,0xB2,0x58,0xDB,0x16,0xB3, +0x15,0xB2,0x60,0xDA,0xC0,0xF0,0x50,0x9C,0x40,0x6B,0x6D,0xEA,0xC0,0xF0,0x50,0xDC,0x14,0xB3,0x49,0x9C,0x6D,0xEA,0x13,0xB3,0x6D,0xEA,0x49,0xDC,0x00,0xEF,0x03,0x63,0x00,0x00,0xCC,0x2C,0x11,0x80,0xE9,0xAE,0x10,0x80,0xB8,0x95,0x11,0x80,0x29,0xD8,0x10,0x80,0x99,0xB0,0x10,0x80,0x2D,0xB1,0x10,0x80,0xA1,0xB1,0x10,0x80,0x79,0xD4,0x10,0x80,0xE5,0xD4,0x10,0x80,0x19,0xC9,0x10,0x80,0xF1,0xD3,0x10,0x80,0x6D,0xCA,0x10,0x80,0x3C,0x1C,0x11,0x80,0xA5,0xA2,0x10,0x80,0xDC,0x00,0x11,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x44,0xA4,0x63,0xA4,0x00,0x6E,0x40,0x32,0x69,0xE2,0xFF,0xF7,0x1F,0x6B,0x6C,0xEA,0x7F,0xF4,0x0F,0x72,0x60,0xA5,0x46,0x67,0x08,0x61,0x69,0xE4,0xC2,0xC2,0x01,0x4B,0xFF,0x6A,0x4C,0xEB,0x61,0xC4,0x01,0x6A,0x60,0xC5,0x20,0xE8,0x00,0x65,0x00,0x00,0xF9,0x63,0x0C,0x62,0x0B,0xD1,0x0A,0xD0,0xFF,0x69,0x2C,0xEC,0x08,0xD4,0x61,0xF3,0x06,0x6D,0x00,0x18,0x9A,0x33,0x22,0x6C,0x40,0xB0,0xF3,0x6A,0x24,0x6C,0x20,0xF0,0xBF,0xA0,0x2C,0xED,0xA0,0x35,0x00,0x18,0x9A,0x33,0x4D,0xED,0x40,0xF0,0x41,0xA0,0x40,0xF0,0xA0,0xA0,0x26,0x6C,0x2C,0xEA,0x40,0x32,0x2C,0xED,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x9A,0x33,0x4C,0xED,0xEB,0xF0,0x12,0x6D,0x00,0x18,0x9A,0x33,0x28,0x6C,0x93,0xF7,0x1A,0x6D,0x00,0x18,0x9A,0x33,0x2A,0x6C,0x00,0x18,0xEE,0x33,0x01,0x6C,0x02,0x6C,0x00,0x18,0x9A,0x33,0x20,0x6D,0x2D,0xB2,0x03,0xF4,0x00,0x6D,0x20,0x68,0x81,0xA2,0x00,0x18,0x9A,0x33,0x2C,0xEC,0x2A,0xB2,0xFF,0xF7,0x1F,0x6B,0xFF,0xF7,0x1F,0x6D,0x40,0xAA,0x5E,0x6C,0x4C,0xEB,0x9F,0xF7,0x1F,0x6A,0x4C,0xEB,0x0D,0xEB,0x00,0x18,0x9A,0x33,0x6C,0xED,0xFF,0x6C,0x09,0x4C,0x00,0x18,0x9A,0x33,0x03,0x6D,0x21,0xB2,0xFF,0xF7,0x1F,0x6B,0xFF,0x6D,0x81,0xA2,0x1F,0xB2,0x21,0x4D,0x2C,0xEC,0x49,0xE4,0x40,0xAA,0x4C,0xEB,0xEE,0xF1,0x09,0x6A,0x4C,0xEB,0x6D,0xED,0xFF,0xF7,0x1F,0x6A,0x4C,0xED,0x1A,0xB2,0x07,0x6B,0x40,0xA2,0x2C,0xEA,0x6C,0xEA,0x40,0x32,0x44,0x32,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x9A,0x33,0x4C,0xED,0x02,0x6C,0x00,0x18,0x9A,0x33,0xB0,0x67,0x00,0x6C,0x00,0x18,0x9A,0x33,0x0D,0x6D,0x08,0x92,0x0C,0x22,0x9D,0x67,0x10,0x4C,0x55,0x6D,0x00,0x18,0x64,0x2E,0x0A,0x6E,0xDD, +0x67,0x01,0x6C,0x00,0x6D,0x00,0x18,0xDC,0x34,0x10,0x4E,0x0C,0x97,0x0B,0x91,0x0A,0x90,0x00,0xEF,0x07,0x63,0x00,0x00,0xDC,0x00,0x11,0x80,0x38,0xF4,0x04,0x80,0x5E,0x00,0x00,0xB6,0x30,0xF4,0x04,0x80,0x00,0x00,0x00,0xB6,0x81,0x08,0x11,0x80,0xF6,0x63,0x12,0x62,0x11,0xD1,0x10,0xD0,0x14,0xD4,0x16,0xD6,0x60,0xAC,0x7F,0xF4,0x0A,0x73,0x80,0xF0,0x04,0x60,0x7F,0xF4,0x0A,0x6A,0x62,0xEA,0x13,0x61,0x7F,0xF4,0x07,0x6A,0x62,0xEA,0x08,0x61,0x7F,0xF4,0x06,0x6A,0x42,0xEB,0x23,0x60,0x3F,0xF4,0x00,0x73,0x38,0x60,0x33,0x11,0x7F,0xF4,0x08,0x73,0x47,0x60,0x7F,0xF4,0x09,0x73,0x4A,0x60,0x2C,0x11,0x5F,0xF5,0x00,0x73,0x73,0x60,0x5F,0xF5,0x00,0x6A,0x62,0xEA,0x06,0x61,0x7F,0xF4,0x0F,0x73,0x0B,0x60,0x7F,0xF4,0x10,0x73,0x06,0x10,0x5F,0xF5,0x03,0x73,0x00,0xF1,0x0D,0x60,0x5F,0xF5,0x05,0x73,0x27,0x60,0x17,0x11,0x16,0x92,0x00,0x6B,0x21,0x10,0x7F,0xF4,0x06,0x73,0x03,0x61,0x8C,0xB2,0x00,0x6B,0x60,0xDA,0x8B,0xB2,0x0F,0x6B,0x40,0x9A,0x46,0x32,0x6C,0xEA,0x03,0x72,0x04,0x61,0x89,0xB2,0x60,0x9A,0x89,0xB2,0x60,0xDA,0x8A,0xB3,0x88,0xB2,0x60,0xDA,0x8A,0xB3,0x89,0xB2,0x60,0xDA,0xFF,0x17,0x81,0xB2,0x89,0xB3,0x40,0x9A,0x6E,0xEA,0xE0,0xF0,0x16,0x2A,0x14,0x94,0x87,0xB2,0x63,0xA4,0x60,0xC2,0xE9,0x10,0x14,0x92,0x83,0xA2,0x01,0x24,0x01,0x6C,0x80,0x18,0x88,0x2A,0x00,0x65,0xE1,0x10,0x14,0x94,0x81,0xB2,0x63,0xA4,0x80,0xF1,0x61,0xC2,0xDB,0x10,0x14,0x93,0x7F,0xB1,0xFF,0xF7,0x1F,0x6C,0x43,0xA3,0x44,0x33,0x4D,0xE3,0x6C,0x33,0x4D,0xE3,0x40,0x99,0x68,0x30,0x8C,0xE8,0x4F,0xEA,0x03,0x22,0x00,0x18,0xFD,0x1D,0x91,0x67,0x0F,0x20,0x00,0x18,0x40,0xA4,0x00,0x65,0x76,0xB6,0x00,0x6A,0x01,0x6C,0xB1,0x67,0xE2,0x67,0x00,0x18,0xF3,0x1D,0x04,0xD2,0x80,0x99,0x00,0x18,0x0C,0x1E,0xB0,0x67,0x71,0xB2,0x00,0xCA,0xB7,0x10,0x14,0x93,0x00,0x6E,0x43,0xA3,0x01,0x22,0x01,0x6E,0x6A,0xB2,0x80,0xF1,0xD1,0xC2,0xAE,0x10,0x14,0x94,0x14,0x93,0x61,0xF3,0x06,0x6D,0x85,0xA4,0x0E,0xD4,0x48,0xA3,0x27,0xA3,0xFF,0xF7,0x1F,0x6C,0x40,0x32,0x4D,0xE9,0x00,0x6A,0x45,0xC3,0x4A,0xC3,0x8C,0xE9,0x00,0x18,0x9A,0x33,0x22,0x6C,0x5F,0xB0,0xF3,0x6A,0xFF,0xF7,0x1F,0x6B,0x20,0xF0,0xBF,0xA0,0x24,0x6C,0xA0,0x35,0x4D,0xED, +0x00,0x18,0x9A,0x33,0x6C,0xED,0x40,0xF0,0x41,0xA0,0x40,0xF0,0xA0,0xA0,0x26,0x6C,0x40,0x32,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x9A,0x33,0x4C,0xED,0xEB,0xF0,0x12,0x6D,0x00,0x18,0x9A,0x33,0x28,0x6C,0x93,0xF7,0x1A,0x6D,0x00,0x18,0x9A,0x33,0x2A,0x6C,0x00,0x18,0xEE,0x33,0x01,0x6C,0x7D,0x21,0xFF,0xF7,0x1F,0x6B,0x51,0x67,0x6C,0xE9,0x00,0xF4,0x01,0x59,0x02,0x61,0x00,0xF4,0x00,0x6A,0xFF,0xF7,0x1F,0x69,0x4C,0xE9,0x0E,0x92,0xFF,0x6C,0xFF,0x4A,0x8C,0xEA,0x04,0x5A,0x28,0x61,0x47,0xB0,0x00,0x6A,0x7D,0x67,0x06,0xD2,0x0C,0xCB,0xE0,0xF7,0x1F,0x6A,0x4C,0xE9,0x44,0xB3,0x06,0x92,0x80,0xF4,0x20,0x34,0x01,0x6D,0x6C,0xEA,0x8D,0xEA,0x06,0xD2,0x00,0x6C,0x40,0xB2,0x04,0xD4,0x05,0xD4,0x9D,0x67,0x18,0x4C,0xC5,0x67,0x00,0x6F,0x07,0xD2,0x3F,0x10,0xE0,0xF7,0x1F,0x6A,0x8C,0xEA,0x88,0x67,0x80,0xF4,0x40,0x32,0x8C,0xEB,0x4D,0xEB,0x38,0xB2,0xFF,0x6D,0xEC,0xED,0x60,0xDE,0x41,0xDE,0x2B,0x10,0x0E,0x92,0x00,0x6D,0x91,0x67,0x40,0x33,0x34,0xB2,0x25,0x67,0x41,0xE3,0x7D,0x67,0x18,0x4B,0x2F,0xB2,0x8B,0x65,0x31,0xB3,0x0A,0x65,0xFF,0xF7,0x1F,0x6A,0x6B,0x65,0xFF,0x6B,0x4A,0x65,0x2B,0x65,0x6C,0x67,0xAC,0x32,0x79,0xE2,0x20,0xDE,0x00,0xF1,0x01,0x5C,0x00,0xCE,0x21,0xDE,0x60,0x9E,0xE1,0x45,0xD4,0x61,0x48,0x67,0x6C,0xEA,0xA9,0x67,0x6B,0x67,0x6D,0xEA,0x80,0x4C,0xEC,0xED,0x40,0xDE,0x80,0x4C,0x4A,0x67,0x04,0x5D,0x4C,0xEC,0xE8,0x61,0x00,0x6F,0x9D,0x67,0x04,0xD7,0x05,0xD7,0x18,0x4C,0x01,0x6E,0x00,0x18,0xF7,0x33,0x00,0x65,0x0E,0x10,0x02,0x6C,0x01,0x6D,0x00,0x18,0x1C,0x80,0x00,0x6E,0x08,0x10,0x14,0x93,0x16,0x92,0x80,0xAB,0x00,0x18,0xFA,0x8B,0xA0,0xA2,0x01,0x6A,0x01,0x10,0x00,0x6A,0x12,0x97,0x11,0x91,0x10,0x90,0x00,0xEF,0x0A,0x63,0x38,0x91,0x10,0x80,0x6C,0x1D,0x11,0x80,0x2C,0x00,0x00,0xB5,0x48,0x91,0x10,0x80,0x44,0x91,0x10,0x80,0x32,0x97,0x79,0x23,0x78,0xA0,0x00,0xB0,0x01,0x00,0xA5,0x01,0xAE,0x23,0x87,0x54,0xD0,0x00,0x11,0x80,0xDC,0x00,0x11,0x80,0x88,0x07,0x11,0x80,0x01,0x91,0x02,0x80,0x08,0xA1,0x11,0x80,0x00,0xF8,0x10,0x80,0xFF,0xFF,0x03,0xE0,0x00,0x00,0x00,0x80,0x00,0xFB,0x10,0x80,0x00,0x00,0x00,0x04,0x03,0xB2,0x00,0x6B,0x60,0xDA,0x20,0xE8,0x00,0x65,0x00, +0x00,0x04,0x60,0x00,0xB0,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x40,0xAC,0x01,0xF4,0x03,0x72,0x2C,0x61,0x80,0x18,0x3F,0x2A,0x00,0x69,0x80,0x18,0x91,0x2B,0x00,0x65,0x16,0xB2,0x08,0xF1,0x11,0x6B,0x6B,0xEB,0x60,0xCA,0x15,0xB2,0x91,0x67,0x20,0xDA,0x14,0xB2,0x20,0x18,0x83,0x39,0x20,0xDA,0x14,0xB2,0x15,0xB0,0xB1,0x67,0x80,0xF1,0x62,0xA2,0x90,0x67,0x30,0x6E,0x68,0x32,0x69,0xE2,0x0F,0xB3,0x44,0x32,0x00,0x18,0x64,0x2E,0x40,0xCB,0x01,0x6A,0x4B,0xEA,0x47,0xD8,0x0E,0xB3,0x40,0x98,0x0E,0xB4,0xB1,0x67,0x6D,0xEA,0x40,0xD8,0x00,0x18,0x64,0x2E,0x0C,0x6E,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0x6A,0x00,0xEF,0x04,0x63,0x0C,0xA1,0x11,0x80,0x10,0xA1,0x11,0x80,0x14,0xA1,0x11,0x80,0x08,0xA1,0x11,0x80,0xDC,0x00,0x11,0x80,0xCC,0xA0,0x11,0x80,0x00,0x00,0x00,0x70,0xFC,0xA0,0x11,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0xFF,0xF7,0x1F,0x6A,0xCC,0xEA,0x02,0x74,0x0C,0x65,0x05,0x67,0x4F,0x65,0x2A,0x65,0x0D,0x61,0x2A,0xB2,0x03,0x6B,0x40,0x9A,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x01,0x72,0x05,0x61,0x27,0xB3,0x40,0x9B,0xC0,0xF7,0x42,0x32,0xFC,0x2A,0x48,0x67,0x04,0x72,0x38,0x61,0x60,0xA0,0xFF,0x6E,0x46,0x67,0x6C,0xEA,0x10,0x72,0x0B,0x61,0x42,0xA0,0xCC,0xEA,0x02,0x72,0x07,0x61,0x1F,0xB2,0xB0,0x67,0x00,0x18,0xE0,0x1D,0x81,0x9A,0x00,0x6A,0x2D,0x10,0xFF,0x6A,0x6C,0xEA,0x02,0x72,0x01,0x6C,0x04,0x60,0x22,0x72,0x02,0x60,0x2F,0x72,0x1E,0x61,0xFF,0x6E,0x46,0x67,0x6C,0xEA,0x2F,0x72,0x01,0x6A,0x02,0x60,0x42,0xA0,0xCC,0xEA,0xFF,0x6D,0x6F,0x42,0xAC,0xEB,0xAA,0xEB,0x11,0x60,0xE5,0x67,0x01,0x69,0x06,0x4C,0xAC,0xEC,0x99,0xE0,0x42,0xA6,0xAC,0xEA,0x03,0x5A,0x01,0x61,0x22,0xC6,0xFF,0x4B,0xEC,0xEB,0xFF,0x6D,0x08,0x4C,0xAA,0xEB,0xEC,0xEC,0xF1,0x61,0x88,0x67,0xB0,0x67,0xC9,0x67,0x00,0x18,0xCA,0x1E,0xEA,0x67,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63,0x6C,0x1D,0x11,0x80,0x1C,0xA3,0x00,0xB0,0x9C,0x31,0x11,0x80,0x20,0xE8,0x00,0x65,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0xFF,0xF7,0x1F,0x69,0x8C,0xE9,0x24,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x4C,0x32,0x18,0xB3,0x2B,0xE2,0x48,0x32,0x61,0xE2,0x5C,0x98,0x4F,0xEA,0x05,0x22,0x01,0x6A,0x00,0x6B,0x20,0xF2,0x5E,0xC0, +0x1E,0x10,0x00,0x18,0x41,0x5E,0x91,0x67,0x04,0xD2,0x0C,0x6B,0x18,0x2A,0x5F,0x98,0x41,0xA2,0x44,0x72,0x14,0x60,0x00,0x18,0xA5,0x5E,0x91,0x67,0x06,0x22,0x00,0x18,0x69,0x5E,0x91,0x67,0x1F,0x6B,0x0B,0x22,0x05,0x10,0x00,0x18,0x80,0x49,0x91,0x67,0x62,0x67,0x05,0x10,0x91,0x67,0x20,0x18,0x13,0x26,0x0E,0x6D,0x04,0x93,0x08,0x97,0x07,0x91,0x06,0x90,0x43,0x67,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x03,0x44,0x90,0x67,0x00,0x18,0xF2,0x5A,0x0B,0xD5,0x22,0x67,0x1A,0x65,0x1E,0x2A,0xBD,0x67,0x90,0x67,0x00,0x18,0x07,0xDF,0x10,0x4D,0x7D,0x67,0x48,0xAB,0x0B,0x93,0xFF,0xF7,0x1F,0x6D,0x40,0xCB,0x65,0x67,0x4C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x09,0xB3,0x48,0x32,0x69,0xE2,0x20,0xF2,0x3E,0xC2,0x5D,0x67,0x88,0xAA,0x80,0x18,0xEE,0x2B,0xAC,0xEC,0x1A,0x65,0x08,0x97,0x07,0x91,0x06,0x90,0x58,0x67,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0x20,0xB0,0x00,0x6A,0x04,0xD2,0x40,0x98,0x01,0x69,0xC0,0xF6,0x42,0x32,0x2C,0xEA,0x09,0x22,0x00,0x18,0x4F,0x9A,0x06,0xD4,0x04,0xD1,0x40,0x98,0x1A,0xB3,0x6C,0xEA,0x40,0xD8,0x06,0x94,0x44,0xAC,0xFF,0xF7,0x1F,0x6B,0x06,0x72,0x19,0x61,0x40,0x9C,0x17,0x2A,0x45,0xAC,0x6C,0xEA,0x17,0x2A,0x41,0x9C,0x82,0x67,0x42,0x32,0x42,0x32,0x6C,0xEA,0x01,0xF0,0x0B,0x72,0x6C,0xEC,0x04,0x61,0x80,0x18,0xEE,0x2B,0x00,0x65,0x0A,0x10,0x01,0xF0,0x05,0x72,0x07,0x61,0x00,0x18,0x2C,0x48,0x00,0x65,0x03,0x10,0x00,0x18,0x74,0x56,0x00,0x65,0x04,0x92,0x05,0x22,0x06,0xB2,0x07,0xB4,0x60,0x9A,0x8D,0xEB,0x60,0xDA,0x0A,0x97,0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0x00,0x00,0x54,0x45,0x11,0x80,0xFF,0xFF,0xFF,0xF7,0x00,0x00,0x00,0x08,0xF9,0x63,0x0C,0x62,0x44,0xAC,0x07,0x72,0x11,0x61,0x60,0x9C,0xFF,0x6D,0x40,0xA3,0x03,0x72,0x26,0x61,0x42,0xA3,0xAC,0xEA,0x23,0x2A,0x43,0xA3,0x64,0xA3,0xAC,0xEA,0xAC,0xEB,0x60,0x33,0x6D,0xEA,0x12,0xB3,0x40,0xCB,0x1A,0x10,0x08,0x72,0x18,0x61,0x40,0x9C,0x66,0x6B,0x9D,0x67,0x06,0xD2,0x0E,0xB2,0x70,0xCC,0xFD,0x67,0x80,0x9A,0x00,0x6D,0x04,0x06,0x24,0x4F,0xA9,0xE7,0x40,0xA2,0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40, +0xC3,0xF9,0x61,0x06,0x95,0x07,0x96,0x00,0x18,0x40,0x1E,0x08,0x97,0x03,0x10,0x00,0x18,0x64,0x8B,0x00,0x65,0x0C,0x97,0x00,0xEF,0x07,0x63,0x0C,0xA1,0x11,0x80,0x84,0x21,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x44,0xAC,0x24,0x67,0x66,0x72,0x34,0x61,0x00,0x9C,0xE1,0xF7,0x1F,0x6A,0xBD,0x67,0x80,0x98,0x10,0x4D,0x4C,0xEC,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x2A,0xDF,0x4C,0xEC,0x82,0x67,0x29,0x2A,0x5D,0x67,0x68,0xAA,0xFF,0xF7,0x1F,0x6A,0x4C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x12,0xB3,0x48,0x32,0x69,0xE2,0x20,0xF0,0x78,0xA2,0x03,0x73,0x14,0x60,0xE0,0xF7,0x08,0x6A,0x47,0xEB,0x01,0x6B,0x6C,0xEA,0x0E,0x22,0x0C,0xB3,0x00,0xF4,0x84,0xD8,0x40,0x9B,0x02,0x2A,0x00,0xDB,0x04,0x10,0x0A,0xB2,0x40,0x9A,0x00,0xF4,0x04,0xDA,0x08,0xB2,0x00,0xDA,0x03,0x10,0x00,0x18,0x18,0x58,0x91,0x67,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0x10,0xA1,0x11,0x80,0x14,0xA1,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x0B,0xB0,0xE3,0xF7,0x1F,0x6B,0x7C,0x6C,0x40,0x98,0x01,0x6D,0x56,0x32,0x6C,0xEA,0x69,0x98,0x58,0xEB,0x12,0xEA,0x00,0x18,0xEB,0x9F,0x4A,0xD8,0x6B,0x98,0x05,0x97,0x4D,0xE3,0x6B,0xD8,0x04,0x90,0x00,0xEF,0x03,0x63,0xCC,0xA0,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0x3B,0xB0,0xBD,0x67,0x10,0x4D,0x90,0xA0,0x4F,0xA0,0x80,0x34,0x4D,0xEC,0x4E,0xA0,0x80,0x34,0x00,0x18,0x3A,0xBA,0x4D,0xEC,0x7D,0x67,0x48,0xAB,0x8F,0xA0,0xFD,0x67,0x4C,0xCB,0x49,0xAB,0x4D,0xCB,0x6A,0xAB,0x03,0x6A,0x4C,0xEB,0x4E,0xA0,0x48,0x32,0x4D,0xEB,0x80,0x32,0x48,0x32,0x4D,0xEB,0x50,0xA0,0x6E,0xCF,0x70,0x80,0x48,0x32,0x9A,0x34,0x4D,0xEC,0x00,0x53,0x8F,0xCF,0x05,0x60,0x09,0xF4,0x00,0x6A,0x8D,0xEA,0x4F,0xCF,0x06,0x10,0x0A,0xF0,0x00,0x6A,0x4B,0xEA,0x8D,0xEA,0x7D,0x67,0x4F,0xCB,0x9D,0x67,0x10,0x4C,0xFF,0xF7,0x1F,0x6F,0x0F,0x6A,0x00,0x6E,0x2C,0x65,0x0F,0x65,0x01,0x69,0x4A,0x65,0x89,0x67,0xC4,0x30,0x89,0xE0,0x84,0xAA,0x00,0x6D,0xE8,0x67,0x65,0x67,0xEC,0xEC,0x44,0x67,0x47,0xEB,0x2C,0xEA,0x07,0x22,0xEA,0x67,0x6B,0xE7,0xF1,0x67,0xE4,0xEA,0xED,0xED,0x48,0x67,0x4C,0xED,0x01,0x4B,0xFF,0x6F,0xEC,0xEB,0x10,0x5B,0xF0,0x61, +0x01,0x4E,0x69,0x67,0xEC,0xEE,0x69,0xE0,0x04,0x5E,0xA4,0xCA,0xE1,0x61,0xFD,0x67,0xCC,0xAF,0x51,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x5D,0x67,0xCD,0xAA,0x50,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x7D,0x67,0xCE,0xAB,0x4F,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0xFD,0x67,0xCF,0xAF,0x4E,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x0A,0x97,0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0xCC,0xA0,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6B,0x04,0xD3,0x6C,0xEA,0xFF,0x6B,0x02,0x4B,0x6B,0xEB,0x6C,0xEA,0xFF,0x6B,0x01,0x4B,0xC2,0x67,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x51,0xB1,0x52,0xB3,0x07,0x68,0x41,0x99,0x51,0xB4,0x01,0x6D,0x4E,0x32,0x0C,0xEA,0x69,0xE2,0x60,0xA2,0x40,0x99,0x0C,0xEB,0x40,0xF6,0x60,0x33,0x8C,0xEA,0x6D,0xEA,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x40,0xD9,0x04,0x93,0x57,0x6C,0x01,0x6D,0x4C,0xEB,0x71,0x6A,0x04,0xD3,0x4B,0xEA,0x4C,0xEB,0x40,0x99,0xC3,0x67,0x40,0xF6,0x42,0x32,0x0C,0xEA,0x50,0x32,0x00,0x18,0x01,0xA0,0x4D,0xEE,0x40,0x99,0x01,0x6B,0x03,0x67,0x6C,0xEA,0x06,0x22,0x41,0x99,0x80,0x6B,0x6C,0xEA,0x01,0x5A,0x18,0x67,0x02,0x48,0x56,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x00,0x36,0x37,0xB0,0xFF,0xF7,0x1F,0x69,0x1C,0xF0,0x00,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x60,0x98,0xE3,0xF7,0x1F,0x6C,0xD8,0x36,0x76,0x33,0x8C,0xEB,0x6D,0xEE,0xFB,0xF7,0x1F,0x6B,0x6C,0xEE,0x4D,0xEE,0x56,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x47,0xA0,0xC6,0xA0,0x58,0x6C,0x40,0x32,0x4D,0xEE,0x00,0x18,0x01,0xA0,0x01,0x6D,0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xC8,0xA0,0x04,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x03,0x6B,0x6C,0xEE,0x4D,0xEE,0x59,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x80,0x18,0x9A,0x2C,0x00,0x65,0x40,0x98,0xC0,0xF7,0x42,0x32,0x24,0x22,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x81,0x6B,0x2C,0xEA,0x6B,0xEB,0x6C,0xEA,0xC2,0x67,0x80,0x6B,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x4C,0xE9,0xE0,0xF1,0x1D,0x6A,0x4B,0xEA,0x4C,0xE9,0x45,0xA0,0xFF,0x6B,0xD1,0x67,0x6C,0xEA,0x48,0x32,0xE0,0xF1,0x1C,0x6B,0x6C,0xEA,0x59,0x6C,0x01,0x6D,0x4D, +0xEE,0x0B,0x10,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x4C,0xE9,0x81,0x6A,0x4B,0xEA,0xD1,0x67,0x57,0x6C,0x01,0x6D,0x4C,0xEE,0x00,0x18,0x01,0xA0,0x00,0x65,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0xCC,0xA0,0x11,0x80,0xD8,0xDF,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x0F,0xB1,0xFF,0x68,0x8C,0xE8,0x47,0x99,0x4F,0xEA,0x04,0x22,0x87,0x41,0x00,0x18,0xFD,0x1D,0x15,0x4C,0x0E,0x20,0x0B,0xB6,0x00,0x68,0xA7,0x41,0x01,0x6C,0x15,0x4D,0xF0,0x67,0x00,0x18,0xF3,0x1D,0x04,0xD0,0x87,0x99,0x00,0x18,0x0C,0x1E,0x14,0x6D,0x10,0xC9,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0xCC,0xA0,0x11,0x80,0xF9,0xB5,0x10,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x00,0x6C,0x02,0xF0,0x00,0x6E,0x00,0x18,0x01,0xA0,0xA4,0x67,0x2D,0xB2,0x3C,0x6C,0x00,0x6D,0xC0,0x9A,0x7F,0x6A,0xFF,0xF7,0x1F,0x68,0x80,0xF4,0xC2,0x36,0x4C,0xEE,0xC4,0x36,0xFF,0x6A,0x01,0x4E,0x4C,0xEE,0x00,0x18,0x01,0xA0,0xC0,0x36,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x01,0xF6,0x01,0x69,0x2B,0xE9,0xC2,0x67,0x2C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x2C,0xEA,0x01,0xF6,0x00,0x6B,0xC2,0x67,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x03,0x69,0x2B,0xE9,0xC2,0x67,0x2C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xEA,0x2C,0xEA,0x02,0x6B,0xC2,0x67,0x6D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x4C,0xE8,0xD0,0x67,0x2C,0xEE,0x01,0x6D,0x00,0x18,0x01,0xA0,0x57,0x6C,0x80,0x18,0x38,0x2D,0x01,0x6C,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63,0xCC,0xA0,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x1A,0xB2,0x06,0xD4,0x47,0x9A,0x8E,0xEA,0x05,0x22,0x8F,0xEA,0x03,0x22,0x00,0x18,0xFD,0x1D,0x06,0x04,0x15,0xB0,0x42,0x6B,0x41,0x98,0x6C,0xEA,0x6A,0xEA,0x08,0x60,0x47,0x98,0x4F,0xEA,0x1C,0x22,0x87,0x40,0x00,0x18,0xFD,0x1D,0x15,0x4C,0x17,0x10,0x7D,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x02,0x6E,0x4C,0xEE,0x04,0x26,0x50,0xA8,0x01,0x4A,0x50,0xC8, +0x0C,0x10,0x86,0x67,0x00,0x18,0x01,0xA0,0xA6,0x67,0x49,0x98,0x01,0x4A,0x80,0x18,0x8D,0x2C,0x49,0xD8,0x80,0x18,0x4B,0x2D,0x00,0x65,0x05,0x97,0x04,0x90,0x00,0xEF,0x03,0x63,0xCC,0xA0,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x00,0x6C,0xC4,0x67,0x00,0x18,0x01,0xA0,0xA4,0x67,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0xFF,0x6A,0x04,0x4A,0x4B,0xEA,0x4C,0xEE,0x01,0x6D,0x00,0x18,0x01,0xA0,0x57,0x6C,0x0A,0xB0,0x41,0x6B,0x6B,0xEB,0x41,0x98,0x00,0x6C,0x6C,0xEA,0x80,0x18,0x38,0x2D,0x41,0xD8,0x80,0x18,0x8D,0x2C,0x00,0x65,0x00,0x6A,0x49,0xC0,0x05,0x97,0x04,0x90,0x00,0xEF,0x03,0x63,0x00,0x00,0xCC,0xA0,0x11,0x80,0xFD,0x63,0x04,0x62,0x80,0x18,0xD8,0x2C,0x00,0x65,0x0D,0xB3,0x00,0x6A,0x59,0x6C,0x4B,0xDB,0x49,0xDB,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x00,0xF2,0x01,0x6A,0x4B,0xEA,0x59,0x6C,0x01,0x6D,0x00,0x18,0x01,0xA0,0x4C,0xEE,0x80,0x18,0x4B,0x2D,0x00,0x65,0x04,0x97,0x00,0xEF,0x03,0x63,0xCC,0xA0,0x11,0x80,0xFD,0x63,0x04,0x62,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x02,0xF1,0x01,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x00,0x6C,0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x06,0xB4,0x41,0x6B,0x6B,0xEB,0x41,0x9C,0x04,0x97,0x6C,0xEA,0x41,0xDC,0x00,0x6A,0x49,0xC4,0x00,0xEF,0x03,0x63,0x00,0x00,0xCC,0xA0,0x11,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x80,0x18,0xD8,0x2C,0x00,0x65,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x69,0x02,0xF0,0x01,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0x02,0xF0,0x00,0x68,0xC2,0x67,0x0D,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x59,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x2C,0xEA,0x00,0xF2,0x01,0x6B,0x6B,0xEB,0xC2,0x67,0x6C,0xEE,0x59,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x00,0x6C,0xD0,0x67,0x00,0x18,0x01,0xA0,0xA4,0x67,0x28,0xB2,0x03,0x6C,0x00,0x6D,0x00,0x9A,0x07,0x6A,0x00,0xF7,0x02,0x30,0x00,0x18,0xEB,0x9F,0x4C,0xE8,0x2C,0xEA,0x1F,0xF4,0x01,0x6B,0x6B,0xEB,0x6C,0xEA,0x21,0xB3,0x05,0x48,0x1F,0xF4,0x00,0x6C,0x61,0xE0,0x20,0xF1,0x7A,0xA0,0xC2,0x67,0x00,0x6D,0x60,0x33,0x68,0x33,0x8C,0xEB,0x6D, +0xEE,0x00,0x18,0x01,0xA0,0x03,0x6C,0x18,0xB3,0x7F,0x6A,0x3C,0x6C,0xC0,0x9B,0x00,0x6D,0x01,0x68,0x80,0xF4,0xC2,0x36,0x4C,0xEE,0xC4,0x36,0xFF,0x6A,0x06,0x4E,0x4C,0xEE,0x00,0x18,0x01,0xA0,0xC0,0x36,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x02,0x6B,0x6B,0xEB,0x2C,0xEA,0x6C,0xEA,0xC2,0x67,0x0D,0xEE,0xB0,0x67,0x00,0x18,0x01,0xA0,0x57,0x6C,0xB0,0x67,0x00,0x18,0xEB,0x9F,0x57,0x6C,0x02,0x6E,0x4C,0xE9,0xCB,0xEE,0xB0,0x67,0x2C,0xEE,0x00,0x18,0x01,0xA0,0x57,0x6C,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0xEF,0x04,0x63,0x00,0x00,0xCC,0xA0,0x11,0x80,0xDC,0x00,0x11,0x80,0xFD,0x63,0x04,0x62,0x7F,0xF7,0x0F,0x6D,0x00,0x18,0x5D,0xBA,0x5E,0x6C,0x0E,0xB2,0xFF,0xF6,0x1F,0x6D,0x00,0x18,0x5D,0xBA,0x81,0xA2,0xFF,0x6D,0xD8,0x6C,0x00,0x18,0x9A,0x33,0x08,0x4D,0xFF,0x6C,0x09,0x4C,0x00,0x18,0x9A,0x33,0x00,0x6D,0x07,0xB4,0x41,0x6B,0x6B,0xEB,0x41,0x9C,0x04,0x97,0x6C,0xEA,0x41,0xDC,0x00,0x6A,0x49,0xC4,0x00,0xEF,0x03,0x63,0x30,0xF4,0x04,0x80,0xCC,0xA0,0x11,0x80,0xF7,0x63,0x10,0x62,0x0F,0xD1,0x0E,0xD0,0x72,0xB5,0x73,0xB3,0x07,0x6C,0xC0,0x9D,0xFF,0xF7,0x1F,0x6F,0xC0,0x32,0x58,0x32,0x80,0xF5,0x42,0x31,0x41,0x9D,0x4E,0x32,0x8C,0xEA,0x69,0xE2,0x60,0xA2,0x6D,0xB2,0x8C,0xEB,0x40,0xF6,0x60,0x33,0xCC,0xEA,0x6D,0xEA,0x40,0xF6,0x42,0x33,0x40,0xDD,0xFF,0x6E,0x8C,0xEB,0x61,0x21,0x51,0x67,0xEC,0xE9,0x00,0xF4,0x01,0x59,0x02,0x61,0x00,0xF4,0x00,0x6A,0x27,0x67,0x4C,0xE9,0x4F,0x43,0xCC,0xEA,0x04,0x5A,0x23,0x61,0x61,0xB0,0x00,0x6F,0x5D,0x67,0x06,0xD7,0x0C,0xCA,0x06,0x92,0x5F,0xB3,0x80,0xF4,0x20,0x34,0x01,0x6D,0x6C,0xEA,0x8D,0xEA,0x06,0xD2,0x5D,0xB2,0x9D,0x67,0x18,0x4C,0xC5,0x67,0x07,0xD2,0x04,0xD7,0x05,0xD7,0x3C,0x10,0xE0,0xF7,0x1F,0x6A,0x4C,0xEB,0x49,0x67,0x80,0xF4,0x60,0x33,0xCC,0xEA,0x6D,0xEA,0x40,0xDC,0x54,0xB2,0xFF,0x6D,0xEC,0xED,0x41,0xDC,0x28,0x10,0x53,0xB2,0x60,0x33,0x00,0x6D,0x41,0xE3,0x5D,0x67,0x18,0x4A,0xAA,0x65,0x4D,0xB2,0x71,0x67,0x0D,0x65,0x2A,0x65,0x4E,0xB2,0x6F,0x65,0x4E,0x65,0x8A,0x65,0xAC,0x32,0xCD,0x67,0xD1,0xE2,0x48,0x67,0x40,0xDC,0x00,0xF1,0x01,0x5B,0x00,0xCC,0x41,0xDC,0xC0,0x9C,0xE1,0x45,0xD7,0x61,0x49,0x67,0xCC,0xEA,0xAC,0x67,0xAD,0xEA, +0xAA,0x67,0x80,0x4B,0xEC,0xED,0x80,0x4B,0xCB,0x67,0x04,0x5D,0x40,0xDC,0xCC,0xEB,0xE7,0x61,0x00,0x6F,0x9D,0x67,0x04,0xD7,0x05,0xD7,0x18,0x4C,0x01,0x6E,0x00,0x18,0xF7,0x33,0x00,0x65,0x34,0xB2,0xC4,0x6C,0xA0,0x9A,0x7F,0x6A,0x80,0xF4,0xA2,0x35,0x4C,0xED,0xA0,0x32,0x00,0x18,0x9A,0x33,0x4D,0xED,0x5E,0x6C,0x00,0x18,0x78,0xBA,0x60,0x6D,0x35,0xB2,0x35,0xB0,0x2C,0xB3,0x81,0xA2,0x01,0xF4,0x00,0x6D,0x09,0xE4,0x40,0xAA,0x4C,0xED,0x40,0x9B,0x0F,0x6B,0x46,0x32,0x6C,0xEA,0x40,0x32,0x50,0x32,0x4D,0xED,0x00,0x18,0x9A,0x33,0x2D,0xED,0x2D,0xB2,0x23,0xB6,0xEE,0xF1,0x1F,0x6D,0x21,0xA2,0x60,0x9E,0x01,0xE1,0x40,0xA8,0x07,0x68,0x91,0x67,0x4C,0xED,0x01,0x6A,0x6C,0xEA,0x00,0xF7,0x62,0x33,0x0C,0xEB,0x40,0x32,0x5C,0x32,0x60,0x33,0x64,0x33,0x4D,0xED,0x00,0x18,0x9A,0x33,0x6D,0xED,0x17,0xB2,0x01,0x6C,0xA0,0x9A,0x00,0xF7,0xA2,0x35,0x00,0x18,0x68,0x91,0x0C,0xED,0x13,0xB3,0x01,0x6C,0xA0,0x9B,0x00,0xF7,0xA2,0x35,0x00,0x18,0x82,0x91,0x0C,0xED,0x5E,0x6C,0x00,0x18,0x78,0xBA,0x90,0x6D,0xFF,0x6D,0x91,0x67,0x00,0x18,0x78,0xBA,0x01,0x4D,0xFF,0x6C,0x09,0x4C,0x00,0x18,0x9A,0x33,0x03,0x6D,0xFF,0x6D,0xD8,0x6C,0x00,0x18,0x9A,0x33,0x08,0x4D,0xFE,0xF7,0x1F,0x6D,0x00,0x18,0x5D,0xBA,0x5E,0x6C,0x10,0x97,0x0F,0x91,0x0E,0x90,0x00,0xEF,0x09,0x63,0x00,0x00,0xCC,0xA0,0x11,0x80,0xE0,0xDF,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0x00,0xF8,0x10,0x80,0xFF,0xFF,0x03,0xE0,0x00,0x00,0x00,0x80,0x00,0xFB,0x10,0x80,0x00,0x00,0x00,0x04,0x38,0xF4,0x04,0x80,0x00,0x00,0x00,0xB6,0x30,0xF4,0x04,0x80,0xE0,0x63,0x3F,0x62,0x3E,0xD0,0x0F,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x00,0x68,0x7D,0x67,0x04,0xF0,0x1F,0x6A,0x9D,0x67,0x12,0xC3,0x48,0xCB,0x00,0x18,0xEC,0xC6,0x10,0x4C,0x08,0xB4,0x04,0x63,0x41,0x6B,0x41,0x9C,0x09,0xC4,0x3F,0x97,0x3E,0x90,0x6B,0xEB,0x6C,0xEA,0x41,0xDC,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0xCC,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x18,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x16,0xB5,0x17,0xB3,0x07,0x6E,0x41,0x9D,0x16,0xB4,0x4E,0x32,0xCC,0xEA,0x69,0xE2,0x40,0xA2,0x60,0x9D,0xCC,0xEA,0x40,0xF6,0x40,0x32,0x8C,0xEB,0x4D,0xEB,0x9D, +0x67,0x04,0xF0,0x1E,0x6A,0x60,0xDD,0x48,0xCC,0x03,0x6A,0x52,0xC4,0x80,0xF4,0x62,0x32,0x7F,0x6C,0x8C,0xEA,0x9D,0x67,0x53,0xC4,0x62,0x32,0x40,0xF6,0x62,0x33,0xCC,0xEB,0x75,0xC4,0x54,0xC4,0x00,0x18,0xAA,0xC6,0x10,0x4C,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0xCC,0xA0,0x11,0x80,0xD0,0xDF,0x10,0x80,0xFF,0xFF,0xFF,0xF1,0xE0,0x63,0x3E,0x62,0x3D,0xD1,0x3C,0xD0,0x11,0xB4,0xFB,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x7D,0x67,0x04,0xF0,0x1F,0x6A,0x48,0xCB,0x0D,0xB2,0x0E,0xB0,0x00,0x69,0xA1,0xF1,0x48,0xAA,0x9D,0x67,0x32,0xC3,0x49,0xD8,0x00,0x18,0xEC,0xC6,0x10,0x4C,0x41,0x98,0x41,0x6B,0x6B,0xEB,0x05,0x63,0x6C,0xEA,0x29,0xC0,0x41,0xD8,0x3E,0x97,0x3D,0x91,0x3C,0x90,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0x58,0x46,0x11,0x80,0xCC,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x0E,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x7D,0x67,0x04,0xF0,0x1D,0x6A,0x48,0xCB,0x01,0x6A,0x52,0xC3,0x09,0xB2,0x7F,0x6B,0x9D,0x67,0x40,0x9A,0x10,0x4C,0x80,0xF4,0x42,0x32,0x6C,0xEA,0x7D,0x67,0x00,0x18,0x7C,0xC6,0x53,0xC3,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x76,0x5D,0x11,0x80,0xCC,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x24,0xB4,0xFC,0x63,0x08,0x6E,0x00,0x18,0x64,0x2E,0x00,0x6D,0x7D,0x67,0x04,0xF0,0x0D,0x6A,0x48,0xCB,0x19,0x6A,0x00,0x6C,0x52,0xC3,0x60,0x6A,0x4B,0xEA,0x53,0xC3,0x94,0xC3,0x55,0xC3,0x96,0xC3,0x97,0xC3,0x98,0xC3,0x1B,0xB3,0xBD,0x67,0x9F,0xC5,0x54,0xA3,0x20,0xF0,0x80,0xC5,0x20,0xF0,0x82,0xC5,0x59,0xC5,0x55,0xA3,0x20,0xF0,0x84,0xC5,0x20,0xF0,0x85,0xC5,0x5A,0xC5,0x56,0xA3,0x20,0xF0,0x87,0xC5,0x20,0xF0,0x89,0xC5,0x5B,0xC5,0x57,0xA3,0x5C,0xC5,0x58,0xA3,0x5D,0xC5,0x59,0xA3,0x5E,0xC5,0x02,0x6A,0x20,0xF0,0x41,0xC5,0x20,0xF0,0x43,0xC5,0x1E,0x6A,0x20,0xF0,0x46,0xC5,0x12,0x6A,0x20,0xF0,0x48,0xC5,0x20,0xF0,0x4A,0xC5,0x20,0xF0,0x8B,0xC5,0x9D,0x67,0x00,0x18,0xFC,0xC2,0x10,0x4C,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x00,0x00,0x76,0x5D,0x11,0x80,0xCC,0xA0,0x11,0x80,0xE0,0x63,0x3E,0x62,0x1A,0xB4,0xFC,0x63,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x7D,0x67,0x04,0xF0,0x06,0x6A,0x48,0xCB,0x0F,0x6A, +0x9D,0x67,0x52,0xC3,0x00,0x6A,0x54,0xC4,0x56,0xC4,0x57,0xC4,0x58,0xC4,0x59,0xC4,0x5A,0xC4,0x5B,0xC4,0x5C,0xC4,0x5D,0xC4,0x5E,0xC4,0x5F,0xC4,0x07,0x6A,0x20,0x6B,0x20,0xF0,0x40,0xC4,0x03,0x6A,0x73,0xC4,0x75,0xC4,0x20,0xF0,0x41,0xC4,0x00,0x18,0xA8,0xC1,0x10,0x4C,0x7D,0x67,0x04,0xF0,0x0A,0x6A,0x48,0xCB,0x9D,0x67,0x01,0x6A,0x52,0xC3,0x53,0xC3,0x00,0x18,0x5E,0xC2,0x10,0x4C,0x04,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0x76,0x5D,0x11,0x80,0xE0,0x63,0x3E,0x62,0xFB,0x63,0x7D,0x67,0x00,0xF4,0x06,0x6A,0x48,0xCB,0x03,0x6A,0x52,0xC3,0x13,0x6A,0x55,0xC3,0x26,0xB2,0x6D,0xA2,0x08,0x73,0x22,0x60,0x70,0x32,0x69,0xE2,0x24,0xB6,0x48,0x32,0x6B,0xE2,0x48,0x32,0xD1,0xE2,0x20,0xF1,0x4F,0xA4,0x01,0x6D,0xAC,0xEA,0x16,0x22,0x00,0xF1,0x52,0xAE,0x47,0xEB,0xAC,0xEA,0x11,0x22,0x20,0xF1,0x6C,0xAC,0xFF,0xF7,0x1F,0x6A,0x9D,0x67,0x4C,0xEB,0x5D,0x67,0x73,0xC2,0xBD,0x67,0x62,0x32,0x7D,0x67,0x54,0xC3,0x00,0xF1,0x18,0x4D,0x00,0x18,0xD2,0x48,0x10,0x4C,0x13,0xB2,0x6C,0xA2,0x0A,0x73,0x1D,0x60,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x10,0xB3,0x48,0x32,0x71,0xE2,0xE0,0xF0,0x4B,0xA4,0xFF,0x6B,0x6C,0xEA,0x01,0x72,0x0E,0x61,0x60,0xF2,0x7C,0xAC,0x5D,0x67,0x9D,0x67,0x73,0xC2,0xBD,0x67,0x62,0x32,0x7D,0x67,0x54,0xC3,0x00,0xF1,0x18,0x4D,0x00,0x18,0xD2,0x48,0x10,0x4C,0x05,0x63,0x3E,0x97,0x00,0xEF,0x20,0x63,0xCC,0xA0,0x11,0x80,0x58,0x46,0x11,0x80,0x48,0x60,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x12,0xB0,0x00,0x6A,0xFF,0x6D,0xC0,0xF1,0x46,0xC0,0xC0,0xF1,0x5A,0xC0,0x03,0x6A,0xC0,0xF1,0x58,0xC0,0x0E,0xB2,0x02,0x6B,0xAC,0xEC,0xC0,0xF1,0x65,0xC0,0xC0,0xF1,0x64,0xC0,0xC0,0xF1,0x79,0xC0,0x40,0xF1,0x9E,0xC0,0x60,0xC2,0x00,0x18,0xEB,0xA4,0xAC,0xEC,0x20,0xF1,0x8E,0x40,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x05,0x97,0x04,0x90,0x00,0xEF,0x03,0x63,0x48,0x5C,0x11,0x80,0xBD,0x5B,0x11,0x80,0xE0,0x63,0x3E,0x62,0x3D,0xD1,0x3C,0xD0,0xF5,0x63,0x7D,0x67,0x00,0xF4,0x05,0x6A,0x7E,0xB5,0x54,0xCB,0x9D,0x67,0x0D,0x6A,0x20,0xF0,0x4A,0xC3,0x2B,0x4C,0x00,0x18,0x2E,0x2E,0x06,0x6E,0x7A,0xB0,0x00,0x6A,0x9D,0x67,0x01,0x6B,0x20,0xF0,0x51,0xC4,0x20,0xF0,0x52,0xC4,0x20, +0xF0,0x73,0xC4,0x20,0xF0,0x54,0xC4,0x20,0xF0,0x55,0xC4,0x20,0xF0,0x56,0xC4,0x20,0xF0,0x77,0xC4,0xC0,0xF1,0x46,0xC0,0xC0,0xF1,0x5A,0xC0,0x03,0x6A,0xC0,0xF1,0x58,0xC0,0x6F,0xB2,0x02,0x6B,0xC0,0xF1,0x65,0xC0,0xC0,0xF1,0x64,0xC0,0xC0,0xF1,0x79,0xC0,0x20,0xF1,0x8E,0x40,0x60,0xC2,0x00,0x6D,0x00,0x18,0x64,0x2E,0x08,0x6E,0x60,0xF1,0x4E,0xA0,0x02,0x72,0x07,0x60,0x03,0x52,0x02,0x60,0x01,0x72,0x01,0x10,0x03,0x72,0x15,0x61,0xAF,0x10,0x63,0xB5,0x00,0x6B,0xFF,0x6C,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x48,0x32,0xA9,0xE2,0x20,0xF0,0x58,0xA2,0x8C,0xEA,0x80,0xF0,0x1F,0x2A,0x01,0x4B,0x8C,0xEB,0x0A,0x5B,0xEF,0x61,0x00,0x18,0xD4,0x5A,0x0A,0x04,0x62,0x67,0x80,0xF0,0x1D,0x2A,0x0A,0x02,0x06,0x4A,0x64,0xA2,0xFF,0xF7,0x1F,0x6C,0xBD,0x67,0x60,0x33,0x4C,0xD3,0x43,0xA2,0x22,0x4D,0x4D,0xEB,0x8C,0xEB,0x4C,0xD3,0x5D,0x67,0x20,0xF0,0x53,0xA2,0x7D,0x67,0x4D,0xD2,0x20,0xF0,0x74,0xA3,0x0A,0x02,0x0A,0x4A,0x4E,0xD3,0x24,0xA2,0x43,0xA2,0x20,0x31,0x8C,0xE9,0x4D,0xE9,0x8C,0xE9,0x9D,0x67,0x20,0xF0,0x97,0xA4,0x4F,0xD4,0x9D,0x67,0x00,0x18,0x8E,0xDF,0x20,0x4C,0x50,0xD2,0x62,0x67,0x75,0x2A,0x5D,0x67,0x71,0xAA,0xFF,0xF7,0x1F,0x6C,0x3D,0xB5,0x8C,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x3C,0xB3,0x48,0x32,0x61,0xE2,0xE0,0xF0,0x8D,0x40,0x00,0x18,0x2E,0x2E,0x06,0x6E,0x5D,0x67,0x20,0xF1,0x50,0xAA,0x7D,0x67,0x9D,0x67,0x60,0xF2,0x5E,0xC8,0x20,0xF1,0x74,0xA3,0x5D,0x67,0xE0,0xF0,0x7A,0xC0,0x20,0xF1,0x98,0xA4,0x7D,0x67,0xE0,0xF0,0x9C,0xC0,0x20,0xF1,0x5C,0xA2,0xE0,0xF0,0x5D,0xC0,0x20,0xF0,0x40,0xA3,0xE0,0xF0,0x53,0xC0,0x01,0x6A,0x80,0xF2,0x42,0xC0,0x91,0xAB,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x45,0x95,0x4C,0xEC,0x7D,0x67,0x40,0xF1,0x60,0xA3,0x22,0x32,0x5E,0x32,0x00,0xF1,0x71,0xC0,0x18,0x22,0xEF,0xF7,0x1F,0x6A,0x4C,0xE9,0x01,0x6A,0x80,0xF0,0x3E,0xC8,0x04,0xD2,0x20,0xB2,0xFF,0xF7,0x1F,0x6C,0xFA,0x6D,0x05,0xD2,0x80,0xF0,0x5E,0xA8,0xA4,0xF4,0x1A,0x6E,0x20,0xF5,0x17,0x6F,0x8C,0xEA,0x06,0x6C,0x20,0x18,0x1B,0x32,0x06,0xD2,0x05,0x10,0x5D,0x67,0x40,0xF1,0x40,0xAA,0x80,0xF0,0x5E,0xC8,0x00,0x18,0x4E,0x9B,0x0A,0x04,0x22,0x67, +0x0F,0x22,0x7D,0x67,0x20,0xF0,0x80,0xA3,0xE0,0xF0,0xA8,0xA0,0x00,0x18,0xB6,0xDF,0x00,0x65,0x0B,0xB4,0x00,0x18,0xD3,0xDF,0x00,0x65,0x07,0x10,0x0C,0x6B,0x06,0x10,0x5D,0x67,0x91,0xAA,0x20,0x18,0x13,0x26,0x01,0x6D,0x71,0x67,0x0B,0x63,0x3E,0x97,0x3D,0x91,0x3C,0x90,0x43,0x67,0x00,0xEF,0x20,0x63,0x00,0x00,0xE0,0xA0,0x11,0x80,0x48,0x5C,0x11,0x80,0xBD,0x5B,0x11,0x80,0x48,0x60,0x11,0x80,0xF0,0xA5,0x10,0x80,0xF3,0x63,0x18,0x62,0x17,0xD1,0x16,0xD0,0x00,0x6A,0x0C,0xD2,0x0D,0xD2,0x0E,0xD2,0x7D,0x67,0x01,0xF4,0x03,0x6A,0x1A,0xD4,0x54,0xCB,0x62,0xA4,0x23,0xA4,0x26,0x5B,0x20,0xF4,0x05,0x60,0x00,0xF0,0x10,0x0A,0x64,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3,0x00,0xEB,0x00,0x65,0x4D,0x00,0x59,0x00,0xAD,0x00,0x77,0x02,0x23,0x03,0x63,0x03,0xEF,0x03,0x3F,0x08,0x11,0x04,0x25,0x04,0x43,0x04,0x57,0x04,0x25,0x07,0xC7,0x05,0x6B,0x04,0x97,0x05,0xAF,0x05,0x25,0x07,0xD7,0x05,0xE9,0x05,0xFB,0x05,0x29,0x06,0x35,0x06,0x4B,0x06,0x57,0x06,0x6B,0x06,0x7B,0x06,0x8B,0x06,0x97,0x06,0xA9,0x06,0x3B,0x08,0x3B,0x08,0x3B,0x08,0x3B,0x08,0xC7,0x06,0x07,0x07,0x13,0x07,0x31,0x08,0x21,0xF0,0x04,0xB2,0x03,0x6C,0x40,0xAA,0x0C,0xD2,0x17,0x13,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x02,0xF1,0x03,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x00,0x6C,0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67,0x80,0x18,0x38,0x2D,0x00,0x6C,0x00,0x18,0xFE,0x4F,0x00,0x65,0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18,0x95,0x2B,0xC5,0x67,0xC0,0xF7,0x1C,0xB3,0x0A,0x6A,0x4C,0xC3,0x08,0x6A,0x4D,0xC3,0x00,0x6A,0x49,0xC3,0x4A,0xC3,0xC9,0x13,0x0B,0x59,0x18,0x67,0xA0,0xF3,0x0D,0x20,0xC0,0xF7,0x00,0xB4,0x05,0x21,0x41,0x9C,0x40,0x6B,0x6C,0xEA,0x07,0x22,0x8F,0x13,0x41,0x9C,0x40,0x6B,0x6C,0xEA,0x02,0x2A,0x29,0xC4,0xB7,0x13,0xA0,0xF7,0x04,0xB3,0x04,0x6A,0xFA,0x6D,0x89,0xA3,0x29,0xC3,0x04,0xD2,0x80,0xF7,0x1C,0xB2,0x06,0xD1,0x0B,0xD4,0x05,0xD2,0x4A,0xA3,0x01,0x6C,0xA4,0xF1,0x00,0x6E,0x07,0xD2,0x61,0x9B,0xE1,0xF4,0x11,0x6F,0x6A,0x32,0x66,0xEC,0x8C,0xEA,0x8C,0xEB,0x08,0xD2,0x20,0x18,0x1B,0x32,0x09,0xD3,0xA0,0xF0,0x08,0x20,0x00,0xF0,0x10,0x0A,0x24,0x33,0x4D, +0xE3,0x60,0x8B,0x4D,0xE3,0x00,0xEB,0x00,0x65,0x17,0x00,0x95,0x00,0xC1,0x00,0xF7,0x00,0x17,0x01,0x1B,0x01,0x1F,0x01,0x41,0x01,0x29,0x01,0x31,0x01,0x39,0x01,0x40,0xF7,0x04,0xB2,0x61,0x9A,0x01,0x6A,0x6C,0xEA,0x0B,0x22,0x02,0x6A,0x6C,0xEA,0x04,0x22,0x80,0x18,0x9A,0x2D,0x00,0x65,0x15,0x10,0x80,0x18,0xC0,0x2D,0x00,0x65,0x11,0x10,0x02,0x6A,0x6C,0xEA,0x04,0x22,0x80,0x18,0xD3,0x2E,0x00,0x65,0x0A,0x10,0x04,0x6A,0x6C,0xEA,0x04,0x22,0x80,0x18,0xA4,0x2E,0x00,0x65,0x03,0x10,0x80,0x18,0x12,0x2E,0x00,0x65,0x00,0xF7,0x00,0xB0,0x6B,0x98,0x4A,0x98,0x29,0x98,0x10,0xD3,0x00,0x18,0xFE,0x4F,0x0F,0xD2,0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18,0x95,0x2B,0xC5,0x67,0x0B,0x94,0x0A,0x6A,0x4C,0xC0,0x02,0x5C,0x08,0x6A,0x4D,0xC0,0x40,0xF3,0x0D,0x60,0x0F,0x92,0x10,0x93,0x29,0xD8,0x4A,0xD8,0x6B,0xD8,0x47,0x13,0xC0,0xF6,0x04,0xB4,0x02,0x6A,0x61,0x9C,0x4D,0xEB,0x04,0x6A,0x6C,0xEA,0x61,0xDC,0x07,0x22,0x02,0x6A,0x4B,0xEA,0x6C,0xEA,0x80,0x18,0xE9,0x2E,0x41,0xDC,0x1A,0x10,0x01,0x6A,0x6D,0xEA,0x80,0x18,0xB0,0x2D,0x41,0xDC,0x14,0x10,0x80,0xF6,0x18,0xB4,0x03,0x6A,0x4B,0xEA,0x61,0x9C,0x4C,0xEB,0x02,0x6A,0x4B,0xEA,0x4C,0xEB,0x04,0x6A,0x6C,0xEA,0x61,0xDC,0x04,0x22,0x80,0x18,0xB6,0x2E,0x00,0x65,0x03,0x10,0x80,0x18,0x25,0x2E,0x00,0x65,0x60,0xF6,0x10,0xB2,0x40,0x6C,0x61,0x9A,0x8D,0xEB,0x61,0xDA,0x16,0x13,0x60,0xF6,0x04,0xB0,0x03,0x6B,0x6B,0xEB,0x41,0x98,0x6C,0xEA,0x01,0x6B,0x6D,0xEA,0x80,0x18,0xD2,0x2D,0x41,0xD8,0x41,0x98,0x40,0x6B,0x6D,0xEA,0x41,0xD8,0x06,0x13,0x01,0x6C,0x03,0x10,0x02,0x6C,0x01,0x10,0x03,0x6C,0x80,0x18,0x6B,0x2F,0x00,0x65,0xFD,0x12,0x80,0x18,0xFA,0x2E,0x00,0x65,0xF9,0x12,0x80,0x18,0x21,0x2F,0x00,0x65,0xF5,0x12,0x80,0x18,0x3D,0x2F,0x00,0x65,0xF1,0x12,0x80,0x18,0x80,0x2F,0x00,0x65,0xE0,0xF2,0x0C,0x22,0x12,0x72,0x98,0x67,0x01,0x5C,0x78,0x67,0x01,0x5B,0x58,0x67,0x03,0x4A,0xE3,0x12,0x04,0x59,0xA0,0xF2,0x13,0x60,0x80,0x18,0x38,0x2D,0x00,0x6C,0x57,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x02,0xF1,0x03,0x6A,0x4B,0xEA,0x4C,0xEE,0x57,0x6C,0x00,0x18,0x01,0xA0,0x01,0x6D,0x00,0x6C,0xA4,0x67,0x00,0x18,0x01,0xA0,0xC4,0x67, +0x00,0x18,0xFE,0x4F,0x00,0x65,0x00,0x6D,0x9D,0x67,0x28,0x4C,0x80,0x18,0x95,0x2B,0xC5,0x67,0xA0,0xF5,0x18,0xB0,0x0A,0x6A,0x4C,0xC0,0x08,0x6A,0x2A,0xC0,0x00,0x1C,0xDD,0x31,0x4D,0xC0,0x11,0xD2,0x41,0x98,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0x01,0x71,0x41,0xD8,0x06,0x61,0x80,0x18,0x6B,0x2F,0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0x02,0x71,0x04,0x61,0x41,0x98,0x04,0x6B,0x6D,0xEA,0x41,0xD8,0x00,0x1C,0xE5,0x31,0x11,0x94,0x02,0x6A,0x04,0xD2,0x60,0xF5,0x18,0xB2,0x06,0xD1,0x01,0x6C,0x05,0xD2,0x41,0x98,0xFA,0x6D,0x44,0xF2,0x19,0x6E,0x4A,0x32,0x8C,0xEA,0xE1,0xF4,0x12,0x6F,0x20,0x18,0x1B,0x32,0x07,0xD2,0x8E,0x12,0x4F,0x59,0x25,0x60,0x1A,0x93,0x44,0xA3,0x08,0x5A,0x21,0x60,0x40,0xF5,0x08,0xB5,0x7F,0x6A,0x4C,0xE9,0x80,0x9D,0x40,0xF5,0x04,0xB2,0x80,0xF4,0x20,0x33,0x4C,0xEC,0x6D,0xEC,0x80,0xDD,0x1A,0x92,0x64,0xA2,0xFF,0x6A,0x4C,0xEB,0x07,0x6A,0x4C,0xEB,0x20,0xF5,0x10,0xB2,0x00,0xF7,0x60,0x33,0x8C,0xEA,0x6D,0xEA,0x40,0xDD,0x6E,0x12,0x1A,0x93,0x0A,0x59,0x45,0xA3,0x84,0xA3,0x40,0x32,0x4D,0xEC,0x03,0x61,0x03,0x6C,0x0D,0xD4,0x64,0x12,0x00,0xF5,0x00,0xB6,0x00,0xF5,0x0C,0xB3,0xE3,0xF7,0x1F,0x6A,0xA0,0x9E,0x8C,0xEA,0x54,0x32,0x6C,0xED,0x00,0xF5,0x00,0xB3,0x4D,0xED,0x24,0x32,0x69,0xE2,0x40,0xAA,0xFF,0xF7,0x1F,0x6B,0xA0,0xDE,0x6C,0xEA,0x4C,0x32,0x82,0xEA,0x20,0xF2,0x14,0x61,0x03,0x59,0x05,0x60,0x02,0x6A,0x4B,0xEA,0x4C,0xED,0xA0,0xDE,0x0F,0x10,0x06,0x59,0xFF,0x6B,0x58,0x67,0x01,0x6C,0x6C,0xEA,0x61,0x9E,0x8D,0xED,0x8C,0xEA,0x81,0x6C,0x8B,0xEC,0x5C,0x32,0x8C,0xEB,0x4D,0xEB,0xA0,0xDE,0x61,0xDE,0xA0,0xF4,0x1C,0xB2,0x1F,0x6B,0x6B,0xEB,0x49,0xE1,0x80,0xA2,0x0F,0x6A,0x4C,0xEC,0x40,0x9E,0x84,0x34,0x6C,0xEA,0x8D,0xEA,0x40,0xDE,0x28,0x12,0x1A,0x92,0x85,0xA2,0x05,0x5C,0xE0,0xF1,0x15,0x60,0x60,0xF4,0x1C,0xB5,0x07,0x6A,0x4C,0xEC,0x41,0x9D,0x39,0x6B,0x6B,0xEB,0x8C,0x34,0x6C,0xEA,0x8D,0xEA,0x41,0xDD,0x17,0x12,0x1A,0x94,0x60,0xF4,0x04,0xB3,0x43,0xA4,0x46,0xC3,0x44,0xA4,0x47,0xC3,0x45,0xA4,0x48,0xC3,0x0D,0x12,0x40,0xF4,0x10,0xB5,0x60,0xF4,0x08,0xB3,0x3E,0x34,0x40,0x9D,0xC0,0xF7,0x80,0x34,0x6C,0xEA,0x8D,0xEA,0x40,0xDD,0x7F,0x6A,0x4C,0xE9,0x25,0xC5,0xFE, +0x11,0x1A,0x94,0x20,0xF4,0x10,0xB3,0x43,0xA4,0x4E,0xC3,0x44,0xA4,0x4F,0xC3,0x45,0xA4,0x50,0xC3,0xF4,0x11,0x1A,0x94,0x00,0xF4,0x1C,0xB3,0x43,0xA4,0x51,0xC3,0x44,0xA4,0x52,0xC3,0x45,0xA4,0x53,0xC3,0xEA,0x11,0x00,0xF4,0x0C,0xB6,0xFF,0x6C,0xA4,0x67,0x69,0xA6,0x6C,0xED,0x0A,0x75,0x40,0x61,0x4C,0xA6,0x00,0x6F,0x8C,0xEA,0x0A,0x72,0x14,0x60,0x22,0x67,0x44,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x4C,0x32,0x00,0xF4,0x04,0xB3,0x2B,0xE2,0x48,0x32,0x69,0xE2,0x20,0xF0,0x58,0xA2,0x05,0x6F,0x8C,0xEA,0x04,0x72,0x03,0x60,0x0A,0x6A,0x00,0x6F,0x4C,0xC6,0x4D,0xA6,0x08,0x72,0x6A,0x60,0x22,0x67,0x50,0x32,0x29,0xE2,0xF8,0xB4,0x48,0x32,0x2B,0xE2,0x48,0x32,0x89,0xE2,0x20,0xF1,0x4F,0xA2,0x01,0x6B,0x05,0x6F,0x6C,0xEA,0x05,0x22,0x00,0xF1,0x52,0xAC,0x47,0xE9,0x6C,0xEA,0x57,0x2A,0x08,0x6A,0x00,0x6F,0x4D,0xC6,0x53,0x10,0xEF,0xB0,0x7F,0x4D,0x6E,0x4D,0x05,0x6F,0x90,0x67,0xB5,0xE3,0x06,0x6E,0x00,0x18,0x2E,0x2E,0x15,0xD7,0xFF,0xF7,0x38,0xC0,0x25,0x10,0x4B,0x43,0x8C,0xEA,0x03,0x5A,0x23,0x60,0xE5,0xB5,0x04,0x6F,0x00,0x69,0x24,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x4C,0x32,0x2B,0xE2,0x48,0x33,0xA9,0xE3,0x20,0xF0,0x58,0xA2,0x8C,0xEA,0x04,0x72,0xDF,0x60,0x01,0x49,0x8C,0xE9,0x0A,0x59,0xEF,0x61,0x2D,0x10,0xDC,0xB0,0x60,0xF1,0x02,0x4D,0x05,0x6F,0x90,0x67,0xB5,0xE3,0x06,0x6E,0x00,0x18,0x2E,0x2E,0x15,0xD7,0xFF,0xF7,0x39,0xC0,0x15,0x97,0x1F,0x10,0x48,0x43,0x8C,0xEA,0x02,0x5A,0xE5,0x67,0x1A,0x60,0xD2,0xB5,0x04,0x6F,0x00,0x69,0x01,0x6E,0xFF,0xF7,0x1F,0x68,0x30,0x32,0x29,0xE2,0x48,0x32,0x2B,0xE2,0x48,0x33,0xA9,0xE3,0x20,0xF1,0x4F,0xA2,0xCC,0xEA,0x06,0x22,0x00,0xF1,0x52,0xAD,0x0C,0xEA,0x47,0xE9,0xCC,0xEA,0xD7,0x2A,0x01,0x49,0x8C,0xE9,0x08,0x59,0xEC,0x61,0xBC,0xB2,0x4A,0xA2,0x0C,0xD2,0x0C,0x93,0xE0,0x32,0x4D,0xEB,0x0C,0xD3,0x77,0x10,0xC3,0xB2,0x20,0xF0,0x7C,0xA2,0x0C,0xD3,0x20,0xF0,0x7D,0xA2,0x0C,0x94,0x20,0xF0,0x5E,0xA2,0x60,0x33,0x6D,0xEC,0x85,0x10,0xBD,0xB2,0x20,0xF0,0x7F,0xA2,0x0C,0xD3,0x40,0xF0,0x60,0xA2,0x0C,0x94,0x40,0xF0,0x41,0xA2,0x60,0x33,0x6D,0xEC,0x79,0x10,0x1A,0x93,0x43,0xA3,0x62,0xAB,0x60,0x33,0x6D,0xEA,0xB5,0xB3,0x41,0xDB,0x34,0x11,0x1A,0x94, +0xA7,0xB3,0x43,0xA4,0x54,0xC3,0x44,0xA4,0x55,0xC3,0x45,0xA4,0x56,0xC3,0x2B,0x11,0x1A,0x94,0xA3,0xB3,0x43,0xA4,0x57,0xC3,0x44,0xA4,0x58,0xC3,0x45,0xA4,0x59,0xC3,0x22,0x11,0x4F,0x41,0xFF,0x6B,0x6C,0xEA,0x09,0x5A,0x00,0xF1,0x04,0x60,0x5C,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0xFF,0xF7,0x1F,0x6E,0x4C,0xEE,0x79,0x6A,0x4B,0xEA,0x4C,0xEE,0x2C,0x33,0x78,0x6A,0x4C,0xEB,0x5C,0x6C,0x01,0x6D,0x6D,0xEE,0xD6,0x10,0x93,0xB2,0x92,0xAA,0x69,0x9A,0x0C,0xD4,0x9E,0xB4,0x07,0x10,0x90,0xB2,0x69,0x9A,0x62,0x34,0x82,0x34,0x0C,0xD4,0xFF,0xF7,0x1F,0x6C,0x8C,0xEB,0x69,0xDA,0x02,0x6A,0x3C,0x10,0x8B,0xB2,0x96,0xAA,0x6B,0x9A,0x0C,0xD4,0x96,0xB4,0x07,0x10,0x88,0xB2,0x6B,0x9A,0x62,0x34,0x82,0x34,0x0C,0xD4,0xFF,0xF7,0x1F,0x6C,0x8C,0xEB,0x6B,0xDA,0xEE,0x17,0x78,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x02,0x6B,0x0C,0xD2,0x0E,0xD3,0xE2,0x10,0x76,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xD2,0x02,0x6C,0x0E,0xD4,0xDA,0x10,0x77,0x6C,0x00,0x18,0xEB,0x9F,0x01,0x6D,0x0C,0xD2,0xD8,0x17,0x78,0xB2,0x74,0xA2,0x0C,0xD3,0x75,0xA2,0x0C,0x94,0x56,0xA2,0x60,0x33,0x6D,0xEC,0x08,0x10,0x73,0xB2,0x77,0xA2,0x0C,0xD3,0x78,0xA2,0x0C,0x94,0x59,0xA2,0x60,0x33,0x6D,0xEC,0x40,0x32,0x40,0x32,0x4D,0xEC,0x0C,0xD4,0x03,0x6A,0x0E,0xD2,0xBC,0x10,0x1A,0x93,0x79,0xB1,0x43,0xA3,0x44,0x33,0x4D,0xE3,0x6C,0x33,0x4D,0xE3,0x40,0x99,0x68,0x30,0x4F,0xEA,0x03,0x22,0x00,0x18,0xFD,0x1D,0x91,0x67,0x0E,0x20,0x00,0x18,0x40,0xA4,0x00,0x65,0x72,0xB6,0x00,0x6F,0x01,0x6C,0xB1,0x67,0x00,0x18,0xF3,0x1D,0x04,0xD7,0x80,0x99,0x00,0x18,0x0C,0x1E,0xB0,0x67,0x6D,0xB2,0x00,0xCA,0x9C,0x10,0x1A,0x94,0x66,0xB2,0x63,0xA4,0x80,0xF1,0x61,0xC2,0x96,0x10,0x1A,0x94,0x00,0x6B,0x43,0xA4,0x01,0x22,0x01,0x6B,0x61,0xB2,0x80,0xF1,0x71,0xC2,0x8D,0x10,0x05,0x59,0x00,0x6A,0x78,0x67,0x12,0xD2,0x70,0x23,0x1A,0x94,0x42,0xA4,0x02,0xAC,0x0C,0x72,0x05,0x61,0x5B,0xB2,0x01,0x6F,0x41,0x9A,0x12,0xD2,0x03,0x10,0x12,0x97,0x03,0x6A,0x0E,0xD2,0x7A,0x23,0x00,0xF0,0x12,0x0A,0x24,0x33,0x4D,0xE3,0x60,0x8B,0x4D,0xE3,0x00,0xEB,0x00,0x65,0x0B,0x00,0x29,0x00,0x83,0x00,0xA5,0x00,0xAF,0x00,0x06,0x27,0x12,0x96,0x3F,0x6A,0x90,0x67,0x4C,0xEC,0x00, +0x6D,0x31,0x10,0x3F,0x6A,0x90,0x67,0x4C,0xEC,0x00,0x18,0xEB,0x9F,0xA7,0x67,0x0C,0xD2,0x5E,0x10,0x02,0x31,0x01,0x6B,0x6C,0xE9,0x09,0x21,0xA3,0x67,0x40,0x6C,0xD1,0x67,0x14,0xD3,0x00,0x18,0x01,0xA0,0x15,0xD7,0x15,0x97,0x14,0x93,0x0C,0x27,0x7F,0x6A,0x4C,0xE8,0x07,0x34,0x40,0x6A,0x12,0x96,0x4D,0xEC,0xFF,0x6A,0x4C,0xEC,0x00,0x18,0x01,0xA0,0xA3,0x67,0x0B,0x10,0x7F,0x6A,0x4C,0xE8,0x07,0x34,0x40,0x6A,0x4D,0xEC,0xFF,0x6A,0x4C,0xEC,0x00,0x18,0xEB,0x9F,0xA3,0x67,0x0C,0xD2,0x38,0x21,0x40,0x6C,0x01,0x6D,0x00,0x6E,0x00,0x18,0x01,0xA0,0x00,0x65,0x31,0x10,0x01,0x6A,0x0C,0xEA,0x03,0x22,0x03,0x6B,0x0D,0xD3,0x2B,0x10,0x08,0x27,0x12,0x95,0xFF,0xF7,0x1F,0x6A,0x90,0x67,0x00,0x18,0x9A,0x33,0x4C,0xED,0x22,0x10,0x30,0xB2,0x12,0x10,0x01,0x6A,0x0C,0xEA,0x05,0x2A,0x2E,0xB2,0x06,0x10,0x01,0x6A,0x0C,0xEA,0x02,0x22,0x03,0x6A,0x15,0x10,0x2C,0xB2,0x06,0x27,0x7D,0x67,0x40,0xF0,0x68,0xAB,0x49,0xE0,0x60,0xCA,0x0E,0x10,0x49,0xE0,0x40,0xAA,0xFF,0xF7,0x1F,0x6C,0x4C,0xEC,0x0C,0xD4,0x07,0x10,0x01,0x6A,0x4C,0xE9,0x24,0xB2,0x20,0xC2,0x02,0x10,0x02,0x6A,0x0D,0xD2,0x0E,0x93,0x0D,0x94,0x70,0x32,0x4D,0xEC,0x1A,0x92,0x83,0xC2,0x1A,0x93,0x1A,0x94,0x41,0xA3,0x10,0x6B,0x6B,0xEB,0x6C,0xEA,0x41,0xC4,0x1A,0x92,0x0C,0x96,0x02,0x6C,0x00,0x18,0x2C,0x2B,0xA0,0x9A,0x18,0x97,0x17,0x91,0x16,0x90,0x00,0xEF,0x0D,0x63,0x00,0x00,0xD2,0x04,0x11,0x80,0xCC,0xA0,0x11,0x80,0xF0,0xA5,0x10,0x80,0xFF,0xFF,0x03,0xFE,0xFF,0xFF,0xFF,0x8F,0x1F,0x00,0xFC,0xFF,0xE8,0xDF,0x10,0x80,0xFC,0xDF,0x10,0x80,0xFF,0xFF,0xFF,0x7F,0x48,0x60,0x11,0x80,0x58,0x46,0x11,0x80,0xE0,0xA0,0x11,0x80,0xDC,0x00,0x11,0x80,0xFC,0xA0,0x11,0x80,0x00,0x00,0xFF,0xFF,0x88,0x07,0x11,0x80,0x01,0x91,0x02,0x80,0x08,0xA1,0x11,0x80,0x00,0x00,0x00,0xB6,0x00,0xA0,0x00,0xB0,0x00,0x10,0x00,0xB6,0x1C,0xA1,0x11,0x80,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0x44,0xAC,0x24,0x67,0x01,0x72,0x55,0x61,0x00,0x9C,0x5D,0x67,0xFA,0x6D,0x20,0xF0,0x08,0xC2,0x02,0x6A,0x04,0xD2,0x45,0xB2,0x06,0xD0,0xE4,0xF4,0x03,0x6E,0x05,0xD2,0x41,0x9C,0xC1,0xF4,0x1C,0x6F,0x04,0x6C,0x20,0x18,0x1B,0x32,0x07,0xD2,0x3F,0x6A,0x4C,0xE8,0x20,0x70,0x0A,0x61, +0x62,0xA1,0xFF,0x6A,0x4C,0xEB,0x06,0x2B,0x3C,0xB2,0x60,0xDA,0x3C,0xB2,0x60,0xDA,0x01,0x6A,0x42,0xC1,0x7D,0x67,0x20,0xF0,0x68,0xA3,0x3F,0x6A,0x6C,0xEA,0x24,0x72,0x03,0x67,0x24,0x61,0x7D,0x67,0x01,0xF4,0x03,0x6A,0x00,0x1C,0xDD,0x31,0x50,0xCB,0x00,0x18,0xFE,0x4F,0x02,0x67,0x00,0x6D,0x9D,0x67,0x20,0x4C,0x80,0x18,0x95,0x2B,0xC5,0x67,0x2F,0xB3,0x40,0x99,0x6C,0xEA,0x2F,0xB3,0x6E,0xEA,0x06,0x2A,0x80,0x18,0x6B,0x2F,0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0xA0,0x99,0x02,0x6C,0x00,0x18,0x2C,0x2B,0x00,0x6E,0x00,0x1C,0xE5,0x31,0x90,0x67,0x3E,0x10,0xFF,0x6A,0x4C,0xE8,0x30,0x70,0x04,0x61,0x80,0x18,0x07,0x30,0x91,0x67,0x36,0x10,0x44,0xA9,0x02,0x72,0x30,0x61,0x21,0xB2,0x00,0xA2,0x2D,0x28,0x40,0x99,0x04,0xF0,0x0F,0x6B,0x6C,0xEA,0x6A,0xEA,0x0B,0x61,0x1E,0xB2,0xFF,0xF7,0x1F,0x6B,0x40,0xAA,0x6C,0xEA,0x40,0x32,0x40,0x32,0x00,0xF2,0x0F,0x6B,0x6D,0xEA,0x40,0xD9,0x02,0x6A,0x04,0xD2,0x11,0xB2,0x05,0x6C,0xFA,0x6D,0x05,0xD2,0x40,0x99,0x24,0xF5,0x13,0x6E,0xC1,0xF4,0x1D,0x6F,0x06,0xD2,0x41,0x99,0x20,0x18,0x1B,0x32,0x07,0xD2,0x11,0xB2,0xFF,0x6B,0x40,0xA2,0x6C,0xEA,0x07,0x22,0x40,0x99,0x6C,0xEA,0x30,0x72,0x03,0x60,0x0E,0xB2,0x00,0xDA,0x03,0x10,0x00,0x18,0xF4,0x2C,0x91,0x67,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0xF0,0xA5,0x10,0x80,0x14,0xE0,0x10,0x80,0x38,0x91,0x10,0x80,0x00,0x00,0xFF,0x00,0x00,0x00,0x01,0x00,0x98,0x00,0x11,0x80,0x04,0x09,0x11,0x80,0x1C,0xA1,0x11,0x80,0x94,0x00,0x11,0x80,0xFD,0x63,0x04,0x62,0x00,0x18,0x23,0xEA,0x00,0x65,0x04,0x97,0x00,0xEF,0x03,0x63,0xEF,0x63,0x20,0x62,0x1F,0xD1,0x1E,0xD0,0x80,0xAC,0x00,0x6A,0xC0,0xB3,0x11,0xD4,0xA0,0xA5,0x1B,0xD2,0x84,0x32,0x89,0xE2,0x4C,0x32,0x8B,0xE2,0x4C,0x32,0x8B,0xE2,0x48,0x32,0x69,0xE2,0x19,0xD2,0x12,0xD5,0xE0,0xF0,0x6C,0xA2,0x18,0xD3,0xA0,0xF0,0x9A,0xAA,0x19,0x93,0x13,0xD4,0xA0,0xF0,0x58,0xAA,0x19,0x94,0x14,0xD2,0xA0,0xF0,0x7C,0xAB,0x19,0x92,0x15,0xD3,0x7D,0x67,0x60,0xF0,0x6C,0xA3,0xC0,0xF0,0x80,0xAC,0x16,0xD4,0xC0,0xF2,0x74,0xC2,0x9D,0x67,0xE0,0xF0,0x13,0xA2,0x60,0xF0,0x8C,0xA4,0xE0,0xF0,0x28,0xA2,0xC0,0xF2,0x95,0xC2,0xB1,0x67,0x00,0x18,0x7B,0xBB,0x90,0x67,0x17, +0xD2,0x17,0x93,0x48,0x32,0x1C,0xD2,0x69,0xE2,0xA6,0xB3,0x44,0x32,0x69,0xE2,0x1A,0xD2,0x19,0x92,0xE0,0xF0,0xA8,0xA2,0x00,0x18,0xC3,0x34,0x90,0x67,0x12,0x93,0x0E,0x23,0x18,0x94,0x01,0x74,0x0B,0x61,0x1A,0x92,0x03,0xF4,0x00,0x6C,0x18,0xF0,0x00,0x6D,0xC3,0xAA,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x8D,0x93,0x4C,0xEE,0x14,0x93,0x05,0x23,0x19,0x94,0x00,0xF2,0x57,0xA4,0x01,0x72,0x15,0x60,0x03,0x6A,0x04,0xD2,0x95,0xB2,0x19,0x93,0x12,0x94,0x05,0xD2,0x14,0x92,0xFA,0x6D,0x64,0xF6,0x09,0x6E,0x06,0xD2,0x00,0xF2,0x57,0xA3,0x64,0xF4,0x18,0x6F,0x08,0xD4,0x04,0x6C,0x20,0x18,0x1B,0x32,0x07,0xD2,0x0C,0x11,0x00,0x1C,0xDD,0x31,0x00,0x65,0x9D,0x67,0x40,0x4C,0xB1,0x67,0x00,0x18,0x3B,0x94,0x1B,0xD2,0x10,0x92,0x88,0xB6,0x46,0x32,0x01,0x4A,0xCC,0xEA,0x10,0xD2,0x19,0x92,0xC0,0xF2,0xEE,0xAA,0x07,0x2F,0x12,0x93,0x01,0x73,0x04,0x61,0x00,0x1C,0xE5,0x31,0x1B,0x94,0xF2,0x10,0x10,0x95,0x08,0x25,0x14,0x94,0x06,0x24,0x9B,0xED,0x01,0x2C,0xE5,0xE8,0x10,0xEA,0x00,0x65,0x01,0x10,0x00,0x6A,0x14,0x93,0xFF,0xF7,0x1F,0x6C,0x4B,0xE3,0x13,0x93,0x8C,0xEA,0x65,0xE2,0x14,0x92,0x23,0xEA,0x01,0x60,0x47,0xE1,0x12,0x93,0x01,0x73,0x18,0x61,0x19,0x92,0xEC,0xEC,0xA0,0xF2,0x74,0x9A,0x14,0xD4,0xCC,0xEB,0x73,0xE5,0xA3,0xEB,0x44,0x67,0x02,0x61,0x6F,0xB2,0x49,0xE4,0x14,0x94,0x9A,0xEA,0x01,0x2C,0xE5,0xE8,0x12,0xE9,0x41,0x41,0x00,0x65,0x98,0xEA,0x12,0xEA,0x65,0xE2,0xA7,0xE1,0xCC,0xE9,0x19,0x94,0xFF,0x6B,0x14,0x35,0xE0,0xF0,0x48,0xA4,0x6C,0xED,0x02,0x6C,0x6C,0xEA,0x40,0x32,0x4C,0x32,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0x9A,0x33,0x4C,0xED,0x10,0x92,0x2D,0xE2,0x1D,0xD3,0x08,0x59,0x06,0x60,0x1D,0x94,0x14,0x93,0x71,0xE4,0x65,0xE1,0x1D,0xD4,0xF8,0x17,0x1D,0x94,0x43,0xE4,0x00,0x18,0xC4,0x36,0x04,0x30,0x41,0xE0,0x19,0x92,0x4E,0x6C,0x13,0xDA,0x00,0x18,0x9A,0x33,0x14,0x95,0x1D,0x95,0xFF,0xF7,0x1F,0x6B,0x48,0x6C,0x00,0x18,0x9A,0x33,0x6C,0xED,0x18,0x94,0x03,0x2C,0x16,0x95,0x15,0x90,0x07,0x10,0x15,0x92,0x16,0x93,0xFF,0xF7,0x1F,0x6C,0x00,0x6D,0x61,0xE2,0x8C,0xE8,0x00,0x18,0x9A,0x33,0x4C,0x6C,0x4A,0x6C,0x00,0x18,0x9A,0x33,0xB0,0x67,0x00,0x6C,0x00,0x18,0x9A,0x33,0x07,0x6D,0x12,0x92, +0x0D,0x2A,0x18,0x93,0x01,0x73,0x0A,0x61,0x17,0x94,0x44,0xB2,0x7D,0x67,0x40,0xF0,0x68,0xA3,0x49,0xE4,0x60,0xC2,0x42,0xB2,0x49,0xE4,0x60,0xC2,0x1B,0x94,0x00,0x1C,0xE5,0x31,0x02,0x49,0x00,0x18,0x4E,0x05,0x00,0x65,0x01,0xF0,0x00,0x6D,0x00,0x18,0x78,0xBA,0x5E,0x6C,0x12,0x92,0x21,0x2A,0x18,0x93,0x01,0x73,0x0D,0x61,0x1A,0x92,0x18,0xF0,0x00,0x6C,0x03,0xF4,0x00,0x6D,0x00,0x18,0x8D,0x93,0xC3,0xAA,0x19,0x93,0x20,0x6A,0x00,0xF2,0x55,0xC3,0x11,0x10,0x51,0x59,0x07,0x61,0x11,0x95,0xFF,0xF7,0x1F,0x6A,0x91,0x67,0x00,0x18,0x3A,0x96,0x4C,0xEC,0x1A,0x92,0x18,0xF0,0x00,0x6C,0x01,0xF4,0x00,0x6D,0x00,0x18,0x8D,0x93,0xC3,0xAA,0x18,0x93,0x14,0x2B,0x12,0x94,0x12,0x24,0x51,0x59,0x10,0x61,0x11,0x95,0xFF,0xF7,0x1F,0x68,0x91,0x67,0x00,0x18,0x3A,0x96,0x0C,0xEC,0x1A,0x92,0x01,0xF4,0x00,0x6C,0x18,0xF0,0x00,0x6D,0xC3,0xAA,0x00,0x18,0x8D,0x93,0x0C,0xEE,0x2B,0x6A,0x7D,0x67,0x58,0xCB,0x14,0x94,0x1D,0xB2,0xFD,0x67,0x0A,0xD4,0x80,0x9A,0x00,0x6D,0x04,0x06,0x34,0x4F,0xA9,0xE7,0x40,0xA2,0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x0A,0x95,0x0B,0x96,0x00,0x18,0x40,0x1E,0x0C,0x97,0x17,0x92,0x0F,0x22,0x1C,0x93,0x13,0xB2,0x49,0xE3,0x00,0x6B,0xFF,0xF7,0x7C,0xDA,0x1C,0x94,0x11,0xB2,0x49,0xE4,0xFF,0xF7,0x7C,0xDA,0x10,0xB2,0x49,0xE4,0xFF,0xF7,0x7C,0xDA,0x20,0x97,0x1F,0x91,0x1E,0x90,0x01,0x6A,0x00,0xEF,0x11,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x70,0x45,0x11,0x80,0xF0,0xA5,0x10,0x80,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x08,0x48,0x06,0x11,0x80,0x3C,0x06,0x11,0x80,0x68,0x52,0x11,0x80,0x18,0x07,0x11,0x80,0xE8,0x06,0x11,0x80,0xB8,0x06,0x11,0x80,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0xC0,0xAC,0xFF,0xF7,0x1F,0x6A,0xFF,0x6F,0x4C,0xEE,0xEC,0xEE,0x4C,0xED,0x0A,0x65,0xCC,0x32,0xC9,0xE2,0x48,0x32,0x4D,0xB3,0xCB,0xE2,0x48,0x32,0x71,0xE2,0x29,0xA4,0xFF,0xF7,0x1F,0x75,0xEC,0xE9,0x4E,0x61,0x58,0xA4,0xEC,0xEA,0x01,0x72,0x42,0x61,0x47,0xB2,0x49,0xE1,0x40,0xA2,0xEC,0xEA,0x3D,0x2A,0x46,0xB2,0x01,0x6B,0x80,0x9A,0x40,0xF6,0x82,0x32,0x6C,0xEA,0x36,0x22,0xC4,0x30,0xC9,0xE0,0x42,0xB3,0x48,0x32,0xCB,0xE2,0x48,0x32,0x7D,0xE2,0xB3,0xAF,0x48,0x67,0x80,0xF6,0x82,0x34,0xAC, +0xEA,0x0A,0x65,0x03,0x6A,0x4C,0xEC,0x2B,0x65,0x02,0x6A,0x88,0x33,0x44,0xEB,0x68,0x67,0x42,0xEB,0x04,0x60,0x03,0x24,0x41,0x45,0x53,0xCF,0x1C,0x10,0xC9,0xE0,0x48,0x32,0xCB,0xE2,0x48,0x32,0x69,0x67,0x61,0xE2,0x20,0xF0,0x48,0xA0,0x0E,0x2A,0x33,0xB2,0xFF,0xF7,0x1F,0x6B,0xA3,0x67,0x40,0xAA,0xE0,0xF1,0x0E,0x6C,0x4C,0xED,0x08,0xF0,0x00,0x6A,0x4D,0xED,0x00,0x18,0x9A,0x33,0x6C,0xED,0x00,0x6A,0x53,0xC8,0x01,0x6A,0x20,0xF0,0x48,0xC0,0x2A,0xB2,0x00,0x6B,0x49,0xE1,0x60,0xC2,0x24,0xB2,0x49,0xE1,0x60,0xC2,0x3B,0x10,0x1F,0xF7,0x00,0x6A,0xAC,0xEA,0xEC,0xED,0x0C,0x22,0x24,0xB2,0x01,0x6B,0x49,0xE1,0x60,0xC2,0x1E,0xB2,0x03,0x25,0x49,0xE1,0x60,0xC2,0x0B,0x10,0x49,0xE1,0xA0,0xC2,0x08,0x10,0x07,0x25,0x19,0xB2,0x4D,0xE1,0x40,0xA3,0xEC,0xEA,0x02,0x2A,0x01,0x6A,0x40,0xC3,0x58,0xA4,0xFF,0x6D,0x01,0x72,0x1E,0x61,0x14,0xB2,0x49,0xE1,0x40,0xA2,0xAC,0xEA,0x01,0x72,0x18,0x61,0xC4,0x32,0xC9,0xE2,0x48,0x32,0x11,0xB3,0xCB,0xE2,0x48,0x32,0x61,0xE2,0x20,0xF0,0x48,0xA0,0xAC,0xEA,0x09,0x22,0x0E,0xB2,0xF7,0xF7,0x1F,0x6D,0xE0,0xF1,0x0E,0x6C,0x40,0xAA,0x00,0x18,0x9A,0x33,0x4C,0xED,0x00,0x6A,0x53,0xC8,0x20,0xF0,0x48,0xC0,0x06,0x97,0x05,0x91,0x04,0x90,0x01,0x6A,0x00,0xEF,0x04,0x63,0x00,0x00,0x4C,0x7D,0x11,0x80,0xCC,0x05,0x11,0x80,0x00,0x46,0x11,0x80,0x98,0x5F,0x11,0x80,0xEE,0x01,0x00,0xB6,0xD4,0x05,0x11,0x80,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0x00,0xA4,0x24,0xB3,0x04,0x31,0x09,0xE1,0x48,0x32,0x0B,0xE2,0x48,0x32,0x71,0xE2,0x20,0xF0,0x44,0xA4,0x02,0x72,0x20,0x61,0x1F,0xB2,0x01,0x6B,0x40,0x9A,0x40,0xF6,0x42,0x32,0x6C,0xEA,0x0E,0x22,0x20,0xF0,0x48,0xA4,0xFF,0x6B,0x6C,0xEA,0x09,0x22,0x1A,0xB2,0xF7,0xF7,0x1F,0x6D,0xE0,0xF1,0x0E,0x6C,0x40,0xAA,0x00,0x18,0x9A,0x33,0x4C,0xED,0x09,0xE1,0x13,0xB3,0x48,0x32,0x0B,0xE2,0x48,0x32,0x69,0xE2,0x00,0x6B,0x73,0xCA,0x20,0xF0,0x68,0xC2,0x16,0x10,0x39,0x6A,0x7D,0x67,0x50,0xCB,0x10,0xB2,0xFD,0x67,0x06,0xD0,0x80,0x9A,0x00,0x6D,0x04,0x06,0x24,0x4F,0xA9,0xE7,0x40,0xA2,0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x06,0x95,0x07,0x96,0x00,0x18,0x40,0x1E,0x08,0x97,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x01,0x6A,0x00,0xEF, +0x08,0x63,0x98,0x5F,0x11,0x80,0x00,0x46,0x11,0x80,0xEE,0x01,0x00,0xB6,0x28,0x45,0x11,0x80,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0xC0,0xA4,0xFF,0x6B,0x34,0xB2,0x6C,0xEE,0xC4,0x34,0x2A,0x65,0xC9,0xE4,0x48,0x32,0xCB,0xE2,0x48,0x32,0x0C,0x65,0x89,0x67,0x9D,0xE2,0x20,0xF0,0x44,0xA7,0x6C,0xED,0x6C,0xEA,0x02,0x72,0x04,0x60,0x20,0xF0,0x43,0xA7,0x6C,0xEA,0x35,0x2A,0x2B,0xB2,0x01,0x6B,0x00,0x9A,0x40,0xF6,0x02,0x32,0x6C,0xEA,0x45,0x22,0x02,0x75,0x43,0x61,0x03,0x6A,0x80,0xF6,0x02,0x35,0x4C,0xED,0x33,0xAF,0xA8,0x33,0x02,0x6A,0x44,0xEB,0x42,0xE9,0x04,0x60,0x03,0x25,0x41,0x41,0x53,0xCF,0x35,0x10,0x68,0x67,0xC9,0xE3,0x48,0x32,0xCB,0xE2,0x48,0x32,0x89,0x67,0x81,0xE2,0x20,0xF0,0x48,0xA0,0x0E,0x2A,0x1B,0xB2,0xFF,0xF7,0x1F,0x6B,0xA3,0x67,0x40,0xAA,0xE0,0xF1,0x0E,0x6C,0x4C,0xED,0x08,0xF0,0x00,0x6A,0x4D,0xED,0x00,0x18,0x9A,0x33,0x6C,0xED,0x00,0x6A,0x53,0xC8,0x01,0x6A,0x20,0xF0,0x48,0xC0,0x17,0x10,0x3A,0x6A,0x7D,0x67,0x50,0xCB,0x11,0xB2,0xFD,0x67,0x06,0xD6,0x80,0x9A,0x07,0xD5,0x04,0x06,0x00,0x6D,0x24,0x4F,0xA9,0xE7,0x40,0xA2,0xAD,0xE6,0x01,0x4D,0x08,0x5D,0x40,0xC3,0xF9,0x61,0x06,0x95,0x07,0x96,0x00,0x18,0x40,0x1E,0x08,0x97,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x01,0x6A,0x00,0xEF,0x08,0x63,0x00,0x00,0x98,0x5F,0x11,0x80,0x00,0x46,0x11,0x80,0xEE,0x01,0x00,0xB6,0x28,0x45,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0xFF,0xF7,0x1F,0x6A,0x8C,0xEA,0x04,0xD2,0x04,0x93,0x01,0x69,0x44,0xE9,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x20,0xB3,0x48,0x32,0x0D,0xD5,0x69,0xE2,0x05,0xD2,0x00,0x68,0x20,0x18,0xE4,0x06,0x90,0x67,0x01,0x48,0xFF,0x6B,0x6C,0xE8,0x45,0xE1,0x04,0x58,0x6C,0xE9,0xF6,0x61,0x05,0x94,0x44,0x41,0xA0,0xF0,0x88,0xAC,0x98,0xEA,0x17,0xB2,0x06,0xD4,0x60,0xF1,0x42,0xA2,0x6C,0xEA,0x02,0x5A,0x12,0xE9,0x00,0x65,0x06,0x61,0x40,0xF1,0x00,0x59,0x06,0x60,0xFF,0x69,0x41,0x49,0x03,0x10,0xEE,0x59,0x01,0x60,0xEE,0x69,0x00,0x1C,0xDD,0x31,0x00,0x65,0x05,0x93,0x02,0x67,0x26,0x32,0xA0,0xF0,0x48,0xCB,0x04,0x94,0x00,0x18,0x2A,0xFF,0x0D,0x95,0x9D,0x67,0x4C,0xAC,0x05,0x94,0xA0,0xF0,0x48,0xCC,0x00,0x1C,0xE5,0x31,0x90,0x67,0x0A,0x97,0x09, +0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0x5D,0x67,0x03,0x46,0x10,0xD4,0x26,0x67,0x13,0xD7,0x06,0x04,0x40,0xF0,0xA4,0xCA,0x06,0x6E,0x00,0x18,0x2E,0x2E,0xB0,0x67,0x69,0xA1,0x9D,0x67,0x09,0xD3,0x40,0xF0,0x64,0xAC,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x4D,0xB3,0x48,0x32,0x69,0xE2,0x0A,0xD2,0x20,0xF0,0x58,0xA2,0x0D,0x72,0x3D,0x60,0x0E,0x52,0x03,0x60,0x06,0x72,0x04,0x60,0x7F,0x10,0x1B,0x72,0x36,0x60,0x7C,0x10,0x13,0x93,0x01,0x6A,0x00,0x6D,0x40,0xC3,0x80,0xA9,0xFF,0xF7,0x1F,0x6A,0x00,0x18,0xC5,0x4A,0x4C,0xEC,0x0A,0x94,0x00,0x18,0xFD,0x1D,0x28,0x4C,0x09,0x93,0x9D,0x67,0x40,0xF0,0x44,0xAC,0x01,0x73,0x14,0x60,0xFF,0xF7,0x1F,0x6C,0x20,0x18,0x7C,0x2F,0x4C,0xEC,0x62,0x67,0x0A,0x92,0xE0,0xF0,0x9F,0xA2,0xFF,0x6A,0x4C,0xEC,0x20,0x6A,0x4C,0xEC,0x01,0x2C,0x64,0x67,0x01,0x73,0x7D,0x67,0x40,0xF0,0x44,0xAB,0x06,0x60,0xFF,0xF7,0x1F,0x6C,0x00,0x18,0xAD,0xE1,0x4C,0xEC,0x52,0x10,0xFF,0xF7,0x1F,0x6C,0x4C,0xEC,0x80,0x18,0x2C,0x34,0x06,0x05,0x4B,0x10,0x00,0x6C,0x40,0x6B,0x1F,0x6A,0x66,0xC0,0x00,0xF0,0x47,0xC8,0x8C,0xC1,0x6A,0xC0,0x27,0xB3,0x00,0xF0,0x4B,0xC8,0x10,0x6A,0x90,0xC1,0x8F,0xC0,0x4E,0xC0,0x50,0xAB,0xBD,0x67,0xDD,0x67,0x50,0xC0,0x50,0xAB,0xE0,0x6B,0x44,0x4D,0x42,0x32,0x54,0xC1,0x20,0xB2,0x92,0xC0,0x20,0x4E,0x41,0xA2,0x91,0x67,0x01,0x6F,0x48,0x32,0x6C,0xEA,0x56,0x32,0xC0,0xF3,0x00,0x6B,0x6D,0xEA,0x00,0xF0,0x53,0xC8,0x13,0x93,0x01,0x6A,0x00,0x18,0x37,0x40,0x40,0xC3,0x02,0x67,0x16,0x22,0x5D,0x67,0x40,0xF0,0x84,0xAA,0xFF,0xF7,0x1F,0x6B,0x00,0x18,0xAE,0x5D,0x6C,0xEC,0x0A,0x94,0x0A,0x96,0x00,0x6F,0x60,0xF2,0xBC,0xAC,0x7F,0x4E,0x04,0xD2,0xFF,0xF7,0x1F,0x6A,0x90,0x67,0x4C,0xED,0x00,0x18,0x6F,0x4E,0x6E,0x4E,0x10,0x93,0x00,0x6C,0x80,0xC3,0x07,0x10,0x10,0x93,0x0C,0x6A,0x40,0xC3,0x03,0x10,0x10,0x94,0x00,0x6A,0x40,0xC4,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xC0,0x5B,0x11,0x80,0xFD,0x63,0x05,0x62,0x04,0xD0,0x00,0x1C,0xDD,0x31,0x00,0x65,0x02,0x67,0x0F,0xB2,0x0F,0xB3,0x40,0x9A, +0x6E,0xEA,0x00,0x6B,0x02,0x2A,0x0E,0xB2,0x60,0x9A,0x0E,0xB5,0x62,0x33,0x62,0x33,0x40,0x9D,0xFF,0xF7,0x1F,0x6C,0x60,0x33,0x60,0x33,0x8C,0xEA,0x6D,0xEA,0x40,0xDD,0x00,0x18,0xFE,0x25,0x00,0x6C,0x00,0x1C,0xE5,0x31,0x90,0x67,0x05,0x97,0x04,0x90,0x00,0xEF,0x03,0x63,0x44,0x91,0x10,0x80,0x32,0x97,0x79,0x23,0x48,0x91,0x10,0x80,0x30,0x00,0x00,0xB5,0xFC,0x63,0x06,0x62,0x05,0xD1,0x04,0xD0,0x2C,0xB5,0x01,0x68,0xFF,0x6E,0x40,0xF1,0x5E,0xA5,0x0C,0xEA,0x4A,0x22,0x2A,0xB2,0x00,0x6F,0xFF,0xF7,0x1F,0x6C,0x60,0xAA,0x02,0xF0,0x00,0x6A,0x6C,0xEA,0x25,0x2A,0x60,0xF1,0x42,0xA5,0xCC,0xEA,0x05,0x2A,0x01,0x10,0x00,0x6F,0x23,0xB2,0xE0,0xCA,0x2E,0x10,0x06,0x67,0x22,0xB1,0x23,0xB6,0x67,0x67,0xA4,0x67,0x64,0x34,0x69,0xE4,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x48,0x32,0x29,0xE2,0xE0,0xF0,0x4B,0xA2,0x0C,0xEA,0x01,0x72,0x05,0x61,0xC9,0xE4,0x40,0xAA,0xAC,0xEA,0x02,0x5A,0xE5,0x61,0x01,0x4B,0xAC,0xEB,0x0A,0x5B,0xEA,0x61,0x12,0x10,0x14,0xB2,0x60,0xAA,0x01,0x4B,0x60,0xCA,0x4F,0xAD,0x8C,0xEB,0x8C,0xEA,0x4A,0x32,0x8C,0xEA,0x43,0xEB,0x07,0x61,0x4D,0xAD,0x8C,0xEA,0x4A,0x32,0x8C,0xEA,0x43,0xEB,0x01,0x61,0xF0,0x67,0x09,0x27,0x00,0x18,0xB7,0xB5,0x00,0x65,0x00,0x18,0x31,0xBE,0x00,0x65,0x07,0xB2,0x00,0x6B,0x60,0xCA,0x06,0x97,0x05,0x91,0x04,0x90,0x00,0x6A,0x00,0xEF,0x04,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0xE0,0x00,0x00,0xB6,0xC8,0xA0,0x11,0x80,0x48,0x60,0x11,0x80,0x10,0x06,0x11,0x80,0xFD,0x63,0x04,0x62,0x44,0xAC,0x04,0x72,0x0F,0x61,0x0A,0xB2,0x00,0x6B,0x00,0x18,0x3B,0x2B,0x60,0xC2,0x08,0xB6,0x00,0x6B,0x0A,0x6D,0xFF,0x6C,0xC9,0xE3,0x01,0x4B,0x8C,0xEB,0x04,0x5B,0xA0,0xC2,0xFA,0x61,0x04,0x97,0x00,0xEF,0x03,0x63,0x00,0x00,0xFE,0x08,0x11,0x80,0xB4,0x5B,0x11,0x80,0xFD,0x63,0x04,0x62,0x80,0x18,0x91,0x2B,0x00,0x65,0x0E,0xB2,0x00,0x6B,0x0F,0xB4,0x60,0xCA,0x0D,0xB2,0x02,0xF0,0x00,0x6D,0x04,0x97,0x60,0xC2,0x0C,0xB2,0x01,0xF0,0x00,0x6B,0xA0,0xF0,0x72,0xCC,0x6C,0xCA,0xAE,0xCA,0x80,0xF0,0x43,0xA4,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0xA0,0xF0,0xB6,0xCC,0x80,0xF0,0x43,0xC4,0x00,0xEF,0x03,0x63,0xC8,0xA0,0x11,0x80,0xCA,0xA0,0x11,0x80,0xDC,0x00,0x11,0x80,0x48,0x5C,0x11, +0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0x44,0xAC,0xC9,0x72,0x24,0x61,0x00,0x1C,0xDD,0x31,0x00,0x65,0x15,0xB1,0x04,0xD2,0x60,0xF1,0x54,0xA1,0x40,0xF1,0x9E,0xA1,0x04,0x99,0x05,0xD2,0x80,0x6A,0x44,0xD9,0x55,0x6A,0x60,0xF1,0x54,0xC1,0x00,0x18,0xEB,0xA4,0x00,0x65,0x60,0xF1,0x54,0xA1,0x04,0xD9,0x55,0x72,0x04,0x60,0x00,0x18,0x31,0xBE,0x00,0x65,0x04,0x10,0x5D,0x67,0x54,0xA2,0x60,0xF1,0x54,0xC1,0x00,0x1C,0xE5,0x31,0x04,0x94,0x03,0x10,0x00,0x18,0x2F,0xB9,0x00,0x65,0x08,0x97,0x07,0x91,0x06,0x90,0x00,0xEF,0x05,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0xFD,0x63,0x04,0x62,0x00,0x18,0x24,0xB4,0x00,0x65,0x04,0x97,0x00,0xEF,0x03,0x63,0x0D,0xB2,0xFF,0xF7,0x1F,0x6B,0xAC,0xEB,0x43,0xA2,0x01,0x6D,0xAC,0xEA,0x10,0x22,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x07,0xB3,0x48,0x32,0x69,0xE2,0x60,0xF2,0x4D,0xA2,0xAA,0xEA,0x03,0x61,0x45,0x67,0x20,0xE8,0xA0,0xC4,0x20,0xE8,0x00,0x6A,0x00,0x46,0x11,0x80,0x48,0x60,0x11,0x80,0xF8,0x63,0x0E,0x62,0x0D,0xD1,0x0C,0xD0,0xC4,0x67,0xFF,0xF7,0x1F,0x6D,0xAC,0xEE,0xFF,0x76,0x68,0x60,0xC4,0x32,0xC9,0xE2,0x4C,0x32,0xCB,0xE2,0x35,0xB3,0x4C,0x32,0xCB,0xE2,0x48,0x32,0x65,0xE2,0xC0,0xF0,0x74,0xA9,0x40,0x6F,0xAC,0xEB,0x6C,0xEF,0x25,0x27,0x04,0x6A,0x6C,0xEA,0x08,0x22,0xE0,0xF0,0x8D,0x41,0x00,0xF1,0xA7,0x41,0x00,0x18,0x47,0x43,0x0A,0xD6,0x0A,0x96,0x7D,0x67,0x01,0x6A,0x58,0xC3,0x86,0x67,0x00,0x6A,0x03,0x6E,0xBD,0x67,0x5A,0xC3,0x00,0x68,0x00,0xF2,0x4A,0xC1,0x18,0x4D,0x64,0x6A,0xE6,0x67,0x04,0xD2,0x00,0x18,0xA0,0xDD,0x05,0xD0,0x02,0x6C,0x00,0x18,0xE0,0xDC,0xB0,0x67,0x6F,0x99,0x4D,0xEB,0x6F,0xD9,0x2D,0x10,0xE0,0xF0,0x4C,0xA1,0xFF,0x6C,0x01,0x72,0x1C,0xB2,0x15,0x61,0x43,0xA2,0x01,0x6B,0x6C,0xEA,0x04,0x22,0xC0,0xF2,0x58,0xA1,0x8C,0xEA,0x1F,0x2A,0x33,0x6A,0x7D,0x67,0xBD,0x67,0x58,0xC3,0x86,0x67,0x64,0x6A,0x18,0x4D,0x02,0x6E,0x04,0xD2,0x00,0x18,0xA0,0xDD,0x05,0xD7,0x12,0x10,0x43,0xA2,0x01,0x6B,0x6C,0xEA,0x04,0x22,0xC0,0xF2,0x57,0xA1,0x8C,0xEA,0x0A,0x2A,0x60,0xF2,0x4D,0xA1,0x8C,0xEA,0x01,0x72,0x05,0x61,0x9D,0x67,0x20,0x4C,0x80,0x18,0x3D,0x35,0xA6,0x67,0xC0,0xF0,0x54,0xA9,0x07,0x6B,0x6B,0xEB, +0x6C,0xEA,0xC0,0xF0,0x54,0xC9,0x0E,0x97,0x0D,0x91,0x0C,0x90,0x00,0xEF,0x08,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x00,0x46,0x11,0x80,0xFB,0x63,0x08,0x62,0x07,0xD1,0x06,0xD0,0xFF,0xF7,0x1F,0x6F,0xAC,0xEF,0xE4,0x32,0xE9,0xE2,0x4C,0x32,0xEB,0xE2,0x38,0xB3,0x4C,0x32,0xEB,0xE2,0x48,0x32,0x65,0xE2,0xC0,0xF0,0x54,0xA9,0xFF,0xF7,0x1F,0x6B,0xC4,0x67,0x6C,0xEA,0x02,0x6B,0x6C,0xEA,0x09,0x2A,0xC4,0xA4,0x01,0x6A,0x87,0x67,0x28,0x6D,0x4C,0xEE,0x20,0x18,0x9B,0x27,0x24,0x6F,0x52,0x10,0xF0,0xF0,0x0F,0x41,0xA5,0x46,0x90,0x67,0x08,0x6E,0x00,0x18,0x2E,0x2E,0x04,0xD7,0x29,0xB2,0x01,0x6D,0xFF,0x6E,0x60,0xA2,0x28,0xB2,0x04,0x97,0x83,0xA2,0xAC,0xEC,0x0E,0x24,0xC0,0xF2,0x56,0xA1,0xCC,0xEA,0x03,0x2A,0xC0,0xF2,0xB6,0xC1,0x0C,0x10,0x60,0xF2,0xBC,0xA9,0xFF,0xF7,0x1F,0x6A,0x00,0x6C,0x4C,0xED,0x29,0x10,0x20,0xF0,0x58,0xA1,0xCC,0xEA,0x03,0x72,0x1F,0x61,0x00,0xF1,0x46,0x81,0x00,0x52,0x17,0x60,0x7E,0x32,0x15,0x22,0xC0,0xF0,0x54,0xA9,0x04,0x68,0x03,0x6E,0x0D,0xEA,0x87,0x67,0xC0,0xF0,0x54,0xC9,0x00,0xF1,0xAF,0xC1,0x00,0x18,0x2D,0xE2,0xE6,0x67,0x7F,0x6C,0x00,0x18,0xE0,0xDC,0xB0,0x67,0x6F,0x99,0x4D,0xEB,0x6F,0xD9,0x13,0x10,0x80,0x18,0x4C,0x35,0x87,0x67,0x0F,0x10,0x60,0xF2,0xBC,0xA9,0xFF,0xF7,0x1F,0x6B,0x6C,0xED,0x00,0x18,0xF8,0x4E,0xD0,0x67,0xC0,0xF0,0x54,0xA9,0x03,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC9,0x08,0x97,0x07,0x91,0x06,0x90,0x01,0x6A,0x00,0xEF,0x05,0x63,0x48,0x60,0x11,0x80,0xC0,0x5B,0x11,0x80,0x00,0x46,0x11,0x80,0xFA,0x63,0x0A,0x62,0x09,0xD1,0x08,0xD0,0xFF,0xF7,0x1F,0x69,0xAC,0xE9,0x24,0x32,0x29,0xE2,0x4C,0x32,0x2B,0xE2,0x38,0xB3,0x4C,0x32,0x2B,0xE2,0x48,0x32,0x0C,0xD4,0x61,0xE2,0xC0,0xF0,0x54,0xA8,0x66,0xA4,0xFF,0xF7,0x1F,0x6C,0x8C,0xEA,0x04,0x6E,0xCC,0xEA,0x06,0x22,0x00,0xF1,0x4F,0xA0,0xFF,0x6D,0xAC,0xEA,0x6E,0xEA,0x0D,0x22,0x0C,0x92,0xFF,0x6C,0x7F,0x6D,0xE4,0xA2,0x24,0x6A,0x04,0xD2,0x8C,0xEF,0x01,0x6A,0x91,0x67,0x00,0x18,0xEF,0xE1,0x4C,0xEF,0x47,0x10,0x02,0x5B,0x0B,0x60,0x0C,0x95,0x6C,0x34,0x11,0xE4,0xE0,0xF0,0x1F,0x4C,0x08,0x4D,0x08,0x6E,0x00,0x18,0x2E,0x2E,0x06,0xD3,0x06,0x93,0x21,0xB2,0x01,0x6D,0x83,0xA2,0xAC,0xEC,0x15, +0x24,0xC0,0xF2,0x57,0xA0,0xFF,0x6C,0x8C,0xEA,0x07,0x2A,0x80,0x18,0x4C,0x35,0x91,0x67,0x01,0x6D,0xC0,0xF2,0xB7,0xC0,0x29,0x10,0x1A,0xB2,0x60,0xF2,0xBC,0xA8,0x00,0x6C,0xF0,0xA2,0x0C,0x92,0x08,0x4A,0x04,0xD2,0x11,0x10,0x20,0xF0,0x58,0xA0,0xFF,0x6D,0xAC,0xEA,0x03,0x72,0x04,0x61,0x00,0x18,0xA5,0xFF,0x91,0x67,0x16,0x10,0x10,0xB2,0x60,0xF2,0xBC,0xA8,0xF0,0xA2,0x0C,0x92,0x08,0x4A,0x04,0xD2,0xFF,0xF7,0x1F,0x6A,0x4C,0xED,0xFF,0x6A,0xC3,0x67,0x00,0x18,0x8A,0x41,0x4C,0xEF,0xC0,0xF0,0x54,0xA8,0x05,0x6B,0x6B,0xEB,0x6C,0xEA,0xC0,0xF0,0x54,0xC8,0x0A,0x97,0x09,0x91,0x08,0x90,0x00,0xEF,0x06,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x00,0x46,0x11,0x80,0xC0,0x5B,0x11,0x80,0xEF,0x63,0x20,0x62,0x1F,0xD1,0x1E,0xD0,0x64,0xAC,0xC4,0x67,0x24,0x73,0x22,0x61,0xB2,0xB2,0x60,0xF1,0x50,0xA2,0x1E,0x22,0x7D,0x67,0x01,0xF4,0x03,0x6A,0x40,0xF0,0x58,0xCB,0x00,0x1C,0xDD,0x31,0x00,0x65,0x00,0x18,0xFE,0x4F,0x02,0x67,0x00,0x6D,0x9D,0x67,0xC5,0x67,0x80,0x18,0x95,0x2B,0x58,0x4C,0x80,0x18,0x6B,0x2F,0x03,0x6C,0x00,0x18,0xC4,0x53,0x00,0x6C,0x20,0x18,0x10,0x2F,0x00,0x65,0x00,0x1C,0xE5,0x31,0x90,0x67,0x3C,0x11,0xFF,0xF7,0x1F,0x69,0x51,0x67,0x6C,0xEA,0x9C,0x72,0x1D,0x61,0x00,0x9E,0xFF,0x6F,0x44,0xA0,0x46,0x32,0x2C,0xEA,0x18,0x72,0x16,0x61,0xBA,0xA0,0x99,0xA0,0xDD,0x67,0xEC,0xED,0xEC,0xEC,0x00,0x18,0x1A,0xDF,0x5A,0x4E,0x06,0x2A,0xBD,0x67,0x40,0xF0,0x9A,0xAD,0x20,0x18,0x62,0x23,0x2C,0xEC,0x20,0x18,0xCF,0x06,0x90,0x67,0x93,0xB2,0xB0,0x67,0x80,0x9A,0x12,0x11,0xFF,0xF7,0x1F,0x6C,0x44,0x67,0x6C,0xEA,0x93,0x72,0x29,0x61,0x00,0x9E,0x44,0xA0,0x46,0x32,0x11,0x72,0x07,0x60,0x7F,0x72,0x22,0x61,0x45,0xA0,0xFF,0x6B,0x6C,0xEA,0x17,0x72,0x1D,0x61,0x6B,0xA8,0x8C,0xEB,0xFF,0x73,0x19,0x60,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x84,0xB3,0x48,0x32,0x69,0xE2,0xBF,0x9A,0x82,0x67,0x00,0x18,0xB2,0x69,0x1C,0xD6,0x01,0x72,0x64,0xA0,0x1C,0x96,0x03,0x61,0x01,0x6A,0x6D,0xEA,0x03,0x10,0x02,0x6A,0x4B,0xEA,0x6C,0xEA,0x44,0xC0,0x44,0xAE,0xFF,0xF7,0x1F,0x6C,0x93,0x72,0xE0,0xF0,0x01,0x61,0x40,0x9E,0x18,0xD2,0x18,0x95,0x64,0xA2,0xFF,0x6A,0xA5,0xA5,0x22,0x67,0x6C,0xE9, +0x4C,0xED,0x18,0x92,0x19,0xD5,0x26,0x31,0x4B,0xAA,0x8C,0xE9,0x7F,0x71,0x8C,0xEA,0x1A,0xD2,0x02,0x61,0x04,0x75,0x07,0x60,0x28,0x71,0x05,0x60,0x2D,0x71,0x03,0x60,0x2E,0x71,0xC0,0xF0,0x06,0x61,0xFF,0x68,0xC1,0x9E,0x50,0x67,0x6C,0xEA,0x18,0x93,0x46,0x31,0xA6,0x67,0x9D,0x67,0xDA,0xC3,0x0C,0xE9,0x5C,0x4C,0x0C,0xED,0x00,0x18,0x3B,0x94,0x1C,0xD6,0x7F,0x71,0x58,0x67,0x1B,0xD2,0x1C,0x96,0x04,0x22,0xE1,0xF4,0x03,0x6F,0x00,0x6B,0x05,0x10,0x18,0x94,0x01,0xF4,0x16,0x6F,0x65,0xA4,0x0C,0xEB,0x10,0x6A,0x04,0xD2,0x5B,0xB2,0x18,0x95,0x08,0xD3,0x05,0xD2,0x17,0x92,0x07,0xD1,0x01,0x6B,0x06,0xD2,0x59,0xA5,0x0A,0xD6,0x04,0x6C,0x09,0xD2,0x44,0xA5,0x6C,0xEA,0x0B,0xD2,0x4B,0xAD,0x0C,0xD2,0x54,0xB2,0x49,0xE6,0x44,0xA2,0x82,0xF6,0x17,0x6E,0x6C,0xEA,0x0D,0xD2,0x44,0xA5,0x0E,0xD2,0x45,0xA5,0x0F,0xD2,0x46,0xA5,0x10,0xD2,0x47,0xA5,0x11,0xD2,0x48,0xA5,0x12,0xD2,0x49,0xA5,0x13,0xD2,0x4A,0xA5,0x14,0xD2,0x4B,0xA5,0xFA,0x6D,0x20,0x18,0x1B,0x32,0x15,0xD2,0x1A,0x92,0xFF,0x72,0x72,0x60,0x1A,0x93,0x44,0x32,0xFF,0x6C,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x3F,0xB3,0x48,0x32,0x61,0xE2,0xE0,0xF0,0x4B,0xA0,0x8C,0xEA,0x01,0x72,0x62,0x61,0x20,0xF0,0x58,0xA0,0xFF,0x6D,0xAC,0xEA,0x0B,0x72,0x13,0x61,0x37,0xB2,0x18,0x95,0x00,0x18,0xE0,0x1D,0x80,0x9A,0x00,0xF2,0x54,0xA0,0xFF,0x6B,0x6C,0xEA,0x01,0x72,0x5B,0x61,0x8D,0x98,0x00,0x18,0x1A,0x1E,0x00,0x6D,0x00,0x6A,0x00,0xF2,0x54,0xC0,0x53,0x10,0x1A,0x94,0x00,0x18,0x5E,0xDE,0x18,0x95,0x1B,0x94,0x08,0x2C,0x19,0x95,0x04,0x75,0x05,0x61,0x18,0x94,0x80,0x18,0xCA,0x35,0x1A,0x95,0x3B,0x10,0x28,0x71,0x05,0x61,0x18,0x94,0x80,0x18,0x8A,0x35,0x1A,0x95,0x34,0x10,0x2D,0x71,0x15,0x61,0x20,0xF0,0x58,0xA0,0x03,0x72,0x2E,0x60,0x05,0x72,0x2C,0x60,0x06,0x72,0x2A,0x60,0x07,0x72,0x28,0x60,0x08,0x72,0x26,0x60,0x09,0x72,0x24,0x60,0x0A,0x72,0x22,0x60,0x18,0x94,0x00,0x18,0x35,0xFC,0x1A,0x95,0x1D,0x10,0x2E,0x71,0x1B,0x61,0x20,0xF0,0x58,0xA0,0x03,0x72,0x0C,0x60,0x05,0x72,0x0A,0x60,0x06,0x72,0x08,0x60,0x07,0x72,0x06,0x60,0x08,0x72,0x04,0x60,0x09,0x72,0x02,0x60,0x0A,0x72,0x07,0x61,0x1A,0x94,0x2E,0x6D,0x02,0x6E,0x20,0x18,0x9B, +0x27,0x24,0x6F,0x04,0x10,0x18,0x94,0x00,0x18,0x0B,0xFC,0x1A,0x95,0x09,0xB2,0x18,0x95,0x80,0x9A,0x00,0x18,0xE0,0x1D,0x00,0x65,0x03,0x10,0x20,0x18,0xFA,0x24,0x86,0x67,0x20,0x97,0x1F,0x91,0x1E,0x90,0x00,0xEF,0x11,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0x64,0x52,0x11,0x80,0x48,0x60,0x11,0x80,0xF0,0xA5,0x10,0x80,0x04,0x46,0x11,0x80,0xFF,0x63,0x00,0xD0,0x0F,0xB0,0xFF,0xF7,0x1F,0x6A,0x4C,0xEC,0x00,0x6B,0xE2,0x67,0xFF,0x6E,0x64,0x32,0x69,0xE2,0x48,0x32,0x6B,0xE2,0x48,0x32,0x15,0xE2,0x43,0xAD,0xEC,0xEA,0x8E,0xEA,0x05,0x2A,0x42,0x9D,0x08,0x72,0x02,0x61,0x00,0x6A,0x05,0x10,0x01,0x4B,0xCC,0xEB,0x03,0x5B,0xED,0x61,0x01,0x6A,0x00,0x90,0x20,0xE8,0x01,0x63,0x98,0x5F,0x11,0x80,0xFD,0x63,0x04,0x62,0x16,0xB2,0x00,0x6B,0x60,0xF1,0x43,0xA2,0x01,0x72,0x14,0x61,0x14,0xB6,0x83,0x67,0xFF,0x6D,0x84,0x32,0x89,0xE2,0x4C,0x32,0x8B,0xE2,0x4C,0x32,0x8B,0xE2,0x48,0x32,0xC9,0xE2,0xE0,0xF0,0x4B,0xA2,0xAC,0xEA,0x01,0x72,0x0D,0x60,0x01,0x4C,0xAC,0xEC,0x0A,0x5C,0xEF,0x61,0x09,0xB2,0x60,0xF1,0x43,0xA2,0x02,0x5A,0x02,0x60,0x43,0x67,0x07,0x23,0x0C,0x6A,0x05,0x10,0x80,0x18,0xC5,0x36,0x00,0x65,0x62,0x67,0xF2,0x17,0x04,0x97,0x00,0xEF,0x03,0x63,0x00,0x00,0x48,0x5C,0x11,0x80,0x48,0x60,0x11,0x80,0xF9,0x63,0x0C,0x62,0x0B,0xD1,0x0A,0xD0,0x00,0x6A,0x0F,0xD5,0x06,0xD2,0x40,0xAC,0x24,0x67,0x01,0xF0,0x0B,0x72,0x0C,0x61,0xBD,0x67,0x80,0x18,0x0D,0x2C,0x10,0x4D,0x80,0xA9,0xFF,0xF7,0x1F,0x6B,0xA2,0x67,0x00,0x18,0xC5,0x4A,0x6C,0xEC,0xAC,0x10,0x00,0xF4,0x19,0x72,0x2C,0x61,0x49,0xA4,0x03,0x5A,0x02,0x61,0x01,0x6A,0x49,0xC4,0x7D,0x67,0x58,0xA3,0x00,0x1C,0xDD,0x31,0x52,0xC3,0xBD,0x67,0x91,0x67,0x12,0x4D,0x00,0x18,0xB7,0x45,0x07,0xD2,0x02,0x67,0x0C,0x2A,0xA9,0xA1,0xFF,0x6B,0x20,0x6A,0x6C,0xED,0xB8,0x35,0x4D,0xED,0xFF,0xF7,0x1F,0x6A,0xAA,0x6C,0x00,0x18,0xB6,0x33,0x4C,0xED,0x00,0x1C,0xE5,0x31,0x07,0x94,0x7D,0x67,0x52,0xA3,0xFF,0x6B,0x6C,0xEA,0x61,0x2A,0x80,0xA9,0xFF,0xF7,0x1F,0x6A,0xB0,0x67,0x4C,0xEC,0x58,0x10,0x00,0xF4,0x05,0x72,0x06,0x61,0x4B,0xA4,0x03,0x5A,0x79,0x61,0x01,0x6A,0x4B,0xC4,0x76,0x10,0x41,0xF4,0x12,0x72,0x10,0x61,0x00,0x18,0xE5,0x41,0x00,0x65,0x06,0x94, +0x00,0x18,0x78,0x36,0x02,0x67,0x80,0xA9,0x06,0x96,0xFF,0xF7,0x1F,0x6A,0x4C,0xEC,0x00,0x18,0x33,0x4B,0xB0,0x67,0x3F,0x10,0x01,0xF0,0x04,0x72,0x3F,0x61,0x04,0xA4,0xFF,0xF7,0x1F,0x6A,0xFF,0xF7,0x1F,0x6B,0x00,0x30,0x4C,0xE8,0x43,0xA4,0xBD,0x67,0x14,0x4D,0x4D,0xE8,0x6C,0xE8,0x00,0x18,0x2A,0xDF,0x90,0x67,0x04,0x22,0x5D,0x67,0x0A,0xCA,0x02,0x6A,0x23,0x10,0x7D,0x67,0xAA,0xAB,0xFF,0xF7,0x1F,0x6B,0xAC,0xEB,0x64,0x32,0x69,0xE2,0x4C,0x32,0x6B,0xE2,0x4C,0x32,0x6B,0xE2,0x27,0xB3,0x48,0x32,0x69,0xE2,0x20,0xF0,0x78,0xA2,0xFF,0x6A,0x4C,0xEB,0x12,0x73,0x0A,0x60,0x19,0x73,0x08,0x60,0x80,0xA9,0xFF,0xF7,0x1F,0x6A,0x0C,0x6D,0x00,0x18,0xC5,0x4A,0x4C,0xEC,0x2E,0x10,0xFF,0xF7,0x1F,0x6C,0x00,0x18,0x0C,0x48,0xAC,0xEC,0x80,0xA9,0xA2,0x67,0x00,0x18,0xC5,0x4A,0x00,0x65,0x01,0x6B,0x06,0xD3,0x21,0x10,0x21,0xF4,0x06,0x72,0x1E,0x61,0x80,0x18,0xD6,0x36,0x00,0x65,0x10,0x2A,0x14,0xB0,0x7D,0x67,0x78,0xA3,0x60,0xF1,0x43,0xA0,0x91,0x67,0x60,0xF1,0x63,0xC0,0x00,0x18,0xFC,0x52,0x08,0xD2,0x7D,0x67,0x20,0xF0,0x60,0xA3,0x60,0xF1,0x63,0xC0,0x80,0xA9,0x06,0x96,0xFF,0xF7,0x1F,0x6B,0x6C,0xEC,0x00,0x18,0x33,0x4B,0xA2,0x67,0x01,0x6A,0x06,0xD2,0x06,0x92,0x03,0x22,0x0F,0x93,0x66,0x6A,0x40,0xC3,0x0C,0x97,0x0B,0x91,0x0A,0x90,0x01,0x6A,0x00,0xEF,0x07,0x63,0x00,0x00,0x48,0x60,0x11,0x80,0x48,0x5C,0x11,0x80,0xF5,0x63,0x14,0x62,0x13,0xD1,0x12,0xD0,0x00,0x6D,0x17,0xF7,0x0C,0x6E,0x00,0x18,0x01,0xA0,0x33,0x6C,0x61,0xB4,0x20,0x18,0xD6,0x32,0x00,0x69,0x20,0x18,0x5B,0x30,0x00,0x65,0x00,0x18,0xA6,0x5C,0x00,0x65,0x00,0x18,0xC8,0x8A,0x00,0x65,0x00,0x18,0xA3,0x9B,0x00,0x65,0x5A,0xB4,0x00,0x18,0x44,0x81,0x00,0x65,0x59,0xB0,0x00,0x18,0x4C,0x81,0x90,0x67,0x87,0x40,0x00,0x18,0x4C,0x81,0x01,0x4C,0x56,0xB4,0x57,0xB5,0x20,0xC0,0x00,0x18,0x2E,0x2E,0x30,0x6E,0x55,0xB5,0x88,0x40,0xD8,0x4C,0x00,0x18,0x2E,0x2E,0x30,0x6E,0x53,0xB5,0x87,0x40,0x11,0x4C,0x00,0x18,0x2E,0x2E,0x18,0x6E,0x51,0xB0,0x03,0x6B,0x40,0x98,0x42,0x32,0x4A,0x32,0x6C,0xEA,0x6A,0xEA,0x05,0x60,0x4E,0xB2,0x20,0xF1,0x2C,0xC2,0x20,0xF1,0x36,0xC2,0x00,0x18,0x04,0xF6,0x00,0x65,0x00,0x18,0x48,0x3C,0x00,0x65,0x00,0x18,0x71, +0x32,0x00,0x65,0x00,0x18,0xE2,0x24,0x00,0x65,0x00,0x18,0x9A,0x7E,0x00,0x65,0x00,0x18,0xB5,0xC8,0x00,0x65,0x45,0xB3,0x43,0xB2,0x60,0xDA,0x00,0x18,0x0B,0x2B,0x00,0x65,0x40,0x98,0x0F,0x6B,0x46,0x32,0x6C,0xEA,0x03,0x72,0x05,0x61,0x9D,0x67,0x40,0x4C,0x00,0x18,0x1B,0x28,0x00,0x6D,0x00,0x18,0xE9,0x2F,0x00,0x65,0x80,0x18,0x54,0x2A,0x00,0x65,0x20,0x18,0xA2,0x39,0x00,0x65,0x80,0x18,0x08,0x2A,0x00,0x65,0x00,0x1C,0xAD,0x31,0x00,0x65,0x29,0xF6,0x00,0x6D,0x00,0x18,0x17,0x2D,0x01,0x6C,0x09,0x6A,0x04,0xD2,0x32,0xB2,0x2F,0xB3,0x01,0x6C,0x05,0xD2,0x9B,0xF4,0x0D,0x6A,0x06,0xD2,0x32,0xF0,0x0E,0x6A,0x07,0xD2,0x2E,0xB2,0xFA,0x6D,0x8A,0xF2,0x01,0x6E,0x40,0x9A,0xA1,0xF3,0x16,0x6F,0x08,0xD2,0x40,0xF0,0x41,0xA3,0x09,0xD2,0x40,0xF0,0x40,0xA3,0x0A,0xD2,0x20,0xF0,0x5F,0xA3,0x0B,0xD2,0x20,0xF0,0x5E,0xA3,0x0C,0xD2,0x20,0xF0,0x5D,0xA3,0x0D,0xD2,0x20,0xF0,0x5C,0xA3,0x20,0x18,0x1B,0x32,0x0E,0xD2,0x21,0xB2,0x22,0xB3,0x40,0x9A,0x6E,0xEA,0x19,0x2A,0x21,0xB1,0x21,0xB3,0x40,0x99,0x6E,0xEA,0x14,0x2A,0x20,0xB0,0x21,0xB2,0x21,0xB3,0x80,0x98,0x8C,0xEA,0x6E,0xEA,0x0B,0x2A,0x20,0xB3,0x00,0xF6,0x82,0x32,0x00,0x6D,0x3F,0xF4,0x00,0x6C,0x00,0x18,0xFA,0x8B,0x40,0xC3,0x00,0x6A,0x40,0xD8,0x00,0x6A,0x40,0xD9,0x13,0xB3,0x12,0xB2,0x20,0x18,0x3D,0x36,0x60,0xDA,0x14,0x97,0x13,0x91,0x12,0x90,0x00,0xEF,0x0B,0x63,0x84,0xC8,0x00,0x80,0x03,0x00,0x00,0xC4,0x98,0x24,0x11,0x80,0x38,0x24,0x11,0x80,0x58,0xDF,0x10,0x80,0xA0,0xDF,0x10,0x80,0x88,0xDF,0x10,0x80,0x6C,0x1D,0x11,0x80,0xDC,0x00,0x11,0x80,0x5C,0xA1,0x00,0xB0,0x00,0x00,0x01,0x00,0xF0,0xA5,0x10,0x80,0x90,0x1E,0x11,0x80,0x3C,0x91,0x10,0x80,0xEF,0xBE,0x23,0x87,0x44,0x91,0x10,0x80,0x32,0x97,0x79,0x23,0x40,0x91,0x10,0x80,0xFF,0xFF,0xFF,0x00,0xEE,0xFF,0xC0,0x00,0xD0,0x00,0x11,0x80,0x00,0x00,0x00,0x00,0x2E,0x5A,0x2C,0x4B,0xCF,0x9D,0xF2,0xCB,0x74,0x9C,0x13,0xCE,0x57,0xF4,0x4C,0x54,0x48,0xA9,0xD3,0x53,0xC5,0x19,0x73,0x6F,0xF7,0xEB,0x68,0x53,0xCC,0xAE,0x50,0xF1,0x57,0x02,0xE2,0x66,0xA3,0x5C,0xBC,0xD3,0xB7,0xA6,0x2F,0xC9,0xAE,0xDC,0x77,0x9E,0x07,0x91,0x5F,0x86,0x91,0x8D,0xDC,0x27,0x00,0x5D,0xF1,0xD6,0xCF,0x0C,0x14,0x2B, +0x62,0x5E,0xD2,0xEF,0xF4,0xA5,0x18,0xFF,0x15,0x20,0x70,0x09,0x98,0x44,0x21,0xA6,0x58,0x6F,0x9F,0xC3,0xFE,0x7E,0x43,0x29,0xD2,0x80,0x9E,0xA5,0x11,0x25,0xF8,0xED,0xB0,0x9D,0x42,0xB8,0x1B,0xC5,0xBD,0x00,0x9F,0x79,0xE4,0xB5,0x9D,0xBB,0xAA,0x85,0x7F,0xCA,0x85,0x6F,0xB9,0xF7,0xEA,0x25,0x07,0x04,0x05,0x01,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x04,0x00,0x00,0x00,0x01,0x03,0x02,0x04,0x00,0x00,0x00,0x00,0x1B,0x00,0xB7,0x00,0x53,0x01,0x36,0x00,0x6F,0x01,0xA7,0x02,0x53,0x00,0x28,0x02,0xFD,0x03,0x25,0x00,0x04,0x0B,0x0F,0x04,0x0A,0x0E,0x08,0x0B,0x0F,0x00,0x00,0x00,0x05,0x41,0x32,0x12,0x00,0x00,0x00,0x00,0x8D,0xDC,0x2E,0x90, +}; + +#endif //CONFIG_MP_INCLUDED + +#ifndef CONFIG_PHY_SETTING_WITH_ODM +u32 Rtl8723UPHY_REG_2TArray[Rtl8723UPHY_REG_2TArrayLength] = { +0x0, }; + +u32 Rtl8723UPHY_REG_1TArray[Rtl8723UPHY_REG_1TArrayLength] = { +0x800,0x80040000, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66f60110, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000760, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xa78,0x00000900, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x69543420, +0xc54,0x43bc0094, +0xc58,0x69543420, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x7116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8723UPHY_ChangeTo_1T1RArray[Rtl8723UPHY_ChangeTo_1T1RArrayLength] = { +0x0, }; + +u32 Rtl8723UPHY_ChangeTo_1T2RArray[Rtl8723UPHY_ChangeTo_1T2RArrayLength] = { +0x0, }; + +u32 Rtl8723UPHY_ChangeTo_2T2RArray[Rtl8723UPHY_ChangeTo_2T2RArrayLength] = { +0x0, }; + + +u32 Rtl8723UPHY_REG_1T_mCardArray[Rtl8723UPHY_REG_1T_mCardArrayLength] = { +0x800,0x80040000, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66f60110, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000760, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xa78,0x00000900, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x69543420, +0xc54,0x43bc0094, +0xc58,0x69543420, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x7116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8723UPHY_REG_1T_SDIOArray[Rtl8723UPHY_REG_1T_SDIOArrayLength] = { +0x800,0x80040000, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66f60110, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000760, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xa78,0x00000900, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x69543420, +0xc54,0x43bc0094, +0xc58,0x69543420, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x7116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8723URadioA_2TArray[Rtl8723URadioA_2TArrayLength] = { +0x0, }; + +u32 Rtl8723URadioB_2TArray[Rtl8723URadioB_2TArrayLength] = { +0x0, }; + +u32 Rtl8723URadioA_1TArray[Rtl8723URadioA_1TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00039c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001a3f1, +0x00b,0x00014787, +0x00c,0x000896fe, +0x00d,0x0000e02c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00030355, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0000024f, +0x01f,0x00000000, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x00057730, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f474, +0x015,0x0004f477, +0x015,0x0008f474, +0x015,0x000cf474, +0x016,0x00000339, +0x016,0x00040339, +0x016,0x00080339, +0x016,0x000c0366, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00000003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00000247, +0x01f,0x00000000, +0x000,0x00030159, +}; + +u32 Rtl8723URadioB_1TArray[Rtl8723URadioB_1TArrayLength] = { +0x0, }; + +u32 Rtl8723URadioA_1T_mCardArray[Rtl8723URadioA_1T_mCardArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001a3f1, +0x00b,0x00014787, +0x00c,0x000896fe, +0x00d,0x0000e02c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00030355, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x00057730, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x00000339, +0x016,0x00040339, +0x016,0x00080339, +0x016,0x000c0356, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u32 Rtl8723URadioA_1T_SDIOArray[Rtl8723URadioA_1T_SDIOArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00039c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001a3f1, +0x00b,0x00014787, +0x00c,0x000896fe, +0x00d,0x0000e02c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00030355, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0000024f, +0x01f,0x00000000, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x00057730, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f474, +0x015,0x0004f477, +0x015,0x0008f474, +0x015,0x000cf474, +0x016,0x00000339, +0x016,0x00040339, +0x016,0x00080339, +0x016,0x000c0366, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00000003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00000247, +0x01f,0x00000000, +0x000,0x00030159, +}; + +u32 Rtl8723URadioB_GM_Array[Rtl8723URadioB_GM_ArrayLength] = { +0x0, }; + +u32 Rtl8723UMAC_2T_Array[Rtl8723UMAC_2T_ArrayLength] = { +0x420,0x00000080, +0x423,0x00000000, +0x430,0x00000000, +0x431,0x00000000, +0x432,0x00000000, +0x433,0x00000001, +0x434,0x00000004, +0x435,0x00000005, +0x436,0x00000006, +0x437,0x00000007, +0x438,0x00000000, +0x439,0x00000000, +0x43a,0x00000000, +0x43b,0x00000001, +0x43c,0x00000004, +0x43d,0x00000005, +0x43e,0x00000006, +0x43f,0x00000007, +0x440,0x0000005d, +0x441,0x00000001, +0x442,0x00000000, +0x444,0x00000015, +0x445,0x000000f0, +0x446,0x0000000f, +0x447,0x00000000, +0x458,0x00000041, +0x459,0x000000a8, +0x45a,0x00000072, +0x45b,0x000000b9, +0x460,0x00000066, +0x461,0x00000066, +0x462,0x00000008, +0x463,0x00000003, +0x4c8,0x000000ff, +0x4c9,0x00000008, +0x4cc,0x000000ff, +0x4cd,0x000000ff, +0x4ce,0x00000001, +0x500,0x00000026, +0x501,0x000000a2, +0x502,0x0000002f, +0x503,0x00000000, +0x504,0x00000028, +0x505,0x000000a3, +0x506,0x0000005e, +0x507,0x00000000, +0x508,0x0000002b, +0x509,0x000000a4, +0x50a,0x0000005e, +0x50b,0x00000000, +0x50c,0x0000004f, +0x50d,0x000000a4, +0x50e,0x00000000, +0x50f,0x00000000, +0x512,0x0000001c, +0x514,0x0000000a, +0x515,0x00000010, +0x516,0x0000000a, +0x517,0x00000010, +0x51a,0x00000016, +0x524,0x0000000f, +0x525,0x0000004f, +0x546,0x00000040, +0x547,0x00000000, +0x550,0x00000010, +0x551,0x00000010, +0x559,0x00000002, +0x55a,0x00000002, +0x55d,0x000000ff, +0x605,0x00000030, +0x608,0x0000000e, +0x609,0x0000002a, +0x652,0x00000020, +0x63c,0x0000000a, +0x63d,0x0000000e, +0x63e,0x0000000a, +0x63f,0x0000000e, +0x66e,0x00000005, +0x700,0x00000021, +0x701,0x00000043, +0x702,0x00000065, +0x703,0x00000087, +0x708,0x00000021, +0x709,0x00000043, +0x70a,0x00000065, +0x70b,0x00000087, +}; + + +u32 Rtl8723UAGCTAB_2TArray[Rtl8723UAGCTAB_2TArrayLength] = { +0x0, }; + +u32 Rtl8723UAGCTAB_1TArray[Rtl8723UAGCTAB_1TArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7a060001, +0xc78,0x79070001, +0xc78,0x78080001, +0xc78,0x77090001, +0xc78,0x760a0001, +0xc78,0x750b0001, +0xc78,0x740c0001, +0xc78,0x730d0001, +0xc78,0x720e0001, +0xc78,0x710f0001, +0xc78,0x70100001, +0xc78,0x6f110001, +0xc78,0x6e120001, +0xc78,0x6d130001, +0xc78,0x6c140001, +0xc78,0x6b150001, +0xc78,0x6a160001, +0xc78,0x69170001, +0xc78,0x68180001, +0xc78,0x67190001, +0xc78,0x661a0001, +0xc78,0x651b0001, +0xc78,0x641c0001, +0xc78,0x631d0001, +0xc78,0x621e0001, +0xc78,0x611f0001, +0xc78,0x60200001, +0xc78,0x49210001, +0xc78,0x48220001, +0xc78,0x47230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7a460001, +0xc78,0x79470001, +0xc78,0x78480001, +0xc78,0x77490001, +0xc78,0x764a0001, +0xc78,0x754b0001, +0xc78,0x744c0001, +0xc78,0x734d0001, +0xc78,0x724e0001, +0xc78,0x714f0001, +0xc78,0x70500001, +0xc78,0x6f510001, +0xc78,0x6e520001, +0xc78,0x6d530001, +0xc78,0x6c540001, +0xc78,0x6b550001, +0xc78,0x6a560001, +0xc78,0x69570001, +0xc78,0x68580001, +0xc78,0x67590001, +0xc78,0x665a0001, +0xc78,0x655b0001, +0xc78,0x645c0001, +0xc78,0x635d0001, +0xc78,0x625e0001, +0xc78,0x615f0001, +0xc78,0x60600001, +0xc78,0x49610001, +0xc78,0x48620001, +0xc78,0x47630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + + +#endif//ENDIF CONFIG_PHY_SETTING_WITH_ODM + +u32 Rtl8723UPHY_REG_Array_PG[Rtl8723UPHY_REG_Array_PGLength] = { +0xe00,0xffffffff,0x0a0c0c0c, +0xe04,0xffffffff,0x02040608, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x0a0c0d0e, +0xe14,0xffffffff,0x02040608, +0xe18,0xffffffff,0x0a0c0d0e, +0xe1c,0xffffffff,0x02040608, +0x830,0xffffffff,0x0a0c0c0c, +0x834,0xffffffff,0x02040608, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x0a0c0d0e, +0x848,0xffffffff,0x02040608, +0x84c,0xffffffff,0x0a0c0d0e, +0x868,0xffffffff,0x02040608, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x06060606, +0xe14,0xffffffff,0x00020406, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x06060606, +0x848,0xffffffff,0x00020406, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u32 Rtl8723UMACPHY_Array_PG[Rtl8723UMACPHY_Array_PGLength] = { +0x0, }; + +#if MP_DRIVER == 1 + +u32 Rtl8723UPHY_REG_Array_MP[Rtl8723UPHY_REG_Array_MPLength] = { +0xc30,0x69e9ac4a, +0xc3c,0x0a979718, +}; + +#endif//#if MP_DRIVER == 1 + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.h index 732e05c8d94a..2512b91bf7a2 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.h @@ -1,75 +1,75 @@ -#ifndef __INC_HAL8723U_FW_IMG_H -#define __INC_HAL8723U_FW_IMG_H - -/*Created on 2013/01/14, 15:51*/ - -//FW v16 enable usb interrupt -#define Rtl8723UImgArrayLength 22172 -extern u8 Rtl8723UFwImgArray[Rtl8723UImgArrayLength]; -#define Rtl8723UBTImgArrayLength 1 -extern u8 Rtl8723UFwBTImgArray[Rtl8723UBTImgArrayLength]; - -#define Rtl8723UUMCBCutImgArrayWithBTLength 24118 -#define Rtl8723UUMCBCutImgArrayWithoutBTLength 19200 - -extern u8 Rtl8723UFwUMCBCutImgArrayWithBT[Rtl8723UUMCBCutImgArrayWithBTLength]; -extern u8 Rtl8723UFwUMCBCutImgArrayWithoutBT[Rtl8723UUMCBCutImgArrayWithoutBTLength]; - -#define Rtl8723SUMCBCutMPImgArrayLength 24174 -extern const u8 Rtl8723SFwUMCBCutMPImgArray[Rtl8723SUMCBCutMPImgArrayLength]; - -#define Rtl8723EBTImgArrayLength 15275 -extern u8 Rtl8723EFwBTImgArray[Rtl8723EBTImgArrayLength] ; - - -#ifndef CONFIG_PHY_SETTING_WITH_ODM -#define Rtl8723UPHY_REG_2TArrayLength 1 -extern u32 Rtl8723UPHY_REG_2TArray[Rtl8723UPHY_REG_2TArrayLength]; -#define Rtl8723UPHY_REG_1TArrayLength 372 -extern u32 Rtl8723UPHY_REG_1TArray[Rtl8723UPHY_REG_1TArrayLength]; -#define Rtl8723UPHY_ChangeTo_1T1RArrayLength 1 -extern u32 Rtl8723UPHY_ChangeTo_1T1RArray[Rtl8723UPHY_ChangeTo_1T1RArrayLength]; -#define Rtl8723UPHY_ChangeTo_1T2RArrayLength 1 -extern u32 Rtl8723UPHY_ChangeTo_1T2RArray[Rtl8723UPHY_ChangeTo_1T2RArrayLength]; -#define Rtl8723UPHY_ChangeTo_2T2RArrayLength 1 -extern u32 Rtl8723UPHY_ChangeTo_2T2RArray[Rtl8723UPHY_ChangeTo_2T2RArrayLength]; - -#define Rtl8723UPHY_REG_1T_mCardArrayLength 372 -extern u32 Rtl8723UPHY_REG_1T_mCardArray[Rtl8723UPHY_REG_1T_mCardArrayLength]; -#define Rtl8723UPHY_REG_1T_SDIOArrayLength 372 -extern u32 Rtl8723UPHY_REG_1T_SDIOArray[Rtl8723UPHY_REG_1T_SDIOArrayLength]; -#define Rtl8723URadioA_2TArrayLength 1 -extern u32 Rtl8723URadioA_2TArray[Rtl8723URadioA_2TArrayLength]; -#define Rtl8723URadioB_2TArrayLength 1 -extern u32 Rtl8723URadioB_2TArray[Rtl8723URadioB_2TArrayLength]; -#define Rtl8723URadioA_1TArrayLength 282 -extern u32 Rtl8723URadioA_1TArray[Rtl8723URadioA_1TArrayLength]; -#define Rtl8723URadioB_1TArrayLength 1 -extern u32 Rtl8723URadioB_1TArray[Rtl8723URadioB_1TArrayLength]; -#define Rtl8723URadioA_1T_mCardArrayLength 282 -extern u32 Rtl8723URadioA_1T_mCardArray[Rtl8723URadioA_1T_mCardArrayLength]; -#define Rtl8723URadioA_1T_SDIOArrayLength 282 -extern u32 Rtl8723URadioA_1T_SDIOArray[Rtl8723URadioA_1T_SDIOArrayLength]; -#define Rtl8723URadioB_GM_ArrayLength 1 -extern u32 Rtl8723URadioB_GM_Array[Rtl8723URadioB_GM_ArrayLength]; -#define Rtl8723UMAC_2T_ArrayLength 172 -extern u32 Rtl8723UMAC_2T_Array[Rtl8723UMAC_2T_ArrayLength]; - -#define Rtl8723UAGCTAB_2TArrayLength 1 -extern u32 Rtl8723UAGCTAB_2TArray[Rtl8723UAGCTAB_2TArrayLength]; -#define Rtl8723UAGCTAB_1TArrayLength 320 -extern u32 Rtl8723UAGCTAB_1TArray[Rtl8723UAGCTAB_1TArrayLength]; -#endif//#ifndef CONFIG_PHY_SETTING_WITH_ODM - -#define Rtl8723UPHY_REG_Array_PGLength 336 -extern u32 Rtl8723UPHY_REG_Array_PG[Rtl8723UPHY_REG_Array_PGLength]; -#define Rtl8723UMACPHY_Array_PGLength 1 -extern u32 Rtl8723UMACPHY_Array_PG[Rtl8723UMACPHY_Array_PGLength]; - -#if MP_DRIVER == 1 -#define Rtl8723UPHY_REG_Array_MPLength 4 -extern u32 Rtl8723UPHY_REG_Array_MP[Rtl8723UPHY_REG_Array_MPLength]; -#endif //#if MP_DRIVER == 1 - -#endif //#ifndef __INC_HAL8723U_FW_IMG_H - +#ifndef __INC_HAL8723U_FW_IMG_H +#define __INC_HAL8723U_FW_IMG_H + +/*Created on 2013/01/14, 15:51*/ + +//FW v16 enable usb interrupt +#define Rtl8723UImgArrayLength 22172 +extern u8 Rtl8723UFwImgArray[Rtl8723UImgArrayLength]; +#define Rtl8723UBTImgArrayLength 1 +extern u8 Rtl8723UFwBTImgArray[Rtl8723UBTImgArrayLength]; + +#define Rtl8723UUMCBCutImgArrayWithBTLength 24348 +#define Rtl8723UUMCBCutImgArrayWithoutBTLength 19200 + +extern u8 Rtl8723UFwUMCBCutImgArrayWithBT[Rtl8723UUMCBCutImgArrayWithBTLength]; +extern u8 Rtl8723UFwUMCBCutImgArrayWithoutBT[Rtl8723UUMCBCutImgArrayWithoutBTLength]; + +#define Rtl8723SUMCBCutMPImgArrayLength 24174 +extern const u8 Rtl8723SFwUMCBCutMPImgArray[Rtl8723SUMCBCutMPImgArrayLength]; + +#define Rtl8723EBTImgArrayLength 16404 +extern u8 Rtl8723EFwBTImgArray[Rtl8723EBTImgArrayLength] ; + + +#ifndef CONFIG_PHY_SETTING_WITH_ODM +#define Rtl8723UPHY_REG_2TArrayLength 1 +extern u32 Rtl8723UPHY_REG_2TArray[Rtl8723UPHY_REG_2TArrayLength]; +#define Rtl8723UPHY_REG_1TArrayLength 372 +extern u32 Rtl8723UPHY_REG_1TArray[Rtl8723UPHY_REG_1TArrayLength]; +#define Rtl8723UPHY_ChangeTo_1T1RArrayLength 1 +extern u32 Rtl8723UPHY_ChangeTo_1T1RArray[Rtl8723UPHY_ChangeTo_1T1RArrayLength]; +#define Rtl8723UPHY_ChangeTo_1T2RArrayLength 1 +extern u32 Rtl8723UPHY_ChangeTo_1T2RArray[Rtl8723UPHY_ChangeTo_1T2RArrayLength]; +#define Rtl8723UPHY_ChangeTo_2T2RArrayLength 1 +extern u32 Rtl8723UPHY_ChangeTo_2T2RArray[Rtl8723UPHY_ChangeTo_2T2RArrayLength]; + +#define Rtl8723UPHY_REG_1T_mCardArrayLength 372 +extern u32 Rtl8723UPHY_REG_1T_mCardArray[Rtl8723UPHY_REG_1T_mCardArrayLength]; +#define Rtl8723UPHY_REG_1T_SDIOArrayLength 372 +extern u32 Rtl8723UPHY_REG_1T_SDIOArray[Rtl8723UPHY_REG_1T_SDIOArrayLength]; +#define Rtl8723URadioA_2TArrayLength 1 +extern u32 Rtl8723URadioA_2TArray[Rtl8723URadioA_2TArrayLength]; +#define Rtl8723URadioB_2TArrayLength 1 +extern u32 Rtl8723URadioB_2TArray[Rtl8723URadioB_2TArrayLength]; +#define Rtl8723URadioA_1TArrayLength 282 +extern u32 Rtl8723URadioA_1TArray[Rtl8723URadioA_1TArrayLength]; +#define Rtl8723URadioB_1TArrayLength 1 +extern u32 Rtl8723URadioB_1TArray[Rtl8723URadioB_1TArrayLength]; +#define Rtl8723URadioA_1T_mCardArrayLength 282 +extern u32 Rtl8723URadioA_1T_mCardArray[Rtl8723URadioA_1T_mCardArrayLength]; +#define Rtl8723URadioA_1T_SDIOArrayLength 282 +extern u32 Rtl8723URadioA_1T_SDIOArray[Rtl8723URadioA_1T_SDIOArrayLength]; +#define Rtl8723URadioB_GM_ArrayLength 1 +extern u32 Rtl8723URadioB_GM_Array[Rtl8723URadioB_GM_ArrayLength]; +#define Rtl8723UMAC_2T_ArrayLength 172 +extern u32 Rtl8723UMAC_2T_Array[Rtl8723UMAC_2T_ArrayLength]; + +#define Rtl8723UAGCTAB_2TArrayLength 1 +extern u32 Rtl8723UAGCTAB_2TArray[Rtl8723UAGCTAB_2TArrayLength]; +#define Rtl8723UAGCTAB_1TArrayLength 320 +extern u32 Rtl8723UAGCTAB_1TArray[Rtl8723UAGCTAB_1TArrayLength]; +#endif//#ifndef CONFIG_PHY_SETTING_WITH_ODM + +#define Rtl8723UPHY_REG_Array_PGLength 336 +extern u32 Rtl8723UPHY_REG_Array_PG[Rtl8723UPHY_REG_Array_PGLength]; +#define Rtl8723UMACPHY_Array_PGLength 1 +extern u32 Rtl8723UMACPHY_Array_PG[Rtl8723UMACPHY_Array_PGLength]; + +#if MP_DRIVER == 1 +#define Rtl8723UPHY_REG_Array_MPLength 4 +extern u32 Rtl8723UPHY_REG_Array_MP[Rtl8723UPHY_REG_Array_MPLength]; +#endif //#if MP_DRIVER == 1 + +#endif //#ifndef __INC_HAL8723U_FW_IMG_H + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_BB.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_BB.c index 912752ff06b5..a737344c3b88 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_BB.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_BB.c @@ -1,815 +1,815 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License along with -* this program; if not, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "../odm_precomp.h" - -#if (RTL8723A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board == cond) && cond != 0x00) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( (_interface & cond) == 0 && cond != 0x07) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( (_platform & cond) == 0 && cond != 0x0F) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* AGC_TAB_1T.TXT -******************************************************************************/ - -u4Byte Array_AGC_TAB_1T_8723A[] = { - 0xC78, 0x7B000001, - 0xC78, 0x7B010001, - 0xC78, 0x7B020001, - 0xC78, 0x7B030001, - 0xC78, 0x7B040001, - 0xC78, 0x7B050001, - 0xC78, 0x7A060001, - 0xC78, 0x79070001, - 0xC78, 0x78080001, - 0xC78, 0x77090001, - 0xC78, 0x760A0001, - 0xC78, 0x750B0001, - 0xC78, 0x740C0001, - 0xC78, 0x730D0001, - 0xC78, 0x720E0001, - 0xC78, 0x710F0001, - 0xC78, 0x70100001, - 0xC78, 0x6F110001, - 0xC78, 0x6E120001, - 0xC78, 0x6D130001, - 0xC78, 0x6C140001, - 0xC78, 0x6B150001, - 0xC78, 0x6A160001, - 0xC78, 0x69170001, - 0xC78, 0x68180001, - 0xC78, 0x67190001, - 0xC78, 0x661A0001, - 0xC78, 0x651B0001, - 0xC78, 0x641C0001, - 0xC78, 0x631D0001, - 0xC78, 0x621E0001, - 0xC78, 0x611F0001, - 0xC78, 0x60200001, - 0xC78, 0x49210001, - 0xC78, 0x48220001, - 0xC78, 0x47230001, - 0xC78, 0x46240001, - 0xC78, 0x45250001, - 0xC78, 0x44260001, - 0xC78, 0x43270001, - 0xC78, 0x42280001, - 0xC78, 0x41290001, - 0xC78, 0x402A0001, - 0xC78, 0x262B0001, - 0xC78, 0x252C0001, - 0xC78, 0x242D0001, - 0xC78, 0x232E0001, - 0xC78, 0x222F0001, - 0xC78, 0x21300001, - 0xC78, 0x20310001, - 0xC78, 0x06320001, - 0xC78, 0x05330001, - 0xC78, 0x04340001, - 0xC78, 0x03350001, - 0xC78, 0x02360001, - 0xC78, 0x01370001, - 0xC78, 0x00380001, - 0xC78, 0x00390001, - 0xC78, 0x003A0001, - 0xC78, 0x003B0001, - 0xC78, 0x003C0001, - 0xC78, 0x003D0001, - 0xC78, 0x003E0001, - 0xC78, 0x003F0001, - 0xC78, 0x7B400001, - 0xC78, 0x7B410001, - 0xC78, 0x7B420001, - 0xC78, 0x7B430001, - 0xC78, 0x7B440001, - 0xC78, 0x7B450001, - 0xC78, 0x7A460001, - 0xC78, 0x79470001, - 0xC78, 0x78480001, - 0xC78, 0x77490001, - 0xC78, 0x764A0001, - 0xC78, 0x754B0001, - 0xC78, 0x744C0001, - 0xC78, 0x734D0001, - 0xC78, 0x724E0001, - 0xC78, 0x714F0001, - 0xC78, 0x70500001, - 0xC78, 0x6F510001, - 0xC78, 0x6E520001, - 0xC78, 0x6D530001, - 0xC78, 0x6C540001, - 0xC78, 0x6B550001, - 0xC78, 0x6A560001, - 0xC78, 0x69570001, - 0xC78, 0x68580001, - 0xC78, 0x67590001, - 0xC78, 0x665A0001, - 0xC78, 0x655B0001, - 0xC78, 0x645C0001, - 0xC78, 0x635D0001, - 0xC78, 0x625E0001, - 0xC78, 0x615F0001, - 0xC78, 0x60600001, - 0xC78, 0x49610001, - 0xC78, 0x48620001, - 0xC78, 0x47630001, - 0xC78, 0x46640001, - 0xC78, 0x45650001, - 0xC78, 0x44660001, - 0xC78, 0x43670001, - 0xC78, 0x42680001, - 0xC78, 0x41690001, - 0xC78, 0x406A0001, - 0xC78, 0x266B0001, - 0xC78, 0x256C0001, - 0xC78, 0x246D0001, - 0xC78, 0x236E0001, - 0xC78, 0x226F0001, - 0xC78, 0x21700001, - 0xC78, 0x20710001, - 0xC78, 0x06720001, - 0xC78, 0x05730001, - 0xC78, 0x04740001, - 0xC78, 0x03750001, - 0xC78, 0x02760001, - 0xC78, 0x01770001, - 0xC78, 0x00780001, - 0xC78, 0x00790001, - 0xC78, 0x007A0001, - 0xC78, 0x007B0001, - 0xC78, 0x007C0001, - 0xC78, 0x007D0001, - 0xC78, 0x007E0001, - 0xC78, 0x007F0001, - 0xC78, 0x3800001E, - 0xC78, 0x3801001E, - 0xC78, 0x3802001E, - 0xC78, 0x3803001E, - 0xC78, 0x3804001E, - 0xC78, 0x3805001E, - 0xC78, 0x3806001E, - 0xC78, 0x3807001E, - 0xC78, 0x3808001E, - 0xC78, 0x3C09001E, - 0xC78, 0x3E0A001E, - 0xC78, 0x400B001E, - 0xC78, 0x440C001E, - 0xC78, 0x480D001E, - 0xC78, 0x4C0E001E, - 0xC78, 0x500F001E, - 0xC78, 0x5210001E, - 0xC78, 0x5611001E, - 0xC78, 0x5A12001E, - 0xC78, 0x5E13001E, - 0xC78, 0x6014001E, - 0xC78, 0x6015001E, - 0xC78, 0x6016001E, - 0xC78, 0x6217001E, - 0xC78, 0x6218001E, - 0xC78, 0x6219001E, - 0xC78, 0x621A001E, - 0xC78, 0x621B001E, - 0xC78, 0x621C001E, - 0xC78, 0x621D001E, - 0xC78, 0x621E001E, - 0xC78, 0x621F001E, - -}; - -void -ODM_ReadAndConfig_AGC_TAB_1T_8723A( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte interfaceValue = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_AGC_TAB_1T_8723A)/sizeof(u4Byte); - pu4Byte Array = Array_AGC_TAB_1T_8723A; - - - hex += board; - hex += interfaceValue << 8; - hex += platform << 16; - hex += 0xFF000000; - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_AGC_8723A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_AGC_8723A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - - -/****************************************************************************** -* PHY_REG_1T.TXT -******************************************************************************/ - -u4Byte Array_PHY_REG_1T_8723A[] = { - 0x800, 0x80040000, - 0x804, 0x00000003, - 0x808, 0x0000FC00, - 0x80C, 0x0000000A, - 0x810, 0x10001331, - 0x814, 0x020C3D10, - 0x818, 0x02200385, - 0x81C, 0x00000000, - 0x820, 0x01000100, - 0x824, 0x00390004, - 0x828, 0x00000000, - 0x82C, 0x00000000, - 0x830, 0x00000000, - 0x834, 0x00000000, - 0x838, 0x00000000, - 0x83C, 0x00000000, - 0x840, 0x00010000, - 0x844, 0x00000000, - 0x848, 0x00000000, - 0x84C, 0x00000000, - 0x850, 0x00000000, - 0x854, 0x00000000, - 0x858, 0x569A569A, - 0x85C, 0x001B25A4, - 0x860, 0x66F60110, - 0x864, 0x061F0130, - 0x868, 0x00000000, - 0x86C, 0x32323200, - 0x870, 0x07000760, - 0x874, 0x22004000, - 0x878, 0x00000808, - 0x87C, 0x00000000, - 0x880, 0xC0083070, - 0x884, 0x000004D5, - 0x888, 0x00000000, - 0x88C, 0xCCC000C0, - 0x890, 0x00000800, - 0x894, 0xFFFFFFFE, - 0x898, 0x40302010, - 0x89C, 0x00706050, - 0x900, 0x00000000, - 0x904, 0x00000023, - 0x908, 0x00000000, - 0x90C, 0x81121111, - 0xA00, 0x00D047C8, - 0xA04, 0x80FF000C, - 0xA08, 0x8C838300, - 0xA0C, 0x2E68120F, - 0xA10, 0x9500BB78, - 0xA14, 0x11144028, - 0xA18, 0x00881117, - 0xA1C, 0x89140F00, - 0xA20, 0x1A1B0000, - 0xA24, 0x090E1317, - 0xA28, 0x00000204, - 0xA2C, 0x00D30000, - 0xA70, 0x101FBF00, - 0xA74, 0x00000007, - 0xA78, 0x00000900, - 0xC00, 0x48071D40, - 0xC04, 0x03A05611, - 0xC08, 0x000000E4, - 0xC0C, 0x6C6C6C6C, - 0xC10, 0x08800000, - 0xC14, 0x40000100, - 0xC18, 0x08800000, - 0xC1C, 0x40000100, - 0xC20, 0x00000000, - 0xC24, 0x00000000, - 0xC28, 0x00000000, - 0xC2C, 0x00000000, - 0xC30, 0x69E9AC44, - 0xFF0F011F, 0xABCD, - 0xC34, 0x469652CF, - 0xCDCDCDCD, 0xCDCD, - 0xC34, 0x469652AF, - 0xFF0F011F, 0xDEAD, - 0xC38, 0x49795994, - 0xC3C, 0x0A97971C, - 0xC40, 0x1F7C403F, - 0xC44, 0x000100B7, - 0xC48, 0xEC020107, - 0xC4C, 0x007F037F, - 0xC50, 0x69543420, - 0xC54, 0x43BC0094, - 0xC58, 0x69543420, - 0xC5C, 0x433C0094, - 0xC60, 0x00000000, - 0xFF0F011F, 0xABCD, - 0xC64, 0x7116848B, - 0xCDCDCDCD, 0xCDCD, - 0xC64, 0x7112848B, - 0xFF0F011F, 0xDEAD, - 0xC68, 0x47C00BFF, - 0xC6C, 0x00000036, - 0xC70, 0x2C7F000D, - 0xC74, 0x018610DB, - 0xC78, 0x0000001F, - 0xC7C, 0x00B91612, - 0xC80, 0x40000100, - 0xC84, 0x20F60000, - 0xC88, 0x40000100, - 0xC8C, 0x20200000, - 0xC90, 0x00121820, - 0xC94, 0x00000000, - 0xC98, 0x00121820, - 0xC9C, 0x00007F7F, - 0xCA0, 0x00000000, - 0xCA4, 0x00000080, - 0xCA8, 0x00000000, - 0xCAC, 0x00000000, - 0xCB0, 0x00000000, - 0xCB4, 0x00000000, - 0xCB8, 0x00000000, - 0xCBC, 0x28000000, - 0xCC0, 0x00000000, - 0xCC4, 0x00000000, - 0xCC8, 0x00000000, - 0xCCC, 0x00000000, - 0xCD0, 0x00000000, - 0xCD4, 0x00000000, - 0xCD8, 0x64B22427, - 0xCDC, 0x00766932, - 0xCE0, 0x00222222, - 0xCE4, 0x00000000, - 0xCE8, 0x37644302, - 0xCEC, 0x2F97D40C, - 0xD00, 0x00080740, - 0xD04, 0x00020401, - 0xD08, 0x0000907F, - 0xD0C, 0x20010201, - 0xD10, 0xA0633333, - 0xD14, 0x3333BC43, - 0xD18, 0x7A8F5B6B, - 0xD2C, 0xCC979975, - 0xD30, 0x00000000, - 0xD34, 0x80608000, - 0xD38, 0x00000000, - 0xD3C, 0x00027293, - 0xD40, 0x00000000, - 0xD44, 0x00000000, - 0xD48, 0x00000000, - 0xD4C, 0x00000000, - 0xD50, 0x6437140A, - 0xD54, 0x00000000, - 0xD58, 0x00000000, - 0xD5C, 0x30032064, - 0xD60, 0x4653DE68, - 0xD64, 0x04518A3C, - 0xD68, 0x00002101, - 0xD6C, 0x2A201C16, - 0xD70, 0x1812362E, - 0xD74, 0x322C2220, - 0xD78, 0x000E3C24, - 0xE00, 0x2A2A2A2A, - 0xE04, 0x2A2A2A2A, - 0xE08, 0x03902A2A, - 0xE10, 0x2A2A2A2A, - 0xE14, 0x2A2A2A2A, - 0xE18, 0x2A2A2A2A, - 0xE1C, 0x2A2A2A2A, - 0xE28, 0x00000000, - 0xE30, 0x1000DC1F, - 0xE34, 0x10008C1F, - 0xE38, 0x02140102, - 0xE3C, 0x681604C2, - 0xE40, 0x01007C00, - 0xE44, 0x01004800, - 0xE48, 0xFB000000, - 0xE4C, 0x000028D1, - 0xE50, 0x1000DC1F, - 0xE54, 0x10008C1F, - 0xE58, 0x02140102, - 0xE5C, 0x28160D05, - 0xE60, 0x00000008, - 0xE68, 0x001B25A4, - 0xE6C, 0x631B25A0, - 0xE70, 0x631B25A0, - 0xE74, 0x081B25A0, - 0xE78, 0x081B25A0, - 0xE7C, 0x081B25A0, - 0xE80, 0x081B25A0, - 0xE84, 0x631B25A0, - 0xE88, 0x081B25A0, - 0xE8C, 0x631B25A0, - 0xED0, 0x631B25A0, - 0xED4, 0x631B25A0, - 0xED8, 0x631B25A0, - 0xEDC, 0x001B25A0, - 0xEE0, 0x001B25A0, - 0xEEC, 0x6B1B25A0, - 0xF14, 0x00000003, - 0xF4C, 0x00000000, - 0xF00, 0x00000300, - -}; - -void -ODM_ReadAndConfig_PHY_REG_1T_8723A( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte interfaceValue = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_PHY_REG_1T_8723A)/sizeof(u4Byte); - pu4Byte Array = Array_PHY_REG_1T_8723A; - - - hex += board; - hex += interfaceValue << 8; - hex += platform << 16; - hex += 0xFF000000; - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - - -/****************************************************************************** -* PHY_REG_MP.TXT -******************************************************************************/ - -u4Byte Array_PHY_REG_MP_8723A[] = { - 0xC30, 0x69E9AC4A, - 0xC3C, 0x0A979718, - -}; - -void -ODM_ReadAndConfig_PHY_REG_MP_8723A( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte interfaceValue = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_PHY_REG_MP_8723A)/sizeof(u4Byte); - pu4Byte Array = Array_PHY_REG_MP_8723A; - - - hex += board; - hex += interfaceValue << 8; - hex += platform << 16; - hex += 0xFF000000; - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - - -/****************************************************************************** -* PHY_REG_PG.TXT -******************************************************************************/ - -u4Byte Array_PHY_REG_PG_8723A[] = { - 0xE00, 0xFFFFFFFF, 0x0A0C0C0C, - 0xE04, 0xFFFFFFFF, 0x02040608, - 0xE08, 0x0000FF00, 0x00000000, - 0x86C, 0xFFFFFF00, 0x00000000, - 0xE10, 0xFFFFFFFF, 0x0A0C0D0E, - 0xE14, 0xFFFFFFFF, 0x02040608, - 0xE18, 0xFFFFFFFF, 0x0A0C0D0E, - 0xE1C, 0xFFFFFFFF, 0x02040608, - 0x830, 0xFFFFFFFF, 0x0A0C0C0C, - 0x834, 0xFFFFFFFF, 0x02040608, - 0x838, 0xFFFFFF00, 0x00000000, - 0x86C, 0x000000FF, 0x00000000, - 0x83C, 0xFFFFFFFF, 0x0A0C0D0E, - 0x848, 0xFFFFFFFF, 0x02040608, - 0x84C, 0xFFFFFFFF, 0x0A0C0D0E, - 0x868, 0xFFFFFFFF, 0x02040608, - 0xE00, 0xFFFFFFFF, 0x00000000, - 0xE04, 0xFFFFFFFF, 0x00000000, - 0xE08, 0x0000FF00, 0x00000000, - 0x86C, 0xFFFFFF00, 0x00000000, - 0xE10, 0xFFFFFFFF, 0x00000000, - 0xE14, 0xFFFFFFFF, 0x00000000, - 0xE18, 0xFFFFFFFF, 0x00000000, - 0xE1C, 0xFFFFFFFF, 0x00000000, - 0x830, 0xFFFFFFFF, 0x00000000, - 0x834, 0xFFFFFFFF, 0x00000000, - 0x838, 0xFFFFFF00, 0x00000000, - 0x86C, 0x000000FF, 0x00000000, - 0x83C, 0xFFFFFFFF, 0x00000000, - 0x848, 0xFFFFFFFF, 0x00000000, - 0x84C, 0xFFFFFFFF, 0x00000000, - 0x868, 0xFFFFFFFF, 0x00000000, - 0xE00, 0xFFFFFFFF, 0x04040404, - 0xE04, 0xFFFFFFFF, 0x00020204, - 0xE08, 0x0000FF00, 0x00000000, - 0x86C, 0xFFFFFF00, 0x00000000, - 0xE10, 0xFFFFFFFF, 0x06060606, - 0xE14, 0xFFFFFFFF, 0x00020406, - 0xE18, 0xFFFFFFFF, 0x00000000, - 0xE1C, 0xFFFFFFFF, 0x00000000, - 0x830, 0xFFFFFFFF, 0x04040404, - 0x834, 0xFFFFFFFF, 0x00020204, - 0x838, 0xFFFFFF00, 0x00000000, - 0x86C, 0x000000FF, 0x00000000, - 0x83C, 0xFFFFFFFF, 0x06060606, - 0x848, 0xFFFFFFFF, 0x00020406, - 0x84C, 0xFFFFFFFF, 0x00000000, - 0x868, 0xFFFFFFFF, 0x00000000, - 0xE00, 0xFFFFFFFF, 0x00000000, - 0xE04, 0xFFFFFFFF, 0x00000000, - 0xE08, 0x0000FF00, 0x00000000, - 0x86C, 0xFFFFFF00, 0x00000000, - 0xE10, 0xFFFFFFFF, 0x00000000, - 0xE14, 0xFFFFFFFF, 0x00000000, - 0xE18, 0xFFFFFFFF, 0x00000000, - 0xE1C, 0xFFFFFFFF, 0x00000000, - 0x830, 0xFFFFFFFF, 0x00000000, - 0x834, 0xFFFFFFFF, 0x00000000, - 0x838, 0xFFFFFF00, 0x00000000, - 0x86C, 0x000000FF, 0x00000000, - 0x83C, 0xFFFFFFFF, 0x00000000, - 0x848, 0xFFFFFFFF, 0x00000000, - 0x84C, 0xFFFFFFFF, 0x00000000, - 0x868, 0xFFFFFFFF, 0x00000000, - 0xE00, 0xFFFFFFFF, 0x00000000, - 0xE04, 0xFFFFFFFF, 0x00000000, - 0xE08, 0x0000FF00, 0x00000000, - 0x86C, 0xFFFFFF00, 0x00000000, - 0xE10, 0xFFFFFFFF, 0x00000000, - 0xE14, 0xFFFFFFFF, 0x00000000, - 0xE18, 0xFFFFFFFF, 0x00000000, - 0xE1C, 0xFFFFFFFF, 0x00000000, - 0x830, 0xFFFFFFFF, 0x00000000, - 0x834, 0xFFFFFFFF, 0x00000000, - 0x838, 0xFFFFFF00, 0x00000000, - 0x86C, 0x000000FF, 0x00000000, - 0x83C, 0xFFFFFFFF, 0x00000000, - 0x848, 0xFFFFFFFF, 0x00000000, - 0x84C, 0xFFFFFFFF, 0x00000000, - 0x868, 0xFFFFFFFF, 0x00000000, - 0xE00, 0xFFFFFFFF, 0x04040404, - 0xE04, 0xFFFFFFFF, 0x00020204, - 0xE08, 0x0000FF00, 0x00000000, - 0x86C, 0xFFFFFF00, 0x00000000, - 0xE10, 0xFFFFFFFF, 0x00000000, - 0xE14, 0xFFFFFFFF, 0x00000000, - 0xE18, 0xFFFFFFFF, 0x00000000, - 0xE1C, 0xFFFFFFFF, 0x00000000, - 0x830, 0xFFFFFFFF, 0x04040404, - 0x834, 0xFFFFFFFF, 0x00020204, - 0x838, 0xFFFFFF00, 0x00000000, - 0x86C, 0x000000FF, 0x00000000, - 0x83C, 0xFFFFFFFF, 0x00000000, - 0x848, 0xFFFFFFFF, 0x00000000, - 0x84C, 0xFFFFFFFF, 0x00000000, - 0x868, 0xFFFFFFFF, 0x00000000, - 0xE00, 0xFFFFFFFF, 0x00000000, - 0xE04, 0xFFFFFFFF, 0x00000000, - 0xE08, 0x0000FF00, 0x00000000, - 0x86C, 0xFFFFFF00, 0x00000000, - 0xE10, 0xFFFFFFFF, 0x00000000, - 0xE14, 0xFFFFFFFF, 0x00000000, - 0xE18, 0xFFFFFFFF, 0x00000000, - 0xE1C, 0xFFFFFFFF, 0x00000000, - 0x830, 0xFFFFFFFF, 0x00000000, - 0x834, 0xFFFFFFFF, 0x00000000, - 0x838, 0xFFFFFF00, 0x00000000, - 0x86C, 0x000000FF, 0x00000000, - 0x83C, 0xFFFFFFFF, 0x00000000, - 0x848, 0xFFFFFFFF, 0x00000000, - 0x84C, 0xFFFFFFFF, 0x00000000, - 0x868, 0xFFFFFFFF, 0x00000000, - -}; - -void -ODM_ReadAndConfig_PHY_REG_PG_8723A( - IN PDM_ODM_T pDM_Odm - ) -{ - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte interfaceValue = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_PHY_REG_PG_8723A)/sizeof(u4Byte); - pu4Byte Array = Array_PHY_REG_PG_8723A; - - hex += board; - hex += interfaceValue << 8; - hex += platform << 16; - hex += 0xFF000000; - for (i = 0; i < ArrayLen; i += 3 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - u4Byte v3 = Array[i+2]; - - // this line is a line of pure_body - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigBB_PHY_REG_PG_8723A(pDM_Odm, v1, v2, v3); - continue; - } - else - { // this line is the start of branch - if ( !CheckCondition(Array[i], hex) ) - { // don't need the hw_body - i += 2; // skip the pair of expression - v1 = Array[i]; - v2 = Array[i+1]; - v3 = Array[i+2]; - while (v2 != 0xDEAD) - { - i += 3; - v1 = Array[i]; - v2 = Array[i+1]; - v3 = Array[i+1]; - } - } - } - } -} - - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#include "../odm_precomp.h" + +#if (RTL8723A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board == cond) && cond != 0x00) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( (_interface & cond) == 0 && cond != 0x07) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( (_platform & cond) == 0 && cond != 0x0F) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* AGC_TAB_1T.TXT +******************************************************************************/ + +u4Byte Array_AGC_TAB_1T_8723A[] = { + 0xC78, 0x7B000001, + 0xC78, 0x7B010001, + 0xC78, 0x7B020001, + 0xC78, 0x7B030001, + 0xC78, 0x7B040001, + 0xC78, 0x7B050001, + 0xC78, 0x7A060001, + 0xC78, 0x79070001, + 0xC78, 0x78080001, + 0xC78, 0x77090001, + 0xC78, 0x760A0001, + 0xC78, 0x750B0001, + 0xC78, 0x740C0001, + 0xC78, 0x730D0001, + 0xC78, 0x720E0001, + 0xC78, 0x710F0001, + 0xC78, 0x70100001, + 0xC78, 0x6F110001, + 0xC78, 0x6E120001, + 0xC78, 0x6D130001, + 0xC78, 0x6C140001, + 0xC78, 0x6B150001, + 0xC78, 0x6A160001, + 0xC78, 0x69170001, + 0xC78, 0x68180001, + 0xC78, 0x67190001, + 0xC78, 0x661A0001, + 0xC78, 0x651B0001, + 0xC78, 0x641C0001, + 0xC78, 0x631D0001, + 0xC78, 0x621E0001, + 0xC78, 0x611F0001, + 0xC78, 0x60200001, + 0xC78, 0x49210001, + 0xC78, 0x48220001, + 0xC78, 0x47230001, + 0xC78, 0x46240001, + 0xC78, 0x45250001, + 0xC78, 0x44260001, + 0xC78, 0x43270001, + 0xC78, 0x42280001, + 0xC78, 0x41290001, + 0xC78, 0x402A0001, + 0xC78, 0x262B0001, + 0xC78, 0x252C0001, + 0xC78, 0x242D0001, + 0xC78, 0x232E0001, + 0xC78, 0x222F0001, + 0xC78, 0x21300001, + 0xC78, 0x20310001, + 0xC78, 0x06320001, + 0xC78, 0x05330001, + 0xC78, 0x04340001, + 0xC78, 0x03350001, + 0xC78, 0x02360001, + 0xC78, 0x01370001, + 0xC78, 0x00380001, + 0xC78, 0x00390001, + 0xC78, 0x003A0001, + 0xC78, 0x003B0001, + 0xC78, 0x003C0001, + 0xC78, 0x003D0001, + 0xC78, 0x003E0001, + 0xC78, 0x003F0001, + 0xC78, 0x7B400001, + 0xC78, 0x7B410001, + 0xC78, 0x7B420001, + 0xC78, 0x7B430001, + 0xC78, 0x7B440001, + 0xC78, 0x7B450001, + 0xC78, 0x7A460001, + 0xC78, 0x79470001, + 0xC78, 0x78480001, + 0xC78, 0x77490001, + 0xC78, 0x764A0001, + 0xC78, 0x754B0001, + 0xC78, 0x744C0001, + 0xC78, 0x734D0001, + 0xC78, 0x724E0001, + 0xC78, 0x714F0001, + 0xC78, 0x70500001, + 0xC78, 0x6F510001, + 0xC78, 0x6E520001, + 0xC78, 0x6D530001, + 0xC78, 0x6C540001, + 0xC78, 0x6B550001, + 0xC78, 0x6A560001, + 0xC78, 0x69570001, + 0xC78, 0x68580001, + 0xC78, 0x67590001, + 0xC78, 0x665A0001, + 0xC78, 0x655B0001, + 0xC78, 0x645C0001, + 0xC78, 0x635D0001, + 0xC78, 0x625E0001, + 0xC78, 0x615F0001, + 0xC78, 0x60600001, + 0xC78, 0x49610001, + 0xC78, 0x48620001, + 0xC78, 0x47630001, + 0xC78, 0x46640001, + 0xC78, 0x45650001, + 0xC78, 0x44660001, + 0xC78, 0x43670001, + 0xC78, 0x42680001, + 0xC78, 0x41690001, + 0xC78, 0x406A0001, + 0xC78, 0x266B0001, + 0xC78, 0x256C0001, + 0xC78, 0x246D0001, + 0xC78, 0x236E0001, + 0xC78, 0x226F0001, + 0xC78, 0x21700001, + 0xC78, 0x20710001, + 0xC78, 0x06720001, + 0xC78, 0x05730001, + 0xC78, 0x04740001, + 0xC78, 0x03750001, + 0xC78, 0x02760001, + 0xC78, 0x01770001, + 0xC78, 0x00780001, + 0xC78, 0x00790001, + 0xC78, 0x007A0001, + 0xC78, 0x007B0001, + 0xC78, 0x007C0001, + 0xC78, 0x007D0001, + 0xC78, 0x007E0001, + 0xC78, 0x007F0001, + 0xC78, 0x3800001E, + 0xC78, 0x3801001E, + 0xC78, 0x3802001E, + 0xC78, 0x3803001E, + 0xC78, 0x3804001E, + 0xC78, 0x3805001E, + 0xC78, 0x3806001E, + 0xC78, 0x3807001E, + 0xC78, 0x3808001E, + 0xC78, 0x3C09001E, + 0xC78, 0x3E0A001E, + 0xC78, 0x400B001E, + 0xC78, 0x440C001E, + 0xC78, 0x480D001E, + 0xC78, 0x4C0E001E, + 0xC78, 0x500F001E, + 0xC78, 0x5210001E, + 0xC78, 0x5611001E, + 0xC78, 0x5A12001E, + 0xC78, 0x5E13001E, + 0xC78, 0x6014001E, + 0xC78, 0x6015001E, + 0xC78, 0x6016001E, + 0xC78, 0x6217001E, + 0xC78, 0x6218001E, + 0xC78, 0x6219001E, + 0xC78, 0x621A001E, + 0xC78, 0x621B001E, + 0xC78, 0x621C001E, + 0xC78, 0x621D001E, + 0xC78, 0x621E001E, + 0xC78, 0x621F001E, + +}; + +void +ODM_ReadAndConfig_AGC_TAB_1T_8723A( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte interfaceValue = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_AGC_TAB_1T_8723A)/sizeof(u4Byte); + pu4Byte Array = Array_AGC_TAB_1T_8723A; + + + hex += board; + hex += interfaceValue << 8; + hex += platform << 16; + hex += 0xFF000000; + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_AGC_8723A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_AGC_8723A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + + +/****************************************************************************** +* PHY_REG_1T.TXT +******************************************************************************/ + +u4Byte Array_PHY_REG_1T_8723A[] = { + 0x800, 0x80040000, + 0x804, 0x00000003, + 0x808, 0x0000FC00, + 0x80C, 0x0000000A, + 0x810, 0x10001331, + 0x814, 0x020C3D10, + 0x818, 0x02200385, + 0x81C, 0x00000000, + 0x820, 0x01000100, + 0x824, 0x00390004, + 0x828, 0x00000000, + 0x82C, 0x00000000, + 0x830, 0x00000000, + 0x834, 0x00000000, + 0x838, 0x00000000, + 0x83C, 0x00000000, + 0x840, 0x00010000, + 0x844, 0x00000000, + 0x848, 0x00000000, + 0x84C, 0x00000000, + 0x850, 0x00000000, + 0x854, 0x00000000, + 0x858, 0x569A569A, + 0x85C, 0x001B25A4, + 0x860, 0x66F60110, + 0x864, 0x061F0130, + 0x868, 0x00000000, + 0x86C, 0x32323200, + 0x870, 0x07000760, + 0x874, 0x22004000, + 0x878, 0x00000808, + 0x87C, 0x00000000, + 0x880, 0xC0083070, + 0x884, 0x000004D5, + 0x888, 0x00000000, + 0x88C, 0xCCC000C0, + 0x890, 0x00000800, + 0x894, 0xFFFFFFFE, + 0x898, 0x40302010, + 0x89C, 0x00706050, + 0x900, 0x00000000, + 0x904, 0x00000023, + 0x908, 0x00000000, + 0x90C, 0x81121111, + 0xA00, 0x00D047C8, + 0xA04, 0x80FF000C, + 0xA08, 0x8C838300, + 0xA0C, 0x2E68120F, + 0xA10, 0x9500BB78, + 0xA14, 0x11144028, + 0xA18, 0x00881117, + 0xA1C, 0x89140F00, + 0xA20, 0x1A1B0000, + 0xA24, 0x090E1317, + 0xA28, 0x00000204, + 0xA2C, 0x00D30000, + 0xA70, 0x101FBF00, + 0xA74, 0x00000007, + 0xA78, 0x00000900, + 0xC00, 0x48071D40, + 0xC04, 0x03A05611, + 0xC08, 0x000000E4, + 0xC0C, 0x6C6C6C6C, + 0xC10, 0x08800000, + 0xC14, 0x40000100, + 0xC18, 0x08800000, + 0xC1C, 0x40000100, + 0xC20, 0x00000000, + 0xC24, 0x00000000, + 0xC28, 0x00000000, + 0xC2C, 0x00000000, + 0xC30, 0x69E9AC44, + 0xFF0F011F, 0xABCD, + 0xC34, 0x469652CF, + 0xCDCDCDCD, 0xCDCD, + 0xC34, 0x469652AF, + 0xFF0F011F, 0xDEAD, + 0xC38, 0x49795994, + 0xC3C, 0x0A97971C, + 0xC40, 0x1F7C403F, + 0xC44, 0x000100B7, + 0xC48, 0xEC020107, + 0xC4C, 0x007F037F, + 0xC50, 0x69543420, + 0xC54, 0x43BC0094, + 0xC58, 0x69543420, + 0xC5C, 0x433C0094, + 0xC60, 0x00000000, + 0xFF0F011F, 0xABCD, + 0xC64, 0x7116848B, + 0xCDCDCDCD, 0xCDCD, + 0xC64, 0x7112848B, + 0xFF0F011F, 0xDEAD, + 0xC68, 0x47C00BFF, + 0xC6C, 0x00000036, + 0xC70, 0x2C7F000D, + 0xC74, 0x018610DB, + 0xC78, 0x0000001F, + 0xC7C, 0x00B91612, + 0xC80, 0x40000100, + 0xC84, 0x20F60000, + 0xC88, 0x40000100, + 0xC8C, 0x20200000, + 0xC90, 0x00121820, + 0xC94, 0x00000000, + 0xC98, 0x00121820, + 0xC9C, 0x00007F7F, + 0xCA0, 0x00000000, + 0xCA4, 0x00000080, + 0xCA8, 0x00000000, + 0xCAC, 0x00000000, + 0xCB0, 0x00000000, + 0xCB4, 0x00000000, + 0xCB8, 0x00000000, + 0xCBC, 0x28000000, + 0xCC0, 0x00000000, + 0xCC4, 0x00000000, + 0xCC8, 0x00000000, + 0xCCC, 0x00000000, + 0xCD0, 0x00000000, + 0xCD4, 0x00000000, + 0xCD8, 0x64B22427, + 0xCDC, 0x00766932, + 0xCE0, 0x00222222, + 0xCE4, 0x00000000, + 0xCE8, 0x37644302, + 0xCEC, 0x2F97D40C, + 0xD00, 0x00080740, + 0xD04, 0x00020401, + 0xD08, 0x0000907F, + 0xD0C, 0x20010201, + 0xD10, 0xA0633333, + 0xD14, 0x3333BC43, + 0xD18, 0x7A8F5B6B, + 0xD2C, 0xCC979975, + 0xD30, 0x00000000, + 0xD34, 0x80608000, + 0xD38, 0x00000000, + 0xD3C, 0x00027293, + 0xD40, 0x00000000, + 0xD44, 0x00000000, + 0xD48, 0x00000000, + 0xD4C, 0x00000000, + 0xD50, 0x6437140A, + 0xD54, 0x00000000, + 0xD58, 0x00000000, + 0xD5C, 0x30032064, + 0xD60, 0x4653DE68, + 0xD64, 0x04518A3C, + 0xD68, 0x00002101, + 0xD6C, 0x2A201C16, + 0xD70, 0x1812362E, + 0xD74, 0x322C2220, + 0xD78, 0x000E3C24, + 0xE00, 0x2A2A2A2A, + 0xE04, 0x2A2A2A2A, + 0xE08, 0x03902A2A, + 0xE10, 0x2A2A2A2A, + 0xE14, 0x2A2A2A2A, + 0xE18, 0x2A2A2A2A, + 0xE1C, 0x2A2A2A2A, + 0xE28, 0x00000000, + 0xE30, 0x1000DC1F, + 0xE34, 0x10008C1F, + 0xE38, 0x02140102, + 0xE3C, 0x681604C2, + 0xE40, 0x01007C00, + 0xE44, 0x01004800, + 0xE48, 0xFB000000, + 0xE4C, 0x000028D1, + 0xE50, 0x1000DC1F, + 0xE54, 0x10008C1F, + 0xE58, 0x02140102, + 0xE5C, 0x28160D05, + 0xE60, 0x00000008, + 0xE68, 0x001B25A4, + 0xE6C, 0x631B25A0, + 0xE70, 0x631B25A0, + 0xE74, 0x081B25A0, + 0xE78, 0x081B25A0, + 0xE7C, 0x081B25A0, + 0xE80, 0x081B25A0, + 0xE84, 0x631B25A0, + 0xE88, 0x081B25A0, + 0xE8C, 0x631B25A0, + 0xED0, 0x631B25A0, + 0xED4, 0x631B25A0, + 0xED8, 0x631B25A0, + 0xEDC, 0x001B25A0, + 0xEE0, 0x001B25A0, + 0xEEC, 0x6B1B25A0, + 0xF14, 0x00000003, + 0xF4C, 0x00000000, + 0xF00, 0x00000300, + +}; + +void +ODM_ReadAndConfig_PHY_REG_1T_8723A( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte interfaceValue = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_PHY_REG_1T_8723A)/sizeof(u4Byte); + pu4Byte Array = Array_PHY_REG_1T_8723A; + + + hex += board; + hex += interfaceValue << 8; + hex += platform << 16; + hex += 0xFF000000; + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + + +/****************************************************************************** +* PHY_REG_MP.TXT +******************************************************************************/ + +u4Byte Array_PHY_REG_MP_8723A[] = { + 0xC30, 0x69E9AC4A, + 0xC3C, 0x0A979718, + +}; + +void +ODM_ReadAndConfig_PHY_REG_MP_8723A( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte interfaceValue = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_PHY_REG_MP_8723A)/sizeof(u4Byte); + pu4Byte Array = Array_PHY_REG_MP_8723A; + + + hex += board; + hex += interfaceValue << 8; + hex += platform << 16; + hex += 0xFF000000; + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +u4Byte Array_PHY_REG_PG_8723A[] = { + 0xE00, 0xFFFFFFFF, 0x0A0C0C0C, + 0xE04, 0xFFFFFFFF, 0x02040608, + 0xE08, 0x0000FF00, 0x00000000, + 0x86C, 0xFFFFFF00, 0x00000000, + 0xE10, 0xFFFFFFFF, 0x0A0C0D0E, + 0xE14, 0xFFFFFFFF, 0x02040608, + 0xE18, 0xFFFFFFFF, 0x0A0C0D0E, + 0xE1C, 0xFFFFFFFF, 0x02040608, + 0x830, 0xFFFFFFFF, 0x0A0C0C0C, + 0x834, 0xFFFFFFFF, 0x02040608, + 0x838, 0xFFFFFF00, 0x00000000, + 0x86C, 0x000000FF, 0x00000000, + 0x83C, 0xFFFFFFFF, 0x0A0C0D0E, + 0x848, 0xFFFFFFFF, 0x02040608, + 0x84C, 0xFFFFFFFF, 0x0A0C0D0E, + 0x868, 0xFFFFFFFF, 0x02040608, + 0xE00, 0xFFFFFFFF, 0x00000000, + 0xE04, 0xFFFFFFFF, 0x00000000, + 0xE08, 0x0000FF00, 0x00000000, + 0x86C, 0xFFFFFF00, 0x00000000, + 0xE10, 0xFFFFFFFF, 0x00000000, + 0xE14, 0xFFFFFFFF, 0x00000000, + 0xE18, 0xFFFFFFFF, 0x00000000, + 0xE1C, 0xFFFFFFFF, 0x00000000, + 0x830, 0xFFFFFFFF, 0x00000000, + 0x834, 0xFFFFFFFF, 0x00000000, + 0x838, 0xFFFFFF00, 0x00000000, + 0x86C, 0x000000FF, 0x00000000, + 0x83C, 0xFFFFFFFF, 0x00000000, + 0x848, 0xFFFFFFFF, 0x00000000, + 0x84C, 0xFFFFFFFF, 0x00000000, + 0x868, 0xFFFFFFFF, 0x00000000, + 0xE00, 0xFFFFFFFF, 0x04040404, + 0xE04, 0xFFFFFFFF, 0x00020204, + 0xE08, 0x0000FF00, 0x00000000, + 0x86C, 0xFFFFFF00, 0x00000000, + 0xE10, 0xFFFFFFFF, 0x06060606, + 0xE14, 0xFFFFFFFF, 0x00020406, + 0xE18, 0xFFFFFFFF, 0x00000000, + 0xE1C, 0xFFFFFFFF, 0x00000000, + 0x830, 0xFFFFFFFF, 0x04040404, + 0x834, 0xFFFFFFFF, 0x00020204, + 0x838, 0xFFFFFF00, 0x00000000, + 0x86C, 0x000000FF, 0x00000000, + 0x83C, 0xFFFFFFFF, 0x06060606, + 0x848, 0xFFFFFFFF, 0x00020406, + 0x84C, 0xFFFFFFFF, 0x00000000, + 0x868, 0xFFFFFFFF, 0x00000000, + 0xE00, 0xFFFFFFFF, 0x00000000, + 0xE04, 0xFFFFFFFF, 0x00000000, + 0xE08, 0x0000FF00, 0x00000000, + 0x86C, 0xFFFFFF00, 0x00000000, + 0xE10, 0xFFFFFFFF, 0x00000000, + 0xE14, 0xFFFFFFFF, 0x00000000, + 0xE18, 0xFFFFFFFF, 0x00000000, + 0xE1C, 0xFFFFFFFF, 0x00000000, + 0x830, 0xFFFFFFFF, 0x00000000, + 0x834, 0xFFFFFFFF, 0x00000000, + 0x838, 0xFFFFFF00, 0x00000000, + 0x86C, 0x000000FF, 0x00000000, + 0x83C, 0xFFFFFFFF, 0x00000000, + 0x848, 0xFFFFFFFF, 0x00000000, + 0x84C, 0xFFFFFFFF, 0x00000000, + 0x868, 0xFFFFFFFF, 0x00000000, + 0xE00, 0xFFFFFFFF, 0x00000000, + 0xE04, 0xFFFFFFFF, 0x00000000, + 0xE08, 0x0000FF00, 0x00000000, + 0x86C, 0xFFFFFF00, 0x00000000, + 0xE10, 0xFFFFFFFF, 0x00000000, + 0xE14, 0xFFFFFFFF, 0x00000000, + 0xE18, 0xFFFFFFFF, 0x00000000, + 0xE1C, 0xFFFFFFFF, 0x00000000, + 0x830, 0xFFFFFFFF, 0x00000000, + 0x834, 0xFFFFFFFF, 0x00000000, + 0x838, 0xFFFFFF00, 0x00000000, + 0x86C, 0x000000FF, 0x00000000, + 0x83C, 0xFFFFFFFF, 0x00000000, + 0x848, 0xFFFFFFFF, 0x00000000, + 0x84C, 0xFFFFFFFF, 0x00000000, + 0x868, 0xFFFFFFFF, 0x00000000, + 0xE00, 0xFFFFFFFF, 0x04040404, + 0xE04, 0xFFFFFFFF, 0x00020204, + 0xE08, 0x0000FF00, 0x00000000, + 0x86C, 0xFFFFFF00, 0x00000000, + 0xE10, 0xFFFFFFFF, 0x00000000, + 0xE14, 0xFFFFFFFF, 0x00000000, + 0xE18, 0xFFFFFFFF, 0x00000000, + 0xE1C, 0xFFFFFFFF, 0x00000000, + 0x830, 0xFFFFFFFF, 0x04040404, + 0x834, 0xFFFFFFFF, 0x00020204, + 0x838, 0xFFFFFF00, 0x00000000, + 0x86C, 0x000000FF, 0x00000000, + 0x83C, 0xFFFFFFFF, 0x00000000, + 0x848, 0xFFFFFFFF, 0x00000000, + 0x84C, 0xFFFFFFFF, 0x00000000, + 0x868, 0xFFFFFFFF, 0x00000000, + 0xE00, 0xFFFFFFFF, 0x00000000, + 0xE04, 0xFFFFFFFF, 0x00000000, + 0xE08, 0x0000FF00, 0x00000000, + 0x86C, 0xFFFFFF00, 0x00000000, + 0xE10, 0xFFFFFFFF, 0x00000000, + 0xE14, 0xFFFFFFFF, 0x00000000, + 0xE18, 0xFFFFFFFF, 0x00000000, + 0xE1C, 0xFFFFFFFF, 0x00000000, + 0x830, 0xFFFFFFFF, 0x00000000, + 0x834, 0xFFFFFFFF, 0x00000000, + 0x838, 0xFFFFFF00, 0x00000000, + 0x86C, 0x000000FF, 0x00000000, + 0x83C, 0xFFFFFFFF, 0x00000000, + 0x848, 0xFFFFFFFF, 0x00000000, + 0x84C, 0xFFFFFFFF, 0x00000000, + 0x868, 0xFFFFFFFF, 0x00000000, + +}; + +void +ODM_ReadAndConfig_PHY_REG_PG_8723A( + IN PDM_ODM_T pDM_Odm + ) +{ + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte interfaceValue = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_PHY_REG_PG_8723A)/sizeof(u4Byte); + pu4Byte Array = Array_PHY_REG_PG_8723A; + + hex += board; + hex += interfaceValue << 8; + hex += platform << 16; + hex += 0xFF000000; + for (i = 0; i < ArrayLen; i += 3 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + u4Byte v3 = Array[i+2]; + + // this line is a line of pure_body + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigBB_PHY_REG_PG_8723A(pDM_Odm, v1, v2, v3); + continue; + } + else + { // this line is the start of branch + if ( !CheckCondition(Array[i], hex) ) + { // don't need the hw_body + i += 2; // skip the pair of expression + v1 = Array[i]; + v2 = Array[i+1]; + v3 = Array[i+2]; + while (v2 != 0xDEAD) + { + i += 3; + v1 = Array[i]; + v2 = Array[i+1]; + v3 = Array[i+1]; + } + } + } + } +} + + +#endif // end of HWIMG_SUPPORT + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_BB.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_BB.h index fa20df9ea19a..d97e5ee60f70 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_BB.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_BB.h @@ -1,63 +1,63 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License along with -* this program; if not, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#if (RTL8723A_SUPPORT == 1) -#ifndef __INC_BB_8723A_HW_IMG_H -#define __INC_BB_8723A_HW_IMG_H - -/****************************************************************************** -* AGC_TAB_1T.TXT -******************************************************************************/ - -void -ODM_ReadAndConfig_AGC_TAB_1T_8723A( - IN PDM_ODM_T pDM_Odm -); - -/****************************************************************************** -* PHY_REG_1T.TXT -******************************************************************************/ - -void -ODM_ReadAndConfig_PHY_REG_1T_8723A( - IN PDM_ODM_T pDM_Odm -); - -/****************************************************************************** -* PHY_REG_MP.TXT -******************************************************************************/ - -void -ODM_ReadAndConfig_PHY_REG_MP_8723A( - IN PDM_ODM_T pDM_Odm -); - -/****************************************************************************** -* PHY_REG_PG.TXT -******************************************************************************/ - -void -ODM_ReadAndConfig_PHY_REG_PG_8723A( - IN PDM_ODM_T pDM_Odm -); - -#endif -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#if (RTL8723A_SUPPORT == 1) +#ifndef __INC_BB_8723A_HW_IMG_H +#define __INC_BB_8723A_HW_IMG_H + +/****************************************************************************** +* AGC_TAB_1T.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_AGC_TAB_1T_8723A( + IN PDM_ODM_T pDM_Odm +); + +/****************************************************************************** +* PHY_REG_1T.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_PHY_REG_1T_8723A( + IN PDM_ODM_T pDM_Odm +); + +/****************************************************************************** +* PHY_REG_MP.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_PHY_REG_MP_8723A( + IN PDM_ODM_T pDM_Odm +); + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_PHY_REG_PG_8723A( + IN PDM_ODM_T pDM_Odm +); + +#endif +#endif // end of HWIMG_SUPPORT + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_FW.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_FW.c index 2b95f5b3c534..736411b1af4b 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_FW.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_FW.c @@ -1,1597 +1,1597 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License along with -* this program; if not, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "Mp_Precomp.h" -#include "../odm_precomp.h" - -#if (RTL8723A_SUPPORT == 1) -u1Byte Array_8723A_rtl8723fw[] = { - -}; -u4Byte ArrayLength_8723A_rtl8723fw = 0; - - -void -ODM_ReadFirmware_8723A_rtl8723fw( - IN PDM_ODM_T pDM_Odm, - OUT u1Byte *pFirmware, - OUT u4Byte *pFirmwareSize -) -{ - ODM_MoveMemory(pDM_Odm, pFirmware, Array_8723A_rtl8723fw, ArrayLength_8723A_rtl8723fw); - *pFirmwareSize = ArrayLength_8723A_rtl8723fw; -} - - -u1Byte Array_8723A_rtl8723fw_B[] = { -0x02, 0x23, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x01, 0x14, 0x15, 0x51, 0xC6, 0x5F, 0x01, 0x00, -0x03, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x02, 0x4A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x61, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x66, 0xB5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x67, 0xC2, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x6F, 0x8F, 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, -0x00, 0x04, 0x06, 0x05, 0x04, 0x02, 0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, -0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, -0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, 0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, -0x00, 0x18, 0x22, 0x21, 0x20, 0x18, 0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, -0x20, 0x08, 0x00, 0x20, 0x22, 0x21, 0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, -0x22, 0x20, 0x18, 0x08, 0x00, 0x20, 0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, -0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, -0x10, 0x00, 0x00, 0x30, 0x31, 0x20, 0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, -0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, -0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, -0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, -0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, 0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, -0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, -0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, -0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, -0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, -0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, -0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, -0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, -0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, -0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, -0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, -0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, -0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, -0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, -0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, -0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, -0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, -0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, -0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, -0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, -0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, -0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, -0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, -0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, -0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, -0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, -0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, -0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, -0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, -0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, -0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, -0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, -0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, -0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, -0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, -0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, -0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, -0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, -0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, -0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, -0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, -0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, -0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, -0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, -0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0xFB, 0x90, 0x93, 0x63, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, -0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xF0, 0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0xF0, -0x0B, 0x90, 0x93, 0x40, 0xF0, 0x04, 0x70, 0x03, 0x02, 0x44, 0xF0, 0x43, 0x66, 0x10, 0x90, 0x93, -0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0xE0, 0x54, 0x0F, 0xFF, 0x90, -0x93, 0x58, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0xF5, 0x49, -0xE4, 0x1B, 0x80, 0x56, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, -0x58, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x04, 0x2F, 0xF5, -0x49, 0xE4, 0xFB, 0x80, 0x35, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x13, -0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, -0xFB, 0x80, 0x17, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, -0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, -0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, -0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x62, 0x12, 0x9D, 0x6C, 0x90, 0x05, 0x22, 0xE4, 0xF0, -0x22, 0xE4, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x41, 0xF0, 0xF5, 0x66, 0x22, 0x22, 0xE4, 0xFF, -0x02, 0x4E, 0x18, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0xFB, 0x90, 0x93, 0x5D, 0x12, 0x1F, -0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0x71, 0xE5, 0x62, 0x64, 0x01, -0x60, 0x03, 0x02, 0x46, 0x71, 0xE5, 0x65, 0x14, 0x60, 0x2B, 0x24, 0xFD, 0x60, 0x27, 0x24, 0x02, -0x24, 0xFB, 0x50, 0x02, 0x80, 0x21, 0x90, 0x93, 0x40, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, -0xE0, 0x60, 0x14, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x08, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, -0xF0, 0x7B, 0x01, 0x80, 0x02, 0x7B, 0x01, 0xEB, 0x70, 0x03, 0x02, 0x46, 0x71, 0x43, 0x66, 0x10, -0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, 0xE0, 0x54, 0x0F, -0xFF, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0x80, -0x2D, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, -0xFE, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x08, -0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3A, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0x80, -0x2D, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, -0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, -0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, -0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x62, -0xE5, 0x63, 0x64, 0x0C, 0x60, 0x68, 0x90, 0x93, 0x13, 0xE0, 0xFF, 0x90, 0x93, 0x58, 0xE0, 0xD3, -0x9F, 0x40, 0x06, 0x90, 0x93, 0x14, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x58, 0xE0, 0x90, 0x93, 0x13, -0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x46, 0xE4, 0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, -0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xA9, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x70, -0x21, 0x12, 0x4A, 0x5E, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, -0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x55, -0x80, 0x09, 0x43, 0x66, 0x01, 0x12, 0x51, 0x39, 0x90, 0x93, 0x51, 0x74, 0x01, 0xF0, 0x12, 0x9D, -0x6C, 0x22, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x47, 0x2B, 0x90, 0x93, -0x5A, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x60, 0x03, 0x02, -0x47, 0x2B, 0x02, 0x47, 0x28, 0x90, 0x93, 0x41, 0xE0, 0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, -0x58, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, -0x3A, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x0F, 0xB5, 0x07, 0x0A, 0x90, -0x93, 0x39, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, -0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x58, 0xE0, 0xB5, 0x07, 0x0B, -0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, -0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x63, 0x74, 0x5A, 0xF0, 0x90, 0x93, -0x63, 0xE0, 0xFF, 0x90, 0x93, 0x48, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x41, 0xE0, -0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x0D, 0xE5, 0x62, 0xB4, 0x01, 0x0B, -0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x52, 0x08, 0x22, 0xE4, 0xF5, 0x66, 0xF5, -0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, 0x59, 0xF0, 0x90, 0x93, 0x55, 0xF0, 0x90, -0x93, 0x52, 0xF0, 0x90, 0x93, 0x57, 0x04, 0xF0, 0x90, 0x93, 0x40, 0xF0, 0xE4, 0x90, 0x93, 0x5A, -0xF0, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x93, 0x4F, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, -0x90, 0x93, 0x4D, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x93, 0x4B, 0x74, -0x05, 0xF0, 0x90, 0x93, 0x45, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x50, 0x74, 0x05, 0xF0, 0xE4, 0x90, -0x93, 0x43, 0xF0, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x93, 0xB2, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x90, -0x93, 0x5C, 0xF0, 0x90, 0x93, 0x58, 0xF0, 0x90, 0x93, 0x3D, 0xF0, 0x90, 0x93, 0x56, 0xF0, 0x90, -0x93, 0x47, 0xF0, 0x90, 0x93, 0x44, 0xF0, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x4A, 0xF0, 0x90, -0x93, 0x46, 0xF0, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x93, 0x49, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0xB4, -0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, -0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x3A, 0xF0, 0x90, -0x93, 0x39, 0xF0, 0x22, 0xEF, 0x60, 0x5F, 0xAF, 0x05, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, -0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, -0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6B, 0x90, 0x93, 0x2B, 0xE0, -0xC3, 0x94, 0x20, 0x50, 0x13, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x23, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xAF, 0x05, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, -0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, -0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xBF, 0xF0, -0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0x74, 0x23, 0x2D, 0xF5, 0x82, -0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x22, 0x90, -0x93, 0x26, 0xE0, 0x60, 0x09, 0x90, 0x01, 0xB9, 0x74, 0x40, 0xF0, 0x02, 0x49, 0x22, 0xE5, 0x64, -0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x02, 0x80, 0x2F, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x67, 0x80, -0x5D, 0x12, 0x51, 0xAC, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, -0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x53, 0xE5, -0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x42, -0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x35, 0xE5, 0x66, 0x30, -0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x28, 0x90, 0x93, 0x42, 0xE0, 0x60, 0x08, -0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x01, -0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, -0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0xE4, 0x90, 0x93, 0x5D, 0xF0, -0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x18, 0x90, 0x93, 0x51, -0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x14, -0x12, 0x52, 0x08, 0x80, 0x0F, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, -0x03, 0x12, 0x4F, 0xA9, 0x90, 0x93, 0x5D, 0xE0, 0x30, 0xE6, 0x1B, 0x43, 0x66, 0x01, 0x90, 0x93, -0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x13, 0x12, 0x51, 0x39, 0x80, -0x0E, 0x12, 0x50, 0x68, 0x80, 0x09, 0x90, 0x93, 0x51, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, -0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x5D, 0xE0, 0x30, 0xE7, 0x2A, 0x43, 0x66, 0x02, 0xE4, 0xF5, -0x48, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, -0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x5A, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x1A, -0xE0, 0x44, 0x10, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, 0x8E, 0x25, 0x8F, 0x26, 0xAD, 0x26, 0xAC, -0x25, 0xAF, 0x24, 0x12, 0x47, 0xE4, 0xAF, 0x26, 0xAE, 0x25, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, -0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, -0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, -0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, -0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, -0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, -0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, -0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, -0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01, -0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x68, 0x8D, 0x69, 0xE5, 0x68, 0x54, -0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x68, 0x30, 0xE2, 0x30, 0xE5, 0x63, -0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0x92, 0xE5, 0x63, 0x30, 0xE3, 0x10, 0xE5, 0x68, 0x20, -0xE3, 0x0B, 0x12, 0x4D, 0x46, 0xEF, 0x60, 0x53, 0x12, 0x51, 0xC5, 0x80, 0x4E, 0xE5, 0x63, 0x20, -0xE3, 0x49, 0xE5, 0x68, 0x30, 0xE3, 0x44, 0xAF, 0x69, 0x12, 0x51, 0x77, 0x80, 0x3D, 0xE5, 0x63, -0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x68, 0x20, 0xE3, 0x09, 0x12, 0x4D, 0x46, 0xEF, 0x60, -0x2A, 0x12, 0x51, 0xC5, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, 0xE5, 0x68, 0x20, 0xE2, -0x09, 0x12, 0x48, 0x88, 0xEF, 0x60, 0x14, 0x12, 0x51, 0x10, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, -0x02, 0x09, 0x12, 0x4B, 0xF0, 0xEF, 0x60, 0x03, 0x12, 0x51, 0xF5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x02, 0x4B, 0x2E, 0x02, 0x52, 0xE5, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, -0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, -0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, -0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4F, -0x66, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, -0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, -0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, -0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, -0xE7, 0x80, 0xBE, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, -0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, 0x01, 0x36, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, -0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, -0x3C, 0x74, 0x02, 0xF0, 0x12, 0x4A, 0x5E, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, -0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B, 0xF0, 0xA3, 0x74, 0x02, 0xF0, -0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, -0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, -0x07, 0xF0, 0x12, 0x4F, 0x19, 0xE5, 0x62, 0x20, 0xE0, 0x05, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0x22, -0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x10, 0x12, 0x51, 0xAC, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, -0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x54, 0xE5, 0x14, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, -0xF0, 0x80, 0x48, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, -0x02, 0xF0, 0x80, 0x37, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, -0x80, 0x29, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, -0x1A, 0x90, 0x93, 0x43, 0xE0, 0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, -0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, -0xF0, 0x7F, 0x00, 0x22, 0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, -0x64, 0x02, 0x60, 0x06, 0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, -0x40, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x93, 0x57, 0xF0, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x07, -0x90, 0x93, 0x57, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x93, 0x40, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xEF, -0xF0, 0x90, 0x93, 0x42, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, -0x58, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, -0x74, 0x02, 0xF0, 0x53, 0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, -0x80, 0x03, 0x12, 0x49, 0x2B, 0x22, 0x90, 0x93, 0xB1, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, -0x0C, 0x90, 0x93, 0xB1, 0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0x7D, 0x40, 0x7F, 0x93, 0x12, -0x53, 0xF0, 0x90, 0x00, 0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x53, 0xF0, 0x90, 0x00, -0x28, 0xE0, 0x54, 0xFC, 0xFD, 0x7F, 0x28, 0x12, 0x53, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, -0xFD, 0x7F, 0x08, 0x12, 0x53, 0xF0, 0x7F, 0x01, 0x12, 0x4E, 0x72, 0x90, 0x00, 0x00, 0xE0, 0x44, -0x20, 0xFD, 0xE4, 0xFF, 0x12, 0x53, 0xF0, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, -0x12, 0x53, 0xF0, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x53, 0xF0, 0x7F, -0x14, 0x7E, 0x00, 0x02, 0x3B, 0x09, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x93, 0x1A, -0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x49, -0x12, 0x51, 0xAC, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, -0x90, 0x93, 0x55, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, -0x52, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, -0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, -0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, -0x00, 0x22, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xC8, 0x12, 0x44, 0xF1, 0x90, 0x93, 0x8A, 0x12, 0x43, -0xA8, 0x12, 0x1E, 0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, -0x03, 0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, -0x12, 0x1F, 0x0F, 0xFD, 0xE4, 0xFF, 0x12, 0x50, 0x2A, 0x80, 0x29, 0x90, 0x93, 0x8A, 0x12, 0x43, -0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x50, 0x2A, 0x1F, 0x80, 0x14, -0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, -0x50, 0x2A, 0xE4, 0xFF, 0x12, 0x4B, 0x73, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, -0x24, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xA9, -0x90, 0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x27, 0x74, 0xFF, 0xF0, 0x12, -0x5A, 0x0E, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x90, 0x12, -0x49, 0xC9, 0x90, 0x05, 0x22, 0xE5, 0x27, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, -0x01, 0x12, 0x58, 0x90, 0x12, 0x49, 0xC9, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x8F, 0x6C, 0xE4, 0x90, 0x94, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, -0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6C, 0x60, 0x3E, 0xC3, 0x90, 0x94, 0x45, 0xE0, -0x94, 0x88, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, -0xF0, 0x22, 0x90, 0x94, 0x44, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, -0x12, 0x3B, 0x09, 0xD3, 0x90, 0x94, 0x45, 0xE0, 0x94, 0x32, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x00, -0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, 0x00, 0x20, 0xE0, 0x44, 0x01, -0xFD, 0x7F, 0x20, 0x12, 0x53, 0xF0, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x00, -0xE0, 0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x53, 0xF0, 0x90, 0x00, 0x28, 0xE0, 0x44, 0x03, 0xFD, -0x7F, 0x28, 0x12, 0x53, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x53, -0xF0, 0xE4, 0xFF, 0x12, 0x4E, 0x72, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x29, -0xE0, 0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x53, 0xF0, 0xE4, 0xFF, 0x90, 0x00, 0x6A, 0xE0, 0x30, -0xE2, 0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x02, -0x30, 0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x03, 0x30, 0xE3, 0x06, -0x7F, 0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, 0x4E, 0xE0, 0x9D, 0x90, 0x93, -0x4D, 0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xA3, -0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x48, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x48, 0x93, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0x9F, 0x00, -0x41, 0x93, 0xAE, 0x00, 0x41, 0x93, 0x94, 0x00, 0x41, 0x94, 0x4A, 0x00, 0x41, 0x93, 0x13, 0x00, -0x41, 0x93, 0x14, 0x00, 0x41, 0x92, 0x69, 0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, -0x41, 0x94, 0x3D, 0x00, 0x41, 0x94, 0x4D, 0x00, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x93, 0x56, 0x74, 0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x94, 0x31, -0x12, 0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x94, 0x31, -0x12, 0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, -0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, -0x50, 0x02, 0x80, 0x35, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x2E, 0x90, 0x93, 0x3D, 0xE0, 0x60, -0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xA9, 0x12, 0x9D, 0x6C, 0x90, 0x93, 0x59, -0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0D, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, -0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x62, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, -0x16, 0x24, 0x02, 0x70, 0x32, 0x80, 0x0A, 0x90, 0x93, 0x57, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x40, -0xF0, 0xE4, 0x90, 0x93, 0x5C, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x50, 0xE0, 0x90, 0x93, -0x57, 0xF0, 0x80, 0x05, 0x90, 0x93, 0x57, 0xED, 0xF0, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, -0xF0, 0x90, 0x93, 0x5C, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, -0x74, 0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, -0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, -0x02, 0xF0, 0x90, 0x93, 0x52, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x0C, 0x50, 0x03, -0x12, 0x4A, 0x5E, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, -0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x3E, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, -0x0F, 0xFF, 0x74, 0x40, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0x90, 0x93, 0x54, 0xF0, 0xEE, 0x90, 0x93, 0x53, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, -0x93, 0xB0, 0xE0, 0x90, 0x94, 0x35, 0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0xB0, 0xE0, 0x90, 0x94, -0x35, 0x60, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x01, 0x10, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x35, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x55, 0x51, -0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x5A, 0x0E, 0xEF, -0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x12, -0x54, 0x48, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x90, 0x93, 0x46, 0xE0, 0x70, 0x1A, 0x90, -0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, 0x90, 0x8E, -0x6A, 0x8F, 0x6B, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x16, -0x90, 0x93, 0x4A, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x44, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, -0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xEF, 0x60, -0x0A, 0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x18, 0x53, 0x63, 0xF0, 0x43, 0x63, -0x0C, 0x22, 0x90, 0x94, 0x4B, 0xEF, 0xF0, 0x12, 0x6B, 0xF8, 0x90, 0x94, 0x4B, 0xE0, 0x60, 0x05, -0x90, 0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, -0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, -0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, -0x05, 0x7F, 0x01, 0x12, 0x4E, 0x18, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0xE5, 0x64, 0x30, -0xE6, 0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, -0xF0, 0x53, 0x64, 0xBF, 0x22, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0xD6, 0x12, 0x4E, -0xCA, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x7D, 0x01, 0xAF, 0x64, 0x02, 0x4A, 0x62, 0x90, -0x02, 0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, -0x43, 0xF7, 0x52, 0x3A, 0x00, 0x40, 0x52, 0x62, 0x00, 0x80, 0x52, 0x8D, 0x01, 0x00, 0x52, 0xA1, -0x02, 0x00, 0x52, 0xB9, 0x04, 0x00, 0x00, 0x00, 0x52, 0xD6, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, -0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, -0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, -0x80, 0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, -0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, -0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, -0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, -0x35, 0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, -0x2D, 0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, -0xFF, 0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, -0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1F, -0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x75, 0xF0, 0xA3, 0xF0, 0xF1, 0xE1, 0x75, 0x8E, -0x02, 0xB1, 0x1A, 0x12, 0x60, 0x10, 0x90, 0x93, 0xB1, 0xEF, 0xF0, 0xF1, 0xE9, 0x90, 0x93, 0xB3, -0xEF, 0xF0, 0x12, 0x60, 0x23, 0x90, 0x93, 0x95, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x14, -0xF5, 0x09, 0xF5, 0x62, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, 0xF0, 0x12, -0x87, 0x51, 0x12, 0x47, 0x2C, 0x12, 0x37, 0x1C, 0x71, 0xC7, 0x12, 0x5F, 0xD4, 0x12, 0x60, 0x3B, -0xF1, 0xDA, 0x12, 0x5F, 0xF2, 0x12, 0x44, 0xFD, 0x12, 0x60, 0xA6, 0xB1, 0x02, 0x90, 0x93, 0x77, -0xE5, 0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x38, 0x75, 0xE8, -0x03, 0x43, 0xA8, 0x85, 0x12, 0x9A, 0xCA, 0xD2, 0xAF, 0x12, 0x90, 0x6F, 0x51, 0xDB, 0x12, 0x60, -0x50, 0x90, 0x93, 0x75, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xE5, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, -0xA3, 0xF0, 0xE5, 0x14, 0x30, 0xE0, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0xFE, 0xB1, 0x2A, 0xD2, 0xAF, -0xE5, 0x14, 0x30, 0xE4, 0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xEF, 0xD2, 0xAF, 0x12, 0x77, 0xF7, 0xE5, -0x14, 0x30, 0xE6, 0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xBF, 0xD2, 0xAF, 0x12, 0x7F, 0x4E, 0xE5, 0x14, -0x30, 0xE7, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0x7F, 0xD2, 0xAF, 0xB1, 0xB8, 0xC2, 0xAF, 0xE5, 0x64, -0x54, 0x0F, 0xFF, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0x43, 0x74, 0x01, 0xF0, 0x51, 0x08, 0xE4, 0x90, -0x93, 0x43, 0xF0, 0xD2, 0xAF, 0x80, 0x9A, 0x90, 0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, -0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x71, 0xF0, -0x7D, 0xFF, 0x7F, 0x55, 0x71, 0xF0, 0x7D, 0xFF, 0x7F, 0x56, 0x71, 0xF0, 0x7D, 0xFF, 0x7F, 0x57, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x91, 0x38, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x71, 0xF0, 0xE4, -0xFD, 0x7F, 0x51, 0x71, 0xF0, 0xE4, 0xFD, 0x7F, 0x52, 0x71, 0xF0, 0xE4, 0xFD, 0x7F, 0x53, 0x80, -0xBF, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, -0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0xF2, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xF6, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x00, 0x00, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x91, 0x38, 0x91, 0x31, 0x90, 0x00, -0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, -0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, -0x74, 0x01, 0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x56, 0xF0, 0xFF, 0x7E, -0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, -0xEC, 0x54, 0xFD, 0xFC, 0x90, 0x93, 0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, -0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x47, -0xE0, 0x60, 0x22, 0xE4, 0xFF, 0x11, 0xDC, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xF6, -0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xF6, 0xB1, 0x4D, 0x90, -0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x51, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x90, 0x94, 0x3E, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x94, 0x40, 0xF0, 0x90, 0x94, -0x3E, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, -0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x61, 0xF0, 0xE4, 0x7B, 0x01, 0x7A, 0x92, 0x79, -0x6B, 0x12, 0x76, 0x31, 0xEF, 0xB4, 0x02, 0x14, 0x90, 0x94, 0x4D, 0xE0, 0x64, 0x04, 0x60, 0x07, -0x43, 0x14, 0x01, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x4D, 0xF0, 0x22, 0x7F, 0x70, 0x7E, -0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, -0xEE, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, -0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0x01, 0xEE, 0xF0, 0x12, 0x1E, 0xF6, 0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, -0x12, 0x98, 0x93, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x04, 0xE0, 0xC3, 0x13, 0x30, 0xE0, -0x16, 0xEF, 0x7B, 0x01, 0xB4, 0x01, 0x06, 0x7A, 0x93, 0x79, 0x0B, 0x80, 0x04, 0x7A, 0x93, 0x79, -0x07, 0x7F, 0x80, 0x7E, 0x08, 0xB1, 0x51, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x92, 0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, -0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, -0xF0, 0xFA, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0xD0, 0x01, 0xD0, 0x02, 0xD1, 0x12, 0x90, 0x92, -0x69, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, -0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x10, 0x12, 0x43, 0xC8, 0x90, -0x92, 0x68, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0xF1, 0xF5, 0xEF, -0x70, 0x02, 0xC1, 0xCB, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, -0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0xD1, 0xD0, 0x90, 0x94, 0x13, 0x12, 0x43, -0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, -0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0xD1, 0xD0, 0x90, 0x01, -0xAF, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x64, 0x01, 0x70, 0x48, 0x90, 0x94, 0x10, 0x12, -0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, -0x20, 0xD1, 0xD0, 0x90, 0x94, 0x13, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, -0x94, 0x10, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, -0x7A, 0xFD, 0x79, 0x22, 0xD1, 0xD0, 0x90, 0x93, 0x95, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, -0x83, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x94, 0x0A, -0x12, 0x43, 0xC8, 0xAB, 0x20, 0xAA, 0x21, 0xA9, 0x22, 0x90, 0x94, 0x0D, 0x12, 0x43, 0xC8, 0xAF, -0x23, 0x15, 0x23, 0xEF, 0x60, 0x1E, 0x90, 0x94, 0x0D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, -0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x94, 0x0A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, 0x12, -0x42, 0x53, 0x80, 0xDB, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, -0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x16, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, -0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, -0x92, 0x69, 0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, -0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x0D, 0xF1, 0xF5, 0xEF, 0x60, 0x70, 0xB1, 0xB8, 0x90, 0x01, 0x3F, -0x74, 0x02, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, -0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x7E, 0x00, 0x7F, -0x02, 0x12, 0x1E, 0xD0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, -0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0x19, 0x12, -0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x12, 0x1E, -0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xD1, 0xD0, 0x90, -0x92, 0x6A, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0x8F, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0x20, 0xF0, -0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, -0xE3, 0x02, 0x7F, 0x01, 0x22, 0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x94, 0x39, 0xEE, 0xF0, 0xA3, 0xEF, -0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0x39, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, -0x83, 0xE0, 0x60, 0x2C, 0xC3, 0x90, 0x94, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0x3B, 0xE0, 0x94, -0x03, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x3B, -0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, -0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xC4, 0x74, 0x43, 0xF0, -0x74, 0x58, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, -0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE1, 0xE4, -0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x11, 0x43, 0xBF, 0x01, 0x0F, -0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x90, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, -0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x0E, 0x74, -0x0F, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, -0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, -0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, -0xFD, 0x62, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x67, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x54, 0x3F, -0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x68, 0xF0, -0x90, 0x93, 0x67, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xE4, 0xFF, 0x90, 0x94, 0x1C, 0xEF, 0xF0, 0xA3, -0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, 0xE0, 0x90, -0x94, 0x21, 0xF0, 0x51, 0x08, 0xBF, 0x01, 0x02, 0x31, 0x5D, 0x90, 0x94, 0x21, 0xE0, 0x90, 0x05, -0x22, 0xF0, 0x80, 0x02, 0x31, 0x5D, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0xAC, -0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x90, 0x90, 0x94, 0x1F, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, -0x90, 0x94, 0x1C, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x94, 0x2B, 0xF0, 0xEF, 0x60, -0x10, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x80, -0x0E, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, -0x05, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, -0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, -0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x16, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0xAE, 0x05, 0x74, 0x22, 0x2E, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEB, 0xF0, 0x90, 0x94, 0x2B, 0xE0, 0xFF, 0x74, 0x23, -0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0x90, -0x94, 0x48, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, -0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x94, 0x49, 0xE0, 0x94, -0xE8, 0x90, 0x94, 0x48, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, -0x12, 0x3B, 0x09, 0x90, 0x94, 0x48, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x80, 0xC6, 0xE4, -0x90, 0x93, 0x63, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x02, 0xC1, -0xF8, 0x12, 0x9D, 0x9A, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x66, 0x90, 0x93, -0x1A, 0xE0, 0x30, 0xE0, 0x18, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x93, 0x1A, -0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0xA3, 0xE0, 0x90, 0x93, 0x63, 0xF0, 0xE4, 0xF5, 0x48, -0x90, 0x93, 0x63, 0xE0, 0x24, 0x03, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, -0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, -0x93, 0x27, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x19, -0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0x93, 0x16, 0xE0, 0xFF, 0x90, 0x93, 0x25, -0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, -0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, 0x93, 0x2B, -0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, -0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x31, 0x2A, 0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, -0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, -0x4A, 0x62, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x93, -0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x90, 0x93, -0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x06, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x93, -0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x20, -0xE0, 0x02, 0xC1, 0xF8, 0xC1, 0x66, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x81, 0x46, -0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0x51, 0x08, 0xBF, 0x01, -0x03, 0x12, 0x54, 0x48, 0xE4, 0xFF, 0x12, 0x6A, 0xBF, 0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x1F, -0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, -0xE0, 0x0D, 0xA3, 0xE0, 0x90, 0x93, 0x63, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, -0xF5, 0x48, 0x90, 0x93, 0x16, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0x93, 0x63, 0xE0, 0x2F, 0xFF, 0x90, -0x93, 0x25, 0xE0, 0xC3, 0x9F, 0xFF, 0x90, 0x93, 0x64, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, -0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0xE4, 0xFF, 0xD1, -0xF9, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, -0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, -0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x14, 0xE4, -0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x62, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, 0xE4, 0xFD, 0xAF, 0x64, -0x12, 0x4A, 0x62, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x30, 0xE0, 0x05, -0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, -0xE0, 0x02, 0xC1, 0xF8, 0xC1, 0xF3, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x03, 0x60, 0x02, 0xA1, 0x9B, -0x7F, 0x01, 0x12, 0x6A, 0xBF, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, -0x03, 0x12, 0x6B, 0xF8, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, -0x81, 0xF7, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xD3, 0x9F, 0x40, 0x4D, 0xE0, -0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, -0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0x17, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, -0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0x93, 0x66, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x66, 0x74, 0x03, -0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x66, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, -0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x80, 0x24, 0xE4, 0xF5, 0x48, 0x90, -0x93, 0x22, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, -0x93, 0x1D, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, -0xE4, 0x90, 0x93, 0x29, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x65, 0xE0, 0xFF, 0x90, -0x93, 0x17, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, -0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x7F, 0x01, 0xD1, -0xF9, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x2F, 0x90, 0x93, 0x15, 0xE0, -0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, -0xE0, 0x60, 0x02, 0x80, 0x0F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x08, -0xE5, 0x65, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x62, 0x90, 0x93, 0x4C, 0xE0, 0x60, -0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, -0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, -0x12, 0x51, 0x39, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, -0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0xF8, 0x7F, 0x01, 0xC1, 0xF5, 0x90, 0x93, 0x27, 0xE0, 0x64, -0x04, 0x60, 0x02, 0xC1, 0x6C, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, -0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, -0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0x93, 0x17, 0xE0, 0xFF, 0x90, -0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, -0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, -0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, -0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x31, 0x2A, 0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, -0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, -0x04, 0x12, 0x4A, 0x62, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, -0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, -0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x07, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, -0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, -0xE0, 0x20, 0xE0, 0x02, 0xC1, 0xF8, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x27, 0xE0, -0x64, 0x05, 0x60, 0x02, 0xC1, 0xF8, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, -0xE0, 0x08, 0x51, 0x08, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x48, 0xE4, 0xFF, 0x12, 0x6A, 0xBF, 0xE4, -0xFF, 0xD1, 0xF9, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, -0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x14, -0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x62, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, 0xE4, 0xFD, 0xAF, -0x64, 0x12, 0x4A, 0x62, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x30, 0xE0, -0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x55, 0x98, 0x22, 0x90, 0x94, 0x2C, 0xEF, 0xF0, 0xF1, 0x5B, -0x90, 0x93, 0x18, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x08, 0x90, 0x94, 0x2C, 0xE0, -0xFF, 0x12, 0x50, 0xDC, 0x90, 0x94, 0x2D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x90, 0x94, -0x2C, 0xE0, 0xB4, 0x01, 0x10, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0x30, 0xE0, 0x16, 0x80, 0x0A, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, -0x94, 0x2D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x2D, 0x12, -0x55, 0x4D, 0x90, 0x94, 0x2C, 0xE0, 0x90, 0x93, 0x26, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x3C, -0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, -0x0D, 0xF0, 0x22, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xE0, 0x13, 0x13, -0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x24, 0x80, 0x0E, 0x90, 0x93, 0x18, 0xE0, 0xC3, 0x13, -0x90, 0x07, 0x78, 0x30, 0xE0, 0x02, 0x80, 0x14, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x03, 0xF0, 0x22, -0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, -0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, -0xD0, 0x92, 0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90, -0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B, -0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x43, 0x32, -0x20, 0x90, 0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, 0x22, -0x90, 0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, 0x02, 0x22, -0x7F, 0x00, 0x22, 0x90, 0x93, 0xB3, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, -0x05, 0x7E, 0xFD, 0x7F, 0x33, 0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, -0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, -0xE4, 0x90, 0x93, 0x78, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, -0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x88, 0x90, 0x93, -0x78, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, -0x78, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, -0x90, 0x93, 0x79, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x78, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, -0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, -0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, -0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, -0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, -0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x93, -0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, -0x07, 0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3C, 0x90, 0x93, 0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, -0x3D, 0xF0, 0x79, 0x40, 0x90, 0x93, 0x5D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, -0xE0, 0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0x9F, 0xF0, 0x22, 0x90, 0x93, 0x9F, 0xE0, -0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0C, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, -0x03, 0x12, 0x58, 0x7B, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, -0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, -0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x45, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, -0x55, 0x28, 0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, -0xA3, 0xE0, 0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x61, 0x38, 0x90, 0x01, 0x34, -0x74, 0x01, 0xF0, 0x85, 0xD1, 0x0A, 0x85, 0xD3, 0x0C, 0x85, 0xD4, 0x0D, 0x85, 0xD5, 0x0E, 0x85, -0xD6, 0x0F, 0x85, 0xD7, 0x10, 0x85, 0xD9, 0x11, 0x85, 0xD2, 0x0B, 0x75, 0x20, 0x00, 0x75, 0x21, -0x00, 0x75, 0x22, 0x0A, 0x75, 0x23, 0x08, 0xFB, 0x7A, 0x93, 0x79, 0xA0, 0x12, 0x56, 0xD0, 0x90, -0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x6E, -0x70, 0x02, 0x41, 0xE9, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, -0xE0, 0x02, 0x41, 0xE9, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, 0x93, 0xA2, 0xE0, 0x54, 0x3F, 0xF5, -0x4E, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, -0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xE5, 0x4E, 0xD3, 0x94, 0x04, -0x40, 0x03, 0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, -0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0xA4, -0xE0, 0x54, 0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, -0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, -0x90, 0x93, 0xA1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2F, 0x90, 0x93, 0xA4, 0xE0, 0x54, -0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, -0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, -0x30, 0xE0, 0x66, 0xAF, 0x4D, 0x12, 0x79, 0xCB, 0x80, 0x5F, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, -0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x52, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xFD, 0xE5, -0x4D, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8D, 0xF0, 0x12, -0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0E, -0xEE, 0x54, 0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, 0xF1, 0x5C, 0x80, 0x1B, 0x90, 0x01, -0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, 0x0A, 0xE4, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, -0x80, 0x46, 0x90, 0x93, 0x59, 0xE0, 0x60, 0x37, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, -0x74, 0x04, 0xF0, 0x12, 0x51, 0xAC, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xF5, 0x48, 0x90, 0x93, 0x45, -0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, -0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x55, 0xF0, 0x80, 0x09, 0x12, -0x51, 0xAC, 0xBF, 0x01, 0x03, 0x12, 0x52, 0x08, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0xDA, 0x90, -0x01, 0x34, 0x74, 0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, -0xE5, 0x0B, 0x75, 0x4F, 0x88, 0x75, 0x50, 0x0F, 0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, -0x75, 0x50, 0x08, 0x75, 0x51, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x12, 0x90, 0x04, -0x7E, 0xE0, 0x55, 0x51, 0xF5, 0x13, 0x65, 0x12, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x12, 0x75, 0xF0, -0x08, 0xA4, 0x25, 0x4F, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, -0x74, 0x15, 0x2F, 0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, -0x75, 0x22, 0x15, 0x75, 0x23, 0x08, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x97, 0x12, 0x56, 0xD0, 0x90, -0x93, 0x97, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0x5C, 0xE5, -0x12, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, -0x8F, 0x12, 0x90, 0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x13, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, -0x01, 0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, -0x43, 0x14, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, -0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, -0x54, 0x05, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x54, 0x38, 0x80, 0xFE, 0xE5, 0x2C, -0x30, 0xE6, 0x06, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x81, 0xE3, -0x90, 0x93, 0xB2, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0x60, 0x0F, -0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x12, -0x45, 0x09, 0x90, 0x93, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xD9, 0x90, 0x05, 0x22, 0x74, 0xFF, -0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xDC, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, -0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2D, -0xE0, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9F, 0x40, 0x30, -0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x90, 0x93, 0x32, 0x12, 0x43, 0x84, 0x90, 0x81, -0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2E, 0x12, 0x43, -0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x80, 0x1C, -0x90, 0x93, 0x2D, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, -0x54, 0x0F, 0xFE, 0x25, 0xE0, 0x4F, 0xF0, 0x80, 0x03, 0x12, 0x6A, 0x4A, 0xD1, 0x7E, 0x90, 0x93, -0xB2, 0xE4, 0xF0, 0xE5, 0x2E, 0x30, 0xE1, 0x45, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x43, 0x14, -0x40, 0x12, 0x9F, 0x27, 0x11, 0xD6, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x1D, 0x90, 0x01, 0x3B, 0xE0, -0x30, 0xE4, 0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, -0x22, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, 0x08, 0xC3, 0x94, 0xFF, -0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xE5, 0x2E, 0x30, -0xE2, 0x43, 0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x12, 0x4C, 0x64, 0x90, 0x93, 0x5C, 0xE0, 0x60, -0x34, 0x90, 0x93, 0x57, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x57, -0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, -0xAD, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, -0x93, 0x40, 0xE0, 0x14, 0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, -0xE5, 0x62, 0x64, 0x01, 0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, -0x01, 0x3C, 0x74, 0x02, 0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, -0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, -0x30, 0xE4, 0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, -0x60, 0x1C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x5A, -0xE4, 0xF0, 0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x08, 0xE5, 0x2E, -0x30, 0xE5, 0x25, 0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x1A, 0xE5, 0x65, -0x60, 0x16, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x08, -0x12, 0x51, 0x39, 0x80, 0x03, 0x12, 0x50, 0x68, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, -0x74, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, 0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, -0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x08, 0xE5, 0x2F, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x37, -0x74, 0x02, 0xF0, 0x12, 0x4F, 0xEB, 0x74, 0x45, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, -0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, -0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x5D, 0xE0, -0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x15, -0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x5D, 0x02, 0x57, 0x1F, 0x90, 0x94, -0x3E, 0xE0, 0x30, 0xE0, 0x2F, 0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x94, 0x3D, 0xE0, 0x04, 0xF0, -0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x94, 0x40, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x3D, 0xF0, 0x90, -0x94, 0x40, 0xE0, 0xFF, 0x90, 0x94, 0x3F, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x44, 0xFE, 0xE4, -0x90, 0x94, 0x40, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, -0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x7D, 0xB5, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x66, 0xFF, -0xA3, 0xF0, 0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, -0x3D, 0x90, 0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, -0xE4, 0x06, 0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, -0x74, 0x20, 0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, -0x30, 0xE7, 0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, -0x56, 0x74, 0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, -0x3E, 0x30, 0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, -0x00, 0x56, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, -0x06, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x8F, 0x52, 0x8D, 0x53, -0xE5, 0x53, 0x54, 0x1F, 0x90, 0x93, 0x5F, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, -0xF5, 0x83, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x60, 0x74, 0x01, 0xF0, 0xEB, 0xC3, 0x94, -0x01, 0x40, 0x03, 0x02, 0x79, 0xCB, 0x90, 0x93, 0x5D, 0xE0, 0x25, 0x55, 0xFF, 0xA3, 0xF0, 0xA3, -0xE0, 0x90, 0x41, 0xA4, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x14, 0x74, 0x01, 0x25, 0x52, 0xF5, -0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x02, 0x79, 0x82, 0x90, -0x93, 0x5E, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEF, -0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, -0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, -0x56, 0x00, 0x90, 0x01, 0xC4, 0x74, 0xC2, 0xF0, 0x74, 0x67, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, -0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, -0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34, 0x30, 0xE0, 0x06, 0x90, 0x01, -0x3C, 0x74, 0x01, 0xF0, 0xE5, 0x34, 0x30, 0xE1, 0x10, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, -0x93, 0x15, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x46, 0x72, 0xE5, 0x34, 0x30, 0xE2, 0x36, 0x90, 0x01, -0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, -0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, -0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x55, 0xE4, -0xF0, 0x12, 0x52, 0x08, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0x90, -0x06, 0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, -0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, -0x06, 0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x52, 0xE4, 0xF0, 0x12, 0x52, 0x08, 0xE5, -0x34, 0x30, 0xE4, 0x34, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x30, 0xE0, -0x24, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xDC, 0x90, 0x07, 0x78, 0x74, -0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, -0x12, 0x34, 0x30, 0x80, 0x03, 0x12, 0x5A, 0x4F, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, -0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, -0x83, 0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, 0x64, 0xF0, 0x12, 0x51, 0xDD, 0x12, 0x52, 0x08, -0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, -0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, 0xAE, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, -0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x06, -0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0xE5, 0x36, 0x30, 0xE1, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x02, -0xF0, 0xE5, 0x36, 0x30, 0xE3, 0x08, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0x71, 0xB2, 0xE5, 0x36, -0x30, 0xE4, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x75, 0x90, 0x01, -0x3E, 0x74, 0x04, 0xF0, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE7, 0x13, 0x74, 0x80, 0xF0, 0x90, 0x07, -0x95, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0xFF, 0x12, 0x55, 0x98, 0x90, 0x07, -0x8F, 0xE0, 0x30, 0xE6, 0x11, 0x74, 0x40, 0xF0, 0x90, 0x07, 0x7C, 0xE0, 0xB4, 0x06, 0x07, 0x90, -0x07, 0x80, 0xE0, 0xFF, 0x71, 0xD0, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE5, 0x14, 0x74, 0x20, 0xF0, -0xE4, 0xFF, 0x12, 0x55, 0x98, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, 0x01, -0xF0, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE2, 0x0D, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, -0x7F, 0x01, 0x12, 0x55, 0x98, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE0, 0x07, 0x74, 0x01, 0xF0, 0xFF, -0x12, 0x55, 0x98, 0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, -0x30, 0xE6, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, -0x3E, 0x74, 0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, -0x14, 0x80, 0xE5, 0x37, 0x30, 0xE4, 0x1D, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x44, 0x24, -0x90, 0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x51, -0x4A, 0x12, 0x66, 0x7E, 0x74, 0xC2, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x67, 0xA3, 0xF0, 0xD0, -0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, -0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, -0x6D, 0x7F, 0x01, 0x51, 0xBF, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, -0x02, 0x71, 0xF8, 0x7F, 0x01, 0x12, 0x5E, 0xF9, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, -0x20, 0xE0, 0x29, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0x93, 0x1A, -0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, -0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x4A, 0x62, 0x90, 0x93, 0x4C, 0xE0, -0x90, 0x05, 0x22, 0x60, 0x05, 0x74, 0x6F, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, -0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x98, 0x22, 0xEF, -0x64, 0x03, 0x60, 0x02, 0x61, 0x8D, 0x90, 0x94, 0x02, 0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, -0xA3, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x30, 0x90, 0x94, -0x06, 0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0xA3, 0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, -0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x94, 0x02, 0x74, 0xFF, 0xF0, -0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0x80, 0x2D, 0x90, 0x93, -0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x17, 0x90, 0x94, 0x02, 0x74, 0xFF, 0xF0, 0xA3, 0x74, -0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0x5A, 0x80, 0x05, 0x90, -0x94, 0x06, 0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0x02, 0xE0, 0x90, -0x06, 0xC0, 0xF0, 0x90, 0x94, 0x03, 0xE0, 0x90, 0x06, 0xC1, 0xF0, 0x90, 0x94, 0x04, 0xE0, 0x90, -0x06, 0xC2, 0xF0, 0x90, 0x94, 0x05, 0xE0, 0x90, 0x06, 0xC3, 0xF0, 0x90, 0x94, 0x06, 0xE0, 0x90, -0x06, 0xC4, 0xF0, 0x90, 0x94, 0x07, 0xE0, 0x90, 0x06, 0xC5, 0xF0, 0x90, 0x94, 0x08, 0xE0, 0x90, -0x06, 0xC6, 0xF0, 0x90, 0x94, 0x09, 0xE0, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, -0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x24, 0xE4, 0xF0, 0x22, 0xEF, 0xB4, 0x01, -0x10, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x16, 0x90, 0x06, 0xCC, 0xE4, 0xF0, -0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0x90, 0x06, 0xCC, 0x74, 0x03, -0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, 0x93, -0x1C, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0x22, -0xAD, 0x07, 0x90, 0x93, 0x63, 0xE0, 0x54, 0xF0, 0x44, 0x05, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, -0x90, 0x93, 0x65, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x65, 0x90, 0x94, 0x19, 0x12, 0x43, -0xC8, 0x7A, 0x93, 0x79, 0x63, 0x02, 0x57, 0x1F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, -0x93, 0xEA, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xEE, 0x12, 0x1F, 0xD5, 0x00, -0x00, 0x00, 0x00, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, -0x90, 0x93, 0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x3D, 0xE0, -0x60, 0x14, 0x12, 0x51, 0xAC, 0xBF, 0x01, 0x0B, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, -0x30, 0xE0, 0x03, 0x12, 0x4F, 0xA9, 0x90, 0x93, 0x2D, 0xE0, 0x20, 0xE0, 0x24, 0x90, 0x93, 0x47, -0xE0, 0x60, 0x1E, 0x7F, 0x01, 0x12, 0x50, 0xDC, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x13, 0x90, 0x93, -0xEE, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xEE, 0x12, 0x55, -0x4D, 0x12, 0x54, 0x31, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x15, -0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, -0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x10, -0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x15, -0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x12, 0x1E, -0xF6, 0xFC, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x15, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x03, -0x12, 0x1F, 0x0F, 0xFD, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xED, -0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFD, 0x54, -0x04, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x10, 0xFF, 0xE0, 0x54, -0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x18, -0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, -0x03, 0x12, 0x1F, 0x0F, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, -0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xDF, 0x4E, -0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, -0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, -0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x04, 0xFE, 0x90, -0x93, 0x19, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, -0xEC, 0x20, 0xE0, 0x02, 0xC1, 0xF3, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x25, 0xF0, -0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, -0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x16, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0x90, 0x93, 0x17, 0xF0, 0x80, 0x4E, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, -0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x93, 0x16, 0x50, -0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x16, 0x74, 0x2A, 0xF0, -0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, -0x90, 0x93, 0x17, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, -0x17, 0x74, 0x2A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3D, -0x90, 0x93, 0x16, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x1E, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, -0xF0, 0x90, 0x93, 0x17, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x20, 0xF0, 0x90, 0x93, 0x16, -0xE0, 0xC3, 0x13, 0x90, 0x93, 0x21, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x22, -0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, 0xE4, 0x90, 0x93, -0x11, 0xF0, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x20, 0xE0, 0x14, 0x12, 0x1E, 0xF6, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, -0x04, 0x7F, 0x01, 0x80, 0x02, 0xE4, 0xFF, 0x12, 0x50, 0xDC, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, -0x0F, 0x30, 0xE0, 0x18, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x75, -0x64, 0x04, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, -0x03, 0xF0, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x80, -0x2B, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x80, 0x1C, -0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x93, 0x27, 0x74, 0x02, 0xF0, 0x80, 0x0D, 0x90, -0x93, 0x1D, 0xE0, 0xB4, 0x07, 0x06, 0x90, 0x93, 0x27, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x1D, -0xF0, 0x80, 0x65, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x90, 0x93, 0x83, 0x30, 0xE0, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, -0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x12, 0x9B, 0x2D, 0x90, 0x00, 0x40, 0x74, 0x20, -0xF0, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x13, 0x13, 0x13, -0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, -0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x12, 0x55, 0x4D, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, -0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, -0x90, 0x93, 0x26, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, -0x09, 0x90, 0x93, 0x04, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x55, 0x98, 0x90, -0x93, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x51, 0xBF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, -0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, -0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x53, 0x91, 0xBF, 0x90, -0xFD, 0x68, 0xE0, 0x20, 0xE0, 0x03, 0x02, 0x72, 0x0E, 0x90, 0x93, 0x94, 0xE0, 0x70, 0x16, 0x90, -0x00, 0x2E, 0xE0, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x00, 0x2D, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, -0x93, 0x94, 0x74, 0x01, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x54, 0x3F, 0xD3, 0x94, 0x09, 0x50, 0x03, -0x12, 0x9B, 0xE0, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x0E, 0x60, 0x03, 0x02, 0x70, 0x93, 0x90, 0x93, -0x04, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x03, 0x02, 0x70, 0x93, 0x90, 0xFD, -0x62, 0xE0, 0x54, 0xC0, 0xFE, 0x90, 0x07, 0x90, 0xE0, 0x54, 0x3F, 0x4E, 0xF0, 0x90, 0xFD, 0x63, -0xE0, 0x90, 0x07, 0x91, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x07, 0x92, 0xF0, 0x90, 0xFD, 0x65, -0xE0, 0x90, 0x07, 0x93, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x01, 0xF0, 0xEF, 0x20, 0xE0, 0x44, 0x90, -0x93, 0x04, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x19, 0x90, 0x07, 0x78, 0x12, 0x58, 0xF0, -0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x49, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x40, -0xF0, 0x80, 0x40, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x11, 0xE4, 0xFF, 0x12, -0x55, 0x98, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, -0x78, 0x80, 0x14, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, -0xE0, 0x05, 0x12, 0x58, 0xF0, 0x80, 0x0C, 0xE0, 0x44, 0x10, 0xF0, 0xE0, 0x44, 0x20, 0xF0, 0xE0, -0x54, 0xDF, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x0F, 0x0A, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xA3, -0xE0, 0xFD, 0x51, 0xCA, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x15, 0x70, 0x76, 0x90, 0xFD, 0x62, 0xE0, -0x90, 0x93, 0x6A, 0xF0, 0xE0, 0x30, 0xE6, 0x1C, 0xF4, 0x54, 0x3F, 0x04, 0xFF, 0x90, 0x93, 0x0F, -0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9F, 0x90, 0x93, 0x69, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x20, -0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xFF, 0x90, 0x93, 0x6A, -0xE0, 0x54, 0x3F, 0x2F, 0x90, 0x93, 0x69, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, -0x90, 0x93, 0x69, 0xE0, 0xFF, 0x90, 0x01, 0xE7, 0xF0, 0xEF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFF, -0x90, 0x93, 0x69, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, 0x93, 0x6B, 0xF0, 0x90, 0x00, -0x2E, 0xF0, 0xEE, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x93, 0x10, 0xE0, 0x54, 0x0F, 0x4F, 0x90, 0x00, -0x2D, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x16, 0x07, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x51, 0x29, -0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x21, 0x07, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x51, 0x51, 0x90, 0xFD, -0x60, 0xE0, 0xB4, 0x22, 0x02, 0x51, 0x79, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x23, 0x70, 0x7B, 0x90, -0xFD, 0x62, 0xE0, 0x90, 0x93, 0x2C, 0x30, 0xE0, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x02, 0xE4, 0xF0, -0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE1, 0x5B, 0x90, 0x93, 0x2D, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, -0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x32, 0x12, 0x1F, -0xC9, 0xE4, 0xFF, 0x12, 0x50, 0xDC, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x2E, -0x12, 0x1F, 0xC9, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, -0x08, 0x12, 0x34, 0x30, 0x90, 0x01, 0xBE, 0xE0, 0x04, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, -0x2D, 0x30, 0xE2, 0x08, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x80, 0x06, 0xE0, 0x54, 0x1F, 0x44, -0x60, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0xFF, 0x12, 0x9C, 0x4C, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x24, -0x02, 0x51, 0xA1, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x25, 0x13, 0x90, 0xFD, 0x62, 0xE0, 0x60, 0x0D, -0x90, 0x93, 0x1C, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0x24, 0x74, 0x04, 0xF0, 0x90, 0xFD, 0x60, -0xE0, 0xB4, 0x26, 0x05, 0x7F, 0x01, 0x12, 0x9C, 0xE8, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x30, 0x07, -0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0x51, 0xF5, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0x07, -0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, -0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, -0xF0, 0x44, 0x07, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x6E, 0xEF, 0xF0, 0x7B, 0x01, -0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x57, -0x1F, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x09, 0xF0, 0x54, 0x0F, 0x44, 0x10, -0xF0, 0x90, 0x93, 0x6E, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, -0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x57, 0x1F, 0x90, 0x00, 0x75, 0xE0, 0x44, 0x01, 0xF0, -0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0x74, 0x03, 0xF0, 0x7F, 0x02, 0x7E, -0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0xE4, 0xF0, 0x90, 0x00, 0x75, 0xE0, 0x54, 0xFE, 0xF0, -0x22, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0D, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, -0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, -0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x57, 0x1F, 0xAE, 0x07, 0x90, 0x93, 0x6C, 0xE0, -0x54, 0xF0, 0x44, 0x04, 0xF0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x6E, 0xEE, 0xF0, 0xA3, -0xED, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, -0x79, 0x6C, 0x02, 0x57, 0x1F, 0xAC, 0x07, 0x90, 0x93, 0xD9, 0xE0, 0x44, 0x0F, 0xF0, 0x54, 0x0F, -0x44, 0x70, 0xF0, 0x90, 0x93, 0xDB, 0xEC, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, -0xDC, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0x93, 0xDD, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, -0xDE, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xDF, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, -0xE0, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0xE1, 0xF0, 0x80, 0x11, 0x90, 0x93, 0xDC, 0xED, -0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, -0x93, 0x79, 0xDB, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0xD9, 0x02, 0x57, 0x1F, -0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x83, 0xF0, 0x90, 0x00, -0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, -0x85, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x86, 0xF0, 0x90, 0x00, 0x04, 0x12, -0x1F, 0x0F, 0x90, 0x93, 0x87, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x58, 0xE0, 0x20, -0xE0, 0x15, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x7F, 0x30, 0x12, 0x98, 0x37, 0x90, 0x93, 0x83, -0xE0, 0xFB, 0x7D, 0x01, 0xE4, 0x80, 0x07, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x51, -0xF5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x80, 0x12, 0x43, 0xC8, 0xEF, 0x12, 0x43, 0xD1, -0x74, 0x73, 0x01, 0x74, 0x6A, 0x02, 0x74, 0xBB, 0x03, 0x74, 0xC4, 0x05, 0x74, 0xCD, 0x06, 0x76, -0x24, 0x07, 0x74, 0xD6, 0x0B, 0x74, 0xDF, 0x10, 0x74, 0xE7, 0x11, 0x74, 0xEF, 0x12, 0x74, 0xF7, -0x13, 0x75, 0x00, 0x14, 0x75, 0x09, 0x15, 0x75, 0x11, 0x16, 0x75, 0x1B, 0x17, 0x75, 0x25, 0x18, -0x75, 0x2F, 0x19, 0x75, 0xF1, 0x1B, 0x75, 0xFA, 0x1C, 0x75, 0x38, 0x1D, 0x75, 0x42, 0x1E, 0x75, -0x4D, 0x21, 0x75, 0x55, 0x22, 0x75, 0x5D, 0x23, 0x75, 0x65, 0x24, 0x75, 0x6D, 0x25, 0x75, 0x75, -0x26, 0x75, 0x7D, 0x27, 0x75, 0x86, 0x28, 0x75, 0x8F, 0x29, 0x74, 0x7C, 0x2D, 0x74, 0x85, 0x2E, -0x75, 0x98, 0x2F, 0x76, 0x03, 0x30, 0x75, 0xA9, 0x32, 0x75, 0xA0, 0x33, 0x74, 0x97, 0x34, 0x75, -0xB2, 0x36, 0x75, 0xBB, 0x37, 0x75, 0xC4, 0x38, 0x75, 0xCD, 0x3A, 0x74, 0x8E, 0x3B, 0x75, 0xD6, -0x3E, 0x75, 0xDF, 0x3F, 0x75, 0xE8, 0x41, 0x76, 0x0C, 0x46, 0x74, 0xA0, 0x47, 0x74, 0xB2, 0x48, -0x74, 0xA9, 0x49, 0x76, 0x14, 0x4B, 0x00, 0x00, 0x76, 0x1D, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, -0x02, 0x90, 0x7B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x81, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x02, 0x91, 0x62, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x91, 0xAA, 0x90, 0x93, -0x80, 0x12, 0x43, 0xA8, 0x02, 0x91, 0xE3, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x15, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x1B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x92, 0xDB, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x98, 0x2F, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x92, 0xEC, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x41, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x02, 0x8F, 0x13, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x9E, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0xC1, 0x25, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xC1, 0x2B, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0xE1, 0x52, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x93, 0x34, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x93, 0x4E, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xC1, -0xBE, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x01, 0x80, 0x2F, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x7F, 0x02, 0x80, 0x25, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x03, 0x80, 0x1B, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x95, 0x16, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE4, 0xFF, -0x80, 0x08, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x04, 0x02, 0x94, 0x34, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0xE1, 0x67, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE1, 0x7F, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0xE1, 0x97, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE1, 0xAF, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0xE1, 0xC7, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE1, 0xDF, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x02, 0x95, 0x4E, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x95, 0x67, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x95, 0x80, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE1, 0x58, -0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x95, 0xA8, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, -0x95, 0xC1, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x95, 0xDA, 0x90, 0x93, 0x80, 0x12, 0x43, -0xA8, 0x02, 0x97, 0x8D, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x97, 0x9F, 0x90, 0x93, 0x80, -0x12, 0x43, 0xA8, 0x02, 0x6C, 0x79, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x97, 0xC2, 0x90, -0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x97, 0xDB, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x98, -0x16, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x6D, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, -0x02, 0x8F, 0x29, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x9A, 0x96, 0x90, 0x93, 0x80, 0x12, -0x43, 0xA8, 0x61, 0x60, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x98, 0x81, 0x90, 0x01, 0xC6, -0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x05, 0x7F, 0x0B, 0x80, 0x0A, 0x7D, 0x01, 0x7F, 0x0C, 0x80, -0x04, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x41, 0x12, -0x43, 0xC8, 0xE4, 0xFE, 0x90, 0x00, 0xA3, 0xE0, 0x54, 0xF8, 0x44, 0x05, 0xF0, 0x90, 0x00, 0xA0, -0xE0, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x5A, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x49, 0x90, 0xFD, -0x50, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0x94, 0x41, 0x12, 0x43, -0xA8, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, -0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0F, 0x74, -0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0x90, 0xFD, -0x58, 0x74, 0x01, 0xF0, 0xFF, 0x80, 0x12, 0x90, 0x01, 0x43, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, -0x08, 0x90, 0x01, 0x42, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, -0x83, 0x12, 0x43, 0xC8, 0xE4, 0x90, 0x93, 0x86, 0xF0, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x42, 0x90, -0x07, 0x78, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x78, -0xE0, 0x44, 0x80, 0x54, 0xBF, 0xF0, 0x90, 0x93, 0x86, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0x93, 0x79, -0x86, 0xFD, 0x7F, 0x1A, 0xD1, 0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0x30, -0xE1, 0x4F, 0x90, 0x93, 0x04, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x06, 0xF0, -0x22, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, 0x3F, 0xF0, 0x90, -0x07, 0x83, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x07, 0x95, 0xE0, 0x54, 0xF9, 0xF0, 0x90, 0x93, 0x0B, -0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x34, 0x30, -0xE4, 0x90, 0x93, 0x86, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x86, 0x7D, 0x01, 0x7F, 0x1A, 0xD1, -0x35, 0x22, 0x7D, 0x01, 0x7F, 0x0D, 0xC1, 0x35, 0x12, 0x1E, 0xF6, 0xFF, 0xE9, 0x24, 0x01, 0xF9, -0xE4, 0x3A, 0xFA, 0x7D, 0x04, 0xC1, 0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x17, 0xC1, 0x35, 0x90, -0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, -0xA8, 0x7D, 0x01, 0x7F, 0x18, 0xC1, 0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x19, 0xC1, 0x35, 0x90, -0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, -0xA8, 0x7D, 0x01, 0x7F, 0x1A, 0xC1, 0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1B, 0xC1, 0x35, 0x90, -0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, -0xA8, 0x7D, 0x01, 0x7F, 0x1C, 0xC1, 0x35, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, -0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFD, 0x70, 0x02, 0x21, -0x40, 0x90, 0x94, 0x4A, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, -0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, 0x39, 0x90, 0x94, 0x4A, -0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x79, 0xF0, 0x75, -0x20, 0x01, 0x75, 0x21, 0x93, 0x75, 0x22, 0x79, 0x75, 0x23, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, -0x7A, 0x12, 0x56, 0xD0, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, -0x94, 0x4A, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, -0x90, 0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4A, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x43, -0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x4A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, -0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0x90, 0x94, 0x4A, 0xE0, 0x75, 0xF0, 0x04, 0x90, -0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7E, 0xF0, 0x90, 0x94, 0x4A, 0xE0, 0x75, 0xF0, -0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7F, 0xF0, 0x80, 0x33, 0xE0, 0x75, -0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4A, -0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, -0x94, 0x4A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, -0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7B, 0x12, 0x73, 0xC6, 0x90, 0x93, -0x78, 0xE0, 0xFF, 0x90, 0x94, 0x4A, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, -0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x94, 0x4A, 0xE0, 0xFF, 0x74, 0x01, -0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x94, 0x4A, -0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x01, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, -0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x22, 0x12, -0x43, 0xC8, 0x90, 0x94, 0x25, 0xE0, 0x54, 0xF0, 0x44, 0x06, 0xFF, 0xF0, 0xED, 0x54, 0x0F, 0xC4, -0x54, 0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x94, 0x22, 0x12, 0x43, 0xA8, 0x90, 0x94, -0x19, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x25, 0x12, 0x57, 0x1F, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x0E, 0x74, -0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, 0x29, 0x74, 0x27, 0x2F, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0xCC, 0xEF, 0xF0, 0x24, 0x27, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0xCD, 0xF0, 0x7B, 0x01, 0x7A, 0x93, -0x79, 0xCC, 0x7D, 0x02, 0x31, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, -0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x62, 0xF0, 0x74, 0x28, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, 0x93, 0x61, 0xF0, 0x74, 0xE8, 0x2D, -0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x5D, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, -0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x85, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0xC6, -0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x0D, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, -0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, 0x93, 0x62, 0xE0, 0xFF, 0x90, 0x93, 0x61, 0xE0, -0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, 0x61, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, -0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, -0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, -0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, -0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, 0x90, 0x93, 0x61, 0xE0, 0xFD, 0x31, -0x82, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x12, 0x90, 0x04, 0x30, 0xE0, 0x70, -0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0x04, 0xCF, 0x04, 0xF0, 0x90, 0x93, 0x61, -0xE0, 0xFF, 0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2C, 0xF5, 0x82, -0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x11, 0x74, 0x27, -0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x90, -0x93, 0x88, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x8B, 0xF0, 0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, -0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x8D, 0xF0, 0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x88, -0x12, 0x43, 0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x8E, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, -0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8F, 0xCB, 0xF0, 0xA3, 0xEB, -0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, -0xE0, 0x90, 0x93, 0x91, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, 0xC6, 0x2C, 0xF5, 0x82, 0xE4, 0x34, -0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, 0x90, 0x93, 0x8E, 0xE0, 0x90, 0x93, -0x8B, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0xED, 0x70, 0x02, 0x81, 0x5D, 0x90, 0x93, 0x8C, 0xED, 0xF0, -0x90, 0x93, 0x88, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x8B, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x90, -0x93, 0x8C, 0xE0, 0x14, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x70, 0x02, 0x81, 0x5D, 0x90, 0x93, 0x8B, -0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0x81, 0x5D, 0xE4, 0x90, 0x93, 0x8A, 0xF0, 0xEF, 0x14, -0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0xFD, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0xD3, 0x9D, -0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, -0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x91, 0xE0, -0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0xC3, 0x94, 0x10, -0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8F, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, -0x93, 0x89, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x8C, -0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0x6F, 0x60, 0x08, 0x90, 0x93, 0x89, 0xE0, 0x14, 0xF0, 0x80, -0x83, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x93, -0x89, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x93, 0x8D, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x88, -0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, -0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, -0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, -0x04, 0x90, 0x93, 0x88, 0xE0, 0xFD, 0x31, 0x82, 0x90, 0x93, 0x88, 0xE0, 0xFF, 0x22, 0xAD, 0x07, -0xED, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, -0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, -0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xF9, 0x54, -0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFF, 0x90, -0x93, 0x8B, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, -0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8C, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, -0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8E, 0xCB, 0xF0, -0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, -0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, -0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xEE, 0xC3, 0x9F, 0x40, 0x02, -0xC1, 0x0B, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, -0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0x90, 0x93, -0x8A, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xC1, 0x45, 0xEE, 0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, -0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, -0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8C, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, -0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8E, 0xE0, 0x5E, -0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x8A, 0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x93, -0x8D, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x93, 0x8A, 0x74, 0x17, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0xFF, -0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, 0x8C, 0xE0, 0x30, 0xE0, 0x06, 0x90, -0x93, 0x8A, 0x74, 0x18, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x88, -0xF0, 0x80, 0x42, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, 0xA1, 0x69, 0x90, 0x93, 0x8B, 0xE0, 0xFC, -0x90, 0x93, 0x89, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, -0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xE0, 0xB4, -0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x89, 0xE0, 0x44, 0x40, 0x90, 0x93, 0x88, 0xF0, -0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, -0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, -0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, -0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, -0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, 0x93, 0x89, 0xE0, 0xD3, 0x9C, 0x40, -0x5E, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, -0xEF, 0xF0, 0x90, 0x93, 0x89, 0xEF, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, -0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, -0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, -0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, -0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, -0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0x90, 0x93, 0x88, -0xE0, 0x44, 0x80, 0xFD, 0x31, 0x82, 0x90, 0x93, 0x88, 0xE0, 0x44, 0x80, 0xFF, 0x22, 0xEF, 0xC3, -0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, 0xF0, 0xFD, 0xEF, 0xC3, 0x13, -0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x10, 0xEF, -0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, -0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x4D, 0xF0, 0x22, 0xE4, 0x90, -0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, 0x03, 0x02, 0x87, 0x50, -0xEF, 0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, 0x90, 0x89, 0x01, 0xE0, 0xFF, 0x90, -0x8F, 0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x75, 0xF0, 0x09, -0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x87, 0x47, 0xEF, 0x25, -0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, -0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x87, 0x47, 0x90, 0x93, 0x78, 0xE0, 0x94, 0x20, 0x40, -0x09, 0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x87, 0x50, 0x90, 0x93, 0x78, 0xE0, 0x75, 0xF0, -0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, -0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, -0xE0, 0x90, 0x93, 0x7D, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, -0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7F, 0xCF, 0xF0, 0xA3, 0xEF, -0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x79, 0xF0, 0x80, 0x14, 0x90, 0x93, -0x78, 0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, -0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, -0x75, 0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x82, 0xF0, 0x74, 0x67, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x41, 0xE5, -0x90, 0x93, 0x82, 0xE0, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0x9F, 0x40, 0x13, 0x90, 0x93, 0x82, 0xE0, -0x90, 0x93, 0x7A, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, 0x93, 0x79, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, -0x93, 0x7A, 0xE0, 0xFF, 0x90, 0x41, 0x18, 0x93, 0xFE, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x85, 0xF5, -0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, 0x90, 0x40, 0xE0, 0x80, -0x07, 0x90, 0x93, 0x7A, 0xE0, 0x90, 0x40, 0xFC, 0x93, 0x90, 0x93, 0x81, 0xF0, 0x90, 0x93, 0x81, -0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x56, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x8B, -0x57, 0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x78, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, -0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7B, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, -0x12, 0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x9D, 0xFD, -0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, -0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, -0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x04, -0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, -0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, -0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x06, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, -0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, -0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, -0x5C, 0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, -0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x05, 0x12, -0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, -0xD3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, -0xF0, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0xF0, 0x80, 0x07, 0xE4, 0x90, 0x93, 0x7B, 0xF0, 0xA3, 0xF0, -0x90, 0x93, 0x7B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x78, 0xE0, 0x25, 0xE0, 0x24, 0x02, -0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x79, 0xE0, -0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, -0x93, 0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, 0x41, 0xB4, 0x90, 0x93, 0x78, 0xE0, 0xFF, -0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, 0x40, 0x03, 0xEF, 0x80, 0x1C, 0x90, 0x93, -0x78, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x82, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x90, 0x93, 0x83, 0xF0, 0x90, -0x93, 0x83, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, 0x23, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, -0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x01, 0x40, 0x0F, 0x74, 0xC6, -0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x14, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x78, -0xE0, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, -0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x60, 0x02, 0xA1, 0xF5, 0x12, -0x7C, 0xAE, 0xA1, 0xF5, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, -0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, -0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x40, 0x02, 0xA1, 0xF5, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x7D, 0x01, -0x12, 0x7A, 0xE3, 0xA1, 0xF5, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, -0x91, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0x81, 0xC3, 0x90, 0x8A, 0x83, 0xE0, 0xFE, -0xB4, 0x03, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x19, 0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, -0x02, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x11, 0x40, 0x2E, 0x80, 0x1F, 0x90, 0x8A, 0x83, -0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, -0xEE, 0x70, 0x11, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x0D, 0x90, 0x8E, 0xC5, 0x74, -0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFE, 0x24, 0xC4, -0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x87, 0xF0, 0x74, 0x85, 0x2E, 0xF5, -0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30, 0x50, 0x0A, 0xE4, 0x90, 0x93, -0x87, 0xF0, 0x74, 0x67, 0x2F, 0x81, 0x6E, 0x90, 0x8E, 0xC5, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, -0x63, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, -0x0A, 0x60, 0x5B, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xEE, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, -0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, -0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x78, 0xE0, 0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, -0x33, 0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, -0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, 0x93, 0x78, 0xE0, 0x24, 0xA7, 0xF5, 0x82, -0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0x6F, 0x60, 0x56, 0x90, 0x93, -0x78, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, -0x40, 0x08, 0x90, 0x93, 0x87, 0x74, 0x05, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0x39, 0x90, 0x93, -0x87, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, -0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x41, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0x80, 0x2F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, -0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x04, -0xF0, 0x80, 0x14, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x67, 0xF5, 0x82, -0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7A, 0xE0, 0xFE, 0x90, 0x93, 0x78, 0xE0, -0xFF, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x87, 0xE0, -0xFE, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, -0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x11, 0xE4, 0x90, 0x93, 0x87, 0xF0, -0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x87, 0xE0, -0xFD, 0xA1, 0xF2, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xA1, 0xF5, 0x90, 0x93, 0x7B, 0xF0, 0xA3, 0xF0, -0x90, 0x41, 0xE1, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, -0x1F, 0x3C, 0x90, 0x93, 0x85, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x24, 0xC4, -0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x87, 0xF0, 0xE4, 0x90, 0x93, 0x84, -0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0xD3, 0x94, 0x04, 0x50, 0x47, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, -0x5C, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x42, 0xC8, 0xFD, 0xAC, -0xF0, 0xEF, 0x90, 0x41, 0xDC, 0x93, 0xFF, 0x7E, 0x00, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, -0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x85, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, -0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x84, 0xE0, 0x04, 0xF0, -0x80, 0xAF, 0x90, 0x93, 0x84, 0xE0, 0xC3, 0x13, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFF, 0xB4, 0x01, -0x0D, 0x90, 0x93, 0x84, 0xE0, 0x70, 0x5D, 0x90, 0x93, 0x87, 0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, -0x03, 0x1D, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x87, 0x74, 0x03, 0xF0, 0x80, -0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x87, 0x74, 0x01, 0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, -0x93, 0x87, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, -0x87, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, 0x87, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, -0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x80, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x7F, 0xE0, -0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0xD3, 0x90, 0x93, 0x80, 0xE0, 0x94, 0x03, -0x90, 0x93, 0x7F, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x90, 0x93, 0x87, -0xE0, 0xFD, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, -0xED, 0xF0, 0x12, 0x7F, 0x0E, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, -0x91, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, -0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x67, 0xF5, 0x82, -0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, -0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, 0x93, 0x78, 0xE0, 0xFD, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, -0x50, 0x1C, 0x90, 0x93, 0x7F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, -0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x80, 0x14, 0x90, 0x93, -0x78, 0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, -0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, -0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, 0xFF, 0x9D, 0xFB, 0x74, 0xFF, 0x9C, 0xFA, -0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, -0xD3, 0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x78, 0xE0, 0x50, 0x13, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, -0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, 0x42, 0x87, 0x80, 0x10, 0x25, 0xE0, 0x24, -0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, -0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, -0x1F, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, -0x12, 0x43, 0x1F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, -0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, -0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, -0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x02, 0x7F, 0x53, -0x22, 0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, -0xE4, 0xF0, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x14, -0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, -0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, 0x90, 0x89, 0x01, 0x04, 0xF0, 0xE4, 0x90, -0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, 0x03, 0x02, 0x89, 0x4C, -0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, -0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, -0x90, 0x84, 0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, -0x06, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, -0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0x74, 0x13, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x74, -0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x80, -0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, -0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x05, -0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, -0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x47, -0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC7, -0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, -0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, -0x83, 0xE4, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, -0x8E, 0x04, 0xF0, 0x90, 0x41, 0x92, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x90, 0x41, 0x5A, 0x74, -0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0x90, 0x93, 0x78, -0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, -0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x75, -0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x74, 0xC2, 0x2D, 0xF5, -0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x86, -0x12, 0x43, 0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x84, 0x12, -0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, -0x43, 0x9C, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE4, -0xF0, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, -0x83, 0x74, 0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0x74, 0x13, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x02, 0x87, 0x93, 0x22, 0x8F, 0x57, 0xEF, -0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, -0x57, 0x75, 0xF0, 0x02, 0xA4, 0x24, 0x02, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, -0x5B, 0x89, 0x5C, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, -0x85, 0x83, 0x5D, 0x8F, 0x5E, 0xE5, 0x57, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, -0x35, 0xF0, 0x75, 0x5F, 0x01, 0xF5, 0x60, 0x89, 0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, -0x34, 0x89, 0xF5, 0x83, 0xE0, 0x12, 0x43, 0xD1, 0x89, 0xCD, 0x00, 0x89, 0xE2, 0x01, 0x89, 0xF7, -0x02, 0x8A, 0x0C, 0x03, 0x8A, 0x35, 0x04, 0x8A, 0x4A, 0x05, 0x8A, 0x5F, 0x06, 0x8A, 0x85, 0x0C, -0x8A, 0xB2, 0x0D, 0x8A, 0xDF, 0x0E, 0x8B, 0x0C, 0x0F, 0x00, 0x00, 0x8B, 0x40, 0xE5, 0x57, 0x25, -0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, -0x80, 0x3C, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, -0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, -0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, -0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, -0x74, 0x8F, 0xF0, 0x61, 0x40, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, -0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF5, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, -0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, -0x0D, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, -0xF0, 0xA3, 0xF0, 0x61, 0x40, 0x90, 0x04, 0x47, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, -0x42, 0x53, 0x90, 0x04, 0x46, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, -0x42, 0x65, 0x90, 0x04, 0x45, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, -0x61, 0x37, 0x90, 0x04, 0x4B, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, -0x04, 0x4A, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, -0x04, 0x49, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, -0x04, 0x4F, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, -0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, -0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, -0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x50, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, -0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, -0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x12, 0x1E, 0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, -0x12, 0x42, 0x53, 0xAB, 0x5A, 0xE5, 0x5C, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, -0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, -0x01, 0x12, 0x1F, 0x0F, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, -0x82, 0x85, 0x58, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, -0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, -0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, -0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, -0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x4B, 0x90, 0x93, 0x8F, 0x74, 0x0B, 0xF0, -0x90, 0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x50, 0x02, 0x81, 0x85, 0x74, 0x01, 0x7E, 0x00, -0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, -0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, -0x4E, 0x60, 0x0A, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x8F, -0xE0, 0x14, 0xF0, 0x80, 0xBB, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x47, 0x90, 0x93, 0x8F, 0x74, 0x0F, 0xF0, 0x90, -0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, -0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, -0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, -0x90, 0x93, 0x8F, 0xE0, 0xA3, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0x8F, 0xE0, 0x14, 0xF0, 0x80, 0xBF, -0xE4, 0x90, 0x93, 0x90, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, -0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, -0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, 0x02, 0xA1, 0x3E, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, -0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, -0x06, 0x90, 0x93, 0x8F, 0xE0, 0x80, 0x63, 0x90, 0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, -0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, -0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, -0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, -0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, -0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0x80, -0x09, 0x90, 0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0x90, 0x93, -0x90, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, -0x90, 0x93, 0x91, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, -0xEE, 0xF0, 0xE5, 0x57, 0xC3, 0x94, 0x20, 0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, -0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, -0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x91, 0xE0, 0xA3, -0xF0, 0x80, 0x37, 0x80, 0x2D, 0x74, 0x27, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, -0xE0, 0xFF, 0x90, 0x93, 0x90, 0xE0, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x92, 0xEE, -0xF0, 0x80, 0x17, 0x90, 0x93, 0x91, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, -0x80, 0x08, 0x90, 0x93, 0x90, 0xE0, 0x90, 0x93, 0x92, 0xF0, 0x90, 0x93, 0x92, 0xE0, 0xFD, 0xAF, -0x57, 0x12, 0x79, 0x82, 0x90, 0x93, 0x92, 0xE0, 0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, -0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, -0x90, 0x8A, 0x83, 0x74, 0x03, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, -0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x03, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, -0x22, 0xE4, 0x90, 0x8A, 0x83, 0xF0, 0x22, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, -0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x54, 0x40, -0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x75, 0xF0, -0x09, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAD, 0x82, 0xAC, 0x83, 0x90, 0x93, 0x8A, 0xEC, 0xF0, -0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0xFA, -0x7B, 0x01, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, -0x1F, 0x0F, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x8C, 0x12, 0x43, 0xA8, 0xEF, 0x12, 0x42, 0x53, 0x90, -0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x8C, 0x12, -0x43, 0xA8, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, -0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, -0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0x8D, 0x82, 0x8C, 0x83, 0xA3, 0xF0, 0x90, 0x93, 0x88, -0xE0, 0xFE, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x24, 0xC2, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, -0xEE, 0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8A, 0x12, 0x43, -0x9C, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, -0x90, 0x93, 0x89, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xEE, -0xF0, 0x21, 0x4D, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, -0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0xC1, 0x17, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, -0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFD, 0xAF, 0x06, 0xC1, -0x17, 0x12, 0x1E, 0xF6, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, -0x40, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, 0x12, 0x1E, 0xF6, -0x90, 0x89, 0x01, 0xF0, 0x22, 0x90, 0x93, 0x8F, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x92, 0xE0, 0x54, -0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, 0x93, 0x8F, 0x12, 0x43, 0xA8, 0x90, -0x94, 0x19, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x92, 0x02, 0x57, 0x1F, 0x90, 0x00, -0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, 0x94, 0x40, -0x40, 0x02, 0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, 0xE0, 0x24, -0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x83, 0xF0, -0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, -0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x85, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x74, 0xFF, -0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, -0xE0, 0x90, 0x93, 0x89, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, -0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x8B, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, -0xEC, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, -0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x02, 0x8F, 0x75, 0xE4, -0x90, 0x92, 0x69, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0xF5, 0x62, -0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x90, 0x00, -0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x59, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, -0x3C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x01, 0x90, 0x93, 0x3D, 0xF0, 0xEF, -0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x13, -0x13, 0x54, 0x01, 0x90, 0x93, 0x44, 0xF0, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x4A, -0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, 0x01, 0x90, 0x93, 0x46, 0xF0, 0xEF, -0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, -0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x49, 0xF0, 0xE0, 0x70, 0x38, 0x90, 0x93, 0x47, 0xE0, 0x70, -0x10, 0xFF, 0x12, 0x50, 0xDC, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, -0x0F, 0x7F, 0x01, 0x12, 0x50, 0xDC, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, -0x90, 0x93, 0x86, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, -0x12, 0x34, 0x30, 0x90, 0x93, 0x3D, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xA9, 0x90, 0x93, 0x83, 0x12, -0x43, 0xA8, 0x12, 0x4D, 0xB2, 0x90, 0x93, 0x59, 0xE0, 0x90, 0x01, 0xE6, 0xF0, 0xD0, 0xD0, 0x92, -0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, 0xE0, 0x25, 0x12, 0x1E, 0xF6, 0x90, -0x93, 0x48, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x4B, 0xF0, 0xEF, 0xC3, 0x13, -0x54, 0x7F, 0x90, 0x93, 0x45, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x50, 0xF0, -0x22, 0x90, 0x93, 0x48, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x45, -0x74, 0x14, 0xF0, 0x90, 0x93, 0x50, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x19, -0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, -0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x4F, 0x74, 0x05, 0xF0, 0x90, -0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xA3, 0xE0, 0x90, 0x05, -0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x4C, 0xF0, 0x60, 0x20, 0x90, 0x93, 0x15, 0xE0, -0x20, 0xE0, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x62, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, -0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xA9, 0x12, 0x51, 0x5A, 0x90, 0x93, 0x4C, 0xE0, -0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x02, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0xFF, 0x54, -0x80, 0xFE, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xFF, 0xE0, 0x54, -0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x70, 0xFF, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x8F, 0x4F, -0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, -0x0F, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x3A, 0xF0, 0x90, -0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xD3, 0x94, -0x20, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x01, 0xF0, 0x80, 0x57, 0xEF, 0xD3, 0x94, 0x40, 0x50, -0x08, 0x90, 0x93, 0x37, 0x74, 0x02, 0xF0, 0x80, 0x49, 0xEF, 0xD3, 0x94, 0x60, 0x50, 0x08, 0x90, -0x93, 0x37, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0x93, 0x37, -0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, 0x94, 0xA0, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x05, -0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x06, 0xF0, 0x80, -0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, 0x37, 0x50, 0x05, 0x74, 0x07, 0xF0, 0x80, 0x03, 0x74, -0x08, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x90, 0x93, 0x3B, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x60, 0x0B, -0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, -0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, 0xA8, 0xF0, 0x90, 0x00, 0x01, -0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xA9, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, -0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAA, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, -0x90, 0x93, 0xAB, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, -0x93, 0xAC, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x0E, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFD, -0xF0, 0x90, 0x93, 0x11, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x11, 0xF0, 0x22, 0x90, 0x93, -0x83, 0x12, 0x43, 0xC8, 0xE4, 0x90, 0x93, 0x86, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x0C, 0xF0, -0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x7A, 0x90, 0x93, 0x86, 0x74, -0x01, 0xF0, 0xFB, 0x7A, 0x93, 0x79, 0x86, 0xFD, 0x7F, 0x14, 0x12, 0x76, 0x35, 0x90, 0x93, 0x04, -0xE0, 0x44, 0x08, 0xF0, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0x30, 0xE1, -0x10, 0x90, 0x93, 0x04, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFD, 0xF0, 0x80, -0x07, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x02, 0xF0, 0xEF, 0x30, 0xE2, 0x1E, 0x90, 0x93, 0x04, 0xE0, -0x44, 0x04, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xEF, -0xF0, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x80, 0x07, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x10, -0xF0, 0x12, 0x1E, 0xF6, 0x30, 0xE4, 0x5C, 0x90, 0x93, 0x04, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x04, -0x26, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x86, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, -0x86, 0x7D, 0x01, 0x7F, 0x14, 0x12, 0x76, 0x35, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, -0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, -0xE3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x54, 0x3F, 0xF0, -0x90, 0x93, 0x0B, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x80, 0x7E, 0x08, -0x12, 0x34, 0x30, 0x22, 0xEF, 0x70, 0x21, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x40, -0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x01, 0xF0, 0x80, -0x07, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x6A, 0x12, 0x1E, 0xF6, -0x90, 0x00, 0x01, 0x30, 0xE0, 0x2E, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x00, 0x02, -0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC2, -0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC3, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x54, -0xFE, 0xF0, 0x80, 0x2C, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, -0x0F, 0x90, 0x06, 0xC5, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC6, 0xF0, 0x90, -0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x01, 0xF0, -0x90, 0x06, 0xCC, 0xE0, 0x44, 0x02, 0xF0, 0xEF, 0xB4, 0x02, 0x11, 0x12, 0x1E, 0xF6, 0x90, 0x06, -0xC8, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC9, 0xF0, 0xEF, 0xB4, 0x03, 0x11, -0x12, 0x1E, 0xF6, 0x90, 0x06, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xCB, -0xF0, 0xEF, 0x64, 0x04, 0x70, 0x1F, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x07, 0x83, 0x30, 0xE0, 0x06, -0xE0, 0x44, 0x10, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0x6F, 0xF0, 0xEF, 0x30, 0xE1, 0x07, 0x90, 0x07, -0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, -0x43, 0xA8, 0x12, 0x1E, 0xF6, 0x90, 0x92, 0x6B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0x92, 0x6C, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6D, 0xF0, 0x90, 0x93, 0x83, -0x12, 0x43, 0xA8, 0x12, 0x76, 0x31, 0xEF, 0xB4, 0x02, 0x03, 0x43, 0x14, 0x01, 0x22, 0x90, 0x93, -0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, -0x7D, 0x03, 0x7F, 0x1D, 0x02, 0x76, 0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, -0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1E, 0x02, 0x76, 0x35, -0x12, 0x1E, 0xF6, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x1F, 0xB6, 0xA8, 0x04, 0xA9, -0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0x0B, 0x12, 0x43, 0x84, 0xEC, 0x54, 0x03, 0xFC, 0x12, -0x43, 0x59, 0x90, 0x93, 0x07, 0x02, 0x1F, 0xC9, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1F, 0x02, 0x76, -0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, -0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x20, 0x02, 0x76, 0x35, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, -0x90, 0x01, 0xBC, 0xF0, 0xEF, 0x30, 0xE0, 0x5C, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x4E, 0x90, -0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, -0xFD, 0x52, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x53, 0xF0, 0xA3, 0xE4, 0xF0, -0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x90, 0xFD, 0x55, 0x30, 0xE0, 0x05, 0x74, 0xA0, 0xF0, 0x80, 0x03, -0x74, 0xC0, 0xF0, 0x90, 0xFD, 0x56, 0x74, 0x10, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0xFD, 0x50, -0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xBD, -0xE0, 0x44, 0x01, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, -0xE4, 0xFC, 0x74, 0x20, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0xEE, 0xF9, -0x90, 0x01, 0xBD, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, -0xF0, 0xEC, 0xC3, 0x99, 0x50, 0x43, 0xEC, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x02, 0xE4, 0xFD, 0xED, -0xC3, 0x94, 0x20, 0x50, 0x07, 0xAF, 0x05, 0xD1, 0xE1, 0x0D, 0x80, 0xF3, 0x0C, 0x90, 0xFD, 0x10, -0xE0, 0x04, 0xF0, 0xEC, 0xB5, 0x01, 0xDA, 0xE4, 0xFD, 0xED, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, -0x93, 0x83, 0xE0, 0xFB, 0xC3, 0xEF, 0x9B, 0x74, 0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x07, 0xAF, -0x05, 0xD1, 0xE1, 0x0D, 0x80, 0xE3, 0x0C, 0x80, 0xB8, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x80, 0xFD, -0x7F, 0x81, 0x12, 0x53, 0xF0, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0xF1, -0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, -0xFD, 0x50, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, -0x83, 0xE0, 0x90, 0xFD, 0x51, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, -0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x52, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, -0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x53, 0xF0, 0xEF, 0x75, 0xF0, 0x08, -0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x54, 0xF0, 0xEF, -0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, -0x55, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, -0xE0, 0x90, 0xFD, 0x56, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, -0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, -0x90, 0xFE, 0x10, 0x60, 0x05, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, -0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, -0xA8, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x76, 0x35, 0xEF, 0xB4, 0x03, 0x05, 0x7F, 0xFF, 0x12, 0x9C, -0x4C, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, -0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x24, 0x02, 0x76, 0x35, 0x12, 0x1E, 0xF6, 0xFF, 0x54, -0x01, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, -0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFB, -0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, -0x0F, 0x90, 0x93, 0x1B, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, -0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x26, 0x02, 0x76, 0x35, 0x12, -0x1E, 0xF6, 0x90, 0x93, 0xB0, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, -0x8A, 0x12, 0x43, 0xC8, 0xE4, 0xFE, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x2F, 0x90, 0xFD, 0x50, -0xEF, 0xF0, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x8E, 0x82, -0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, -0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, -0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xAE, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, -0xAF, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x46, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, -0x60, 0x43, 0xC3, 0x90, 0x94, 0x47, 0xE0, 0x94, 0x88, 0x90, 0x94, 0x46, 0xE0, 0x94, 0x13, 0x40, -0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x46, 0xE4, 0x75, -0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x94, 0x47, -0xE0, 0x94, 0x64, 0x90, 0x94, 0x46, 0xE0, 0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, -0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0x90, 0x93, 0xE2, 0x12, 0x1F, 0xC9, 0x90, 0x93, -0xE6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x93, -0xE6, 0x12, 0x43, 0x90, 0xD3, 0x12, 0x43, 0x73, 0x50, 0x41, 0x90, 0x93, 0xE6, 0x12, 0x43, 0x84, -0xA9, 0x07, 0x90, 0x93, 0xE2, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, -0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x7B, 0x01, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, 0x1B, -0x90, 0x93, 0xE6, 0x12, 0x43, 0x84, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, -0xE4, 0x3C, 0xFC, 0x90, 0x93, 0xE6, 0x12, 0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xE6, 0x02, 0x43, -0x84, 0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xB8, -0x12, 0x43, 0x90, 0xC3, 0x12, 0x43, 0x73, 0x90, 0x93, 0xB4, 0x60, 0x67, 0x12, 0x43, 0x84, 0x12, -0x2C, 0x6E, 0x90, 0x93, 0xC0, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x84, 0x11, 0xE8, -0x90, 0x93, 0xC4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x84, 0x12, 0x43, 0x66, 0x90, -0x93, 0xC0, 0x12, 0x43, 0x90, 0x12, 0x43, 0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, -0x90, 0x93, 0xC4, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xBC, 0x12, 0x43, 0x84, 0xA8, 0x01, -0x12, 0x1F, 0xB6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, 0x90, 0x93, -0xC8, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, -0xC8, 0x80, 0x0A, 0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xBC, 0x12, 0x43, 0x84, -0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0xD3, 0x10, 0xAF, -0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x4C, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x47, 0xE0, 0xFF, -0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, -0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x38, 0x90, 0x94, 0x4C, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, -0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, -0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, -0xD8, 0xF8, 0xFF, 0x80, 0x4C, 0x90, 0x94, 0x4C, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, -0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, -0xF0, 0x12, 0x54, 0x38, 0x90, 0x94, 0x4C, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, -0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, -0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, -0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0x54, -0x01, 0xFF, 0x90, 0x94, 0x3E, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x44, -0xFE, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, -0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x94, 0x3F, 0xF0, 0x22, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFE, -0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, -0x12, 0x1F, 0xD5, 0x20, 0x08, 0x30, 0x70, 0x90, 0x93, 0x0B, 0x12, 0x1F, 0xD5, 0xC0, 0x08, 0x30, -0x70, 0xE4, 0x90, 0x93, 0x11, 0xF0, 0xA3, 0xF0, 0x43, 0xE8, 0x04, 0x90, 0xFD, 0x68, 0x74, 0x02, -0xF0, 0x90, 0x04, 0x26, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x07, 0x83, 0xE4, 0xF0, 0x90, 0x07, 0x78, -0x74, 0x03, 0xF0, 0x90, 0x04, 0x64, 0xE4, 0xF0, 0x90, 0x00, 0x40, 0x74, 0x20, 0xF0, 0x71, 0x2D, -0x90, 0x93, 0x2C, 0x74, 0x01, 0xF0, 0x7D, 0x04, 0x7F, 0x02, 0x02, 0x3A, 0xAD, 0x90, 0x93, 0x15, -0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x93, 0x26, -0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, -0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, -0x18, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xEF, -0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, -0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, 0x28, 0x74, 0x02, 0xF0, -0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, -0xA3, 0xF0, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x93, -0x23, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x29, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFD, -0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, -0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x22, -0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0A, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x93, 0x6E, -0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0x70, -0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x72, -0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x93, 0x6C, 0x30, 0xE6, 0x08, 0xE0, 0x54, 0x0F, 0x44, 0x50, -0xF0, 0x80, 0x16, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0x73, -0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, -0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x57, 0x1F, 0xAD, 0x07, 0x90, 0x93, -0xFA, 0xE0, 0x54, 0xF0, 0x44, 0x0C, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, -0xFC, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0xFD, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, -0xFE, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xFF, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x94, -0x00, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x94, 0x01, 0xF0, 0xED, 0xB4, 0x02, 0x0B, 0x90, 0x93, -0xFA, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x80, 0x3C, 0xED, 0xB4, 0x04, 0x0B, 0x90, 0x93, 0xFA, -0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x80, 0x2D, 0xED, 0xF4, 0x70, 0x29, 0x90, 0x93, 0xFA, 0xE0, -0x54, 0x0F, 0x44, 0x60, 0xF0, 0x90, 0x93, 0x2C, 0xE0, 0x60, 0x08, 0x90, 0x93, 0xFC, 0x74, 0x01, -0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0xFC, 0xF0, 0xE4, 0x90, 0x93, 0xFD, 0xF0, 0xA3, 0xF0, 0xA3, -0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xFC, 0x90, 0x94, 0x19, 0x12, 0x43, -0xC8, 0x7A, 0x93, 0x79, 0xFA, 0x02, 0x57, 0x1F, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, -0x44, 0x0E, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0xFD, -0x63, 0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x90, 0xFD, -0x65, 0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0x73, 0xF0, 0x90, 0xFD, -0x67, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0xED, 0xB4, 0x01, 0x11, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0x0F, -0x44, 0x20, 0xF0, 0x90, 0x93, 0x6E, 0x74, 0x01, 0xF0, 0x80, 0x13, 0xED, 0xB4, 0x02, 0x0F, 0x90, -0x93, 0x6C, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x93, 0x6E, 0x74, 0x02, 0xF0, 0x90, 0x93, -0x6C, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x13, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, -0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x12, 0x57, 0x1F, 0x22, 0x90, 0x93, 0x47, 0xE0, -0x60, 0x27, 0x90, 0x93, 0x4A, 0xE0, 0x70, 0x21, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, -0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x44, 0xE0, 0x90, 0x07, 0x78, -0x60, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, -0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xE1, 0x26, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x01, 0x70, 0x2B, -0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x19, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x29, 0xE0, 0x04, 0xF0, -0x90, 0x93, 0x1E, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xE1, 0x11, -0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, 0x27, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, -0x04, 0x70, 0x2C, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x19, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x29, -0xE0, 0x04, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, -0x02, 0xE1, 0x11, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x22, 0x90, -0x93, 0x1D, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xC1, 0xD5, 0x90, 0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x0F, -0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x27, 0x30, 0xE0, 0x4E, 0xE1, 0x23, 0x90, -0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, -0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xC1, 0xE4, 0x90, 0x93, 0x2A, -0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, -0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, -0x64, 0x80, 0x94, 0x80, 0x90, 0x93, 0x27, 0x40, 0x02, 0xE1, 0x23, 0x74, 0x02, 0xF0, 0x22, 0x90, -0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x18, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, -0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, -0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, -0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, -0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x58, 0x90, 0x07, -0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x07, 0x70, 0x49, 0x90, 0x93, 0x2A, -0xE0, 0xB4, 0x04, 0x05, 0x90, 0x93, 0x27, 0x80, 0x3A, 0x90, 0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, -0x3F, 0x30, 0xE0, 0x0C, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x27, 0x80, 0x23, -0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x18, 0x90, 0x93, 0x2A, 0xE0, 0x04, -0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, -0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x15, 0xE0, -0x20, 0xE0, 0x02, 0xE1, 0xC3, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, -0x2A, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x21, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, -0x01, 0x12, 0x39, 0x77, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, -0xE4, 0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, 0x93, -0x5D, 0xE0, 0xFF, 0x90, 0x93, 0x16, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, -0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x63, 0x74, 0x05, -0xF0, 0x90, 0x93, 0x26, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x05, 0x22, -0x74, 0x6F, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, -0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, -0x12, 0x51, 0x39, 0x22, 0x01, 0xF5, -}; -u4Byte ArrayLength_8723A_rtl8723fw_B = 24550; - - -void -ODM_ReadFirmware_8723A_rtl8723fw_B( - IN PDM_ODM_T pDM_Odm, - OUT u1Byte *pFirmware, - OUT u4Byte *pFirmwareSize -) -{ - ODM_MoveMemory(pDM_Odm, pFirmware, Array_8723A_rtl8723fw_B, ArrayLength_8723A_rtl8723fw_B); - *pFirmwareSize = ArrayLength_8723A_rtl8723fw_B; -} - - - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#include "Mp_Precomp.h" +#include "../odm_precomp.h" + +#if (RTL8723A_SUPPORT == 1) +u1Byte Array_8723A_rtl8723fw[] = { + +}; +u4Byte ArrayLength_8723A_rtl8723fw = 0; + + +void +ODM_ReadFirmware_8723A_rtl8723fw( + IN PDM_ODM_T pDM_Odm, + OUT u1Byte *pFirmware, + OUT u4Byte *pFirmwareSize +) +{ + ODM_MoveMemory(pDM_Odm, pFirmware, Array_8723A_rtl8723fw, ArrayLength_8723A_rtl8723fw); + *pFirmwareSize = ArrayLength_8723A_rtl8723fw; +} + + +u1Byte Array_8723A_rtl8723fw_B[] = { +0x02, 0x23, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x01, 0x14, 0x15, 0x51, 0xC6, 0x5F, 0x01, 0x00, +0x03, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x4A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x61, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x66, 0xB5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x67, 0xC2, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x6F, 0x8F, 0x05, 0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, +0x00, 0x04, 0x06, 0x05, 0x04, 0x02, 0x00, 0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, +0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, +0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, 0x12, 0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, +0x00, 0x18, 0x22, 0x21, 0x20, 0x18, 0x00, 0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, +0x20, 0x08, 0x00, 0x20, 0x22, 0x21, 0x1C, 0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, +0x22, 0x20, 0x18, 0x08, 0x00, 0x20, 0x31, 0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, +0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, +0x10, 0x00, 0x00, 0x30, 0x31, 0x20, 0x10, 0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, +0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, +0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x04, 0x04, 0x04, 0x05, +0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x07, 0x09, 0x0A, 0x0C, 0x0E, 0x11, 0x13, +0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, 0x1D, 0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, +0x23, 0x28, 0x2A, 0x2C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, +0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x78, +0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, 0x40, +0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x00, 0x02, 0x00, 0x02, +0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, +0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xC8, +0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, +0x03, 0x20, 0x03, 0xE8, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, +0x02, 0x03, 0x04, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x12, 0x24, 0x3C, +0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, +0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x20, 0x1E, 0x1C, 0x18, +0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, +0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, +0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, 0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, +0x93, 0x28, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, +0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, +0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50, 0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, +0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, +0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, +0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, +0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, 0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, +0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, 0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, +0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, +0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, +0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, +0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x06, 0xF7, +0x09, 0xA7, 0xF0, 0x19, 0x22, 0xBB, 0xFE, 0x06, 0xF3, 0xE5, 0xF0, 0x09, 0xF3, 0x19, 0x22, 0xF8, +0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0xE5, +0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0, 0x22, 0xBB, +0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, +0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, +0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xCF, 0xF4, 0xCF, 0xCE, 0xF4, 0xCE, 0xCD, 0xF4, 0xCD, 0xCC, +0xF4, 0xCC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, +0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, +0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, +0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, +0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15, 0x82, 0x70, +0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, +0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, +0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, +0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, +0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, +0xE4, 0x73, 0x74, 0x02, 0x93, 0xB5, 0xF0, 0x06, 0x74, 0x03, 0x93, 0x68, 0x60, 0xE9, 0xA3, 0xA3, +0xA3, 0xA3, 0x80, 0xD8, 0xE4, 0xFB, 0x90, 0x93, 0x63, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, +0xE5, 0x65, 0x70, 0x03, 0x02, 0x44, 0xF0, 0xE5, 0x62, 0x64, 0x01, 0x60, 0x03, 0x02, 0x44, 0xF0, +0x0B, 0x90, 0x93, 0x40, 0xF0, 0x04, 0x70, 0x03, 0x02, 0x44, 0xF0, 0x43, 0x66, 0x10, 0x90, 0x93, +0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x3A, 0xE0, 0x54, 0x0F, 0xFF, 0x90, +0x93, 0x58, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0xF5, 0x49, +0xE4, 0x1B, 0x80, 0x56, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x0F, 0xFF, 0x90, 0x93, +0x58, 0xE0, 0xC3, 0x9F, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x04, 0x2F, 0xF5, +0x49, 0xE4, 0xFB, 0x80, 0x35, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x13, +0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, +0xFB, 0x80, 0x17, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, +0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, +0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, +0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x62, 0x12, 0x9D, 0x6C, 0x90, 0x05, 0x22, 0xE4, 0xF0, +0x22, 0xE4, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x41, 0xF0, 0xF5, 0x66, 0x22, 0x22, 0xE4, 0xFF, +0x02, 0x4E, 0x18, 0x02, 0x45, 0x03, 0x02, 0x45, 0x06, 0xE4, 0xFB, 0x90, 0x93, 0x5D, 0x12, 0x1F, +0xD5, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x46, 0x71, 0xE5, 0x62, 0x64, 0x01, +0x60, 0x03, 0x02, 0x46, 0x71, 0xE5, 0x65, 0x14, 0x60, 0x2B, 0x24, 0xFD, 0x60, 0x27, 0x24, 0x02, +0x24, 0xFB, 0x50, 0x02, 0x80, 0x21, 0x90, 0x93, 0x40, 0xE0, 0x14, 0xF0, 0xE0, 0x60, 0x04, 0xA3, +0xE0, 0x60, 0x14, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x08, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, +0xF0, 0x7B, 0x01, 0x80, 0x02, 0x7B, 0x01, 0xEB, 0x70, 0x03, 0x02, 0x46, 0x71, 0x43, 0x66, 0x10, +0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x44, 0xE0, 0x54, 0x0F, +0xFF, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0x50, 0x08, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0x80, +0x2D, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, 0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, +0xFE, 0x90, 0x93, 0x58, 0xE0, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x08, +0xE4, 0xF5, 0x48, 0x90, 0x93, 0x3A, 0x80, 0x06, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x37, 0xE0, 0x80, +0x2D, 0x90, 0x93, 0x58, 0xE0, 0x64, 0x01, 0x60, 0x03, 0xE0, 0x70, 0x0F, 0xE4, 0xF5, 0x48, 0x90, +0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x2F, 0x80, 0x13, 0xE4, 0xF5, 0x48, 0x90, 0x93, +0x58, 0xE0, 0x14, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x04, 0x2F, 0xF5, 0x49, +0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, +0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, 0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x62, +0xE5, 0x63, 0x64, 0x0C, 0x60, 0x68, 0x90, 0x93, 0x13, 0xE0, 0xFF, 0x90, 0x93, 0x58, 0xE0, 0xD3, +0x9F, 0x40, 0x06, 0x90, 0x93, 0x14, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x58, 0xE0, 0x90, 0x93, 0x13, +0xF0, 0xA3, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x46, 0xE4, 0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, +0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xA9, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x70, +0x21, 0x12, 0x4A, 0x5E, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, +0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x55, +0x80, 0x09, 0x43, 0x66, 0x01, 0x12, 0x51, 0x39, 0x90, 0x93, 0x51, 0x74, 0x01, 0xF0, 0x12, 0x9D, +0x6C, 0x22, 0xE4, 0x90, 0x93, 0x63, 0xF0, 0xE5, 0x65, 0x70, 0x03, 0x02, 0x47, 0x2B, 0x90, 0x93, +0x5A, 0xE0, 0x60, 0x11, 0xE4, 0xF0, 0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x60, 0x03, 0x02, +0x47, 0x2B, 0x02, 0x47, 0x28, 0x90, 0x93, 0x41, 0xE0, 0x04, 0xF0, 0x53, 0x66, 0xEF, 0x90, 0x93, +0x58, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, +0x3A, 0x90, 0x93, 0x58, 0xE0, 0xFF, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x0F, 0xB5, 0x07, 0x0A, 0x90, +0x93, 0x39, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x80, 0x22, 0x90, 0x93, 0x36, 0xE0, 0xC4, 0x54, 0x07, +0xFF, 0xE0, 0x54, 0x0F, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x58, 0xE0, 0xB5, 0x07, 0x0B, +0xE4, 0xB5, 0x06, 0x07, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0xC4, +0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x63, 0x74, 0x5A, 0xF0, 0x90, 0x93, +0x63, 0xE0, 0xFF, 0x90, 0x93, 0x48, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x41, 0xE0, +0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x0D, 0xE5, 0x62, 0xB4, 0x01, 0x0B, +0xA3, 0xE0, 0x70, 0x07, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x52, 0x08, 0x22, 0xE4, 0xF5, 0x66, 0xF5, +0x65, 0x75, 0x64, 0x0C, 0x75, 0x63, 0x0C, 0x90, 0x93, 0x59, 0xF0, 0x90, 0x93, 0x55, 0xF0, 0x90, +0x93, 0x52, 0xF0, 0x90, 0x93, 0x57, 0x04, 0xF0, 0x90, 0x93, 0x40, 0xF0, 0xE4, 0x90, 0x93, 0x5A, +0xF0, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x93, 0x4F, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, +0x90, 0x93, 0x4D, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x93, 0x4B, 0x74, +0x05, 0xF0, 0x90, 0x93, 0x45, 0x74, 0x14, 0xF0, 0x90, 0x93, 0x50, 0x74, 0x05, 0xF0, 0xE4, 0x90, +0x93, 0x43, 0xF0, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x93, 0xB2, 0xF0, 0x90, 0x93, 0x4C, 0xF0, 0x90, +0x93, 0x5C, 0xF0, 0x90, 0x93, 0x58, 0xF0, 0x90, 0x93, 0x3D, 0xF0, 0x90, 0x93, 0x56, 0xF0, 0x90, +0x93, 0x47, 0xF0, 0x90, 0x93, 0x44, 0xF0, 0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x4A, 0xF0, 0x90, +0x93, 0x46, 0xF0, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x93, 0x49, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0xB4, +0x02, 0x05, 0x90, 0x00, 0x93, 0xE4, 0xF0, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x7F, 0xF0, 0xE0, 0x54, +0xF0, 0xF0, 0xE0, 0x54, 0x8F, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x3A, 0xF0, 0x90, +0x93, 0x39, 0xF0, 0x22, 0xEF, 0x60, 0x5F, 0xAF, 0x05, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, +0x30, 0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, +0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6B, 0x90, 0x93, 0x2B, 0xE0, +0xC3, 0x94, 0x20, 0x50, 0x13, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x23, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x23, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0xAF, 0x05, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, +0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, +0xE0, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xBF, 0xF0, +0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0x74, 0x23, 0x2D, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x22, 0x90, +0x93, 0x26, 0xE0, 0x60, 0x09, 0x90, 0x01, 0xB9, 0x74, 0x40, 0xF0, 0x02, 0x49, 0x22, 0xE5, 0x64, +0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x02, 0x80, 0x2F, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x67, 0x80, +0x5D, 0x12, 0x51, 0xAC, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, +0x61, 0xE5, 0x66, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x53, 0xE5, +0x64, 0x54, 0x0F, 0xD3, 0x94, 0x02, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x42, +0xE5, 0x66, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x35, 0xE5, 0x66, 0x30, +0xE4, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x28, 0x90, 0x93, 0x42, 0xE0, 0x60, 0x08, +0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x1A, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x08, 0x90, 0x01, +0xB9, 0x74, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, +0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0xE4, 0x90, 0x93, 0x5D, 0xF0, +0x90, 0x06, 0xA9, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x18, 0x90, 0x93, 0x51, +0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0x53, 0x66, 0xFD, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x14, +0x12, 0x52, 0x08, 0x80, 0x0F, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, +0x03, 0x12, 0x4F, 0xA9, 0x90, 0x93, 0x5D, 0xE0, 0x30, 0xE6, 0x1B, 0x43, 0x66, 0x01, 0x90, 0x93, +0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x13, 0x12, 0x51, 0x39, 0x80, +0x0E, 0x12, 0x50, 0x68, 0x80, 0x09, 0x90, 0x93, 0x51, 0xE0, 0x70, 0x03, 0x53, 0x66, 0xFE, 0xE4, +0x90, 0x93, 0x51, 0xF0, 0x90, 0x93, 0x5D, 0xE0, 0x30, 0xE7, 0x2A, 0x43, 0x66, 0x02, 0xE4, 0xF5, +0x48, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, +0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x5A, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x1A, +0xE0, 0x44, 0x10, 0xF0, 0x22, 0x53, 0x66, 0xFD, 0x22, 0x8E, 0x25, 0x8F, 0x26, 0xAD, 0x26, 0xAC, +0x25, 0xAF, 0x24, 0x12, 0x47, 0xE4, 0xAF, 0x26, 0xAE, 0x25, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, +0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, +0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, +0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, +0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, +0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, +0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, +0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, +0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x7D, 0x01, +0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x68, 0x8D, 0x69, 0xE5, 0x68, 0x54, +0x0F, 0xFF, 0xE5, 0x63, 0x54, 0x0F, 0x6F, 0x60, 0x72, 0xE5, 0x68, 0x30, 0xE2, 0x30, 0xE5, 0x63, +0x20, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x51, 0x92, 0xE5, 0x63, 0x30, 0xE3, 0x10, 0xE5, 0x68, 0x20, +0xE3, 0x0B, 0x12, 0x4D, 0x46, 0xEF, 0x60, 0x53, 0x12, 0x51, 0xC5, 0x80, 0x4E, 0xE5, 0x63, 0x20, +0xE3, 0x49, 0xE5, 0x68, 0x30, 0xE3, 0x44, 0xAF, 0x69, 0x12, 0x51, 0x77, 0x80, 0x3D, 0xE5, 0x63, +0x54, 0x0F, 0xFF, 0xBF, 0x0C, 0x0E, 0xE5, 0x68, 0x20, 0xE3, 0x09, 0x12, 0x4D, 0x46, 0xEF, 0x60, +0x2A, 0x12, 0x51, 0xC5, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, 0x04, 0x0E, 0xE5, 0x68, 0x20, 0xE2, +0x09, 0x12, 0x48, 0x88, 0xEF, 0x60, 0x14, 0x12, 0x51, 0x10, 0xE5, 0x63, 0x54, 0x0F, 0xFF, 0xBF, +0x02, 0x09, 0x12, 0x4B, 0xF0, 0xEF, 0x60, 0x03, 0x12, 0x51, 0xF5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x02, 0x4B, 0x2E, 0x02, 0x52, 0xE5, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, +0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, +0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, +0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4F, +0x66, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, +0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, +0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, +0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, +0xE7, 0x80, 0xBE, 0xEF, 0x64, 0x01, 0x70, 0x3E, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, +0x02, 0x7F, 0x03, 0x12, 0x3A, 0x22, 0x90, 0x01, 0x36, 0x74, 0x03, 0xF0, 0xFD, 0x7F, 0x02, 0x12, +0x3A, 0x93, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, +0x3C, 0x74, 0x02, 0xF0, 0x12, 0x4A, 0x5E, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, +0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x7B, 0xF0, 0xA3, 0x74, 0x02, 0xF0, +0x7D, 0x7B, 0xFF, 0x12, 0x3A, 0x93, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x7D, 0x10, 0x7F, +0x03, 0x12, 0x3A, 0x3F, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x44, +0x07, 0xF0, 0x12, 0x4F, 0x19, 0xE5, 0x62, 0x20, 0xE0, 0x05, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0x22, +0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x10, 0x12, 0x51, 0xAC, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, +0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x54, 0xE5, 0x14, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, +0xF0, 0x80, 0x48, 0xE5, 0x64, 0x54, 0x0F, 0xD3, 0x94, 0x01, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, +0x02, 0xF0, 0x80, 0x37, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, +0x80, 0x29, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, +0x1A, 0x90, 0x93, 0x43, 0xE0, 0x70, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x10, 0xF0, 0x80, 0x0C, 0x90, +0x01, 0xB9, 0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, +0xF0, 0x7F, 0x00, 0x22, 0xE5, 0x62, 0x64, 0x01, 0x70, 0x6B, 0xE5, 0x65, 0x60, 0x67, 0xE5, 0x65, +0x64, 0x02, 0x60, 0x06, 0xE5, 0x65, 0x64, 0x05, 0x70, 0x27, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x93, +0x40, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x93, 0x57, 0xF0, 0x90, 0x93, 0x40, 0xE0, 0x70, 0x07, +0x90, 0x93, 0x57, 0xE0, 0xFF, 0x80, 0x05, 0x90, 0x93, 0x40, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xEF, +0xF0, 0x90, 0x93, 0x42, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xE4, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, +0x58, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, +0x74, 0x02, 0xF0, 0x53, 0x66, 0xFD, 0x53, 0x66, 0xEF, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, +0x80, 0x03, 0x12, 0x49, 0x2B, 0x22, 0x90, 0x93, 0xB1, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x91, 0x80, +0x0C, 0x90, 0x93, 0xB1, 0xE0, 0x70, 0x04, 0x7D, 0xD4, 0x80, 0x02, 0x7D, 0x40, 0x7F, 0x93, 0x12, +0x53, 0xF0, 0x90, 0x00, 0x29, 0xE0, 0x54, 0x3F, 0xFD, 0x7F, 0x29, 0x12, 0x53, 0xF0, 0x90, 0x00, +0x28, 0xE0, 0x54, 0xFC, 0xFD, 0x7F, 0x28, 0x12, 0x53, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, +0xFD, 0x7F, 0x08, 0x12, 0x53, 0xF0, 0x7F, 0x01, 0x12, 0x4E, 0x72, 0x90, 0x00, 0x00, 0xE0, 0x44, +0x20, 0xFD, 0xE4, 0xFF, 0x12, 0x53, 0xF0, 0x90, 0x00, 0x20, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x20, +0x12, 0x53, 0xF0, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x53, 0xF0, 0x7F, +0x14, 0x7E, 0x00, 0x02, 0x3B, 0x09, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x93, 0x1A, +0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xB9, 0x74, 0x20, 0xF0, 0x80, 0x49, +0x12, 0x51, 0xAC, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x80, 0x39, +0x90, 0x93, 0x55, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x80, 0x2B, 0x90, 0x93, +0x52, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x80, 0x1D, 0xE5, 0x64, 0x54, 0x0F, +0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x80, 0x0C, 0x90, 0x01, 0xB9, +0xE4, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x7F, +0x00, 0x22, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xC8, 0x12, 0x44, 0xF1, 0x90, 0x93, 0x8A, 0x12, 0x43, +0xA8, 0x12, 0x1E, 0xF6, 0xF5, 0x65, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x1F, 0x14, 0x60, 0x31, 0x24, +0x03, 0x70, 0x44, 0x7F, 0x01, 0x80, 0x3D, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, +0x12, 0x1F, 0x0F, 0xFD, 0xE4, 0xFF, 0x12, 0x50, 0x2A, 0x80, 0x29, 0x90, 0x93, 0x8A, 0x12, 0x43, +0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x01, 0x12, 0x50, 0x2A, 0x1F, 0x80, 0x14, +0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x7F, 0x02, 0x12, +0x50, 0x2A, 0xE4, 0xFF, 0x12, 0x4B, 0x73, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, +0x24, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xA9, +0x90, 0x04, 0x1D, 0xE0, 0x60, 0x24, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x27, 0x74, 0xFF, 0xF0, 0x12, +0x5A, 0x0E, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x58, 0x90, 0x12, +0x49, 0xC9, 0x90, 0x05, 0x22, 0xE5, 0x27, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0xAA, 0xE0, 0xFF, 0x7D, +0x01, 0x12, 0x58, 0x90, 0x12, 0x49, 0xC9, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x8F, 0x6C, 0xE4, 0x90, 0x94, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, +0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x6C, 0x60, 0x3E, 0xC3, 0x90, 0x94, 0x45, 0xE0, +0x94, 0x88, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, +0xF0, 0x22, 0x90, 0x94, 0x44, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, +0x12, 0x3B, 0x09, 0xD3, 0x90, 0x94, 0x45, 0xE0, 0x94, 0x32, 0x90, 0x94, 0x44, 0xE0, 0x94, 0x00, +0x40, 0xB9, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, 0x00, 0x20, 0xE0, 0x44, 0x01, +0xFD, 0x7F, 0x20, 0x12, 0x53, 0xF0, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x00, +0xE0, 0x54, 0xDF, 0xFD, 0xE4, 0xFF, 0x12, 0x53, 0xF0, 0x90, 0x00, 0x28, 0xE0, 0x44, 0x03, 0xFD, +0x7F, 0x28, 0x12, 0x53, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x53, +0xF0, 0xE4, 0xFF, 0x12, 0x4E, 0x72, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x90, 0x00, 0x29, +0xE0, 0x44, 0xC0, 0xFD, 0x7F, 0x29, 0x02, 0x53, 0xF0, 0xE4, 0xFF, 0x90, 0x00, 0x6A, 0xE0, 0x30, +0xE2, 0x22, 0xE0, 0x30, 0xE0, 0x20, 0xE0, 0x30, 0xE1, 0x0D, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x02, +0x30, 0xE3, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x00, 0x60, 0xE0, 0x7F, 0x03, 0x30, 0xE3, 0x06, +0x7F, 0x02, 0x80, 0x02, 0x7F, 0x03, 0xEF, 0xFD, 0xD3, 0x90, 0x93, 0x4E, 0xE0, 0x9D, 0x90, 0x93, +0x4D, 0xE0, 0x94, 0x00, 0x50, 0x05, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xA3, +0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x48, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x48, 0x93, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x93, 0x9F, 0x00, +0x41, 0x93, 0xAE, 0x00, 0x41, 0x93, 0x94, 0x00, 0x41, 0x94, 0x4A, 0x00, 0x41, 0x93, 0x13, 0x00, +0x41, 0x93, 0x14, 0x00, 0x41, 0x92, 0x69, 0x00, 0x41, 0x92, 0x6A, 0x00, 0x41, 0x92, 0x68, 0x00, +0x41, 0x94, 0x3D, 0x00, 0x41, 0x94, 0x4D, 0x00, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x90, 0x93, 0x56, 0x74, 0x01, 0xF0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x94, 0x31, +0x12, 0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0xEC, 0x44, 0x02, 0xFC, 0x90, 0x94, 0x31, +0x12, 0x1F, 0xC9, 0x90, 0x94, 0x31, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, +0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE5, 0x65, 0x14, 0x24, 0xFD, +0x50, 0x02, 0x80, 0x35, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x2E, 0x90, 0x93, 0x3D, 0xE0, 0x60, +0x09, 0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xA9, 0x12, 0x9D, 0x6C, 0x90, 0x93, 0x59, +0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x0D, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x04, +0x50, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4A, 0x62, 0x22, 0xEF, 0x14, 0x60, 0x09, 0x14, 0x60, +0x16, 0x24, 0x02, 0x70, 0x32, 0x80, 0x0A, 0x90, 0x93, 0x57, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x40, +0xF0, 0xE4, 0x90, 0x93, 0x5C, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x93, 0x50, 0xE0, 0x90, 0x93, +0x57, 0xF0, 0x80, 0x05, 0x90, 0x93, 0x57, 0xED, 0xF0, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x93, 0x40, +0xF0, 0x90, 0x93, 0x5C, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, +0x74, 0x08, 0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, +0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, +0x02, 0xF0, 0x90, 0x93, 0x52, 0x14, 0xF0, 0xE5, 0x63, 0x54, 0x0F, 0xC3, 0x94, 0x0C, 0x50, 0x03, +0x12, 0x4A, 0x5E, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, +0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x3E, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x01, 0x04, 0xE0, 0x54, +0x0F, 0xFF, 0x74, 0x40, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0x90, 0x93, 0x54, 0xF0, 0xEE, 0x90, 0x93, 0x53, 0xF0, 0x22, 0xEF, 0x70, 0x0B, 0x90, +0x93, 0xB0, 0xE0, 0x90, 0x94, 0x35, 0x60, 0x0B, 0x80, 0x12, 0x90, 0x93, 0xB0, 0xE0, 0x90, 0x94, +0x35, 0x60, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x02, 0x10, 0x80, 0x07, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x01, 0x10, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x35, 0x7F, 0x60, 0x7E, 0x08, 0x02, 0x55, 0x51, +0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x12, 0x5A, 0x0E, 0xEF, +0x70, 0x06, 0x90, 0x01, 0xC8, 0x74, 0xFD, 0xF0, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x93, 0x12, +0x54, 0x48, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x90, 0x93, 0x46, 0xE0, 0x70, 0x1A, 0x90, +0x04, 0x1D, 0xE0, 0x70, 0x14, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x58, 0x90, 0x8E, +0x6A, 0x8F, 0x6B, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x47, 0xE0, 0x60, 0x16, +0x90, 0x93, 0x4A, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x44, 0xE0, 0x90, 0x07, 0x78, 0x60, 0x04, 0x74, +0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xEF, 0x60, +0x0A, 0xE5, 0x62, 0xB4, 0x01, 0x05, 0xE4, 0xFF, 0x12, 0x4E, 0x18, 0x53, 0x63, 0xF0, 0x43, 0x63, +0x0C, 0x22, 0x90, 0x94, 0x4B, 0xEF, 0xF0, 0x12, 0x6B, 0xF8, 0x90, 0x94, 0x4B, 0xE0, 0x60, 0x05, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0x90, 0x04, 0x1A, 0xE0, +0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, +0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, +0x05, 0x7F, 0x01, 0x12, 0x4E, 0x18, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x04, 0x22, 0xE5, 0x64, 0x30, +0xE6, 0x12, 0xE5, 0x64, 0x54, 0x0F, 0xFF, 0x90, 0x01, 0x2F, 0xE0, 0x54, 0x80, 0x4F, 0x64, 0x80, +0xF0, 0x53, 0x64, 0xBF, 0x22, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x01, 0x12, 0x4C, 0xD6, 0x12, 0x4E, +0xCA, 0x53, 0x63, 0xF0, 0x43, 0x63, 0x02, 0x22, 0x7D, 0x01, 0xAF, 0x64, 0x02, 0x4A, 0x62, 0x90, +0x02, 0x84, 0xEF, 0xF0, 0xA3, 0xEE, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xEF, 0x8E, 0xF0, 0x12, +0x43, 0xF7, 0x52, 0x3A, 0x00, 0x40, 0x52, 0x62, 0x00, 0x80, 0x52, 0x8D, 0x01, 0x00, 0x52, 0xA1, +0x02, 0x00, 0x52, 0xB9, 0x04, 0x00, 0x00, 0x00, 0x52, 0xD6, 0xED, 0x54, 0x3F, 0x70, 0x04, 0xFE, +0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x40, 0xEF, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x06, +0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, 0x06, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, +0x80, 0x26, 0xED, 0x54, 0x7F, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x80, 0xEF, +0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xEF, 0x78, 0x07, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x78, +0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0x80, 0x49, 0xED, 0x70, 0x04, +0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x01, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x7D, 0x00, 0xFC, 0x80, +0x35, 0xEC, 0x54, 0x01, 0x4D, 0x70, 0x04, 0xFE, 0xFF, 0x80, 0x04, 0x7E, 0x02, 0x7F, 0x00, 0xEF, +0x2D, 0xEE, 0x3C, 0xC3, 0x13, 0x7D, 0x00, 0x80, 0x1A, 0xEC, 0x54, 0x03, 0x4D, 0x70, 0x04, 0xFE, +0xFF, 0x80, 0x04, 0x7E, 0x04, 0x7F, 0x00, 0xEF, 0x2D, 0xEE, 0x3C, 0x13, 0x13, 0x54, 0x3F, 0x7D, +0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1F, +0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x75, 0xF0, 0xA3, 0xF0, 0xF1, 0xE1, 0x75, 0x8E, +0x02, 0xB1, 0x1A, 0x12, 0x60, 0x10, 0x90, 0x93, 0xB1, 0xEF, 0xF0, 0xF1, 0xE9, 0x90, 0x93, 0xB3, +0xEF, 0xF0, 0x12, 0x60, 0x23, 0x90, 0x93, 0x95, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x14, +0xF5, 0x09, 0xF5, 0x62, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x00, 0xCC, 0xE0, 0x54, 0xF7, 0xF0, 0x12, +0x87, 0x51, 0x12, 0x47, 0x2C, 0x12, 0x37, 0x1C, 0x71, 0xC7, 0x12, 0x5F, 0xD4, 0x12, 0x60, 0x3B, +0xF1, 0xDA, 0x12, 0x5F, 0xF2, 0x12, 0x44, 0xFD, 0x12, 0x60, 0xA6, 0xB1, 0x02, 0x90, 0x93, 0x77, +0xE5, 0xD9, 0xF0, 0xC2, 0xAF, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0x38, 0x75, 0xE8, +0x03, 0x43, 0xA8, 0x85, 0x12, 0x9A, 0xCA, 0xD2, 0xAF, 0x12, 0x90, 0x6F, 0x51, 0xDB, 0x12, 0x60, +0x50, 0x90, 0x93, 0x75, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xE5, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x52, +0xA3, 0xF0, 0xE5, 0x14, 0x30, 0xE0, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0xFE, 0xB1, 0x2A, 0xD2, 0xAF, +0xE5, 0x14, 0x30, 0xE4, 0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xEF, 0xD2, 0xAF, 0x12, 0x77, 0xF7, 0xE5, +0x14, 0x30, 0xE6, 0x0A, 0xC2, 0xAF, 0x53, 0x14, 0xBF, 0xD2, 0xAF, 0x12, 0x7F, 0x4E, 0xE5, 0x14, +0x30, 0xE7, 0x09, 0xC2, 0xAF, 0x53, 0x14, 0x7F, 0xD2, 0xAF, 0xB1, 0xB8, 0xC2, 0xAF, 0xE5, 0x64, +0x54, 0x0F, 0xFF, 0xBF, 0x01, 0x0D, 0x90, 0x93, 0x43, 0x74, 0x01, 0xF0, 0x51, 0x08, 0xE4, 0x90, +0x93, 0x43, 0xF0, 0xD2, 0xAF, 0x80, 0x9A, 0x90, 0x01, 0x3C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0x90, 0x01, 0x34, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x71, 0xF0, +0x7D, 0xFF, 0x7F, 0x55, 0x71, 0xF0, 0x7D, 0xFF, 0x7F, 0x56, 0x71, 0xF0, 0x7D, 0xFF, 0x7F, 0x57, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x91, 0x38, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x71, 0xF0, 0xE4, +0xFD, 0x7F, 0x51, 0x71, 0xF0, 0xE4, 0xFD, 0x7F, 0x52, 0x71, 0xF0, 0xE4, 0xFD, 0x7F, 0x53, 0x80, +0xBF, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, +0x10, 0xDF, 0xFE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x93, 0xF2, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xF6, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x00, 0x00, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x91, 0x38, 0x91, 0x31, 0x90, 0x00, +0x02, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, +0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, +0x74, 0x01, 0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x34, 0xE4, 0x90, 0x93, 0x56, 0xF0, 0xFF, 0x7E, +0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, +0xEC, 0x54, 0xFD, 0xFC, 0x90, 0x93, 0xF2, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xF2, 0x12, 0x43, 0x84, +0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x47, +0xE0, 0x60, 0x22, 0xE4, 0xFF, 0x11, 0xDC, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x12, 0x90, 0x93, 0xF6, +0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xF6, 0xB1, 0x4D, 0x90, +0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x51, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0x94, 0x3E, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x94, 0x40, 0xF0, 0x90, 0x94, +0x3E, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, +0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x61, 0xF0, 0xE4, 0x7B, 0x01, 0x7A, 0x92, 0x79, +0x6B, 0x12, 0x76, 0x31, 0xEF, 0xB4, 0x02, 0x14, 0x90, 0x94, 0x4D, 0xE0, 0x64, 0x04, 0x60, 0x07, +0x43, 0x14, 0x01, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x4D, 0xF0, 0x22, 0x7F, 0x70, 0x7E, +0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x54, 0xFC, 0xFF, 0x90, 0x01, 0xE8, 0xF0, +0xEE, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xEC, 0xF0, 0x90, +0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x01, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, +0x01, 0xEE, 0xF0, 0x12, 0x1E, 0xF6, 0x90, 0x01, 0xEF, 0xF0, 0x90, 0x01, 0xEB, 0x74, 0x40, 0xF0, +0x12, 0x98, 0x93, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x04, 0xE0, 0xC3, 0x13, 0x30, 0xE0, +0x16, 0xEF, 0x7B, 0x01, 0xB4, 0x01, 0x06, 0x7A, 0x93, 0x79, 0x0B, 0x80, 0x04, 0x7A, 0x93, 0x79, +0x07, 0x7F, 0x80, 0x7E, 0x08, 0xB1, 0x51, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x92, 0x69, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, +0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, 0x92, 0x35, +0xF0, 0xFA, 0x90, 0x94, 0x13, 0x12, 0x43, 0xC8, 0xD0, 0x01, 0xD0, 0x02, 0xD1, 0x12, 0x90, 0x92, +0x69, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0xFF, 0x90, +0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0x3F, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x10, 0x12, 0x43, 0xC8, 0x90, +0x92, 0x68, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0xF1, 0xF5, 0xEF, +0x70, 0x02, 0xC1, 0xCB, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, +0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0xD1, 0xD0, 0x90, 0x94, 0x13, 0x12, 0x43, +0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x10, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, +0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, 0xD1, 0xD0, 0x90, 0x01, +0xAF, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x64, 0x01, 0x70, 0x48, 0x90, 0x94, 0x10, 0x12, +0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x75, 0x23, 0x02, 0x7B, 0x01, 0x7A, 0xFD, 0x79, +0x20, 0xD1, 0xD0, 0x90, 0x94, 0x13, 0x12, 0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, +0x94, 0x10, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0x7B, 0x01, +0x7A, 0xFD, 0x79, 0x22, 0xD1, 0xD0, 0x90, 0x93, 0x95, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, +0x83, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1D, 0x8A, 0x1E, 0x89, 0x1F, 0x90, 0x94, 0x0A, +0x12, 0x43, 0xC8, 0xAB, 0x20, 0xAA, 0x21, 0xA9, 0x22, 0x90, 0x94, 0x0D, 0x12, 0x43, 0xC8, 0xAF, +0x23, 0x15, 0x23, 0xEF, 0x60, 0x1E, 0x90, 0x94, 0x0D, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, +0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x94, 0x0A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x43, 0xB1, 0xEF, 0x12, +0x42, 0x53, 0x80, 0xDB, 0xAB, 0x1D, 0xAA, 0x1E, 0xA9, 0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, +0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x16, 0x12, 0x43, 0xC8, 0x90, 0x92, 0x6A, 0xE0, +0xFF, 0x90, 0x92, 0x69, 0xE0, 0xB5, 0x07, 0x07, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x3A, 0xAD, 0x90, +0x92, 0x69, 0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0B, 0x90, 0x92, 0x69, 0xE0, 0x14, +0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x0D, 0xF1, 0xF5, 0xEF, 0x60, 0x70, 0xB1, 0xB8, 0x90, 0x01, 0x3F, +0x74, 0x02, 0xF0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x6E, 0xF9, 0x74, 0x92, +0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x7E, 0x00, 0x7F, +0x02, 0x12, 0x1E, 0xD0, 0x90, 0x92, 0x6A, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x70, 0xF9, 0x74, +0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0x19, 0x12, +0x43, 0xA8, 0x8B, 0x20, 0x8A, 0x21, 0x89, 0x22, 0x90, 0x94, 0x16, 0x12, 0x43, 0xA8, 0x12, 0x1E, +0xF6, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x23, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xD1, 0xD0, 0x90, +0x92, 0x6A, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0x8F, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x64, 0x74, 0x20, 0xF0, +0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x7F, 0x00, 0x30, +0xE3, 0x02, 0x7F, 0x01, 0x22, 0x7F, 0xAF, 0x7E, 0x01, 0x90, 0x94, 0x39, 0xEE, 0xF0, 0xA3, 0xEF, +0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0x39, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, +0x83, 0xE0, 0x60, 0x2C, 0xC3, 0x90, 0x94, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0x3B, 0xE0, 0x94, +0x03, 0x40, 0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x3B, +0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0x80, 0xC6, +0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xC4, 0x74, 0x43, 0xF0, +0x74, 0x58, 0xA3, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, +0x60, 0x07, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x30, 0xE1, 0xE4, +0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x11, 0x43, 0xBF, 0x01, 0x0F, +0x90, 0x02, 0x09, 0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x90, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFB, 0xFA, 0xEF, 0x30, 0xE0, 0x02, 0x7B, 0x80, +0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x04, 0x25, 0xEF, 0xF0, 0xED, 0x60, 0x0E, 0x74, +0x0F, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x03, 0x74, +0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2B, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x02, 0xAF, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, +0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x3F, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, +0xFD, 0x62, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x67, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x54, 0x3F, +0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xFD, 0x63, 0xE0, 0x54, 0x03, 0x4F, 0x90, 0x93, 0x68, 0xF0, +0x90, 0x93, 0x67, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xE4, 0xFF, 0x90, 0x94, 0x1C, 0xEF, 0xF0, 0xA3, +0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, 0xE0, 0x90, +0x94, 0x21, 0xF0, 0x51, 0x08, 0xBF, 0x01, 0x02, 0x31, 0x5D, 0x90, 0x94, 0x21, 0xE0, 0x90, 0x05, +0x22, 0xF0, 0x80, 0x02, 0x31, 0x5D, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0xAC, +0xE0, 0xFF, 0x7D, 0x01, 0x11, 0x90, 0x90, 0x94, 0x1F, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, +0x90, 0x94, 0x1C, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x94, 0x2B, 0xF0, 0xEF, 0x60, +0x10, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x80, +0x0E, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, +0x05, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, +0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0xAF, 0x05, 0x74, +0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x16, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, 0xAE, 0x05, 0x74, 0x22, 0x2E, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEB, 0xF0, 0x90, 0x94, 0x2B, 0xE0, 0xFF, 0x74, 0x23, +0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0x90, +0x94, 0x48, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, +0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x94, 0x49, 0xE0, 0x94, +0xE8, 0x90, 0x94, 0x48, 0xE0, 0x94, 0x03, 0x40, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, +0x12, 0x3B, 0x09, 0x90, 0x94, 0x48, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x80, 0xC6, 0xE4, +0x90, 0x93, 0x63, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x20, 0xE0, 0x02, 0xC1, +0xF8, 0x12, 0x9D, 0x9A, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x66, 0x90, 0x93, +0x1A, 0xE0, 0x30, 0xE0, 0x18, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x93, 0x1A, +0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0xA3, 0xE0, 0x90, 0x93, 0x63, 0xF0, 0xE4, 0xF5, 0x48, +0x90, 0x93, 0x63, 0xE0, 0x24, 0x03, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, +0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, +0x93, 0x27, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x19, +0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0x93, 0x16, 0xE0, 0xFF, 0x90, 0x93, 0x25, +0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, +0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, 0x93, 0x2B, +0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, +0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x31, 0x2A, 0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, +0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, +0x4A, 0x62, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0x90, 0x93, +0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x90, 0x93, +0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x06, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x93, +0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x20, +0xE0, 0x02, 0xC1, 0xF8, 0xC1, 0x66, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x81, 0x46, +0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0x51, 0x08, 0xBF, 0x01, +0x03, 0x12, 0x54, 0x48, 0xE4, 0xFF, 0x12, 0x6A, 0xBF, 0x90, 0x93, 0x1A, 0xE0, 0x30, 0xE0, 0x1F, +0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0x0A, 0x90, 0x93, 0x1A, 0xE0, 0xC4, 0x54, 0x0F, 0x30, +0xE0, 0x0D, 0xA3, 0xE0, 0x90, 0x93, 0x63, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, +0xF5, 0x48, 0x90, 0x93, 0x16, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0x93, 0x63, 0xE0, 0x2F, 0xFF, 0x90, +0x93, 0x25, 0xE0, 0xC3, 0x9F, 0xFF, 0x90, 0x93, 0x64, 0xE0, 0x2F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, +0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0xE4, 0xFF, 0xD1, +0xF9, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, +0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, +0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x14, 0xE4, +0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x62, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, 0xE4, 0xFD, 0xAF, 0x64, +0x12, 0x4A, 0x62, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x30, 0xE0, 0x05, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, +0xE0, 0x02, 0xC1, 0xF8, 0xC1, 0xF3, 0x90, 0x93, 0x27, 0xE0, 0x64, 0x03, 0x60, 0x02, 0xA1, 0x9B, +0x7F, 0x01, 0x12, 0x6A, 0xBF, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, +0x03, 0x12, 0x6B, 0xF8, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, +0x81, 0xF7, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xD3, 0x9F, 0x40, 0x4D, 0xE0, +0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x93, 0x21, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, +0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0x17, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, +0x98, 0x40, 0x08, 0xE0, 0x9F, 0x90, 0x93, 0x66, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x66, 0x74, 0x03, +0xF0, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x66, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x80, 0x24, 0xE4, 0xF5, 0x48, 0x90, +0x93, 0x22, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, +0x93, 0x1D, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, +0xE4, 0x90, 0x93, 0x29, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x65, 0xE0, 0xFF, 0x90, +0x93, 0x17, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, +0x77, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x7F, 0x01, 0xD1, +0xF9, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x2F, 0x90, 0x93, 0x15, 0xE0, +0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1A, 0x90, 0x93, 0x1A, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, +0xE0, 0x60, 0x02, 0x80, 0x0F, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x08, +0xE5, 0x65, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x62, 0x90, 0x93, 0x4C, 0xE0, 0x60, +0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x1F, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, +0x12, 0x51, 0x39, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, +0x54, 0x01, 0x20, 0xE0, 0x02, 0xC1, 0xF8, 0x7F, 0x01, 0xC1, 0xF5, 0x90, 0x93, 0x27, 0xE0, 0x64, +0x04, 0x60, 0x02, 0xC1, 0x6C, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, +0x12, 0x39, 0x77, 0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x27, 0xE0, 0x04, 0xF0, 0x90, +0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0F, 0x90, 0x93, 0x17, 0xE0, 0xFF, 0x90, +0x93, 0x25, 0xE0, 0xC3, 0x9F, 0x90, 0x93, 0x2B, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x30, 0xE0, 0x28, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x6E, 0x90, +0x93, 0x2B, 0xE0, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, +0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x31, 0x2A, 0x80, 0x51, 0x90, 0x93, 0x15, 0xE0, +0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, +0x04, 0x12, 0x4A, 0x62, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, +0x90, 0x93, 0x1C, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x2A, 0xF0, +0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x07, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, +0x90, 0x93, 0x1C, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x93, 0x18, +0xE0, 0x20, 0xE0, 0x02, 0xC1, 0xF8, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x93, 0x27, 0xE0, +0x64, 0x05, 0x60, 0x02, 0xC1, 0xF8, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, +0xE0, 0x08, 0x51, 0x08, 0xBF, 0x01, 0x03, 0x12, 0x54, 0x48, 0xE4, 0xFF, 0x12, 0x6A, 0xBF, 0xE4, +0xFF, 0xD1, 0xF9, 0xE4, 0x90, 0x93, 0x27, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, +0x30, 0xE0, 0x08, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x2F, 0x90, 0x93, 0x15, 0xE0, 0xC4, +0x54, 0x0F, 0x30, 0xE0, 0x14, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x14, +0xE4, 0xFD, 0xAF, 0x64, 0x12, 0x4A, 0x62, 0x80, 0x0B, 0xE5, 0x65, 0x60, 0x0D, 0xE4, 0xFD, 0xAF, +0x64, 0x12, 0x4A, 0x62, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0x30, 0xE0, +0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x55, 0x98, 0x22, 0x90, 0x94, 0x2C, 0xEF, 0xF0, 0xF1, 0x5B, +0x90, 0x93, 0x18, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x08, 0x90, 0x94, 0x2C, 0xE0, +0xFF, 0x12, 0x50, 0xDC, 0x90, 0x94, 0x2D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x90, 0x94, +0x2C, 0xE0, 0xB4, 0x01, 0x10, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x16, 0x80, 0x0A, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, +0x94, 0x2D, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x2D, 0x12, +0x55, 0x4D, 0x90, 0x94, 0x2C, 0xE0, 0x90, 0x93, 0x26, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x3C, +0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, +0x0D, 0xF0, 0x22, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xE0, 0x13, 0x13, +0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x24, 0x80, 0x0E, 0x90, 0x93, 0x18, 0xE0, 0xC3, 0x13, +0x90, 0x07, 0x78, 0x30, 0xE0, 0x02, 0x80, 0x14, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, +0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x03, 0xF0, 0x22, +0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0xFC, 0xEF, 0x30, +0xE0, 0x02, 0x7D, 0x80, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, +0xD0, 0x92, 0xAF, 0x22, 0x75, 0x28, 0x33, 0xE4, 0xF5, 0x29, 0x75, 0x2A, 0x07, 0xF5, 0x2B, 0x90, +0x01, 0x30, 0xE5, 0x28, 0xF0, 0xA3, 0xE5, 0x29, 0xF0, 0xA3, 0xE5, 0x2A, 0xF0, 0xA3, 0xE5, 0x2B, +0xF0, 0x22, 0x75, 0x30, 0x1F, 0x75, 0x31, 0x01, 0x43, 0x31, 0x10, 0xE4, 0xF5, 0x32, 0x43, 0x32, +0x20, 0x90, 0x01, 0x38, 0xE5, 0x30, 0xF0, 0xA3, 0xE5, 0x31, 0xF0, 0xA3, 0xE5, 0x32, 0xF0, 0x22, +0x90, 0x00, 0xF4, 0xE0, 0x20, 0xE3, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x05, 0x7F, 0x02, 0x22, +0x7F, 0x00, 0x22, 0x90, 0x93, 0xB3, 0xE0, 0xB4, 0x01, 0x0C, 0x90, 0x00, 0xF2, 0xE0, 0x30, 0xE7, +0x05, 0x7E, 0xFD, 0x7F, 0x33, 0x22, 0x7E, 0xFD, 0x7F, 0x2F, 0x22, 0x90, 0x00, 0xF3, 0xE0, 0x30, +0xE2, 0x0D, 0x90, 0x05, 0x41, 0x74, 0x10, 0xF0, 0x90, 0x05, 0x5A, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, +0xE4, 0x90, 0x93, 0x78, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, +0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x88, 0x90, 0x93, +0x78, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, +0x78, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, +0x90, 0x93, 0x79, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x78, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, +0xC7, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, +0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, +0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, +0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0xFF, 0xE0, 0x54, 0x0C, +0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x64, 0x01, 0x60, 0x04, 0xEF, 0xB4, 0x03, 0x0E, 0x90, 0x93, +0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x37, 0xF0, 0x79, 0x01, 0x80, 0x18, 0xEE, 0x64, 0x01, 0x60, +0x07, 0xAF, 0x06, 0xEE, 0x64, 0x03, 0x70, 0x3C, 0x90, 0x93, 0x5D, 0x74, 0x01, 0xF0, 0xA3, 0x74, +0x3D, 0xF0, 0x79, 0x40, 0x90, 0x93, 0x5D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF5, 0x82, 0x8E, 0x83, +0xE0, 0x59, 0x60, 0x08, 0xE9, 0xF0, 0xE4, 0x90, 0x93, 0x9F, 0xF0, 0x22, 0x90, 0x93, 0x9F, 0xE0, +0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0C, 0xE4, 0xF0, 0x90, 0x04, 0x19, 0xE0, 0x30, 0xE0, +0x03, 0x12, 0x58, 0x7B, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, +0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, +0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x45, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x90, 0x01, 0x34, 0xE0, +0x55, 0x28, 0xF5, 0x2C, 0xA3, 0xE0, 0x55, 0x29, 0xF5, 0x2D, 0xA3, 0xE0, 0x55, 0x2A, 0xF5, 0x2E, +0xA3, 0xE0, 0x55, 0x2B, 0xF5, 0x2F, 0xE5, 0x2C, 0x20, 0xE0, 0x02, 0x61, 0x38, 0x90, 0x01, 0x34, +0x74, 0x01, 0xF0, 0x85, 0xD1, 0x0A, 0x85, 0xD3, 0x0C, 0x85, 0xD4, 0x0D, 0x85, 0xD5, 0x0E, 0x85, +0xD6, 0x0F, 0x85, 0xD7, 0x10, 0x85, 0xD9, 0x11, 0x85, 0xD2, 0x0B, 0x75, 0x20, 0x00, 0x75, 0x21, +0x00, 0x75, 0x22, 0x0A, 0x75, 0x23, 0x08, 0xFB, 0x7A, 0x93, 0x79, 0xA0, 0x12, 0x56, 0xD0, 0x90, +0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x01, 0xFE, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x01, 0x6E, +0x70, 0x02, 0x41, 0xE9, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, +0xE0, 0x02, 0x41, 0xE9, 0xEF, 0x54, 0x1F, 0xF5, 0x4D, 0x90, 0x93, 0xA2, 0xE0, 0x54, 0x3F, 0xF5, +0x4E, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, +0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xE5, 0x4E, 0xD3, 0x94, 0x04, +0x40, 0x03, 0x75, 0x4E, 0x04, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, +0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0xA4, +0xE0, 0x54, 0x1F, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x75, 0xF0, 0x0A, 0xE5, 0x4D, 0x90, 0x84, 0x00, +0x12, 0x43, 0x9C, 0x75, 0xF0, 0x02, 0xE5, 0x4E, 0x12, 0x43, 0x9C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, +0x90, 0x93, 0xA1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2F, 0x90, 0x93, 0xA4, 0xE0, 0x54, +0x1F, 0xFF, 0xE5, 0x4D, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, +0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, +0x30, 0xE0, 0x66, 0xAF, 0x4D, 0x12, 0x79, 0xCB, 0x80, 0x5F, 0x90, 0x93, 0xA1, 0xE0, 0xFF, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x52, 0x90, 0x93, 0xA4, 0xE0, 0x54, 0x1F, 0xFF, 0xFD, 0xE5, +0x4D, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0x8D, 0xF0, 0x12, +0x42, 0x87, 0x90, 0x93, 0xA3, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x0E, +0xEE, 0x54, 0x7F, 0xFD, 0x8F, 0x55, 0xAB, 0x4E, 0xAF, 0x4D, 0xF1, 0x5C, 0x80, 0x1B, 0x90, 0x01, +0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x11, 0x90, 0x04, 0x30, 0xE0, 0xB4, 0x01, 0x0A, 0xE4, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0xCF, 0xF0, 0xE5, 0x65, 0x14, 0x24, 0xFD, 0x50, 0x02, +0x80, 0x46, 0x90, 0x93, 0x59, 0xE0, 0x60, 0x37, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, +0x74, 0x04, 0xF0, 0x12, 0x51, 0xAC, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xF5, 0x48, 0x90, 0x93, 0x45, +0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5B, +0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x55, 0xF0, 0x80, 0x09, 0x12, +0x51, 0xAC, 0xBF, 0x01, 0x03, 0x12, 0x52, 0x08, 0xE5, 0x2C, 0x20, 0xE1, 0x02, 0x61, 0xDA, 0x90, +0x01, 0x34, 0x74, 0x02, 0xF0, 0x90, 0xFD, 0x10, 0x74, 0x7F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x30, +0xE5, 0x0B, 0x75, 0x4F, 0x88, 0x75, 0x50, 0x0F, 0x75, 0x51, 0x0F, 0x80, 0x09, 0x75, 0x4F, 0xC0, +0x75, 0x50, 0x08, 0x75, 0x51, 0x07, 0x90, 0x04, 0x7F, 0xE0, 0x55, 0x51, 0xF5, 0x12, 0x90, 0x04, +0x7E, 0xE0, 0x55, 0x51, 0xF5, 0x13, 0x65, 0x12, 0x60, 0x60, 0xE4, 0xFF, 0xE5, 0x12, 0x75, 0xF0, +0x08, 0xA4, 0x25, 0x4F, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, +0x74, 0x15, 0x2F, 0xF8, 0xA6, 0x06, 0x0F, 0xBF, 0x08, 0xE2, 0x75, 0x20, 0x00, 0x75, 0x21, 0x00, +0x75, 0x22, 0x15, 0x75, 0x23, 0x08, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x97, 0x12, 0x56, 0xD0, 0x90, +0x93, 0x97, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xD1, 0x5C, 0xE5, +0x12, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0xAD, 0x50, 0x7C, 0x00, 0x12, 0x1F, 0x4E, 0xAF, 0x05, +0x8F, 0x12, 0x90, 0x04, 0x7F, 0xEF, 0xF0, 0xB5, 0x13, 0xA0, 0xE5, 0x2C, 0x30, 0xE3, 0x06, 0x90, +0x01, 0x34, 0x74, 0x08, 0xF0, 0xE5, 0x2C, 0x30, 0xE4, 0x09, 0x90, 0x01, 0x34, 0x74, 0x10, 0xF0, +0x43, 0x14, 0x10, 0xE5, 0x2C, 0x30, 0xE5, 0x26, 0x90, 0x01, 0xCF, 0xE0, 0x30, 0xE5, 0x1F, 0xE0, +0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0x75, 0xA8, 0x00, 0x75, 0xE8, 0x00, 0x12, +0x54, 0x05, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x54, 0x38, 0x80, 0xFE, 0xE5, 0x2C, +0x30, 0xE6, 0x06, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xE5, 0x2E, 0x20, 0xE0, 0x02, 0x81, 0xE3, +0x90, 0x93, 0xB2, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x36, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0x60, 0x0F, +0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x12, +0x45, 0x09, 0x90, 0x93, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xD9, 0x90, 0x05, 0x22, 0x74, 0xFF, +0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xDC, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, +0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2D, +0xE0, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9F, 0x40, 0x30, +0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x90, 0x93, 0x32, 0x12, 0x43, 0x84, 0x90, 0x81, +0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x90, 0x93, 0x2E, 0x12, 0x43, +0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x34, 0x30, 0x80, 0x1C, +0x90, 0x93, 0x2D, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, +0x54, 0x0F, 0xFE, 0x25, 0xE0, 0x4F, 0xF0, 0x80, 0x03, 0x12, 0x6A, 0x4A, 0xD1, 0x7E, 0x90, 0x93, +0xB2, 0xE4, 0xF0, 0xE5, 0x2E, 0x30, 0xE1, 0x45, 0x90, 0x01, 0x36, 0x74, 0x02, 0xF0, 0x43, 0x14, +0x40, 0x12, 0x9F, 0x27, 0x11, 0xD6, 0x90, 0x93, 0x5C, 0xE0, 0x60, 0x1D, 0x90, 0x01, 0x3B, 0xE0, +0x30, 0xE4, 0x16, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, +0x22, 0x90, 0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x05, 0x08, 0xE5, 0x08, 0xC3, 0x94, 0xFF, +0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xE5, 0x2E, 0x30, +0xE2, 0x43, 0x90, 0x01, 0x36, 0x74, 0x04, 0xF0, 0x12, 0x4C, 0x64, 0x90, 0x93, 0x5C, 0xE0, 0x60, +0x34, 0x90, 0x93, 0x57, 0xE0, 0xFF, 0x90, 0x93, 0x40, 0xE0, 0x6F, 0x70, 0x28, 0x90, 0x93, 0x57, +0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x3A, +0xAD, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x22, 0x90, +0x93, 0x40, 0xE0, 0x14, 0xF0, 0xE5, 0x2E, 0x30, 0xE3, 0x34, 0x90, 0x01, 0x36, 0x74, 0x08, 0xF0, +0xE5, 0x62, 0x64, 0x01, 0x70, 0x28, 0xE5, 0x65, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, +0x01, 0x3C, 0x74, 0x02, 0xF0, 0x75, 0x48, 0x00, 0x90, 0x93, 0x4B, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, +0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0xE5, 0x2E, +0x30, 0xE4, 0x2B, 0x90, 0x01, 0x36, 0x74, 0x10, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x20, 0xE5, 0x65, +0x60, 0x1C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x93, 0x5A, +0xE4, 0xF0, 0x53, 0x66, 0xFD, 0xE5, 0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x08, 0xE5, 0x2E, +0x30, 0xE5, 0x25, 0x90, 0x01, 0x36, 0x74, 0x20, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x1A, 0xE5, 0x65, +0x60, 0x16, 0x90, 0x93, 0x59, 0xE0, 0x64, 0x02, 0x60, 0x0B, 0xE5, 0x63, 0x64, 0x0C, 0x60, 0x08, +0x12, 0x51, 0x39, 0x80, 0x03, 0x12, 0x50, 0x68, 0xE5, 0x2E, 0x30, 0xE6, 0x1B, 0x90, 0x01, 0x36, +0x74, 0x40, 0xF0, 0xE5, 0x62, 0xB4, 0x01, 0x10, 0xE5, 0x65, 0x60, 0x0C, 0x53, 0x66, 0xFE, 0xE5, +0x66, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x08, 0xE5, 0x2F, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x37, +0x74, 0x02, 0xF0, 0x12, 0x4F, 0xEB, 0x74, 0x45, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, 0xA3, +0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, +0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x5D, 0xE0, +0x54, 0xF0, 0x44, 0x03, 0xF0, 0x54, 0x0F, 0x44, 0x80, 0xF0, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x15, +0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x0B, 0x7A, 0x93, 0x79, 0x5D, 0x02, 0x57, 0x1F, 0x90, 0x94, +0x3E, 0xE0, 0x30, 0xE0, 0x2F, 0xE5, 0x62, 0xB4, 0x01, 0x2A, 0x90, 0x94, 0x3D, 0xE0, 0x04, 0xF0, +0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x94, 0x40, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0x3D, 0xF0, 0x90, +0x94, 0x40, 0xE0, 0xFF, 0x90, 0x94, 0x3F, 0xE0, 0xD3, 0x9F, 0x50, 0x08, 0x12, 0x44, 0xFE, 0xE4, +0x90, 0x94, 0x40, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, +0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x7D, 0xB5, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x66, 0xFF, +0xA3, 0xF0, 0x53, 0x91, 0xEF, 0x90, 0x00, 0x51, 0xE0, 0xFE, 0x90, 0x00, 0x55, 0xE0, 0x5E, 0xF5, +0x3D, 0x90, 0x00, 0x52, 0xE0, 0xFE, 0x90, 0x00, 0x56, 0xE0, 0x5E, 0xF5, 0x3E, 0xE5, 0x3D, 0x30, +0xE4, 0x06, 0x90, 0x00, 0x55, 0x74, 0x10, 0xF0, 0xE5, 0x3D, 0x30, 0xE5, 0x06, 0x90, 0x00, 0x55, +0x74, 0x20, 0xF0, 0xE5, 0x3D, 0x30, 0xE6, 0x06, 0x90, 0x00, 0x55, 0x74, 0x40, 0xF0, 0xE5, 0x3D, +0x30, 0xE7, 0x06, 0x90, 0x00, 0x55, 0x74, 0x80, 0xF0, 0xE5, 0x3E, 0x30, 0xE0, 0x06, 0x90, 0x00, +0x56, 0x74, 0x01, 0xF0, 0xE5, 0x3E, 0x30, 0xE1, 0x06, 0x90, 0x00, 0x56, 0x74, 0x02, 0xF0, 0xE5, +0x3E, 0x30, 0xE2, 0x06, 0x90, 0x00, 0x56, 0x74, 0x04, 0xF0, 0xE5, 0x3E, 0x30, 0xE3, 0x06, 0x90, +0x00, 0x56, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, +0x06, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x8F, 0x52, 0x8D, 0x53, +0xE5, 0x53, 0x54, 0x1F, 0x90, 0x93, 0x5F, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, +0xF5, 0x83, 0xE0, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x60, 0x74, 0x01, 0xF0, 0xEB, 0xC3, 0x94, +0x01, 0x40, 0x03, 0x02, 0x79, 0xCB, 0x90, 0x93, 0x5D, 0xE0, 0x25, 0x55, 0xFF, 0xA3, 0xF0, 0xA3, +0xE0, 0x90, 0x41, 0xA4, 0x93, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x14, 0x74, 0x01, 0x25, 0x52, 0xF5, +0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAD, 0x53, 0xAF, 0x52, 0x02, 0x79, 0x82, 0x90, +0x93, 0x5E, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEF, +0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, +0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x75, +0x56, 0x00, 0x90, 0x01, 0xC4, 0x74, 0xC2, 0xF0, 0x74, 0x67, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x90, +0x01, 0x3C, 0xE0, 0x55, 0x30, 0xF5, 0x34, 0xA3, 0xE0, 0x55, 0x31, 0xF5, 0x35, 0xA3, 0xE0, 0x55, +0x32, 0xF5, 0x36, 0xA3, 0xE0, 0x55, 0x33, 0xF5, 0x37, 0xE5, 0x34, 0x30, 0xE0, 0x06, 0x90, 0x01, +0x3C, 0x74, 0x01, 0xF0, 0xE5, 0x34, 0x30, 0xE1, 0x10, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, +0x93, 0x15, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0x46, 0x72, 0xE5, 0x34, 0x30, 0xE2, 0x36, 0x90, 0x01, +0x3C, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE0, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, +0x45, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, +0x5B, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x55, 0xE4, +0xF0, 0x12, 0x52, 0x08, 0xE5, 0x34, 0x30, 0xE3, 0x36, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0x90, +0x06, 0x92, 0xE0, 0x30, 0xE1, 0x21, 0x75, 0x48, 0x00, 0x90, 0x93, 0x45, 0xE0, 0xF5, 0x49, 0xE4, +0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, +0x06, 0x92, 0x74, 0x02, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x52, 0xE4, 0xF0, 0x12, 0x52, 0x08, 0xE5, +0x34, 0x30, 0xE4, 0x34, 0x90, 0x01, 0x3C, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x30, 0xE0, +0x24, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0xE4, 0xFF, 0x12, 0x50, 0xDC, 0x90, 0x07, 0x78, 0x74, +0x01, 0xF0, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, 0x08, +0x12, 0x34, 0x30, 0x80, 0x03, 0x12, 0x5A, 0x4F, 0xE5, 0x34, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3C, +0x74, 0x20, 0xF0, 0xE5, 0x35, 0x30, 0xE0, 0x18, 0x90, 0x01, 0x3D, 0x74, 0x01, 0xF0, 0x90, 0x00, +0x83, 0xE0, 0xF5, 0x64, 0x90, 0x01, 0xBB, 0xE5, 0x64, 0xF0, 0x12, 0x51, 0xDD, 0x12, 0x52, 0x08, +0xE5, 0x35, 0x30, 0xE2, 0x06, 0x90, 0x01, 0x3D, 0x74, 0x04, 0xF0, 0xE5, 0x35, 0x30, 0xE4, 0x1B, +0x90, 0x01, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x93, 0xAE, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, +0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, 0x04, 0xF0, 0xE5, 0x36, 0x30, 0xE0, 0x06, +0x90, 0x01, 0x3E, 0x74, 0x01, 0xF0, 0xE5, 0x36, 0x30, 0xE1, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x02, +0xF0, 0xE5, 0x36, 0x30, 0xE3, 0x08, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0x71, 0xB2, 0xE5, 0x36, +0x30, 0xE4, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x10, 0xF0, 0xE5, 0x36, 0x30, 0xE2, 0x75, 0x90, 0x01, +0x3E, 0x74, 0x04, 0xF0, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE7, 0x13, 0x74, 0x80, 0xF0, 0x90, 0x07, +0x95, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0xFF, 0x12, 0x55, 0x98, 0x90, 0x07, +0x8F, 0xE0, 0x30, 0xE6, 0x11, 0x74, 0x40, 0xF0, 0x90, 0x07, 0x7C, 0xE0, 0xB4, 0x06, 0x07, 0x90, +0x07, 0x80, 0xE0, 0xFF, 0x71, 0xD0, 0x90, 0x07, 0x8F, 0xE0, 0x30, 0xE5, 0x14, 0x74, 0x20, 0xF0, +0xE4, 0xFF, 0x12, 0x55, 0x98, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, 0x01, +0xF0, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE2, 0x0D, 0x74, 0x04, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, +0x7F, 0x01, 0x12, 0x55, 0x98, 0x90, 0x07, 0x95, 0xE0, 0x30, 0xE0, 0x07, 0x74, 0x01, 0xF0, 0xFF, +0x12, 0x55, 0x98, 0xE5, 0x36, 0x30, 0xE5, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x20, 0xF0, 0xE5, 0x36, +0x30, 0xE6, 0x06, 0x90, 0x01, 0x3E, 0x74, 0x40, 0xF0, 0xE5, 0x36, 0x30, 0xE7, 0x06, 0x90, 0x01, +0x3E, 0x74, 0x80, 0xF0, 0xE5, 0x37, 0x30, 0xE1, 0x09, 0x90, 0x01, 0x3F, 0x74, 0x02, 0xF0, 0x43, +0x14, 0x80, 0xE5, 0x37, 0x30, 0xE4, 0x1D, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x12, 0x44, 0x24, +0x90, 0x93, 0x57, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x3A, 0x93, 0x51, +0x4A, 0x12, 0x66, 0x7E, 0x74, 0xC2, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x67, 0xA3, 0xF0, 0xD0, +0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, +0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x93, 0x15, 0xE0, 0x30, 0xE0, +0x6D, 0x7F, 0x01, 0x51, 0xBF, 0x90, 0x93, 0x19, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, +0x02, 0x71, 0xF8, 0x7F, 0x01, 0x12, 0x5E, 0xF9, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, 0x07, +0x20, 0xE0, 0x29, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1F, 0x90, 0x93, 0x1A, +0xE0, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, +0x90, 0x05, 0x22, 0xE4, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x4A, 0x62, 0x90, 0x93, 0x4C, 0xE0, +0x90, 0x05, 0x22, 0x60, 0x05, 0x74, 0x6F, 0xF0, 0x80, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x18, 0xE0, +0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0x55, 0x98, 0x22, 0xEF, +0x64, 0x03, 0x60, 0x02, 0x61, 0x8D, 0x90, 0x94, 0x02, 0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, +0xA3, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x30, 0x90, 0x94, +0x06, 0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, 0xA3, 0x74, 0xFA, 0xF0, 0xA3, 0x74, 0x5A, 0xF0, +0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x41, 0x90, 0x94, 0x02, 0x74, 0xFF, 0xF0, +0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0x80, 0x2D, 0x90, 0x93, +0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x17, 0x90, 0x94, 0x02, 0x74, 0xFF, 0xF0, 0xA3, 0x74, +0x55, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0x5A, 0x80, 0x05, 0x90, +0x94, 0x06, 0x74, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0x02, 0xE0, 0x90, +0x06, 0xC0, 0xF0, 0x90, 0x94, 0x03, 0xE0, 0x90, 0x06, 0xC1, 0xF0, 0x90, 0x94, 0x04, 0xE0, 0x90, +0x06, 0xC2, 0xF0, 0x90, 0x94, 0x05, 0xE0, 0x90, 0x06, 0xC3, 0xF0, 0x90, 0x94, 0x06, 0xE0, 0x90, +0x06, 0xC4, 0xF0, 0x90, 0x94, 0x07, 0xE0, 0x90, 0x06, 0xC5, 0xF0, 0x90, 0x94, 0x08, 0xE0, 0x90, +0x06, 0xC6, 0xF0, 0x90, 0x94, 0x09, 0xE0, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, +0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x24, 0xE4, 0xF0, 0x22, 0xEF, 0xB4, 0x01, +0x10, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x16, 0x90, 0x06, 0xCC, 0xE4, 0xF0, +0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0x90, 0x06, 0xCC, 0x74, 0x03, +0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x11, 0x90, 0x93, +0x1C, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0xE0, 0x44, 0x04, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0x22, +0xAD, 0x07, 0x90, 0x93, 0x63, 0xE0, 0x54, 0xF0, 0x44, 0x05, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, +0x90, 0x93, 0x65, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x65, 0x90, 0x94, 0x19, 0x12, 0x43, +0xC8, 0x7A, 0x93, 0x79, 0x63, 0x02, 0x57, 0x1F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, +0x93, 0xEA, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0xEE, 0x12, 0x1F, 0xD5, 0x00, +0x00, 0x00, 0x00, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, +0x90, 0x93, 0x4A, 0xE0, 0x60, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x3D, 0xE0, +0x60, 0x14, 0x12, 0x51, 0xAC, 0xBF, 0x01, 0x0B, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, +0x30, 0xE0, 0x03, 0x12, 0x4F, 0xA9, 0x90, 0x93, 0x2D, 0xE0, 0x20, 0xE0, 0x24, 0x90, 0x93, 0x47, +0xE0, 0x60, 0x1E, 0x7F, 0x01, 0x12, 0x50, 0xDC, 0x90, 0x93, 0x5B, 0xE0, 0x60, 0x13, 0x90, 0x93, +0xEE, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xEE, 0x12, 0x55, +0x4D, 0x12, 0x54, 0x31, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0x90, 0x93, 0x87, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x15, +0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x1E, +0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x10, +0xFF, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x15, +0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x12, 0x1E, +0xF6, 0xFC, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x15, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x00, 0x03, +0x12, 0x1F, 0x0F, 0xFD, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xED, +0x54, 0x02, 0xFF, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFD, 0x54, +0x04, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x10, 0xFF, 0xE0, 0x54, +0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x18, +0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, +0x03, 0x12, 0x1F, 0x0F, 0x54, 0x80, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xDF, 0x4E, +0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, +0xFF, 0x54, 0x80, 0xFE, 0x90, 0x93, 0x19, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0xFF, +0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x04, 0xFE, 0x90, +0x93, 0x19, 0xE0, 0x54, 0xFB, 0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, +0xEC, 0x20, 0xE0, 0x02, 0xC1, 0xF3, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x25, 0xF0, +0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, +0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x16, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, +0x90, 0x93, 0x17, 0xF0, 0x80, 0x4E, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x01, 0x12, +0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x93, 0x16, 0x50, +0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, 0x16, 0x74, 0x2A, 0xF0, +0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, +0x90, 0x93, 0x17, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x93, +0x17, 0x74, 0x2A, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3D, +0x90, 0x93, 0x16, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x1E, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, +0xF0, 0x90, 0x93, 0x17, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x93, 0x20, 0xF0, 0x90, 0x93, 0x16, +0xE0, 0xC3, 0x13, 0x90, 0x93, 0x21, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0xC3, 0x13, 0x90, 0x93, 0x22, +0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x3A, 0xAD, 0xE4, 0x90, 0x93, +0x11, 0xF0, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xC4, 0x13, +0x13, 0x54, 0x03, 0x20, 0xE0, 0x14, 0x12, 0x1E, 0xF6, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, +0x04, 0x7F, 0x01, 0x80, 0x02, 0xE4, 0xFF, 0x12, 0x50, 0xDC, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x54, +0x0F, 0x30, 0xE0, 0x18, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x75, +0x64, 0x04, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, +0x03, 0xF0, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x80, +0x2B, 0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x80, 0x1C, +0x90, 0x93, 0x1D, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x93, 0x27, 0x74, 0x02, 0xF0, 0x80, 0x0D, 0x90, +0x93, 0x1D, 0xE0, 0xB4, 0x07, 0x06, 0x90, 0x93, 0x27, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x93, 0x1D, +0xF0, 0x80, 0x65, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0x13, 0x13, 0x13, +0x54, 0x1F, 0x90, 0x93, 0x83, 0x30, 0xE0, 0x09, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, +0x07, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x12, 0x9B, 0x2D, 0x90, 0x00, 0x40, 0x74, 0x20, +0xF0, 0x90, 0x93, 0x87, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x13, 0x13, 0x13, +0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, +0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x12, 0x55, 0x4D, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, +0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, +0x90, 0x93, 0x26, 0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, +0x09, 0x90, 0x93, 0x04, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x55, 0x98, 0x90, +0x93, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x51, 0xBF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, +0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, +0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x53, 0x91, 0xBF, 0x90, +0xFD, 0x68, 0xE0, 0x20, 0xE0, 0x03, 0x02, 0x72, 0x0E, 0x90, 0x93, 0x94, 0xE0, 0x70, 0x16, 0x90, +0x00, 0x2E, 0xE0, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x00, 0x2D, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, +0x93, 0x94, 0x74, 0x01, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x54, 0x3F, 0xD3, 0x94, 0x09, 0x50, 0x03, +0x12, 0x9B, 0xE0, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x0E, 0x60, 0x03, 0x02, 0x70, 0x93, 0x90, 0x93, +0x04, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x03, 0x02, 0x70, 0x93, 0x90, 0xFD, +0x62, 0xE0, 0x54, 0xC0, 0xFE, 0x90, 0x07, 0x90, 0xE0, 0x54, 0x3F, 0x4E, 0xF0, 0x90, 0xFD, 0x63, +0xE0, 0x90, 0x07, 0x91, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x07, 0x92, 0xF0, 0x90, 0xFD, 0x65, +0xE0, 0x90, 0x07, 0x93, 0xF0, 0x90, 0x07, 0x95, 0x74, 0x01, 0xF0, 0xEF, 0x20, 0xE0, 0x44, 0x90, +0x93, 0x04, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x19, 0x90, 0x07, 0x78, 0x12, 0x58, 0xF0, +0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x49, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x40, +0xF0, 0x80, 0x40, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x11, 0xE4, 0xFF, 0x12, +0x55, 0x98, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x01, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, +0x78, 0x80, 0x14, 0x90, 0x93, 0x04, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, +0xE0, 0x05, 0x12, 0x58, 0xF0, 0x80, 0x0C, 0xE0, 0x44, 0x10, 0xF0, 0xE0, 0x44, 0x20, 0xF0, 0xE0, +0x54, 0xDF, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x0F, 0x0A, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xA3, +0xE0, 0xFD, 0x51, 0xCA, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x15, 0x70, 0x76, 0x90, 0xFD, 0x62, 0xE0, +0x90, 0x93, 0x6A, 0xF0, 0xE0, 0x30, 0xE6, 0x1C, 0xF4, 0x54, 0x3F, 0x04, 0xFF, 0x90, 0x93, 0x0F, +0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9F, 0x90, 0x93, 0x69, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x20, +0xE4, 0xF0, 0x80, 0x1C, 0x90, 0x93, 0x0F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xFF, 0x90, 0x93, 0x6A, +0xE0, 0x54, 0x3F, 0x2F, 0x90, 0x93, 0x69, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, +0x90, 0x93, 0x69, 0xE0, 0xFF, 0x90, 0x01, 0xE7, 0xF0, 0xEF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFF, +0x90, 0x93, 0x69, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, 0x93, 0x6B, 0xF0, 0x90, 0x00, +0x2E, 0xF0, 0xEE, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x93, 0x10, 0xE0, 0x54, 0x0F, 0x4F, 0x90, 0x00, +0x2D, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x16, 0x07, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x51, 0x29, +0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x21, 0x07, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x51, 0x51, 0x90, 0xFD, +0x60, 0xE0, 0xB4, 0x22, 0x02, 0x51, 0x79, 0x90, 0xFD, 0x60, 0xE0, 0x64, 0x23, 0x70, 0x7B, 0x90, +0xFD, 0x62, 0xE0, 0x90, 0x93, 0x2C, 0x30, 0xE0, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x02, 0xE4, 0xF0, +0x90, 0xFD, 0x65, 0xE0, 0x30, 0xE1, 0x5B, 0x90, 0x93, 0x2D, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, +0x22, 0x74, 0xFF, 0xF0, 0x7F, 0x60, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x32, 0x12, 0x1F, +0xC9, 0xE4, 0xFF, 0x12, 0x50, 0xDC, 0x7F, 0x70, 0x7E, 0x08, 0x12, 0x2C, 0x6E, 0x90, 0x93, 0x2E, +0x12, 0x1F, 0xC9, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x70, 0x7E, +0x08, 0x12, 0x34, 0x30, 0x90, 0x01, 0xBE, 0xE0, 0x04, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, +0x2D, 0x30, 0xE2, 0x08, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x80, 0x06, 0xE0, 0x54, 0x1F, 0x44, +0x60, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0xFF, 0x12, 0x9C, 0x4C, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x24, +0x02, 0x51, 0xA1, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x25, 0x13, 0x90, 0xFD, 0x62, 0xE0, 0x60, 0x0D, +0x90, 0x93, 0x1C, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0x24, 0x74, 0x04, 0xF0, 0x90, 0xFD, 0x60, +0xE0, 0xB4, 0x26, 0x05, 0x7F, 0x01, 0x12, 0x9C, 0xE8, 0x90, 0xFD, 0x60, 0xE0, 0xB4, 0x30, 0x07, +0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0x51, 0xF5, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0xD0, 0x07, +0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, +0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, +0xF0, 0x44, 0x07, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x6E, 0xEF, 0xF0, 0x7B, 0x01, +0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x57, +0x1F, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x09, 0xF0, 0x54, 0x0F, 0x44, 0x10, +0xF0, 0x90, 0x93, 0x6E, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, +0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x57, 0x1F, 0x90, 0x00, 0x75, 0xE0, 0x44, 0x01, 0xF0, +0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0x74, 0x03, 0xF0, 0x7F, 0x02, 0x7E, +0x00, 0x12, 0x3A, 0x78, 0x90, 0xFE, 0x13, 0xE4, 0xF0, 0x90, 0x00, 0x75, 0xE0, 0x54, 0xFE, 0xF0, +0x22, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0D, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x90, +0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6E, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, +0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x57, 0x1F, 0xAE, 0x07, 0x90, 0x93, 0x6C, 0xE0, +0x54, 0xF0, 0x44, 0x04, 0xF0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x90, 0x93, 0x6E, 0xEE, 0xF0, 0xA3, +0xED, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, +0x79, 0x6C, 0x02, 0x57, 0x1F, 0xAC, 0x07, 0x90, 0x93, 0xD9, 0xE0, 0x44, 0x0F, 0xF0, 0x54, 0x0F, +0x44, 0x70, 0xF0, 0x90, 0x93, 0xDB, 0xEC, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, +0xDC, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0x93, 0xDD, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, +0xDE, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xDF, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, +0xE0, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0xE1, 0xF0, 0x80, 0x11, 0x90, 0x93, 0xDC, 0xED, +0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, +0x93, 0x79, 0xDB, 0x90, 0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0xD9, 0x02, 0x57, 0x1F, +0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x83, 0xF0, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, +0x85, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x86, 0xF0, 0x90, 0x00, 0x04, 0x12, +0x1F, 0x0F, 0x90, 0x93, 0x87, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x58, 0xE0, 0x20, +0xE0, 0x15, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x7F, 0x30, 0x12, 0x98, 0x37, 0x90, 0x93, 0x83, +0xE0, 0xFB, 0x7D, 0x01, 0xE4, 0x80, 0x07, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x51, +0xF5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x80, 0x12, 0x43, 0xC8, 0xEF, 0x12, 0x43, 0xD1, +0x74, 0x73, 0x01, 0x74, 0x6A, 0x02, 0x74, 0xBB, 0x03, 0x74, 0xC4, 0x05, 0x74, 0xCD, 0x06, 0x76, +0x24, 0x07, 0x74, 0xD6, 0x0B, 0x74, 0xDF, 0x10, 0x74, 0xE7, 0x11, 0x74, 0xEF, 0x12, 0x74, 0xF7, +0x13, 0x75, 0x00, 0x14, 0x75, 0x09, 0x15, 0x75, 0x11, 0x16, 0x75, 0x1B, 0x17, 0x75, 0x25, 0x18, +0x75, 0x2F, 0x19, 0x75, 0xF1, 0x1B, 0x75, 0xFA, 0x1C, 0x75, 0x38, 0x1D, 0x75, 0x42, 0x1E, 0x75, +0x4D, 0x21, 0x75, 0x55, 0x22, 0x75, 0x5D, 0x23, 0x75, 0x65, 0x24, 0x75, 0x6D, 0x25, 0x75, 0x75, +0x26, 0x75, 0x7D, 0x27, 0x75, 0x86, 0x28, 0x75, 0x8F, 0x29, 0x74, 0x7C, 0x2D, 0x74, 0x85, 0x2E, +0x75, 0x98, 0x2F, 0x76, 0x03, 0x30, 0x75, 0xA9, 0x32, 0x75, 0xA0, 0x33, 0x74, 0x97, 0x34, 0x75, +0xB2, 0x36, 0x75, 0xBB, 0x37, 0x75, 0xC4, 0x38, 0x75, 0xCD, 0x3A, 0x74, 0x8E, 0x3B, 0x75, 0xD6, +0x3E, 0x75, 0xDF, 0x3F, 0x75, 0xE8, 0x41, 0x76, 0x0C, 0x46, 0x74, 0xA0, 0x47, 0x74, 0xB2, 0x48, +0x74, 0xA9, 0x49, 0x76, 0x14, 0x4B, 0x00, 0x00, 0x76, 0x1D, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, +0x02, 0x90, 0x7B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x90, 0x81, 0x90, 0x93, 0x80, 0x12, +0x43, 0xA8, 0x02, 0x91, 0x62, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x91, 0xAA, 0x90, 0x93, +0x80, 0x12, 0x43, 0xA8, 0x02, 0x91, 0xE3, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x15, +0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x92, 0x1B, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, +0x92, 0xDB, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x98, 0x2F, 0x90, 0x93, 0x80, 0x12, 0x43, +0xA8, 0x02, 0x92, 0xEC, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x41, 0x90, 0x93, 0x80, +0x12, 0x43, 0xA8, 0x02, 0x8F, 0x13, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x9E, 0x90, +0x93, 0x80, 0x12, 0x43, 0xA8, 0xC1, 0x25, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xC1, 0x2B, 0x90, +0x93, 0x80, 0x12, 0x43, 0xA8, 0xE1, 0x52, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x93, 0x34, +0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x93, 0x4E, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xC1, +0xBE, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x01, 0x80, 0x2F, 0x90, 0x93, 0x80, 0x12, 0x43, +0xA8, 0x7F, 0x02, 0x80, 0x25, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x03, 0x80, 0x1B, 0x90, +0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x95, 0x16, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE4, 0xFF, +0x80, 0x08, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x7F, 0x04, 0x02, 0x94, 0x34, 0x90, 0x93, 0x80, +0x12, 0x43, 0xA8, 0xE1, 0x67, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE1, 0x7F, 0x90, 0x93, 0x80, +0x12, 0x43, 0xA8, 0xE1, 0x97, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE1, 0xAF, 0x90, 0x93, 0x80, +0x12, 0x43, 0xA8, 0xE1, 0xC7, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE1, 0xDF, 0x90, 0x93, 0x80, +0x12, 0x43, 0xA8, 0x02, 0x95, 0x4E, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x95, 0x67, 0x90, +0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x95, 0x80, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0xE1, 0x58, +0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x95, 0xA8, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, +0x95, 0xC1, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x95, 0xDA, 0x90, 0x93, 0x80, 0x12, 0x43, +0xA8, 0x02, 0x97, 0x8D, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x97, 0x9F, 0x90, 0x93, 0x80, +0x12, 0x43, 0xA8, 0x02, 0x6C, 0x79, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x97, 0xC2, 0x90, +0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x97, 0xDB, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x98, +0x16, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x8F, 0x6D, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, +0x02, 0x8F, 0x29, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x9A, 0x96, 0x90, 0x93, 0x80, 0x12, +0x43, 0xA8, 0x61, 0x60, 0x90, 0x93, 0x80, 0x12, 0x43, 0xA8, 0x02, 0x98, 0x81, 0x90, 0x01, 0xC6, +0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x05, 0x7F, 0x0B, 0x80, 0x0A, 0x7D, 0x01, 0x7F, 0x0C, 0x80, +0x04, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x41, 0x12, +0x43, 0xC8, 0xE4, 0xFE, 0x90, 0x00, 0xA3, 0xE0, 0x54, 0xF8, 0x44, 0x05, 0xF0, 0x90, 0x00, 0xA0, +0xE0, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x5A, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x49, 0x90, 0xFD, +0x50, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0x94, 0x41, 0x12, 0x43, +0xA8, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, +0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0F, 0x74, +0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0x90, 0xFD, +0x58, 0x74, 0x01, 0xF0, 0xFF, 0x80, 0x12, 0x90, 0x01, 0x43, 0xE0, 0x04, 0xF0, 0x7F, 0x02, 0x80, +0x08, 0x90, 0x01, 0x42, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, +0x83, 0x12, 0x43, 0xC8, 0xE4, 0x90, 0x93, 0x86, 0xF0, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x42, 0x90, +0x07, 0x78, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x78, +0xE0, 0x44, 0x80, 0x54, 0xBF, 0xF0, 0x90, 0x93, 0x86, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0x93, 0x79, +0x86, 0xFD, 0x7F, 0x1A, 0xD1, 0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0x30, +0xE1, 0x4F, 0x90, 0x93, 0x04, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x95, 0xE0, 0x44, 0x06, 0xF0, +0x22, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, 0x3F, 0xF0, 0x90, +0x07, 0x83, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x07, 0x95, 0xE0, 0x54, 0xF9, 0xF0, 0x90, 0x93, 0x0B, +0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x34, 0x30, +0xE4, 0x90, 0x93, 0x86, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x86, 0x7D, 0x01, 0x7F, 0x1A, 0xD1, +0x35, 0x22, 0x7D, 0x01, 0x7F, 0x0D, 0xC1, 0x35, 0x12, 0x1E, 0xF6, 0xFF, 0xE9, 0x24, 0x01, 0xF9, +0xE4, 0x3A, 0xFA, 0x7D, 0x04, 0xC1, 0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, +0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x17, 0xC1, 0x35, 0x90, +0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, +0xA8, 0x7D, 0x01, 0x7F, 0x18, 0xC1, 0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, +0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x19, 0xC1, 0x35, 0x90, +0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, +0xA8, 0x7D, 0x01, 0x7F, 0x1A, 0xC1, 0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, +0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1B, 0xC1, 0x35, 0x90, +0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, +0xA8, 0x7D, 0x01, 0x7F, 0x1C, 0xC1, 0x35, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, +0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFD, 0x70, 0x02, 0x21, +0x40, 0x90, 0x94, 0x4A, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, +0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, 0x39, 0x90, 0x94, 0x4A, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x79, 0xF0, 0x75, +0x20, 0x01, 0x75, 0x21, 0x93, 0x75, 0x22, 0x79, 0x75, 0x23, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, +0x7A, 0x12, 0x56, 0xD0, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, +0x94, 0x4A, 0x30, 0xE0, 0x59, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x88, 0x12, 0x43, 0x9C, 0xE0, +0x90, 0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4A, 0xE0, 0x75, 0xF0, 0x02, 0x90, 0x00, 0x89, 0x12, 0x43, +0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x94, 0x4A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, +0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0x90, 0x94, 0x4A, 0xE0, 0x75, 0xF0, 0x04, 0x90, +0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7E, 0xF0, 0x90, 0x94, 0x4A, 0xE0, 0x75, 0xF0, +0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7F, 0xF0, 0x80, 0x33, 0xE0, 0x75, +0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x94, 0x4A, +0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7C, 0xF0, 0x90, +0x94, 0x4A, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x7D, +0xF0, 0xEF, 0x54, 0x7F, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7B, 0x12, 0x73, 0xC6, 0x90, 0x93, +0x78, 0xE0, 0xFF, 0x90, 0x94, 0x4A, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, +0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x94, 0x4A, 0xE0, 0xFF, 0x74, 0x01, +0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x94, 0x4A, +0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x01, 0x08, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x02, 0xF0, +0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x22, 0x12, +0x43, 0xC8, 0x90, 0x94, 0x25, 0xE0, 0x54, 0xF0, 0x44, 0x06, 0xFF, 0xF0, 0xED, 0x54, 0x0F, 0xC4, +0x54, 0xF0, 0xFE, 0xEF, 0x54, 0x0F, 0x4E, 0xF0, 0x90, 0x94, 0x22, 0x12, 0x43, 0xA8, 0x90, 0x94, +0x19, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x25, 0x12, 0x57, 0x1F, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xC3, 0x94, 0x20, 0x50, 0x0E, 0x74, +0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x80, 0x29, 0x74, 0x27, 0x2F, +0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x93, 0xCC, 0xEF, 0xF0, 0x24, 0x27, +0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0xCD, 0xF0, 0x7B, 0x01, 0x7A, 0x93, +0x79, 0xCC, 0x7D, 0x02, 0x31, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0x75, 0xF0, 0x09, +0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x62, 0xF0, 0x74, 0x28, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x54, 0x1F, 0x90, 0x93, 0x61, 0xF0, 0x74, 0xE8, 0x2D, +0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x5D, 0x74, 0xE8, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x85, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, +0xE0, 0xFF, 0x74, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x85, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0xC6, +0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x0D, 0x74, 0xC6, 0x2D, 0xF5, 0x82, 0xE4, +0x34, 0x8E, 0xF5, 0x83, 0x74, 0xC8, 0xF0, 0x90, 0x93, 0x62, 0xE0, 0xFF, 0x90, 0x93, 0x61, 0xE0, +0xD3, 0x9F, 0x40, 0x02, 0xEF, 0xF0, 0x90, 0x93, 0x61, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, +0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, +0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, +0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, +0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x05, 0x90, 0x93, 0x61, 0xE0, 0xFD, 0x31, +0x82, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x64, 0x03, 0x60, 0x12, 0x90, 0x04, 0x30, 0xE0, 0x70, +0x0C, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0x90, 0x04, 0xCF, 0x04, 0xF0, 0x90, 0x93, 0x61, +0xE0, 0xFF, 0x22, 0xAC, 0x07, 0xEC, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2C, 0xF5, 0x82, +0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x11, 0x74, 0x27, +0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x90, +0x93, 0x88, 0xE0, 0x54, 0x1F, 0xFF, 0x90, 0x93, 0x8B, 0xF0, 0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, +0x89, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x8D, 0xF0, 0x75, 0xF0, 0x09, 0xEC, 0x90, 0x8A, 0x88, +0x12, 0x43, 0x9C, 0xE0, 0xFE, 0x90, 0x93, 0x8E, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, +0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8F, 0xCB, 0xF0, 0xA3, 0xEB, +0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, +0xE0, 0x90, 0x93, 0x91, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0x74, 0xC6, 0x2C, 0xF5, 0x82, 0xE4, 0x34, +0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0xD3, 0x9E, 0x40, 0x0C, 0x90, 0x93, 0x8E, 0xE0, 0x90, 0x93, +0x8B, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0xED, 0x70, 0x02, 0x81, 0x5D, 0x90, 0x93, 0x8C, 0xED, 0xF0, +0x90, 0x93, 0x88, 0xE0, 0x30, 0xE6, 0x0E, 0x90, 0x93, 0x8B, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x90, +0x93, 0x8C, 0xE0, 0x14, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x70, 0x02, 0x81, 0x5D, 0x90, 0x93, 0x8B, +0xE0, 0xFF, 0xD3, 0x94, 0x00, 0x50, 0x02, 0x81, 0x5D, 0xE4, 0x90, 0x93, 0x8A, 0xF0, 0xEF, 0x14, +0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0xFD, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0xD3, 0x9D, +0x40, 0x6F, 0xEF, 0x94, 0x10, 0x40, 0x21, 0xEF, 0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, +0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x91, 0xE0, +0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0xC3, 0x94, 0x10, +0x50, 0x37, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8F, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x1A, 0x90, +0x93, 0x89, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x8C, +0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0x6F, 0x60, 0x08, 0x90, 0x93, 0x89, 0xE0, 0x14, 0xF0, 0x80, +0x83, 0x90, 0x93, 0x8C, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xC3, 0x9F, 0x50, 0x0F, 0x90, 0x93, +0x89, 0xE0, 0xB5, 0x05, 0x08, 0x90, 0x93, 0x8D, 0xE0, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x88, +0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, +0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, +0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xEC, 0x25, +0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, +0x04, 0x90, 0x93, 0x88, 0xE0, 0xFD, 0x31, 0x82, 0x90, 0x93, 0x88, 0xE0, 0xFF, 0x22, 0xAD, 0x07, +0xED, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, +0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x80, 0x11, 0x74, 0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, +0x91, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xF9, 0x54, +0x1F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0xFF, 0x90, +0x93, 0x8B, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, +0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8C, 0xCB, 0xF0, 0xA3, 0xEB, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, +0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x8E, 0xCB, 0xF0, +0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x89, 0xE0, 0xFE, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, +0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xEE, 0xC3, 0x9F, 0x40, 0x02, +0xC1, 0x0B, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, +0x83, 0xEF, 0xF0, 0xEF, 0x04, 0x90, 0x93, 0x8A, 0xF0, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0x90, 0x93, +0x8A, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x02, 0xC1, 0x45, 0xEE, 0xC3, 0x94, 0x10, 0x40, 0x21, 0xEE, +0x24, 0xF0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, +0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8C, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x70, 0x27, +0x90, 0x93, 0x8A, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x59, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, +0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x8E, 0xE0, 0x5E, +0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x3C, 0x90, 0x93, 0x8A, 0xE0, 0xB4, 0x11, 0x0D, 0x90, 0x93, +0x8D, 0xE0, 0x30, 0xE7, 0x06, 0x90, 0x93, 0x8A, 0x74, 0x17, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0xFF, +0x64, 0x13, 0x60, 0x04, 0xEF, 0xB4, 0x12, 0x0D, 0x90, 0x93, 0x8C, 0xE0, 0x30, 0xE0, 0x06, 0x90, +0x93, 0x8A, 0x74, 0x18, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x88, +0xF0, 0x80, 0x42, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, 0xA1, 0x69, 0x90, 0x93, 0x8B, 0xE0, 0xFC, +0x90, 0x93, 0x89, 0xE0, 0xFF, 0x6C, 0x70, 0x71, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, +0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0xE0, 0xB4, +0x01, 0x10, 0xE9, 0x20, 0xE6, 0x0C, 0x90, 0x93, 0x89, 0xE0, 0x44, 0x40, 0x90, 0x93, 0x88, 0xF0, +0x80, 0x03, 0xAF, 0x01, 0x22, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, +0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xEF, 0x25, 0xE0, 0x24, +0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2B, 0xFF, 0xE4, 0x93, 0x3A, +0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, +0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x66, 0x90, 0x93, 0x89, 0xE0, 0xD3, 0x9C, 0x40, +0x5E, 0x90, 0x93, 0x8B, 0xE0, 0xFF, 0x74, 0x28, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, +0xEF, 0xF0, 0x90, 0x93, 0x89, 0xEF, 0xF0, 0x90, 0x93, 0x88, 0xF0, 0xFC, 0xA3, 0xE0, 0xFF, 0x25, +0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, +0xFB, 0xEF, 0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x74, 0x01, 0x93, +0x2B, 0xFF, 0xE4, 0x93, 0x3A, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x02, +0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x04, 0x22, 0x74, +0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0x90, 0x93, 0x88, +0xE0, 0x44, 0x80, 0xFD, 0x31, 0x82, 0x90, 0x93, 0x88, 0xE0, 0x44, 0x80, 0xFF, 0x22, 0xEF, 0xC3, +0x94, 0x20, 0x50, 0x39, 0xEF, 0x30, 0xE0, 0x17, 0xED, 0xC4, 0x54, 0xF0, 0xFD, 0xEF, 0xC3, 0x13, +0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x10, 0xEF, +0xC3, 0x13, 0xFE, 0x24, 0xA4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, +0x74, 0xA4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x4D, 0xF0, 0x22, 0xE4, 0x90, +0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, 0x03, 0x02, 0x87, 0x50, +0xEF, 0xB4, 0x20, 0x14, 0x90, 0x8F, 0x46, 0xE0, 0x04, 0xF0, 0x90, 0x89, 0x01, 0xE0, 0xFF, 0x90, +0x8F, 0x46, 0xE0, 0xB5, 0x07, 0x02, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x75, 0xF0, 0x09, +0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x87, 0x47, 0xEF, 0x25, +0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, +0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0x87, 0x47, 0x90, 0x93, 0x78, 0xE0, 0x94, 0x20, 0x40, +0x09, 0x90, 0x8F, 0x46, 0xE0, 0x60, 0x03, 0x02, 0x87, 0x50, 0x90, 0x93, 0x78, 0xE0, 0x75, 0xF0, +0x0A, 0xA4, 0x24, 0x00, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, 0x5B, 0x89, 0x5C, +0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFD, 0xA3, +0xE0, 0x90, 0x93, 0x7D, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, +0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7F, 0xCF, 0xF0, 0xA3, 0xEF, +0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0x74, 0x84, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, 0x79, 0xF0, 0x80, 0x14, 0x90, 0x93, +0x78, 0xE0, 0x24, 0x27, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0x90, 0x93, +0x79, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFE, 0x54, 0x1F, 0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, +0x75, 0xF0, 0x09, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xE0, 0x90, 0x93, 0x82, 0xF0, 0x74, 0x67, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x41, 0xE5, +0x90, 0x93, 0x82, 0xE0, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0x9F, 0x40, 0x13, 0x90, 0x93, 0x82, 0xE0, +0x90, 0x93, 0x7A, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0x90, 0x93, 0x79, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, +0x93, 0x7A, 0xE0, 0xFF, 0x90, 0x41, 0x18, 0x93, 0xFE, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x85, 0xF5, +0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, 0x06, 0xEF, 0x90, 0x40, 0xE0, 0x80, +0x07, 0x90, 0x93, 0x7A, 0xE0, 0x90, 0x40, 0xFC, 0x93, 0x90, 0x93, 0x81, 0xF0, 0x90, 0x93, 0x81, +0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x56, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x8B, +0x57, 0xF5, 0x58, 0x89, 0x59, 0x90, 0x93, 0x78, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7B, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, +0x12, 0x1E, 0xF6, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x9D, 0xFD, +0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, +0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, +0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x02, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, +0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, +0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x04, +0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, +0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, +0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x06, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, +0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, +0xA9, 0x59, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, +0x5C, 0x90, 0x00, 0x08, 0x12, 0x42, 0xC8, 0xFD, 0xAC, 0xF0, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, +0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0xAB, 0x57, 0xAA, 0x58, 0xA9, 0x59, 0x90, 0x00, 0x05, 0x12, +0x1F, 0x0F, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x1F, 0x3C, +0xD3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x40, 0x0C, 0xA3, 0xE0, 0x9F, +0xF0, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0xF0, 0x80, 0x07, 0xE4, 0x90, 0x93, 0x7B, 0xF0, 0xA3, 0xF0, +0x90, 0x93, 0x7B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x78, 0xE0, 0x25, 0xE0, 0x24, 0x02, +0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x79, 0xE0, +0x25, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, +0x93, 0xFD, 0xD3, 0xEF, 0x9D, 0xEE, 0x9C, 0x50, 0x02, 0x41, 0xB4, 0x90, 0x93, 0x78, 0xE0, 0xFF, +0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9E, 0x40, 0x03, 0xEF, 0x80, 0x1C, 0x90, 0x93, +0x78, 0xE0, 0xFF, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x82, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x90, 0x93, 0x83, 0xF0, 0x90, +0x93, 0x83, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x02, 0x80, 0x23, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, +0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x01, 0x40, 0x0F, 0x74, 0xC6, +0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x14, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x78, +0xE0, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, +0xFF, 0x24, 0xC6, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x60, 0x02, 0xA1, 0xF5, 0x12, +0x7C, 0xAE, 0xA1, 0xF5, 0x90, 0x93, 0x79, 0xE0, 0x25, 0xE0, 0x24, 0x6C, 0xF5, 0x82, 0xE4, 0x34, +0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xC3, 0x90, 0x93, 0x7C, 0xE0, 0x9F, +0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x40, 0x02, 0xA1, 0xF5, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x7D, 0x01, +0x12, 0x7A, 0xE3, 0xA1, 0xF5, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, +0x91, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0x81, 0xC3, 0x90, 0x8A, 0x83, 0xE0, 0xFE, +0xB4, 0x03, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x19, 0x40, 0x3D, 0x80, 0x2E, 0xEE, 0xB4, +0x02, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x11, 0x40, 0x2E, 0x80, 0x1F, 0x90, 0x8A, 0x83, +0xE0, 0xFE, 0xB4, 0x01, 0x0B, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x1B, 0x80, 0x0C, +0xEE, 0x70, 0x11, 0x90, 0x93, 0x7A, 0xE0, 0xC3, 0x94, 0x03, 0x40, 0x0D, 0x90, 0x8E, 0xC5, 0x74, +0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x8E, 0xC5, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFE, 0x24, 0xC4, +0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x87, 0xF0, 0x74, 0x85, 0x2E, 0xF5, +0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0xC3, 0x94, 0x30, 0x50, 0x0A, 0xE4, 0x90, 0x93, +0x87, 0xF0, 0x74, 0x67, 0x2F, 0x81, 0x6E, 0x90, 0x8E, 0xC5, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, +0x63, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x64, +0x0A, 0x60, 0x5B, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xEE, 0x24, 0x05, 0xFB, 0xE4, 0x33, 0xFA, 0x74, +0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x9B, 0xEA, 0x64, 0x80, +0xF8, 0x74, 0x80, 0x98, 0x50, 0x38, 0x90, 0x93, 0x78, 0xE0, 0xFE, 0xEF, 0x24, 0x05, 0xFB, 0xE4, +0x33, 0xFA, 0x74, 0x85, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xD3, 0x9B, 0xEA, +0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x16, 0x90, 0x93, 0x78, 0xE0, 0x24, 0xA7, 0xF5, 0x82, +0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0x6F, 0x60, 0x56, 0x90, 0x93, +0x78, 0xE0, 0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0xD3, 0x94, 0x42, +0x40, 0x08, 0x90, 0x93, 0x87, 0x74, 0x05, 0xF0, 0x80, 0x11, 0xEF, 0xD3, 0x94, 0x39, 0x90, 0x93, +0x87, 0x40, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, +0x24, 0x85, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x41, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x88, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x06, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0x80, 0x2F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, 0x91, +0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x04, +0xF0, 0x80, 0x14, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x67, 0xF5, 0x82, +0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7A, 0xE0, 0xFE, 0x90, 0x93, 0x78, 0xE0, +0xFF, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0x87, 0xE0, +0xFE, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xEE, 0xF0, 0x75, 0xF0, 0x09, +0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xE0, 0xB4, 0x01, 0x11, 0xE4, 0x90, 0x93, 0x87, 0xF0, +0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x87, 0xE0, +0xFD, 0xA1, 0xF2, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xA1, 0xF5, 0x90, 0x93, 0x7B, 0xF0, 0xA3, 0xF0, +0x90, 0x41, 0xE1, 0x93, 0xFF, 0x7E, 0x00, 0x90, 0x93, 0x7D, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, +0x1F, 0x3C, 0x90, 0x93, 0x85, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x24, 0xC4, +0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE0, 0x90, 0x93, 0x87, 0xF0, 0xE4, 0x90, 0x93, 0x84, +0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0xD3, 0x94, 0x04, 0x50, 0x47, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, +0x5C, 0x75, 0xF0, 0x02, 0xEF, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x42, 0xC8, 0xFD, 0xAC, +0xF0, 0xEF, 0x90, 0x41, 0xDC, 0x93, 0xFF, 0x7E, 0x00, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x7B, 0xEE, +0x8F, 0xF0, 0x12, 0x42, 0x87, 0x90, 0x93, 0x85, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, +0x7C, 0xE0, 0x9F, 0x90, 0x93, 0x7B, 0xE0, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x84, 0xE0, 0x04, 0xF0, +0x80, 0xAF, 0x90, 0x93, 0x84, 0xE0, 0xC3, 0x13, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFF, 0xB4, 0x01, +0x0D, 0x90, 0x93, 0x84, 0xE0, 0x70, 0x5D, 0x90, 0x93, 0x87, 0x04, 0xF0, 0x80, 0x5B, 0xEF, 0xB4, +0x03, 0x1D, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, 0x87, 0x74, 0x03, 0xF0, 0x80, +0x48, 0xEF, 0xB4, 0x01, 0x08, 0x90, 0x93, 0x87, 0x74, 0x01, 0xF0, 0x80, 0x3C, 0x80, 0x35, 0x90, +0x93, 0x87, 0xE0, 0x64, 0x05, 0x70, 0x32, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x93, +0x87, 0x74, 0x05, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x93, 0x87, 0xB4, 0x01, 0x05, 0x74, 0x03, 0xF0, +0x80, 0x03, 0x74, 0x01, 0xF0, 0xD3, 0x90, 0x93, 0x80, 0xE0, 0x94, 0x03, 0x90, 0x93, 0x7F, 0xE0, +0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0xD3, 0x90, 0x93, 0x80, 0xE0, 0x94, 0x03, +0x90, 0x93, 0x7F, 0xE0, 0x94, 0x00, 0x40, 0x05, 0xE4, 0x90, 0x93, 0x87, 0xF0, 0x90, 0x93, 0x87, +0xE0, 0xFD, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, +0xED, 0xF0, 0x12, 0x7F, 0x0E, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x24, 0x67, 0xF5, 0x82, 0xE4, 0x34, +0x91, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x50, 0x0F, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, +0x91, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x78, 0xE0, 0x24, 0x67, 0xF5, 0x82, +0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x7F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, +0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x90, 0x93, 0x78, 0xE0, 0xFD, 0x25, 0xE0, 0x24, +0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, +0x50, 0x1C, 0x90, 0x93, 0x7F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, +0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x42, 0x87, 0x80, 0x14, 0x90, 0x93, +0x78, 0xE0, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, +0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, 0x8D, +0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x74, 0xFF, 0x9D, 0xFB, 0x74, 0xFF, 0x9C, 0xFA, +0xEF, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, +0xD3, 0x9B, 0xEE, 0x9A, 0x90, 0x93, 0x78, 0xE0, 0x50, 0x13, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, +0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEC, 0x8D, 0xF0, 0x12, 0x42, 0x87, 0x80, 0x10, 0x25, 0xE0, 0x24, +0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xAB, 0x5A, 0xAA, +0x5B, 0xA9, 0x5C, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x00, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, +0x00, 0x02, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x04, 0xE4, 0xF5, 0xF0, 0x12, 0x43, +0x1F, 0x90, 0x00, 0x06, 0xE4, 0xF5, 0xF0, 0x12, 0x43, 0x1F, 0x90, 0x00, 0x08, 0xE4, 0xF5, 0xF0, +0x12, 0x43, 0x1F, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x25, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, +0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, +0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, 0xF5, 0x82, 0xE4, 0x34, +0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x02, 0x7F, 0x53, +0x22, 0x90, 0x04, 0x44, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, +0xE4, 0xF0, 0x90, 0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x14, +0x74, 0xA4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0x78, 0xE0, +0x04, 0xF0, 0x80, 0xE2, 0xE4, 0x90, 0x8F, 0x46, 0xF0, 0x90, 0x89, 0x01, 0x04, 0xF0, 0xE4, 0x90, +0x93, 0x78, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x40, 0x03, 0x02, 0x89, 0x4C, +0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x00, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, +0x0A, 0xEF, 0x90, 0x84, 0x02, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, +0x90, 0x84, 0x04, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, +0x06, 0x12, 0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x84, 0x08, 0x12, +0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0xA7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, +0x74, 0x13, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x74, +0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8C, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x80, +0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x04, +0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x05, +0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x84, +0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x47, +0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0xC7, +0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, +0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, +0x83, 0xE4, 0xF0, 0x74, 0x67, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE4, 0xF0, 0x90, +0x8E, 0x04, 0xF0, 0x90, 0x41, 0x92, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0x90, 0x41, 0x5A, 0x74, +0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0x90, 0x93, 0x78, +0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, +0xEF, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x75, +0xF0, 0x09, 0xED, 0x90, 0x8A, 0x8A, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, 0x74, 0xC2, 0x2D, 0xF5, +0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0C, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x86, +0x12, 0x43, 0x9C, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x84, 0x12, +0x43, 0x9C, 0xE4, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x88, 0x12, +0x43, 0x9C, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, 0xE4, +0xF0, 0xED, 0xC3, 0x94, 0x20, 0x50, 0x0F, 0x74, 0x84, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, +0x83, 0x74, 0x13, 0xF0, 0x80, 0x0D, 0x74, 0x27, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, +0x74, 0x13, 0xF0, 0x90, 0x93, 0x78, 0xE0, 0x04, 0xF0, 0x02, 0x87, 0x93, 0x22, 0x8F, 0x57, 0xEF, +0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xAF, 0x82, 0xF5, 0x58, 0x8F, 0x59, 0xE5, +0x57, 0x75, 0xF0, 0x02, 0xA4, 0x24, 0x02, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0x75, 0x5A, 0x01, 0xF5, +0x5B, 0x89, 0x5C, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAF, 0x82, +0x85, 0x83, 0x5D, 0x8F, 0x5E, 0xE5, 0x57, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, +0x35, 0xF0, 0x75, 0x5F, 0x01, 0xF5, 0x60, 0x89, 0x61, 0x74, 0xC2, 0x25, 0x57, 0xF5, 0x82, 0xE4, +0x34, 0x89, 0xF5, 0x83, 0xE0, 0x12, 0x43, 0xD1, 0x89, 0xCD, 0x00, 0x89, 0xE2, 0x01, 0x89, 0xF7, +0x02, 0x8A, 0x0C, 0x03, 0x8A, 0x35, 0x04, 0x8A, 0x4A, 0x05, 0x8A, 0x5F, 0x06, 0x8A, 0x85, 0x0C, +0x8A, 0xB2, 0x0D, 0x8A, 0xDF, 0x0E, 0x8B, 0x0C, 0x0F, 0x00, 0x00, 0x8B, 0x40, 0xE5, 0x57, 0x25, +0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x15, +0x80, 0x3C, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, +0xF0, 0xF0, 0xA3, 0x74, 0x10, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, +0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0x74, 0x05, 0x80, 0x12, 0xE5, 0x57, 0x25, 0xE0, +0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0xF0, 0xF0, 0xA3, 0xE4, 0xF0, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, +0x74, 0x8F, 0xF0, 0x61, 0x40, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, +0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF5, 0x80, 0x27, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, +0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x74, 0x0F, 0xF0, 0xA3, 0x74, 0xF0, 0x80, 0x12, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0x74, +0x0D, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, +0xF0, 0xA3, 0xF0, 0x61, 0x40, 0x90, 0x04, 0x47, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, +0x42, 0x53, 0x90, 0x04, 0x46, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, +0x42, 0x65, 0x90, 0x04, 0x45, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x44, +0x61, 0x37, 0x90, 0x04, 0x4B, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, +0x04, 0x4A, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, +0x04, 0x49, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x48, 0x80, 0x58, 0x90, +0x04, 0x4F, 0xE0, 0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x4E, 0xE0, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x4D, 0xE0, +0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x4C, 0x80, 0x2B, 0x90, 0x04, 0x53, 0xE0, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0x12, 0x42, 0x53, 0x90, 0x04, 0x52, 0xE0, 0xAB, 0x5A, 0xAA, +0x5B, 0xA9, 0x5C, 0x90, 0x00, 0x01, 0x12, 0x42, 0x65, 0x90, 0x04, 0x51, 0xE0, 0x85, 0x59, 0x82, +0x85, 0x58, 0x83, 0xF0, 0x90, 0x04, 0x50, 0xE0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, 0xF0, +0xAB, 0x5A, 0xAA, 0x5B, 0xA9, 0x5C, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, +0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x12, 0x1E, 0xF6, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, +0x12, 0x42, 0x53, 0xAB, 0x5A, 0xE5, 0x5C, 0x24, 0x01, 0xF9, 0xE4, 0x35, 0x5B, 0xFA, 0xC0, 0x03, +0xC0, 0x02, 0xC0, 0x01, 0x12, 0x1E, 0xF6, 0xFF, 0xAB, 0x5F, 0xAA, 0x60, 0xA9, 0x61, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0x5F, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x42, 0x53, 0x85, 0x59, +0x82, 0x85, 0x58, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, +0xE0, 0xFE, 0xEF, 0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0xA3, +0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x85, 0x5E, 0x82, 0x85, 0x5D, 0x83, 0xA3, 0xE0, 0xFE, 0xEF, +0x5E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, +0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x4B, 0x90, 0x93, 0x8F, 0x74, 0x0B, 0xF0, +0x90, 0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x50, 0x02, 0x81, 0x85, 0x74, 0x01, 0x7E, 0x00, +0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, +0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, +0x4E, 0x60, 0x0A, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0xA3, 0xF0, 0x80, 0x68, 0x90, 0x93, 0x8F, +0xE0, 0x14, 0xF0, 0x80, 0xBB, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, +0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x47, 0x90, 0x93, 0x8F, 0x74, 0x0F, 0xF0, 0x90, +0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x00, 0x40, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, +0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, +0x90, 0x93, 0x8F, 0xE0, 0xA3, 0xF0, 0x80, 0x0D, 0x90, 0x93, 0x8F, 0xE0, 0x14, 0xF0, 0x80, 0xBF, +0xE4, 0x90, 0x93, 0x90, 0xF0, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, +0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, +0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x40, 0x02, 0xA1, 0x3E, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, +0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, +0x47, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, +0x06, 0x90, 0x93, 0x8F, 0xE0, 0x80, 0x63, 0x90, 0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE5, +0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, +0x4E, 0x60, 0x46, 0xE4, 0x90, 0x93, 0x8F, 0xF0, 0x90, 0x93, 0x8F, 0xE0, 0xFF, 0xC3, 0x94, 0x0C, +0x50, 0x3C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, +0xD8, 0xF9, 0xFF, 0xE5, 0x57, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, +0xE0, 0x5E, 0xFE, 0xA3, 0xE0, 0x5F, 0x4E, 0x60, 0x08, 0x90, 0x93, 0x8F, 0xE0, 0x24, 0x10, 0x80, +0x09, 0x90, 0x93, 0x8F, 0xE0, 0x04, 0xF0, 0x80, 0xBF, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0x90, 0x93, +0x90, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x88, 0x12, 0x43, 0x9C, 0xEF, 0xF0, +0x90, 0x93, 0x91, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xE5, 0x57, 0x90, 0x8A, 0x89, 0x12, 0x43, 0x9C, +0xEE, 0xF0, 0xE5, 0x57, 0xC3, 0x94, 0x20, 0x50, 0x2C, 0x74, 0x84, 0x25, 0x57, 0xF5, 0x82, 0xE4, +0x34, 0x04, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0x40, 0x02, 0x80, 0x47, 0x74, 0x84, 0x25, 0x57, 0xF5, +0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x93, 0x91, 0xE0, 0xA3, +0xF0, 0x80, 0x37, 0x80, 0x2D, 0x74, 0x27, 0x25, 0x57, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, +0xE0, 0xFF, 0x90, 0x93, 0x90, 0xE0, 0xFE, 0xEF, 0xD3, 0x9E, 0x40, 0x07, 0x90, 0x93, 0x92, 0xEE, +0xF0, 0x80, 0x17, 0x90, 0x93, 0x91, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x05, 0xA3, 0xEE, 0xF0, +0x80, 0x08, 0x90, 0x93, 0x90, 0xE0, 0x90, 0x93, 0x92, 0xF0, 0x90, 0x93, 0x92, 0xE0, 0xFD, 0xAF, +0x57, 0x12, 0x79, 0x82, 0x90, 0x93, 0x92, 0xE0, 0xFF, 0x74, 0xA7, 0x25, 0x57, 0xF5, 0x82, 0xE4, +0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xD3, 0x94, 0x13, 0x40, 0x07, +0x90, 0x8A, 0x83, 0x74, 0x03, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x0B, 0x40, 0x07, 0x90, 0x8A, 0x83, +0x74, 0x02, 0xF0, 0x22, 0xEF, 0xD3, 0x94, 0x03, 0x40, 0x07, 0x90, 0x8A, 0x83, 0x74, 0x01, 0xF0, +0x22, 0xE4, 0x90, 0x8A, 0x83, 0xF0, 0x22, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, +0x12, 0x43, 0xC8, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x54, +0xF0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x88, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x54, 0x40, +0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, 0x89, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x75, 0xF0, +0x09, 0x90, 0x8A, 0x86, 0x12, 0x43, 0x9C, 0xAD, 0x82, 0xAC, 0x83, 0x90, 0x93, 0x8A, 0xEC, 0xF0, +0xA3, 0xED, 0xF0, 0xEF, 0x75, 0xF0, 0x09, 0xA4, 0x24, 0x84, 0xF9, 0x74, 0x8A, 0x35, 0xF0, 0xFA, +0x7B, 0x01, 0xA3, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x03, 0x12, +0x1F, 0x0F, 0x54, 0x0F, 0xFF, 0x90, 0x93, 0x8C, 0x12, 0x43, 0xA8, 0xEF, 0x12, 0x42, 0x53, 0x90, +0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x8C, 0x12, +0x43, 0xA8, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x42, 0x65, 0x90, 0x93, 0x85, 0x12, 0x43, 0xA8, 0x90, +0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xF5, 0x82, +0x8C, 0x83, 0xEF, 0xF0, 0x12, 0x1E, 0xF6, 0x8D, 0x82, 0x8C, 0x83, 0xA3, 0xF0, 0x90, 0x93, 0x88, +0xE0, 0xFE, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x24, 0xC2, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, +0xEE, 0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8A, 0x12, 0x43, +0x9C, 0xEE, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8B, 0x12, 0x43, 0x9C, 0x74, 0x01, 0xF0, +0x90, 0x93, 0x89, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x8A, 0x8C, 0x12, 0x43, 0x9C, 0xEE, +0xF0, 0x21, 0x4D, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x20, +0xC4, 0x13, 0x54, 0x07, 0xFD, 0xAF, 0x06, 0xC1, 0x17, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, +0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFD, 0xAF, 0x06, 0xC1, +0x17, 0x12, 0x1E, 0xF6, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, +0xFE, 0x74, 0x85, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0xB4, +0x40, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x8A, 0x82, 0xF0, 0x22, 0x12, 0x1E, 0xF6, +0x90, 0x89, 0x01, 0xF0, 0x22, 0x90, 0x93, 0x8F, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x92, 0xE0, 0x54, +0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0xC0, 0xF0, 0x90, 0x93, 0x8F, 0x12, 0x43, 0xA8, 0x90, +0x94, 0x19, 0x12, 0x43, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x92, 0x02, 0x57, 0x1F, 0x90, 0x00, +0x02, 0x12, 0x1F, 0x0F, 0xFD, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFC, 0xED, 0xC3, 0x94, 0x40, +0x40, 0x02, 0xE4, 0xFD, 0xEC, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE4, 0xFC, 0xED, 0x25, 0xE0, 0x24, +0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x83, 0xF0, +0xEE, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, +0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x85, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x74, 0xFF, +0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, +0xE0, 0x90, 0x93, 0x89, 0xF0, 0xEE, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, +0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x90, 0x93, 0x8B, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, +0xEC, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x8F, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEC, 0x25, 0xE0, 0x24, 0xC7, 0xF5, 0x82, 0xE4, 0x34, 0x8F, +0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x83, 0x02, 0x8F, 0x75, 0xE4, +0x90, 0x92, 0x69, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xAF, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0xF5, 0x62, +0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, +0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x90, 0x00, +0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x59, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, +0x3C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x54, 0x01, 0x90, 0x93, 0x3D, 0xF0, 0xEF, +0xC3, 0x13, 0x54, 0x01, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0x13, +0x13, 0x54, 0x01, 0x90, 0x93, 0x44, 0xF0, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x4A, +0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, 0x54, 0x01, 0x90, 0x93, 0x46, 0xF0, 0xEF, +0xC4, 0x13, 0x54, 0x01, 0x90, 0x93, 0x5B, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xC4, +0x13, 0x13, 0x54, 0x01, 0x90, 0x93, 0x49, 0xF0, 0xE0, 0x70, 0x38, 0x90, 0x93, 0x47, 0xE0, 0x70, +0x10, 0xFF, 0x12, 0x50, 0xDC, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x10, 0x80, +0x0F, 0x7F, 0x01, 0x12, 0x50, 0xDC, 0x90, 0x93, 0x86, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x03, 0x00, +0x90, 0x93, 0x86, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x70, 0x7E, 0x08, +0x12, 0x34, 0x30, 0x90, 0x93, 0x3D, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xA9, 0x90, 0x93, 0x83, 0x12, +0x43, 0xA8, 0x12, 0x4D, 0xB2, 0x90, 0x93, 0x59, 0xE0, 0x90, 0x01, 0xE6, 0xF0, 0xD0, 0xD0, 0x92, +0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFF, 0x30, 0xE0, 0x25, 0x12, 0x1E, 0xF6, 0x90, +0x93, 0x48, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x4B, 0xF0, 0xEF, 0xC3, 0x13, +0x54, 0x7F, 0x90, 0x93, 0x45, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x50, 0xF0, +0x22, 0x90, 0x93, 0x48, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4B, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x45, +0x74, 0x14, 0xF0, 0x90, 0x93, 0x50, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x19, +0xC3, 0x13, 0x54, 0x7F, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0x90, +0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x90, 0x93, 0x4F, 0x74, 0x05, 0xF0, 0x90, +0x93, 0x4D, 0xE4, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xA3, 0xE0, 0x90, 0x05, +0x58, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0x4C, 0xF0, 0x60, 0x20, 0x90, 0x93, 0x15, 0xE0, +0x20, 0xE0, 0x19, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x4A, 0x62, 0x90, 0x93, 0x3D, 0xE0, 0x60, 0x09, +0x90, 0x93, 0x56, 0xE0, 0x70, 0x03, 0x12, 0x4F, 0xA9, 0x12, 0x51, 0x5A, 0x90, 0x93, 0x4C, 0xE0, +0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x02, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0xFF, 0x54, +0x80, 0xFE, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x7F, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xFF, 0xE0, 0x54, +0xF0, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0x54, 0x70, 0xFF, 0x90, 0x93, 0x36, 0xE0, 0x54, 0x8F, 0x4F, +0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, +0x0F, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x93, 0x3A, 0xF0, 0x90, +0x00, 0x01, 0x74, 0x19, 0x12, 0x42, 0x20, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0xFF, 0xD3, 0x94, +0x20, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x01, 0xF0, 0x80, 0x57, 0xEF, 0xD3, 0x94, 0x40, 0x50, +0x08, 0x90, 0x93, 0x37, 0x74, 0x02, 0xF0, 0x80, 0x49, 0xEF, 0xD3, 0x94, 0x60, 0x50, 0x08, 0x90, +0x93, 0x37, 0x74, 0x03, 0xF0, 0x80, 0x3B, 0xEF, 0xD3, 0x94, 0x80, 0x50, 0x08, 0x90, 0x93, 0x37, +0x74, 0x04, 0xF0, 0x80, 0x2D, 0xEF, 0xD3, 0x94, 0xA0, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x05, +0xF0, 0x80, 0x1F, 0xEF, 0xD3, 0x94, 0xC0, 0x50, 0x08, 0x90, 0x93, 0x37, 0x74, 0x06, 0xF0, 0x80, +0x11, 0xEF, 0xD3, 0x94, 0xE0, 0x90, 0x93, 0x37, 0x50, 0x05, 0x74, 0x07, 0xF0, 0x80, 0x03, 0x74, +0x08, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x90, 0x93, 0x3B, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x60, 0x0B, +0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, +0xFD, 0x12, 0x1E, 0xF6, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, 0xA8, 0xF0, 0x90, 0x00, 0x01, +0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0xA9, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, +0xFF, 0xED, 0x2F, 0x90, 0x93, 0xAA, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0xFF, 0xED, 0x2F, +0x90, 0x93, 0xAB, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, +0x93, 0xAC, 0xF0, 0x22, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x0E, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFD, +0xF0, 0x90, 0x93, 0x11, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x11, 0xF0, 0x22, 0x90, 0x93, +0x83, 0x12, 0x43, 0xC8, 0xE4, 0x90, 0x93, 0x86, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x0C, 0xF0, +0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x7A, 0x90, 0x93, 0x86, 0x74, +0x01, 0xF0, 0xFB, 0x7A, 0x93, 0x79, 0x86, 0xFD, 0x7F, 0x14, 0x12, 0x76, 0x35, 0x90, 0x93, 0x04, +0xE0, 0x44, 0x08, 0xF0, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xFF, 0x30, 0xE1, +0x10, 0x90, 0x93, 0x04, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFD, 0xF0, 0x80, +0x07, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x02, 0xF0, 0xEF, 0x30, 0xE2, 0x1E, 0x90, 0x93, 0x04, 0xE0, +0x44, 0x04, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xEF, +0xF0, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x80, 0x07, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x10, +0xF0, 0x12, 0x1E, 0xF6, 0x30, 0xE4, 0x5C, 0x90, 0x93, 0x04, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x04, +0x26, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x86, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, +0x86, 0x7D, 0x01, 0x7F, 0x14, 0x12, 0x76, 0x35, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, +0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, +0xE3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x04, 0x26, 0xE0, 0x54, 0x3F, 0xF0, +0x90, 0x93, 0x0B, 0x12, 0x43, 0x84, 0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0x7F, 0x80, 0x7E, 0x08, +0x12, 0x34, 0x30, 0x22, 0xEF, 0x70, 0x21, 0x12, 0x1E, 0xF6, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x40, +0xE0, 0x44, 0x20, 0xF0, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x44, 0x01, 0xF0, 0x80, +0x07, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x6A, 0x12, 0x1E, 0xF6, +0x90, 0x00, 0x01, 0x30, 0xE0, 0x2E, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC0, 0xF0, 0x90, 0x00, 0x02, +0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC2, +0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC3, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x54, +0xFE, 0xF0, 0x80, 0x2C, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC4, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, +0x0F, 0x90, 0x06, 0xC5, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC6, 0xF0, 0x90, +0x00, 0x04, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC7, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x01, 0xF0, +0x90, 0x06, 0xCC, 0xE0, 0x44, 0x02, 0xF0, 0xEF, 0xB4, 0x02, 0x11, 0x12, 0x1E, 0xF6, 0x90, 0x06, +0xC8, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xC9, 0xF0, 0xEF, 0xB4, 0x03, 0x11, +0x12, 0x1E, 0xF6, 0x90, 0x06, 0xCA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x06, 0xCB, +0xF0, 0xEF, 0x64, 0x04, 0x70, 0x1F, 0x12, 0x1E, 0xF6, 0xFF, 0x90, 0x07, 0x83, 0x30, 0xE0, 0x06, +0xE0, 0x44, 0x10, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0x6F, 0xF0, 0xEF, 0x30, 0xE1, 0x07, 0x90, 0x07, +0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, +0x43, 0xA8, 0x12, 0x1E, 0xF6, 0x90, 0x92, 0x6B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, +0x92, 0x6C, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0x92, 0x6D, 0xF0, 0x90, 0x93, 0x83, +0x12, 0x43, 0xA8, 0x12, 0x76, 0x31, 0xEF, 0xB4, 0x02, 0x03, 0x43, 0x14, 0x01, 0x22, 0x90, 0x93, +0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, +0x7D, 0x03, 0x7F, 0x1D, 0x02, 0x76, 0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, +0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1E, 0x02, 0x76, 0x35, +0x12, 0x1E, 0xF6, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x1F, 0xB6, 0xA8, 0x04, 0xA9, +0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0x0B, 0x12, 0x43, 0x84, 0xEC, 0x54, 0x03, 0xFC, 0x12, +0x43, 0x59, 0x90, 0x93, 0x07, 0x02, 0x1F, 0xC9, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, +0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x1F, 0x02, 0x76, +0x35, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, +0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x20, 0x02, 0x76, 0x35, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x01, +0x90, 0x01, 0xBC, 0xF0, 0xEF, 0x30, 0xE0, 0x5C, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x4E, 0x90, +0xFD, 0x50, 0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, +0xFD, 0x52, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0x90, 0xFD, 0x53, 0xF0, 0xA3, 0xE4, 0xF0, +0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x90, 0xFD, 0x55, 0x30, 0xE0, 0x05, 0x74, 0xA0, 0xF0, 0x80, 0x03, +0x74, 0xC0, 0xF0, 0x90, 0xFD, 0x56, 0x74, 0x10, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x90, 0xFD, 0x50, +0x74, 0x0A, 0xF0, 0xA3, 0x74, 0x06, 0xF0, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xBD, +0xE0, 0x44, 0x01, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0x0F, 0xFE, 0x90, 0x00, 0x01, 0x12, 0x1F, +0x0F, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, +0xE4, 0xFC, 0x74, 0x20, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0xEE, 0xF9, +0x90, 0x01, 0xBD, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, +0xF0, 0xEC, 0xC3, 0x99, 0x50, 0x43, 0xEC, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x02, 0xE4, 0xFD, 0xED, +0xC3, 0x94, 0x20, 0x50, 0x07, 0xAF, 0x05, 0xD1, 0xE1, 0x0D, 0x80, 0xF3, 0x0C, 0x90, 0xFD, 0x10, +0xE0, 0x04, 0xF0, 0xEC, 0xB5, 0x01, 0xDA, 0xE4, 0xFD, 0xED, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, +0x93, 0x83, 0xE0, 0xFB, 0xC3, 0xEF, 0x9B, 0x74, 0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x07, 0xAF, +0x05, 0xD1, 0xE1, 0x0D, 0x80, 0xE3, 0x0C, 0x80, 0xB8, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x80, 0xFD, +0x7F, 0x81, 0x12, 0x53, 0xF0, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0xF1, +0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, +0xFD, 0x50, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, +0x83, 0xE0, 0x90, 0xFD, 0x51, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, +0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x52, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, +0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x53, 0xF0, 0xEF, 0x75, 0xF0, 0x08, +0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x54, 0xF0, 0xEF, +0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, +0x55, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, +0xE0, 0x90, 0xFD, 0x56, 0xF0, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, +0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x1E, 0xF6, +0x90, 0xFE, 0x10, 0x60, 0x05, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, +0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, +0xA8, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x76, 0x35, 0xEF, 0xB4, 0x03, 0x05, 0x7F, 0xFF, 0x12, 0x9C, +0x4C, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, 0x43, 0xC8, 0x90, 0x93, +0x83, 0x12, 0x43, 0xA8, 0x7D, 0x01, 0x7F, 0x24, 0x02, 0x76, 0x35, 0x12, 0x1E, 0xF6, 0xFF, 0x54, +0x01, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xE0, 0x54, +0xFD, 0x4F, 0xF0, 0x12, 0x1E, 0xF6, 0xFF, 0x54, 0x04, 0xFE, 0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFB, +0x4E, 0xF0, 0xEF, 0x54, 0x08, 0xFF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, +0x0F, 0x90, 0x93, 0x1B, 0xF0, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x90, 0x93, 0x86, 0x12, +0x43, 0xC8, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x7D, 0x03, 0x7F, 0x26, 0x02, 0x76, 0x35, 0x12, +0x1E, 0xF6, 0x90, 0x93, 0xB0, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, +0x8A, 0x12, 0x43, 0xC8, 0xE4, 0xFE, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x2F, 0x90, 0xFD, 0x50, +0xEF, 0xF0, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0x93, 0x8A, 0x12, 0x43, 0xA8, 0x8E, 0x82, +0x75, 0x83, 0x00, 0x12, 0x1F, 0x0F, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, +0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, +0x22, 0x12, 0x1E, 0xF6, 0x90, 0x93, 0xAE, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x93, +0xAF, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x46, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xEB, 0xE0, 0x54, 0xC0, +0x60, 0x43, 0xC3, 0x90, 0x94, 0x47, 0xE0, 0x94, 0x88, 0x90, 0x94, 0x46, 0xE0, 0x94, 0x13, 0x40, +0x0A, 0x90, 0x01, 0xC6, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x94, 0x46, 0xE4, 0x75, +0xF0, 0x01, 0x12, 0x42, 0x87, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3B, 0x09, 0xD3, 0x90, 0x94, 0x47, +0xE0, 0x94, 0x64, 0x90, 0x94, 0x46, 0xE0, 0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC7, 0xE0, 0x30, +0xE2, 0xB8, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0x90, 0x93, 0xE2, 0x12, 0x1F, 0xC9, 0x90, 0x93, +0xE6, 0x12, 0x1F, 0xD5, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x7F, 0x1F, 0xFE, 0xFD, 0xFC, 0x90, 0x93, +0xE6, 0x12, 0x43, 0x90, 0xD3, 0x12, 0x43, 0x73, 0x50, 0x41, 0x90, 0x93, 0xE6, 0x12, 0x43, 0x84, +0xA9, 0x07, 0x90, 0x93, 0xE2, 0x12, 0x43, 0x84, 0xA8, 0x01, 0x12, 0x1F, 0xA3, 0xEF, 0x54, 0x01, +0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x7B, 0x01, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0x73, 0x60, 0x1B, +0x90, 0x93, 0xE6, 0x12, 0x43, 0x84, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, +0xE4, 0x3C, 0xFC, 0x90, 0x93, 0xE6, 0x12, 0x1F, 0xC9, 0x80, 0xAD, 0x90, 0x93, 0xE6, 0x02, 0x43, +0x84, 0x90, 0x93, 0xB4, 0x12, 0x1F, 0xC9, 0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x93, 0xB8, +0x12, 0x43, 0x90, 0xC3, 0x12, 0x43, 0x73, 0x90, 0x93, 0xB4, 0x60, 0x67, 0x12, 0x43, 0x84, 0x12, +0x2C, 0x6E, 0x90, 0x93, 0xC0, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x84, 0x11, 0xE8, +0x90, 0x93, 0xC4, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB8, 0x12, 0x43, 0x84, 0x12, 0x43, 0x66, 0x90, +0x93, 0xC0, 0x12, 0x43, 0x90, 0x12, 0x43, 0x4C, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, +0x90, 0x93, 0xC4, 0x12, 0x43, 0x84, 0xA9, 0x07, 0x90, 0x93, 0xBC, 0x12, 0x43, 0x84, 0xA8, 0x01, +0x12, 0x1F, 0xB6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0x59, 0x90, 0x93, +0xC8, 0x12, 0x1F, 0xC9, 0x90, 0x93, 0xB4, 0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, +0xC8, 0x80, 0x0A, 0x12, 0x43, 0x84, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xBC, 0x12, 0x43, 0x84, +0x90, 0x81, 0x57, 0x12, 0x1F, 0xC9, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x34, 0x30, 0xD3, 0x10, 0xAF, +0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x4C, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x47, 0xE0, 0xFF, +0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x46, +0xE0, 0x5F, 0xF0, 0x12, 0x54, 0x38, 0x90, 0x94, 0x4C, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, +0x05, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x44, 0xE0, +0xFB, 0xE4, 0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, +0xD8, 0xF8, 0xFF, 0x80, 0x4C, 0x90, 0x94, 0x4C, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0xFF, 0x74, 0x01, +0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x62, 0xE0, 0x5F, +0xF0, 0x12, 0x54, 0x38, 0x90, 0x94, 0x4C, 0xE0, 0xFD, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x05, 0x08, +0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x00, 0x60, 0xE0, 0xFB, 0xE4, +0xFE, 0xEF, 0x5B, 0xA8, 0x05, 0x08, 0x80, 0x06, 0xCE, 0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, +0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x83, 0x12, 0x43, 0xC8, 0x12, 0x1E, 0xF6, 0x54, +0x01, 0xFF, 0x90, 0x94, 0x3E, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x44, +0xFE, 0x90, 0x93, 0x83, 0x12, 0x43, 0xA8, 0x12, 0x1E, 0xF6, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, +0x00, 0x01, 0x12, 0x1F, 0x0F, 0x90, 0x94, 0x3F, 0xF0, 0x22, 0x90, 0x93, 0x04, 0xE0, 0x54, 0xFE, +0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, +0x12, 0x1F, 0xD5, 0x20, 0x08, 0x30, 0x70, 0x90, 0x93, 0x0B, 0x12, 0x1F, 0xD5, 0xC0, 0x08, 0x30, +0x70, 0xE4, 0x90, 0x93, 0x11, 0xF0, 0xA3, 0xF0, 0x43, 0xE8, 0x04, 0x90, 0xFD, 0x68, 0x74, 0x02, +0xF0, 0x90, 0x04, 0x26, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x07, 0x83, 0xE4, 0xF0, 0x90, 0x07, 0x78, +0x74, 0x03, 0xF0, 0x90, 0x04, 0x64, 0xE4, 0xF0, 0x90, 0x00, 0x40, 0x74, 0x20, 0xF0, 0x71, 0x2D, +0x90, 0x93, 0x2C, 0x74, 0x01, 0xF0, 0x7D, 0x04, 0x7F, 0x02, 0x02, 0x3A, 0xAD, 0x90, 0x93, 0x15, +0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x93, 0x26, +0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, +0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, +0x18, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0x54, 0xEF, +0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, +0xDF, 0xF0, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x93, 0x28, 0x74, 0x02, 0xF0, +0x90, 0x93, 0x1A, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, +0xA3, 0xF0, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, 0x93, +0x23, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x29, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x54, 0xFD, +0xF0, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x54, 0xEF, 0xF0, 0xE0, 0x54, 0xFB, 0xF0, +0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x93, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x54, 0xE1, 0xF0, 0x22, +0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, 0x44, 0x0A, 0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x93, 0x6E, +0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0x70, +0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0x72, +0xF0, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0x93, 0x6C, 0x30, 0xE6, 0x08, 0xE0, 0x54, 0x0F, 0x44, 0x50, +0xF0, 0x80, 0x16, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0x73, +0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, +0x94, 0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x02, 0x57, 0x1F, 0xAD, 0x07, 0x90, 0x93, +0xFA, 0xE0, 0x54, 0xF0, 0x44, 0x0C, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, +0xFC, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0x93, 0xFD, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, +0xFE, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0x93, 0xFF, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x94, +0x00, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0x94, 0x01, 0xF0, 0xED, 0xB4, 0x02, 0x0B, 0x90, 0x93, +0xFA, 0xE0, 0x54, 0x0F, 0x44, 0x20, 0xF0, 0x80, 0x3C, 0xED, 0xB4, 0x04, 0x0B, 0x90, 0x93, 0xFA, +0xE0, 0x54, 0x0F, 0x44, 0x60, 0xF0, 0x80, 0x2D, 0xED, 0xF4, 0x70, 0x29, 0x90, 0x93, 0xFA, 0xE0, +0x54, 0x0F, 0x44, 0x60, 0xF0, 0x90, 0x93, 0x2C, 0xE0, 0x60, 0x08, 0x90, 0x93, 0xFC, 0x74, 0x01, +0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0xFC, 0xF0, 0xE4, 0x90, 0x93, 0xFD, 0xF0, 0xA3, 0xF0, 0xA3, +0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xFC, 0x90, 0x94, 0x19, 0x12, 0x43, +0xC8, 0x7A, 0x93, 0x79, 0xFA, 0x02, 0x57, 0x1F, 0xAD, 0x07, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0xF0, +0x44, 0x0E, 0xF0, 0x54, 0x0F, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0x93, 0x6F, 0xF0, 0x90, 0xFD, +0x63, 0xE0, 0x90, 0x93, 0x70, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x90, 0xFD, +0x65, 0xE0, 0x90, 0x93, 0x72, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0x93, 0x73, 0xF0, 0x90, 0xFD, +0x67, 0xE0, 0x90, 0x93, 0x74, 0xF0, 0xED, 0xB4, 0x01, 0x11, 0x90, 0x93, 0x6C, 0xE0, 0x54, 0x0F, +0x44, 0x20, 0xF0, 0x90, 0x93, 0x6E, 0x74, 0x01, 0xF0, 0x80, 0x13, 0xED, 0xB4, 0x02, 0x0F, 0x90, +0x93, 0x6C, 0xE0, 0x54, 0x0F, 0x44, 0x70, 0xF0, 0x90, 0x93, 0x6E, 0x74, 0x02, 0xF0, 0x90, 0x93, +0x6C, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x13, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x6E, 0x90, 0x94, +0x19, 0x12, 0x43, 0xC8, 0x7A, 0x93, 0x79, 0x6C, 0x12, 0x57, 0x1F, 0x22, 0x90, 0x93, 0x47, 0xE0, +0x60, 0x27, 0x90, 0x93, 0x4A, 0xE0, 0x70, 0x21, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, +0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x44, 0xE0, 0x90, 0x07, 0x78, +0x60, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, +0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xE1, 0x26, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x01, 0x70, 0x2B, +0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x19, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x29, 0xE0, 0x04, 0xF0, +0x90, 0x93, 0x1E, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xE1, 0x11, +0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, 0x27, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, +0x04, 0x70, 0x2C, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x19, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x29, +0xE0, 0x04, 0xF0, 0x90, 0x93, 0x20, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xB5, 0x07, 0x02, 0x80, +0x02, 0xE1, 0x11, 0xE4, 0x90, 0x93, 0x1D, 0xF0, 0x90, 0x93, 0x27, 0x74, 0x04, 0xF0, 0x22, 0x90, +0x93, 0x1D, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xC1, 0xD5, 0x90, 0x93, 0x2A, 0xE0, 0xB4, 0x04, 0x0F, +0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x93, 0x27, 0x30, 0xE0, 0x4E, 0xE1, 0x23, 0x90, +0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x45, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, +0xF0, 0x90, 0x93, 0x18, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xC1, 0xE4, 0x90, 0x93, 0x2A, +0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, +0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, +0x64, 0x80, 0x94, 0x80, 0x90, 0x93, 0x27, 0x40, 0x02, 0xE1, 0x23, 0x74, 0x02, 0xF0, 0x22, 0x90, +0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x18, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, +0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, +0x01, 0x63, 0x74, 0x05, 0xF0, 0x90, 0x93, 0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0x2F, 0xFF, +0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x1F, 0x3C, 0x90, 0x93, 0x21, 0xE0, 0x2F, 0xFF, +0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x32, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x58, 0x90, 0x07, +0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0x1D, 0xE0, 0x64, 0x07, 0x70, 0x49, 0x90, 0x93, 0x2A, +0xE0, 0xB4, 0x04, 0x05, 0x90, 0x93, 0x27, 0x80, 0x3A, 0x90, 0x93, 0x1C, 0xE0, 0x13, 0x13, 0x54, +0x3F, 0x30, 0xE0, 0x0C, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x27, 0x80, 0x23, +0x90, 0x04, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x4E, 0x18, 0x90, 0x93, 0x2A, 0xE0, 0x04, +0xF0, 0xE4, 0xF5, 0x48, 0x75, 0x49, 0x03, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x39, 0x77, +0x90, 0x01, 0x63, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0x90, 0x93, 0x15, 0xE0, +0x20, 0xE0, 0x02, 0xE1, 0xC3, 0x90, 0x93, 0x19, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, +0x2A, 0xE4, 0xF5, 0x48, 0x90, 0x93, 0x21, 0xE0, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, +0x01, 0x12, 0x39, 0x77, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0x93, 0x1D, 0x74, 0x01, 0xF0, +0xE4, 0x90, 0x93, 0x29, 0xF0, 0x90, 0x93, 0x27, 0xF0, 0x80, 0x20, 0xE4, 0xF5, 0x48, 0x90, 0x93, +0x5D, 0xE0, 0xFF, 0x90, 0x93, 0x16, 0xE0, 0xC3, 0x9F, 0xF5, 0x49, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, +0x7E, 0x01, 0x12, 0x39, 0x77, 0x90, 0x93, 0x27, 0x74, 0x01, 0xF0, 0x90, 0x01, 0x63, 0x74, 0x05, +0xF0, 0x90, 0x93, 0x26, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x60, 0x07, 0x90, 0x05, 0x22, +0x74, 0x6F, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0xC4, 0x13, 0x54, +0x07, 0x20, 0xE0, 0x0F, 0x90, 0x93, 0x15, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, +0x12, 0x51, 0x39, 0x22, 0x01, 0xF5, +}; +u4Byte ArrayLength_8723A_rtl8723fw_B = 24550; + + +void +ODM_ReadFirmware_8723A_rtl8723fw_B( + IN PDM_ODM_T pDM_Odm, + OUT u1Byte *pFirmware, + OUT u4Byte *pFirmwareSize +) +{ + ODM_MoveMemory(pDM_Odm, pFirmware, Array_8723A_rtl8723fw_B, ArrayLength_8723A_rtl8723fw_B); + *pFirmwareSize = ArrayLength_8723A_rtl8723fw_B; +} + + + +#endif // end of HWIMG_SUPPORT + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_FW.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_FW.h index fcdc62b7ec3a..8bdde6c6d264 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_FW.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_FW.h @@ -1,39 +1,39 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License along with -* this program; if not, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#if (RTL8723A_SUPPORT == 1) -#ifndef __INC_FW_8723A_HW_IMG_H -#define __INC_FW_8723A_HW_IMG_H - - -/****************************************************************************** -* rtl8723fw_B.TXT -******************************************************************************/ - -void -ODM_ReadFirmware_8723A_rtl8723fw_B( - IN PDM_ODM_T pDM_Odm, - OUT u1Byte *pFirmware, - OUT u4Byte *pFirmwareSize -); - -#endif -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#if (RTL8723A_SUPPORT == 1) +#ifndef __INC_FW_8723A_HW_IMG_H +#define __INC_FW_8723A_HW_IMG_H + + +/****************************************************************************** +* rtl8723fw_B.TXT +******************************************************************************/ + +void +ODM_ReadFirmware_8723A_rtl8723fw_B( + IN PDM_ODM_T pDM_Odm, + OUT u1Byte *pFirmware, + OUT u4Byte *pFirmwareSize +); + +#endif +#endif // end of HWIMG_SUPPORT + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_MAC.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_MAC.c index 4d5fed358af3..b4e13b43f97c 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_MAC.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_MAC.c @@ -1,219 +1,219 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License along with -* this program; if not, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "../odm_precomp.h" - -#if (RTL8723A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board == cond) && cond != 0x00) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( (_interface & cond) == 0 && cond != 0x07) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( (_platform & cond) == 0 && cond != 0x0F) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* MAC_REG.TXT -******************************************************************************/ - -u4Byte Array_MAC_REG_8723A[] = { - 0x420, 0x00000080, - 0x423, 0x00000000, - 0x430, 0x00000000, - 0x431, 0x00000000, - 0x432, 0x00000000, - 0x433, 0x00000001, - 0x434, 0x00000004, - 0x435, 0x00000005, - 0x436, 0x00000006, - 0x437, 0x00000007, - 0x438, 0x00000000, - 0x439, 0x00000000, - 0x43A, 0x00000000, - 0x43B, 0x00000001, - 0x43C, 0x00000004, - 0x43D, 0x00000005, - 0x43E, 0x00000006, - 0x43F, 0x00000007, - 0x440, 0x0000005D, - 0x441, 0x00000001, - 0x442, 0x00000000, - 0x444, 0x00000015, - 0x445, 0x000000F0, - 0x446, 0x0000000F, - 0x447, 0x00000000, - 0x458, 0x00000041, - 0x459, 0x000000A8, - 0x45A, 0x00000072, - 0x45B, 0x000000B9, - 0x460, 0x00000066, - 0x461, 0x00000066, - 0x462, 0x00000008, - 0x463, 0x00000003, - 0x4C8, 0x000000FF, - 0x4C9, 0x00000008, - 0x4CC, 0x000000FF, - 0x4CD, 0x000000FF, - 0x4CE, 0x00000001, - 0x500, 0x00000026, - 0x501, 0x000000A2, - 0x502, 0x0000002F, - 0x503, 0x00000000, - 0x504, 0x00000028, - 0x505, 0x000000A3, - 0x506, 0x0000005E, - 0x507, 0x00000000, - 0x508, 0x0000002B, - 0x509, 0x000000A4, - 0x50A, 0x0000005E, - 0x50B, 0x00000000, - 0x50C, 0x0000004F, - 0x50D, 0x000000A4, - 0x50E, 0x00000000, - 0x50F, 0x00000000, - 0x512, 0x0000001C, - 0x514, 0x0000000A, - 0x515, 0x00000010, - 0x516, 0x0000000A, - 0x517, 0x00000010, - 0x51A, 0x00000016, - 0x524, 0x0000000F, - 0x525, 0x0000004F, - 0x546, 0x00000040, - 0x547, 0x00000000, - 0x550, 0x00000010, - 0x551, 0x00000010, - 0x559, 0x00000002, - 0x55A, 0x00000002, - 0x55D, 0x000000FF, - 0x605, 0x00000030, - 0x608, 0x0000000E, - 0x609, 0x0000002A, - 0x652, 0x00000020, - 0x63C, 0x0000000A, - 0x63D, 0x0000000A, - 0x63E, 0x0000000E, - 0x63F, 0x0000000E, - 0x66E, 0x00000005, - 0x700, 0x00000021, - 0x701, 0x00000043, - 0x702, 0x00000065, - 0x703, 0x00000087, - 0x708, 0x00000021, - 0x709, 0x00000043, - 0x70A, 0x00000065, - 0x70B, 0x00000087, - -}; - -void -ODM_ReadAndConfig_MAC_REG_8723A( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte interfaceValue = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_MAC_REG_8723A)/sizeof(u4Byte); - pu4Byte Array = Array_MAC_REG_8723A; - - - hex += board; - hex += interfaceValue << 8; - hex += platform << 16; - hex += 0xFF000000; - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigMAC_8723A(pDM_Odm, v1, (u1Byte)v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigMAC_8723A(pDM_Odm, v1, (u1Byte)v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#include "../odm_precomp.h" + +#if (RTL8723A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board == cond) && cond != 0x00) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( (_interface & cond) == 0 && cond != 0x07) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( (_platform & cond) == 0 && cond != 0x0F) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +u4Byte Array_MAC_REG_8723A[] = { + 0x420, 0x00000080, + 0x423, 0x00000000, + 0x430, 0x00000000, + 0x431, 0x00000000, + 0x432, 0x00000000, + 0x433, 0x00000001, + 0x434, 0x00000004, + 0x435, 0x00000005, + 0x436, 0x00000006, + 0x437, 0x00000007, + 0x438, 0x00000000, + 0x439, 0x00000000, + 0x43A, 0x00000000, + 0x43B, 0x00000001, + 0x43C, 0x00000004, + 0x43D, 0x00000005, + 0x43E, 0x00000006, + 0x43F, 0x00000007, + 0x440, 0x0000005D, + 0x441, 0x00000001, + 0x442, 0x00000000, + 0x444, 0x00000015, + 0x445, 0x000000F0, + 0x446, 0x0000000F, + 0x447, 0x00000000, + 0x458, 0x00000041, + 0x459, 0x000000A8, + 0x45A, 0x00000072, + 0x45B, 0x000000B9, + 0x460, 0x00000066, + 0x461, 0x00000066, + 0x462, 0x00000008, + 0x463, 0x00000003, + 0x4C8, 0x000000FF, + 0x4C9, 0x00000008, + 0x4CC, 0x000000FF, + 0x4CD, 0x000000FF, + 0x4CE, 0x00000001, + 0x500, 0x00000026, + 0x501, 0x000000A2, + 0x502, 0x0000002F, + 0x503, 0x00000000, + 0x504, 0x00000028, + 0x505, 0x000000A3, + 0x506, 0x0000005E, + 0x507, 0x00000000, + 0x508, 0x0000002B, + 0x509, 0x000000A4, + 0x50A, 0x0000005E, + 0x50B, 0x00000000, + 0x50C, 0x0000004F, + 0x50D, 0x000000A4, + 0x50E, 0x00000000, + 0x50F, 0x00000000, + 0x512, 0x0000001C, + 0x514, 0x0000000A, + 0x515, 0x00000010, + 0x516, 0x0000000A, + 0x517, 0x00000010, + 0x51A, 0x00000016, + 0x524, 0x0000000F, + 0x525, 0x0000004F, + 0x546, 0x00000040, + 0x547, 0x00000000, + 0x550, 0x00000010, + 0x551, 0x00000010, + 0x559, 0x00000002, + 0x55A, 0x00000002, + 0x55D, 0x000000FF, + 0x605, 0x00000030, + 0x608, 0x0000000E, + 0x609, 0x0000002A, + 0x652, 0x00000020, + 0x63C, 0x0000000A, + 0x63D, 0x0000000A, + 0x63E, 0x0000000E, + 0x63F, 0x0000000E, + 0x66E, 0x00000005, + 0x700, 0x00000021, + 0x701, 0x00000043, + 0x702, 0x00000065, + 0x703, 0x00000087, + 0x708, 0x00000021, + 0x709, 0x00000043, + 0x70A, 0x00000065, + 0x70B, 0x00000087, + +}; + +void +ODM_ReadAndConfig_MAC_REG_8723A( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte interfaceValue = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_MAC_REG_8723A)/sizeof(u4Byte); + pu4Byte Array = Array_MAC_REG_8723A; + + + hex += board; + hex += interfaceValue << 8; + hex += platform << 16; + hex += 0xFF000000; + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigMAC_8723A(pDM_Odm, v1, (u1Byte)v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigMAC_8723A(pDM_Odm, v1, (u1Byte)v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + + +#endif // end of HWIMG_SUPPORT + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_MAC.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_MAC.h index 498faac482c2..295e6f4067b7 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_MAC.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_MAC.h @@ -1,36 +1,36 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License along with -* this program; if not, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#if (RTL8723A_SUPPORT == 1) -#ifndef __INC_MAC_8723A_HW_IMG_H -#define __INC_MAC_8723A_HW_IMG_H - -/****************************************************************************** -* MAC_REG.TXT -******************************************************************************/ - -void -ODM_ReadAndConfig_MAC_REG_8723A( - IN PDM_ODM_T pDM_Odm -); - -#endif -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#if (RTL8723A_SUPPORT == 1) +#ifndef __INC_MAC_8723A_HW_IMG_H +#define __INC_MAC_8723A_HW_IMG_H + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_MAC_REG_8723A( + IN PDM_ODM_T pDM_Odm +); + +#endif +#endif // end of HWIMG_SUPPORT + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_RF.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_RF.c index 31925b03922c..b9a5942bbb22 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_RF.c +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_RF.c @@ -1,290 +1,290 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License along with -* this program; if not, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "../odm_precomp.h" - -#if (RTL8723A_SUPPORT == 1) -static BOOLEAN -CheckCondition( - const u4Byte Condition, - const u4Byte Hex - ) -{ - u4Byte _board = (Hex & 0x000000FF); - u4Byte _interface = (Hex & 0x0000FF00) >> 8; - u4Byte _platform = (Hex & 0x00FF0000) >> 16; - u4Byte cond = Condition; - - if ( Condition == 0xCDCDCDCD ) - return TRUE; - - cond = Condition & 0x000000FF; - if ( (_board == cond) && cond != 0x00) - return FALSE; - - cond = Condition & 0x0000FF00; - cond = cond >> 8; - if ( (_interface & cond) == 0 && cond != 0x07) - return FALSE; - - cond = Condition & 0x00FF0000; - cond = cond >> 16; - if ( (_platform & cond) == 0 && cond != 0x0F) - return FALSE; - return TRUE; -} - - -/****************************************************************************** -* RadioA_1T.TXT -******************************************************************************/ - -u4Byte Array_RadioA_1T_8723A[] = { - 0x000, 0x00030159, - 0x001, 0x00031284, - 0x002, 0x00098000, - 0xFF0F011F, 0xABCD, - 0x003, 0x00018C63, - 0xCDCDCDCD, 0xCDCD, - 0x003, 0x00039C63, - 0xFF0F011F, 0xDEAD, - 0x004, 0x000210E7, - 0x009, 0x0002044F, - 0x00A, 0x0001A3F1, - 0x00B, 0x00014787, - 0x00C, 0x000896FE, - 0x00D, 0x0000E02C, - 0x00E, 0x00039CE7, - 0x00F, 0x00000451, - 0x019, 0x00000000, - 0x01A, 0x00030355, - 0x01B, 0x00060A00, - 0x01C, 0x000FC378, - 0x01D, 0x000A1250, - 0x01E, 0x0000024F, - 0x01F, 0x00000000, - 0x020, 0x0000B614, - 0x021, 0x0006C000, - 0x022, 0x00000000, - 0x023, 0x00001558, - 0x024, 0x00000060, - 0x025, 0x00000483, - 0x026, 0x0004F000, - 0x027, 0x000EC7D9, - 0x028, 0x00057730, - 0x029, 0x00004783, - 0x02A, 0x00000001, - 0x02B, 0x00021334, - 0x02A, 0x00000000, - 0x02B, 0x00000054, - 0x02A, 0x00000001, - 0x02B, 0x00000808, - 0x02B, 0x00053333, - 0x02C, 0x0000000C, - 0x02A, 0x00000002, - 0x02B, 0x00000808, - 0x02B, 0x0005B333, - 0x02C, 0x0000000D, - 0x02A, 0x00000003, - 0x02B, 0x00000808, - 0x02B, 0x00063333, - 0x02C, 0x0000000D, - 0x02A, 0x00000004, - 0x02B, 0x00000808, - 0x02B, 0x0006B333, - 0x02C, 0x0000000D, - 0x02A, 0x00000005, - 0x02B, 0x00000808, - 0x02B, 0x00073333, - 0x02C, 0x0000000D, - 0x02A, 0x00000006, - 0x02B, 0x00000709, - 0x02B, 0x0005B333, - 0x02C, 0x0000000D, - 0x02A, 0x00000007, - 0x02B, 0x00000709, - 0x02B, 0x00063333, - 0x02C, 0x0000000D, - 0x02A, 0x00000008, - 0x02B, 0x0000060A, - 0x02B, 0x0004B333, - 0x02C, 0x0000000D, - 0x02A, 0x00000009, - 0x02B, 0x0000060A, - 0x02B, 0x00053333, - 0x02C, 0x0000000D, - 0x02A, 0x0000000A, - 0x02B, 0x0000060A, - 0x02B, 0x0005B333, - 0x02C, 0x0000000D, - 0x02A, 0x0000000B, - 0x02B, 0x0000060A, - 0x02B, 0x00063333, - 0x02C, 0x0000000D, - 0x02A, 0x0000000C, - 0x02B, 0x0000060A, - 0x02B, 0x0006B333, - 0x02C, 0x0000000D, - 0x02A, 0x0000000D, - 0x02B, 0x0000060A, - 0x02B, 0x00073333, - 0x02C, 0x0000000D, - 0x02A, 0x0000000E, - 0x02B, 0x0000050B, - 0x02B, 0x00066666, - 0x02C, 0x0000001A, - 0x02A, 0x000E0000, - 0x010, 0x0004000F, - 0x011, 0x000E31FC, - 0x010, 0x0006000F, - 0x011, 0x000FF9F8, - 0x010, 0x0002000F, - 0x011, 0x000203F9, - 0x010, 0x0003000F, - 0x011, 0x000FF500, - 0x010, 0x00000000, - 0x011, 0x00000000, - 0x010, 0x0008000F, - 0x011, 0x0003F100, - 0x010, 0x0009000F, - 0x011, 0x00023100, - 0x012, 0x00032000, - 0x012, 0x00071000, - 0x012, 0x000B0000, - 0x012, 0x000FC000, - 0x013, 0x000287B3, - 0x013, 0x000244B7, - 0x013, 0x000204AB, - 0x013, 0x0001C49F, - 0x013, 0x00018493, - 0x013, 0x0001429B, - 0x013, 0x00010299, - 0x013, 0x0000C29C, - 0x013, 0x000081A0, - 0x013, 0x000040AC, - 0x013, 0x00000020, - 0x014, 0x0001944C, - 0x014, 0x00059444, - 0x014, 0x0009944C, - 0x014, 0x000D9444, - 0xFF0F011F, 0xABCD, - 0x015, 0x0000F424, - 0x015, 0x0004F424, - 0x015, 0x0008F424, - 0x015, 0x000CF424, - 0xCDCDCDCD, 0xCDCD, - 0x015, 0x0000F474, - 0x015, 0x0004F477, - 0x015, 0x0008F455, - 0x015, 0x000CF455, - 0xFF0F011F, 0xDEAD, - 0x016, 0x00000339, - 0x016, 0x00040339, - 0x016, 0x00080339, - 0xFF0F011F, 0xABCD, - 0x016, 0x000C0356, - 0xCDCDCDCD, 0xCDCD, - 0x016, 0x000C0366, - 0xFF0F011F, 0xDEAD, - 0x000, 0x00010159, - 0x018, 0x0000F401, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x01F, 0x00000003, - 0x0FE, 0x00000000, - 0x0FE, 0x00000000, - 0x01E, 0x00000247, - 0x01F, 0x00000000, - 0x000, 0x00030159, - -}; - -void -ODM_ReadAndConfig_RadioA_1T_8723A( - IN PDM_ODM_T pDM_Odm - ) -{ - #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) - - u4Byte hex = 0; - u4Byte i = 0; - u2Byte count = 0; - pu4Byte ptr_array = NULL; - u1Byte platform = pDM_Odm->SupportPlatform; - u1Byte interfaceValue = pDM_Odm->SupportInterface; - u1Byte board = pDM_Odm->BoardType; - u4Byte ArrayLen = sizeof(Array_RadioA_1T_8723A)/sizeof(u4Byte); - pu4Byte Array = Array_RadioA_1T_8723A; - - - hex += board; - hex += interfaceValue << 8; - hex += platform << 16; - hex += 0xFF000000; - - for (i = 0; i < ArrayLen; i += 2 ) - { - u4Byte v1 = Array[i]; - u4Byte v2 = Array[i+1]; - - // This (offset, data) pair meets the condition. - if ( v1 < 0xCDCDCDCD ) - { - odm_ConfigRF_RadioA_8723A(pDM_Odm, v1, v2); - continue; - } - else - { // This line is the start line of branch. - if ( !CheckCondition(Array[i], hex) ) - { // Discard the following (offset, data) pairs. - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - i -= 2; // prevent from for-loop += 2 - } - else // Configure matched pairs and skip to end of if-else. - { - READ_NEXT_PAIR(v1, v2, i); - while (v2 != 0xDEAD && - v2 != 0xCDEF && - v2 != 0xCDCD && i < ArrayLen -2) - { - odm_ConfigRF_RadioA_8723A(pDM_Odm, v1, v2); - READ_NEXT_PAIR(v1, v2, i); - } - - while (v2 != 0xDEAD && i < ArrayLen -2) - { - READ_NEXT_PAIR(v1, v2, i); - } - - } - } - } - -} - - -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#include "../odm_precomp.h" + +#if (RTL8723A_SUPPORT == 1) +static BOOLEAN +CheckCondition( + const u4Byte Condition, + const u4Byte Hex + ) +{ + u4Byte _board = (Hex & 0x000000FF); + u4Byte _interface = (Hex & 0x0000FF00) >> 8; + u4Byte _platform = (Hex & 0x00FF0000) >> 16; + u4Byte cond = Condition; + + if ( Condition == 0xCDCDCDCD ) + return TRUE; + + cond = Condition & 0x000000FF; + if ( (_board == cond) && cond != 0x00) + return FALSE; + + cond = Condition & 0x0000FF00; + cond = cond >> 8; + if ( (_interface & cond) == 0 && cond != 0x07) + return FALSE; + + cond = Condition & 0x00FF0000; + cond = cond >> 16; + if ( (_platform & cond) == 0 && cond != 0x0F) + return FALSE; + return TRUE; +} + + +/****************************************************************************** +* RadioA_1T.TXT +******************************************************************************/ + +u4Byte Array_RadioA_1T_8723A[] = { + 0x000, 0x00030159, + 0x001, 0x00031284, + 0x002, 0x00098000, + 0xFF0F011F, 0xABCD, + 0x003, 0x00018C63, + 0xCDCDCDCD, 0xCDCD, + 0x003, 0x00039C63, + 0xFF0F011F, 0xDEAD, + 0x004, 0x000210E7, + 0x009, 0x0002044F, + 0x00A, 0x0001A3F1, + 0x00B, 0x00014787, + 0x00C, 0x000896FE, + 0x00D, 0x0000E02C, + 0x00E, 0x00039CE7, + 0x00F, 0x00000451, + 0x019, 0x00000000, + 0x01A, 0x00030355, + 0x01B, 0x00060A00, + 0x01C, 0x000FC378, + 0x01D, 0x000A1250, + 0x01E, 0x0000024F, + 0x01F, 0x00000000, + 0x020, 0x0000B614, + 0x021, 0x0006C000, + 0x022, 0x00000000, + 0x023, 0x00001558, + 0x024, 0x00000060, + 0x025, 0x00000483, + 0x026, 0x0004F000, + 0x027, 0x000EC7D9, + 0x028, 0x00057730, + 0x029, 0x00004783, + 0x02A, 0x00000001, + 0x02B, 0x00021334, + 0x02A, 0x00000000, + 0x02B, 0x00000054, + 0x02A, 0x00000001, + 0x02B, 0x00000808, + 0x02B, 0x00053333, + 0x02C, 0x0000000C, + 0x02A, 0x00000002, + 0x02B, 0x00000808, + 0x02B, 0x0005B333, + 0x02C, 0x0000000D, + 0x02A, 0x00000003, + 0x02B, 0x00000808, + 0x02B, 0x00063333, + 0x02C, 0x0000000D, + 0x02A, 0x00000004, + 0x02B, 0x00000808, + 0x02B, 0x0006B333, + 0x02C, 0x0000000D, + 0x02A, 0x00000005, + 0x02B, 0x00000808, + 0x02B, 0x00073333, + 0x02C, 0x0000000D, + 0x02A, 0x00000006, + 0x02B, 0x00000709, + 0x02B, 0x0005B333, + 0x02C, 0x0000000D, + 0x02A, 0x00000007, + 0x02B, 0x00000709, + 0x02B, 0x00063333, + 0x02C, 0x0000000D, + 0x02A, 0x00000008, + 0x02B, 0x0000060A, + 0x02B, 0x0004B333, + 0x02C, 0x0000000D, + 0x02A, 0x00000009, + 0x02B, 0x0000060A, + 0x02B, 0x00053333, + 0x02C, 0x0000000D, + 0x02A, 0x0000000A, + 0x02B, 0x0000060A, + 0x02B, 0x0005B333, + 0x02C, 0x0000000D, + 0x02A, 0x0000000B, + 0x02B, 0x0000060A, + 0x02B, 0x00063333, + 0x02C, 0x0000000D, + 0x02A, 0x0000000C, + 0x02B, 0x0000060A, + 0x02B, 0x0006B333, + 0x02C, 0x0000000D, + 0x02A, 0x0000000D, + 0x02B, 0x0000060A, + 0x02B, 0x00073333, + 0x02C, 0x0000000D, + 0x02A, 0x0000000E, + 0x02B, 0x0000050B, + 0x02B, 0x00066666, + 0x02C, 0x0000001A, + 0x02A, 0x000E0000, + 0x010, 0x0004000F, + 0x011, 0x000E31FC, + 0x010, 0x0006000F, + 0x011, 0x000FF9F8, + 0x010, 0x0002000F, + 0x011, 0x000203F9, + 0x010, 0x0003000F, + 0x011, 0x000FF500, + 0x010, 0x00000000, + 0x011, 0x00000000, + 0x010, 0x0008000F, + 0x011, 0x0003F100, + 0x010, 0x0009000F, + 0x011, 0x00023100, + 0x012, 0x00032000, + 0x012, 0x00071000, + 0x012, 0x000B0000, + 0x012, 0x000FC000, + 0x013, 0x000287B3, + 0x013, 0x000244B7, + 0x013, 0x000204AB, + 0x013, 0x0001C49F, + 0x013, 0x00018493, + 0x013, 0x0001429B, + 0x013, 0x00010299, + 0x013, 0x0000C29C, + 0x013, 0x000081A0, + 0x013, 0x000040AC, + 0x013, 0x00000020, + 0x014, 0x0001944C, + 0x014, 0x00059444, + 0x014, 0x0009944C, + 0x014, 0x000D9444, + 0xFF0F011F, 0xABCD, + 0x015, 0x0000F424, + 0x015, 0x0004F424, + 0x015, 0x0008F424, + 0x015, 0x000CF424, + 0xCDCDCDCD, 0xCDCD, + 0x015, 0x0000F474, + 0x015, 0x0004F477, + 0x015, 0x0008F455, + 0x015, 0x000CF455, + 0xFF0F011F, 0xDEAD, + 0x016, 0x00000339, + 0x016, 0x00040339, + 0x016, 0x00080339, + 0xFF0F011F, 0xABCD, + 0x016, 0x000C0356, + 0xCDCDCDCD, 0xCDCD, + 0x016, 0x000C0366, + 0xFF0F011F, 0xDEAD, + 0x000, 0x00010159, + 0x018, 0x0000F401, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x01F, 0x00000003, + 0x0FE, 0x00000000, + 0x0FE, 0x00000000, + 0x01E, 0x00000247, + 0x01F, 0x00000000, + 0x000, 0x00030159, + +}; + +void +ODM_ReadAndConfig_RadioA_1T_8723A( + IN PDM_ODM_T pDM_Odm + ) +{ + #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0) + + u4Byte hex = 0; + u4Byte i = 0; + u2Byte count = 0; + pu4Byte ptr_array = NULL; + u1Byte platform = pDM_Odm->SupportPlatform; + u1Byte interfaceValue = pDM_Odm->SupportInterface; + u1Byte board = pDM_Odm->BoardType; + u4Byte ArrayLen = sizeof(Array_RadioA_1T_8723A)/sizeof(u4Byte); + pu4Byte Array = Array_RadioA_1T_8723A; + + + hex += board; + hex += interfaceValue << 8; + hex += platform << 16; + hex += 0xFF000000; + + for (i = 0; i < ArrayLen; i += 2 ) + { + u4Byte v1 = Array[i]; + u4Byte v2 = Array[i+1]; + + // This (offset, data) pair meets the condition. + if ( v1 < 0xCDCDCDCD ) + { + odm_ConfigRF_RadioA_8723A(pDM_Odm, v1, v2); + continue; + } + else + { // This line is the start line of branch. + if ( !CheckCondition(Array[i], hex) ) + { // Discard the following (offset, data) pairs. + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + i -= 2; // prevent from for-loop += 2 + } + else // Configure matched pairs and skip to end of if-else. + { + READ_NEXT_PAIR(v1, v2, i); + while (v2 != 0xDEAD && + v2 != 0xCDEF && + v2 != 0xCDCD && i < ArrayLen -2) + { + odm_ConfigRF_RadioA_8723A(pDM_Odm, v1, v2); + READ_NEXT_PAIR(v1, v2, i); + } + + while (v2 != 0xDEAD && i < ArrayLen -2) + { + READ_NEXT_PAIR(v1, v2, i); + } + + } + } + } + +} + + +#endif // end of HWIMG_SUPPORT + diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_RF.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_RF.h index 59e8273098cc..21ce3d1aedb9 100755 --- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_RF.h +++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/rtl8723a/HalHWImg8723A_RF.h @@ -1,37 +1,37 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. -* -* This program is free software; you can redistribute it and/or modify it -* under the terms of version 2 of the GNU General Public License as -* published by the Free Software Foundation. -* -* This program is distributed in the hope that it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -* more details. -* -* You should have received a copy of the GNU General Public License along with -* this program; if not, write to the Free Software Foundation, Inc., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#if (RTL8723A_SUPPORT == 1) -#ifndef __INC_RF_8723A_HW_IMG_H -#define __INC_RF_8723A_HW_IMG_H - -/****************************************************************************** -* RadioA_1T.TXT -******************************************************************************/ - -void -ODM_ReadAndConfig_RadioA_1T_8723A( - IN PDM_ODM_T pDM_Odm -); - - -#endif -#endif // end of HWIMG_SUPPORT - +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#if (RTL8723A_SUPPORT == 1) +#ifndef __INC_RF_8723A_HW_IMG_H +#define __INC_RF_8723A_HW_IMG_H + +/****************************************************************************** +* RadioA_1T.TXT +******************************************************************************/ + +void +ODM_ReadAndConfig_RadioA_1T_8723A( + IN PDM_ODM_T pDM_Odm +); + + +#endif +#endif // end of HWIMG_SUPPORT + diff --git a/drivers/net/wireless/rtl8723as/hal/hal_com.c b/drivers/net/wireless/rtl8723as/hal/hal_com.c index 7628b1be1469..9f413a09cfbf 100755 --- a/drivers/net/wireless/rtl8723as/hal/hal_com.c +++ b/drivers/net/wireless/rtl8723as/hal/hal_com.c @@ -65,6 +65,9 @@ void dump_chip_info(HAL_VERSION ChipVersion) else if(IS_C_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "C_CUT_"); else if(IS_D_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "D_CUT_"); else if(IS_E_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "E_CUT_"); + else if(IS_I_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "I_CUT_"); + else if(IS_J_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "J_CUT_"); + else if(IS_K_CUT(ChipVersion)) cnt += sprintf((buf+cnt), "K_CUT_"); else cnt += sprintf((buf+cnt), "UNKNOWN_CUT(%d)_", ChipVersion.CUTVersion); if(IS_1T1R(ChipVersion)) cnt += sprintf((buf+cnt), "1T1R_"); @@ -393,3 +396,58 @@ exit: return ret; } +u8 +SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter); + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + u8 bResult = _SUCCESS; + + switch(variable) { + case HW_DEF_FA_CNT_DUMP: + if(*((u8*)value)) + pDM_Odm->DebugComponents |= (ODM_COMP_DIG |ODM_COMP_FA_CNT); + else + pDM_Odm->DebugComponents &= ~(ODM_COMP_DIG |ODM_COMP_FA_CNT); + break; + case HW_DEF_ODM_DBG_FLAG: + ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_DBG_COMP, *((u8Byte*)value)); + break; + case HW_DEF_ODM_DBG_LEVEL: + ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_DBG_LEVEL, *((u4Byte*)value)); + break; + default: + DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable); + bResult = _FAIL; + break; + } + + return bResult; +} + +u8 +GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter); + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + u8 bResult = _SUCCESS; + + switch(variable) { + case HW_DEF_ODM_DBG_FLAG: + *((u8Byte*)value) = pDM_Odm->DebugComponents; + break; + case HW_DEF_ODM_DBG_LEVEL: + *((u4Byte*)value) = pDM_Odm->DebugLevel; + break; + case HAL_DEF_DBG_DM_FUNC: + *((u32*)value) = pHalData->odmpriv.SupportAbility; + break; + default: + DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable); + bResult = _FAIL; + break; + } + + return bResult; +} + diff --git a/drivers/net/wireless/rtl8723as/hal/hal_intf.c b/drivers/net/wireless/rtl8723as/hal/hal_intf.c index 9fd02a87228f..c7950c48f3b3 100755 --- a/drivers/net/wireless/rtl8723as/hal/hal_intf.c +++ b/drivers/net/wireless/rtl8723as/hal/hal_intf.c @@ -54,24 +54,28 @@ void rtw_hal_read_chip_version(_adapter *padapter) void rtw_hal_def_value_init(_adapter *padapter) { - if(padapter->HalFunc.init_default_value) - padapter->HalFunc.init_default_value(padapter); + if (is_primary_adapter(padapter)) + if(padapter->HalFunc.init_default_value) + padapter->HalFunc.init_default_value(padapter); } void rtw_hal_free_data(_adapter *padapter) { - if(padapter->HalFunc.free_hal_data) - padapter->HalFunc.free_hal_data(padapter); + if (is_primary_adapter(padapter)) + if(padapter->HalFunc.free_hal_data) + padapter->HalFunc.free_hal_data(padapter); } void rtw_hal_dm_init(_adapter *padapter) { - if(padapter->HalFunc.dm_init) - padapter->HalFunc.dm_init(padapter); + if (is_primary_adapter(padapter)) + if(padapter->HalFunc.dm_init) + padapter->HalFunc.dm_init(padapter); } void rtw_hal_dm_deinit(_adapter *padapter) { // cancel dm timer - if(padapter->HalFunc.dm_deinit) - padapter->HalFunc.dm_deinit(padapter); + if (is_primary_adapter(padapter)) + if(padapter->HalFunc.dm_deinit) + padapter->HalFunc.dm_deinit(padapter); } void rtw_hal_sw_led_init(_adapter *padapter) { @@ -96,6 +100,8 @@ u32 rtw_hal_power_on(_adapter *padapter) uint rtw_hal_init(_adapter *padapter) { uint status = _SUCCESS; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + int i; #ifdef CONFIG_DUALMAC_CONCURRENT if(padapter->hw_init_completed == _TRUE) @@ -128,20 +134,27 @@ uint rtw_hal_init(_adapter *padapter) } #endif - padapter->hw_init_completed=_FALSE; - status = padapter->HalFunc.hal_init(padapter); if(status == _SUCCESS){ - padapter->hw_init_completed = _TRUE; + for (i = 0; iiface_nums; i++) { + padapter = dvobj->padapters[i]; + padapter->hw_init_completed = _TRUE; + } if (padapter->registrypriv.notch_filter == 1) rtw_hal_notch_filter(padapter, 1); rtw_hal_reset_security_engine(padapter); + rtw_sec_restore_wep_key(padapter); + + init_hw_mlme_ext(padapter); } else{ - padapter->hw_init_completed = _FALSE; + for (i = 0; iiface_nums; i++) { + padapter = dvobj->padapters[i]; + padapter->hw_init_completed = _FALSE; + } DBG_871X("rtw_hal_init: hal__init fail\n"); } @@ -154,13 +167,22 @@ uint rtw_hal_init(_adapter *padapter) uint rtw_hal_deinit(_adapter *padapter) { uint status = _SUCCESS; - + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + int i; + _func_enter_; + if (!is_primary_adapter(padapter)){ + DBG_871X(" rtw_hal_deinit: Secondary adapter return l\n"); + return status; + } status = padapter->HalFunc.hal_deinit(padapter); if(status == _SUCCESS){ - padapter->hw_init_completed = _FALSE; + for (i = 0; iiface_nums; i++) { + padapter = dvobj->padapters[i]; + padapter->hw_init_completed = _FALSE; + } } else { @@ -210,6 +232,11 @@ void rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID p void rtw_hal_enable_interrupt(_adapter *padapter) { + if (!is_primary_adapter(padapter)){ + DBG_871X(" rtw_hal_enable_interrupt: Secondary adapter return l\n"); + return; + } + if (padapter->HalFunc.enable_interrupt) padapter->HalFunc.enable_interrupt(padapter); else @@ -218,6 +245,11 @@ void rtw_hal_enable_interrupt(_adapter *padapter) } void rtw_hal_disable_interrupt(_adapter *padapter) { + if (!is_primary_adapter(padapter)){ + DBG_871X(" rtw_hal_disable_interrupt: Secondary adapter return l\n"); + return; + } + if (padapter->HalFunc.disable_interrupt) padapter->HalFunc.disable_interrupt(padapter); else @@ -272,6 +304,30 @@ s32 rtw_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe) s32 rtw_hal_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe) { s32 ret = _FAIL; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + _rtw_memcpy(pmgntframe->attrib.ra, pwlanhdr->addr1, ETH_ALEN); + +#ifdef CONFIG_IEEE80211W + if(padapter->securitypriv.binstallBIPkey == _TRUE) + { + if(IS_MCAST(pmgntframe->attrib.ra)) + { + pmgntframe->attrib.encrypt = _BIP_; + //pmgntframe->attrib.bswenc = _TRUE; + } + else + { + pmgntframe->attrib.encrypt = _AES_; + pmgntframe->attrib.bswenc = _TRUE; + } + rtw_mgmt_xmitframe_coalesce(padapter, pmgntframe->pkt, pmgntframe); + } +#endif //CONFIG_IEEE80211W + if(padapter->HalFunc.mgnt_xmit) ret = padapter->HalFunc.mgnt_xmit(padapter, pmgntframe); return ret; @@ -330,13 +386,7 @@ void rtw_hal_add_ra_tid(_adapter *padapter, u32 bitmap, u8 arg, u8 rssi_level) if(padapter->HalFunc.Add_RateATid) padapter->HalFunc.Add_RateATid(padapter, bitmap, arg, rssi_level); } -#ifdef CONFIG_CONCURRENT_MODE -void rtw_hal_clone_data(_adapter *dst_padapter, _adapter *src_padapter) -{ - if(dst_padapter->HalFunc.clone_haldata) - dst_padapter->HalFunc.clone_haldata(dst_padapter, src_padapter); -} -#endif + /* Start specifical interface thread */ void rtw_hal_start_thread(_adapter *padapter) { @@ -457,15 +507,17 @@ void rtw_hal_sreset_reset_value(_adapter *padapter) void rtw_hal_sreset_xmit_status_check(_adapter *padapter) { -#ifdef CONFIG_CONCURRENT_MODE - if (padapter->adapter_type != PRIMARY_ADAPTER) + if (!is_primary_adapter(padapter)) return; -#endif + if(padapter->HalFunc.sreset_xmit_status_check) padapter->HalFunc.sreset_xmit_status_check(padapter); } void rtw_hal_sreset_linked_status_check(_adapter *padapter) { + if (!is_primary_adapter(padapter)) + return; + if(padapter->HalFunc.sreset_linked_status_check) padapter->HalFunc.sreset_linked_status_check(padapter); } diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/Hal8723PwrSeq.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/Hal8723PwrSeq.c index 4f801cbc3e2a..97255cd3bc88 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/Hal8723PwrSeq.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/Hal8723PwrSeq.c @@ -1,91 +1,91 @@ -/*++ -Copyright (c) Realtek Semiconductor Corp. All rights reserved. - -Module Name: - Hal8723PwrSeq.c - -Abstract: - This file includes all kinds of Power Action event for RTL8188E and corresponding hardware configurtions which are released from HW SD. - -Major Change History: - When Who What - ---------- --------------- ------------------------------- - 2011-08-08 Roger Create. - ---*/ -#include "Hal8723PwrSeq.h" - - -/* - drivers should parse below arrays and do the corresponding actions -*/ -//3 Power on Array -WLAN_PWR_CFG rtl8723A_power_on_flow[RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]= -{ - RTL8723A_TRANS_CARDEMU_TO_ACT - RTL8723A_TRANS_END -}; - -//3 Radio off GPIO Array -WLAN_PWR_CFG rtl8723A_radio_off_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_END_STEPS]= -{ - RTL8723A_TRANS_ACT_TO_CARDEMU - RTL8723A_TRANS_END -}; - -//3 Card Disable Array -WLAN_PWR_CFG rtl8723A_card_disable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]= -{ - RTL8723A_TRANS_ACT_TO_CARDEMU - RTL8723A_TRANS_CARDEMU_TO_CARDDIS - RTL8723A_TRANS_END -}; - -//3 Card Enable Array -WLAN_PWR_CFG rtl8723A_card_enable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]= -{ - RTL8723A_TRANS_CARDDIS_TO_CARDEMU - RTL8723A_TRANS_CARDEMU_TO_ACT - RTL8723A_TRANS_END -}; - -//3 Suspend Array -WLAN_PWR_CFG rtl8723A_suspend_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]= -{ - RTL8723A_TRANS_ACT_TO_CARDEMU - RTL8723A_TRANS_CARDEMU_TO_SUS - RTL8723A_TRANS_END -}; - -//3 Resume Array -WLAN_PWR_CFG rtl8723A_resume_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]= -{ - RTL8723A_TRANS_SUS_TO_CARDEMU - RTL8723A_TRANS_CARDEMU_TO_ACT - RTL8723A_TRANS_END -}; - -//3 HWPDN Array -WLAN_PWR_CFG rtl8723A_hwpdn_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]= -{ - RTL8723A_TRANS_ACT_TO_CARDEMU - RTL8723A_TRANS_CARDEMU_TO_PDN - RTL8723A_TRANS_END -}; - -//3 Enter LPS -WLAN_PWR_CFG rtl8723A_enter_lps_flow[RTL8723A_TRANS_ACT_TO_LPS_STEPS+RTL8723A_TRANS_END_STEPS]= -{ - //FW behavior - RTL8723A_TRANS_ACT_TO_LPS - RTL8723A_TRANS_END -}; - -//3 Leave LPS -WLAN_PWR_CFG rtl8723A_leave_lps_flow[RTL8723A_TRANS_LPS_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]= -{ - //FW behavior - RTL8723A_TRANS_LPS_TO_ACT - RTL8723A_TRANS_END -}; - +/*++ +Copyright (c) Realtek Semiconductor Corp. All rights reserved. + +Module Name: + Hal8723PwrSeq.c + +Abstract: + This file includes all kinds of Power Action event for RTL8188E and corresponding hardware configurtions which are released from HW SD. + +Major Change History: + When Who What + ---------- --------------- ------------------------------- + 2011-08-08 Roger Create. + +--*/ +#include "Hal8723PwrSeq.h" + + +/* + drivers should parse below arrays and do the corresponding actions +*/ +//3 Power on Array +WLAN_PWR_CFG rtl8723A_power_on_flow[RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]= +{ + RTL8723A_TRANS_CARDEMU_TO_ACT + RTL8723A_TRANS_END +}; + +//3 Radio off GPIO Array +WLAN_PWR_CFG rtl8723A_radio_off_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_END_STEPS]= +{ + RTL8723A_TRANS_ACT_TO_CARDEMU + RTL8723A_TRANS_END +}; + +//3 Card Disable Array +WLAN_PWR_CFG rtl8723A_card_disable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]= +{ + RTL8723A_TRANS_ACT_TO_CARDEMU + RTL8723A_TRANS_CARDEMU_TO_CARDDIS + RTL8723A_TRANS_END +}; + +//3 Card Enable Array +WLAN_PWR_CFG rtl8723A_card_enable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]= +{ + RTL8723A_TRANS_CARDDIS_TO_CARDEMU + RTL8723A_TRANS_CARDEMU_TO_ACT + RTL8723A_TRANS_END +}; + +//3 Suspend Array +WLAN_PWR_CFG rtl8723A_suspend_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]= +{ + RTL8723A_TRANS_ACT_TO_CARDEMU + RTL8723A_TRANS_CARDEMU_TO_SUS + RTL8723A_TRANS_END +}; + +//3 Resume Array +WLAN_PWR_CFG rtl8723A_resume_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]= +{ + RTL8723A_TRANS_SUS_TO_CARDEMU + RTL8723A_TRANS_CARDEMU_TO_ACT + RTL8723A_TRANS_END +}; + +//3 HWPDN Array +WLAN_PWR_CFG rtl8723A_hwpdn_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]= +{ + RTL8723A_TRANS_ACT_TO_CARDEMU + RTL8723A_TRANS_CARDEMU_TO_PDN + RTL8723A_TRANS_END +}; + +//3 Enter LPS +WLAN_PWR_CFG rtl8723A_enter_lps_flow[RTL8723A_TRANS_ACT_TO_LPS_STEPS+RTL8723A_TRANS_END_STEPS]= +{ + //FW behavior + RTL8723A_TRANS_ACT_TO_LPS + RTL8723A_TRANS_END +}; + +//3 Leave LPS +WLAN_PWR_CFG rtl8723A_leave_lps_flow[RTL8723A_TRANS_LPS_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]= +{ + //FW behavior + RTL8723A_TRANS_LPS_TO_ACT + RTL8723A_TRANS_END +}; + diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c index 34025b0bb50e..4ac0a4a6bd64 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c @@ -27,7 +27,7 @@ //#define BT_DEBUG -#define CHECK_BT_EXIST_FROM_REG +//#define CHECK_BT_EXIST_FROM_REG #define DIS_PS_RX_BCN //#define BTCOEX_DECREASE_WIFI_POWER //#define BTCOEX_CMCC_TEST @@ -144,7 +144,7 @@ static u8 PlatformCancelTimer(PADAPTER a, _timer *ptimer) #define PlatformScheduleWorkItem(pwork) _set_workitem(pwork) #if 0 #define GET_UNDECORATED_AVERAGE_RSSI(padapter) \ - (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) ? \ + (BTDM_CheckFWState(padapter, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) ? \ (GET_HAL_DATA(padapter)->dmpriv.EntryMinUndecoratedSmoothedPWDB): \ (GET_HAL_DATA(padapter)->dmpriv.UndecoratedSmoothedPWDB) #else @@ -216,6 +216,14 @@ void BT_SignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt) void BT_WifiScanNotify(PADAPTER padapter, u8 scanType) { +#if defined(CONFIG_CONCURRENT_MODE) + if (padapter->adapter_type != PRIMARY_ADAPTER) + { + RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE and padapter->adapter_type != PRIMARY_ADAPTER in %s!!\n", __FUNCTION__)); + return; + } +#endif + BTHCI_WifiScanNotify(padapter, scanType); BTDM_CheckAntSelMode(padapter); BTDM_WifiScanNotify(padapter, scanType); @@ -223,6 +231,14 @@ void BT_WifiScanNotify(PADAPTER padapter, u8 scanType) void BT_WifiAssociateNotify(PADAPTER padapter, u8 action) { +#if defined(CONFIG_CONCURRENT_MODE) + if (padapter->adapter_type != PRIMARY_ADAPTER) + { + RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE and padapter->adapter_type != PRIMARY_ADAPTER in %s!!\n", __FUNCTION__)); + return; + } +#endif + // action : // TRUE = associate start // FALSE = associate finished @@ -234,11 +250,27 @@ void BT_WifiAssociateNotify(PADAPTER padapter, u8 action) void BT_WifiMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus) { +#if defined(CONFIG_CONCURRENT_MODE) + if (padapter->adapter_type != PRIMARY_ADAPTER) + { + RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE and padapter->adapter_type != PRIMARY_ADAPTER in %s!!\n", __FUNCTION__)); + return; + } +#endif + BTDM_MediaStatusNotify(padapter, mstatus); } void BT_SpecialPacketNotify(PADAPTER padapter) { +#if defined(CONFIG_CONCURRENT_MODE) + if (padapter->adapter_type != PRIMARY_ADAPTER) + { + RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE and padapter->adapter_type != PRIMARY_ADAPTER in %s!!\n", __FUNCTION__)); + return; + } +#endif + BTDM_ForDhcp(padapter); } @@ -295,7 +327,7 @@ void BTPKT_WPAAuthINITIALIZE(PADAPTER padapter, u8 EntryNum) if (pHalData->bBTMode) { // if (padapter->MgntInfo.OpMode == RT_OP_MODE_IBSS) - if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) { pBtSec->bUsedHwEncrypt = _FALSE; } @@ -745,7 +777,7 @@ void bthci_DecideBTChannel(PADAPTER padapter, u8 EntryNum) IsAPModeExist(padapter)|| BTHCI_HsConnectionEstablished(padapter))) #else - if (!(check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_AP_STATE) == _TRUE || + if (!(BTDM_CheckFWState(padapter, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_AP_STATE) == _TRUE || BTHCI_HsConnectionEstablished(padapter))) #endif { @@ -1462,7 +1494,7 @@ bthci_AssocPreferredChannelList( pMgntInfo->mIbss || IsExtAPModeExist(padapter)) || #else - (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE) == _TRUE) || + (BTDM_CheckFWState(padapter, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE) == _TRUE) || #endif BTHCI_HsConnectionEstablished(padapter)) { @@ -1591,7 +1623,7 @@ u8 bthci_CheckRfStateBeforeConnect(PADAPTER padapter) pBTInfo = GET_BT_INFO(padapter); // rtw_hal_get_hwreg(padapter, HW_VAR_RF_STATE, (u8*)(&RfState)); - RfState = padapter->pwrctrlpriv.rf_pwrstate; + RfState = adapter_to_pwrctl(padapter)->rf_pwrstate; if (RfState != rf_on) { @@ -4249,7 +4281,7 @@ bthci_CmdReadLocalAMPInfo( { // PMGNT_INFO pMgntInfo = &padapter->MgntInfo; - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); u8 localBuf[TmpLocalBufSize] = ""; u8 *pRetPar; u8 len = 0; @@ -5353,15 +5385,15 @@ bthci_CmdWIFIConnectionStatus( } } #else - if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) { + if (BTDM_CheckFWState(padapter, WIFI_AP_STATE) == _TRUE) { if (padapter->stapriv.asoc_sta_count >= 3) connectStatus = HCI_WIFI_CONNECTED; else connectStatus = HCI_WIFI_NOT_CONNECTED; } - else if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_ASOC_STATE) == _TRUE) + else if (BTDM_CheckFWState(padapter, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_ASOC_STATE) == _TRUE) connectStatus = HCI_WIFI_CONNECTED; - else if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING) == _TRUE) + else if (BTDM_CheckFWState(padapter, WIFI_UNDER_LINKING) == _TRUE) connectStatus = HCI_WIFI_CONNECT_IN_PROGRESS; else connectStatus = HCI_WIFI_NOT_CONNECTED; @@ -6526,7 +6558,7 @@ bthci_StateDisconnected( (MgntIsLinkInProgress(pMgntInfo))|| (MgntScanInProgress(pMgntInfo))) #else - while (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) == _TRUE) + while (BTDM_CheckFWState(padapter, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) == _TRUE) #endif { RTPRINT(FIOCTL, IOCTL_STATE, ("Scan/Roaming/Wifi Link is in Progress, wait 200 ms\n")); @@ -6959,7 +6991,7 @@ u8 bthci_WaitForRfReady(PADAPTER padapter) u8 bRet = _FALSE; // PRT_POWER_SAVE_CONTROL pPSC = GET_POWER_SAVE_CONTROL(&(padapter->MgntInfo)); - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); rt_rf_power_state RfState; u32 waitcnt = 0; @@ -7070,7 +7102,7 @@ u8 BTHCI_GetCurrentEntryNumByMAC(PADAPTER padapter, u8 *SA) void BTHCI_StatusWatchdog(PADAPTER padapter) { // PMGNT_INFO pMgntInfo = &padapter->MgntInfo; - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); PBT30Info pBTInfo = GET_BT_INFO(padapter); PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt; PBT_TRAFFIC pBtTraffic = &pBTInfo->BtTraffic; @@ -7113,7 +7145,7 @@ void BTHCI_StatusWatchdog(PADAPTER padapter) !MgntIsLinkInProgress(pMgntInfo) && !MgntScanInProgress(pMgntInfo) && #else - if ((check_fwstate(&padapter->mlmepriv, WIFI_REASOC_STATE|WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _FALSE) && + if ((BTDM_CheckFWState(padapter, WIFI_REASOC_STATE|WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _FALSE) && #endif !bRfOff) { @@ -7166,7 +7198,7 @@ BTHCI_NotifyRFState( PMGNT_INFO pMgntInfo = &padapter->MgntInfo; RT_RF_CHANGE_SOURCE RfOffReason = pMgntInfo->RfOffReason; #else - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); RT_RF_CHANGE_SOURCE RfOffReason = ppwrctrl->rfoff_reason; #endif @@ -8104,7 +8136,7 @@ void btdm_1AntSetPSMode(PADAPTER padapter, u8 enable, u8 smartps, u8 mode) RTPRINT(FBT, BT_TRACE, ("[BTCoex], Current LPS(%s, %d), smartps=%d\n", enable==_TRUE?"ON":"OFF", mode, smartps)); - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); if (enable == _TRUE) { rtw_set_ps_mode(padapter, PS_MODE_MIN, smartps, mode); @@ -8147,6 +8179,41 @@ u8 btdm_Is1AntPsTdmaStateChange(PADAPTER padapter) } } +void btdm_1AntSetBTCoexTable(PADAPTER padapter, u8 coexCase) +{ + switch (coexCase) + { + case 0: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0x55555555); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0x55555555); + break; + case 1: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0x55555555); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0x5afa5afa); + break; + case 2: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0x5a5a5a5a); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0x5a5a5a5a); + break; + case 3: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0xaaaaaaaa); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0xaaaaaaaa); + break; + case 4: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0xffffffff); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0xffffffff); + break; + case 5: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0x5fff5fff); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0x5fff5fff); + break; + case 6: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0x55ff55ff); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0x5a5a5a5a); + break; + } +} + // Before enter TDMA, make sure Power Saving is enable! void btdm_1AntPsTdma( @@ -8171,22 +8238,24 @@ btdm_1AntPsTdma( if (btdm_Is1AntPsTdmaStateChange(padapter)) { // wide duration for WiFi - BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x0, 0x58); + BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x0, 0x50); + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 2: // A2DP Level-2 if (btdm_Is1AntPsTdmaStateChange(padapter)) { // normal duration for WiFi - BTDM_SetFw3a(padapter, 0xd3, 0x12, 0x12, 0x0, 0x58); + BTDM_SetFw3a(padapter, 0xd3, 0x12, 0x12, 0x0, 0x50); + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 3: // BT FTP/OPP if (btdm_Is1AntPsTdmaStateChange(padapter)) { // normal duration for WiFi - BTDM_SetFw3a(padapter, 0xd3, 0x30, 0x03, 0x10, 0x58); - + BTDM_SetFw3a(padapter, 0x53, 0x30, 0x03, 0x10, 0x50); + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 4: // for wifi scan & BT is connected @@ -8194,13 +8263,15 @@ btdm_1AntPsTdma( { // protect 3 beacons in 3-beacon period & no Tx pause at BT slot BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x0); + btdm_1AntSetBTCoexTable(padapter, 1); } break; case 5: // for WiFi connected-busy & BT is Non-Connected-Idle if (btdm_Is1AntPsTdmaStateChange(padapter)) { // SCO mode, Ant fixed at WiFi, WLAN_Act toggle - BTDM_SetFw3a(padapter, 0x61, 0x15, 0x03, 0x31, 0x00); + BTDM_SetFw3a(padapter, 0x61, 0x15, 0x03, 0x31, 0x10); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 9: // ACL high-retry type - 2 @@ -8208,19 +8279,22 @@ btdm_1AntPsTdma( { // narrow duration for WiFi BTDM_SetFw3a(padapter, 0xd3, 0xa, 0xa, 0x0, 0x58); //narrow duration for WiFi + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 10: // for WiFi connect idle & BT ACL busy or WiFi Connected-Busy & BT is Inquiry if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0x13, 0xa, 0xa, 0x0, 0x40); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 11: // ACL high-retry type - 3 if (btdm_Is1AntPsTdmaStateChange(padapter)) { // narrow duration for WiFi - BTDM_SetFw3a(padapter, 0xd3, 0x05, 0x05, 0x00, 0x58); + BTDM_SetFw3a(padapter, 0x53, 0x10, 0x03, 0x10, 0x50); + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 12: // for WiFi Connected-Busy & BT is Connected-Idle @@ -8228,68 +8302,91 @@ btdm_1AntPsTdma( { // Allow High-Pri BT BTDM_SetFw3a(padapter, 0xeb, 0x0a, 0x03, 0x31, 0x18); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 20: // WiFi only busy ,TDMA mode for power saving if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0x13, 0x25, 0x25, 0x00, 0x00); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 27: // WiFi DHCP/Site Survey & BT SCO busy if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0xa3, 0x25, 0x03, 0x31, 0x98); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 28: // WiFi DHCP/Site Survey & BT idle if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0x69, 0x25, 0x03, 0x31, 0x00); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 29: // WiFi DHCP/Site Survey & BT ACL busy if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0xeb, 0x1a, 0x1a, 0x01, 0x18); - rtw_write32(padapter, 0x6c0, 0x5afa5afa); - rtw_write32(padapter, 0x6c4, 0x5afa5afa); + btdm_1AntSetBTCoexTable(padapter, 1); } break; case 30: // WiFi idle & BT Inquiry if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x00); + btdm_1AntSetBTCoexTable(padapter, 0); } break; case 31: // BT HID if (btdm_Is1AntPsTdmaStateChange(padapter)) { - BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x58); + BTDM_SetFw3a(padapter, 0x53, 0x12, 0x12, 0x00, 0x50); + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 32: // BT SCO & Inquiry if (btdm_Is1AntPsTdmaStateChange(padapter)) { - BTDM_SetFw3a(padapter, 0xab, 0x0a, 0x03, 0x11, 0x98); + BTDM_SetFw3a(padapter, 0xa3, 0x0a, 0x03, 0x14, 0x00); + btdm_1AntSetBTCoexTable(padapter, 0); } break; case 33: // BT SCO & WiFi site survey if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0xa3, 0x25, 0x03, 0x30, 0x98); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 34: // BT HID & WiFi site survey if (btdm_Is1AntPsTdmaStateChange(padapter)) { - BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x18); + BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x10); + btdm_1AntSetBTCoexTable(padapter, 1); } break; case 35: // BT HID & WiFi Connecting if (btdm_Is1AntPsTdmaStateChange(padapter)) { - BTDM_SetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x00, 0x18); + BTDM_SetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x00, 0x10); + btdm_1AntSetBTCoexTable(padapter, 1); + } + break; + case 36: // BT A2DP/FTP/A2DP+HID/FTP+A2DP & WiFi LPS + if (btdm_Is1AntPsTdmaStateChange(padapter)) + { + BTDM_SetFw3a(padapter, 0x23, 0x20, 0x00, 0x10, 0x24); + btdm_1AntSetBTCoexTable(padapter, 2); + } + break; + case 37: + if (btdm_Is1AntPsTdmaStateChange(padapter)) + { + BTDM_SetFw3a(padapter, 0x53, 0x10, 0x03, 0x10, 0x10); + btdm_1AntSetBTCoexTable(padapter, 6); } break; } @@ -8326,6 +8423,7 @@ btdm_1AntPsTdma( RTPRINT(FBT, BT_TRACE, ("[BTCoex], 0x860=0x110, Switch Antenna to WiFi\n")); break; } + btdm_1AntSetBTCoexTable(padapter, 2); } RTPRINT(FBT, BT_TRACE, ("[BTCoex], Current TDMA(%s, %d)\n", @@ -8345,7 +8443,7 @@ void _btdm_1AntSetPSTDMA(PADAPTER padapter, u8 bPSEn, u8 smartps, u8 psOption, u u8 bSwitchPS; - if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _FALSE) && + if ((BTDM_CheckFWState(padapter, WIFI_STATION_STATE) == _FALSE) && (get_fwstate(&padapter->mlmepriv) != WIFI_NULL_STATE)) { btdm_1AntPsTdma(padapter, bTDMAOn, tdmaType); @@ -8361,7 +8459,7 @@ void _btdm_1AntSetPSTDMA(PADAPTER padapter, u8 bPSEn, u8 smartps, u8 psOption, u bPSEn==_TRUE?"ON":"OFF", psOption, bTDMAOn==_TRUE?"ON":"OFF", tdmaType)); - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); pHalData = GET_HAL_DATA(padapter); pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant; @@ -8606,7 +8704,12 @@ void btdm_1AntTdmaDurationAdjustForACL(PADAPTER padapter) if (pBtdm8723->psTdmaMonitorCnt == 0) { // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, first time execute!!\n")); - btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 2); + btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 9); + if(pHalData->bt_coexist.halCoex8723.btInfoExt){ + pBtdm8723->psTdmaDuAdjType = 9; + RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n")); + } + else pBtdm8723->psTdmaDuAdjType = 2; } else @@ -8666,7 +8769,7 @@ void btdm_1AntTdmaDurationAdjustForACL(PADAPTER padapter) } else if (pBtdm8723->curPsTdma == 9) { - if (pHalData->bt_coexist.halCoex8723.btInfoExt){ + if ((pHalData->bt_coexist.halCoex8723.btInfoExt) || (pHalData->bt_coexist.halCoex8723.btRssi <= 32)){ pBtdm8723->psTdmaDuAdjType = 9; // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n")); } @@ -8676,7 +8779,7 @@ void btdm_1AntTdmaDurationAdjustForACL(PADAPTER padapter) } else if (pBtdm8723->curPsTdma == 2) { - if (pHalData->bt_coexist.halCoex8723.btInfoExt){ + if ((pHalData->bt_coexist.halCoex8723.btInfoExt) || (pHalData->bt_coexist.halCoex8723.btRssi <=32)){ pBtdm8723->psTdmaDuAdjType = 9; // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n")); } @@ -8855,9 +8958,9 @@ void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter) RTPRINT(FBT, BT_TRACE, ("[BTCoex], WiFi is %s\n", BTDM_IsWifiBusy(padapter)?"Busy":"IDLE")); RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is %s\n", BtStateString[BtState])); - padapter->pwrctrlpriv.btcoex_rfon = _FALSE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _FALSE; - if ((!BTDM_IsWifiBusy(padapter)) &&(check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) != _TRUE)&& + if ((!BTDM_IsWifiBusy(padapter)) &&(BTDM_CheckFWState(padapter, WIFI_AP_STATE) != _TRUE)&& ((BtState == BT_INFO_STATE_NO_CONNECTION) || (BtState == BT_INFO_STATE_CONNECT_IDLE))) { switch (BtState) @@ -8866,7 +8969,7 @@ void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter) _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 9); break; case BT_INFO_STATE_CONNECT_IDLE: - _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 0); + _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 9); break; } } @@ -8898,13 +9001,11 @@ void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter) case BT_INFO_STATE_CONNECT_IDLE: // WiFi is Busy btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 5); - rtw_write32(padapter, 0x6c0, 0x5a5a5a5a); - rtw_write32(padapter, 0x6c4, 0x5a5a5a5a); break; case BT_INFO_STATE_ACL_INQ_OR_PAG: RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is BT_INFO_STATE_ACL_INQ_OR_PAG\n")); case BT_INFO_STATE_INQ_OR_PAG: - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 30); break; case BT_INFO_STATE_SCO_ONLY_BUSY: @@ -8917,14 +9018,17 @@ void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter) btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 23); #else // !BTCOEX_CMCC_TEST btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8); - rtw_write32(padapter, 0x6c0, 0x5a5a5a5a); - rtw_write32(padapter, 0x6c4, 0x5a5a5a5a); #endif // !BTCOEX_CMCC_TEST } break; case BT_INFO_STATE_ACL_ONLY_BUSY: - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; - if (pBtCoex->c2hBtProfile == BT_INFO_HID) + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; + if (!BTDM_IsWifiBusy(padapter)) { + //WiFi LPS + btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 37); + + } + else if (pBtCoex->c2hBtProfile == BT_INFO_HID) { RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is HID\n")); btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 31); @@ -8939,17 +9043,37 @@ void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter) RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP_FTP\n")); btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11); } + else if (pBtCoex->c2hBtProfile == (BT_INFO_A2DP|BT_INFO_HID)) + { + RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP_HID\n")); + btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11); + } + else if (pBtCoex->c2hBtProfile == (BT_INFO_FTP|BT_INFO_HID)) + { + RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is FTP_HID\n")); + btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11); + } else { if (pBtCoex->c2hBtProfile == BT_INFO_A2DP) { RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP\n")); + RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP pBtCoex->AclTp=0x%x lowPriorityTx=%d\n",pBtCoex->AclTp,pHalData->bt_coexist.halCoex8723.lowPriorityTx)); + if(pBtCoex->AclTp > 0x3000 ||pHalData->bt_coexist.halCoex8723.lowPriorityTx >1000) + { + RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP change to A2DP+OPP, pBtCoex->AclTp=0x%x lowPriorityTx=%d\n",pBtCoex->AclTp,pHalData->bt_coexist.halCoex8723.lowPriorityTx)); + btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11); + } + else{ + btdm_1AntTdmaDurationAdjustForACL(padapter); + } } else { RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is UNKNOWN(0x%02X)! Use A2DP Profile\n", pBtCoex->c2hBtProfile)); + btdm_1AntTdmaDurationAdjustForACL(padapter); } - btdm_1AntTdmaDurationAdjustForACL(padapter); + } break; } @@ -9114,7 +9238,7 @@ void btdm_1AntBTStateChangeHandler(PADAPTER padapter, BT_STATE_1ANT oldState, BT btdm_SetFwIgnoreWlanAct(padapter, _FALSE); } - if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) && + if ((BTDM_CheckFWState(padapter, WIFI_STATION_STATE) == _TRUE) && (BTDM_IsWifiConnectionExist(padapter) == _TRUE)) { if ((newState == BT_INFO_STATE_SCO_ONLY_BUSY) || @@ -9185,7 +9309,7 @@ void btdm_1AntBtCoexistHandler(PADAPTER padapter) pHalData = GET_HAL_DATA(padapter); pBtCoex8723 = &pHalData->bt_coexist.halCoex8723; pBtdm8723 = &pBtCoex8723->btdm1Ant; - padapter->pwrctrlpriv.btcoex_rfon = _FALSE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _FALSE; if (BT_IsBtDisabled(padapter) == _TRUE) { RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is disabled\n")); @@ -9403,8 +9527,6 @@ void BTDM_1AntWifiAssociateNotify(PADAPTER padapter, u8 type) (BtState == BT_INFO_STATE_ACL_SCO_BUSY)) { btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8); - rtw_write32(padapter, 0x6c0, 0x5a5a5a5a); - rtw_write32(padapter, 0x6c4, 0x5a5a5a5a); } else if ((BtState == BT_INFO_STATE_ACL_ONLY_BUSY) || (BtState == BT_INFO_STATE_ACL_INQ_OR_PAG)) @@ -9445,7 +9567,7 @@ void BTDM_1AntMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus) if (RT_MEDIA_CONNECT == mstatus) { - if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_STATION_STATE) == _TRUE) { if ((pBtCoex->c2hBtInfo == BT_INFO_STATE_SCO_ONLY_BUSY) || (pBtCoex->c2hBtInfo == BT_INFO_STATE_ACL_SCO_BUSY)) @@ -9454,7 +9576,7 @@ void BTDM_1AntMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus) } } - padapter->pwrctrlpriv.DelayLPSLastTimeStamp = rtw_get_current_time(); + adapter_to_pwrctl(padapter)->DelayLPSLastTimeStamp = rtw_get_current_time(); BTDM_1AntForDhcp(padapter); } else @@ -9486,7 +9608,8 @@ void BTDM_1AntForDhcp(PADAPTER padapter) #if 1 - BTDM_1AntWifiAssociateNotify(padapter, _TRUE); + //BTDM_1AntWifiAssociateNotify(padapter, _TRUE); + RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for DHCP SKIP~~~~~\n")); #else @@ -9509,7 +9632,7 @@ void BTDM_1AntForDhcp(PADAPTER padapter) } else if (BtState == BT_INFO_STATE_ACL_ONLY_BUSY) { - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; if(padapter->securitypriv.ndisencryptstatus != Ndis802_11EncryptionDisabled) { btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 18); @@ -9579,18 +9702,18 @@ void BTDM_1AntWifiScanNotify(PADAPTER padapter, u8 scanType) btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 32); else { - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 33); } } else if (_TRUE == pBtCoex->bC2hBtInquiryPage) { - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 30); } else if (BtState == BT_INFO_STATE_ACL_ONLY_BUSY) { - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; if (pBtCoex->c2hBtProfile == BT_INFO_HID) btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 34); else @@ -9598,7 +9721,7 @@ void BTDM_1AntWifiScanNotify(PADAPTER padapter, u8 scanType) } else { - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 5); } } @@ -9655,6 +9778,10 @@ void BTDM_1AntFwC2hBtInfo8723A(PADAPTER padapter) if (btState == 0x1) { pBtCoex->c2hBtInfo = BT_INFO_STATE_CONNECT_IDLE; + if (pBtCoex->c2hBtProfile) + { + pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_ONLY_BUSY; + } } else if (btState == 0x9) { @@ -9692,28 +9819,26 @@ void BTDM_1AntFwC2hBtInfo8723A(PADAPTER padapter) RTPRINT(FBT, BT_TRACE, ("[BTC2H], %s(%d)\n", BtStateString[pBtCoex->c2hBtInfo], pBtCoex->c2hBtInfo)); - if(pBtCoex->c2hBtProfile != BT_INFO_HID) - pBtCoex->c2hBtProfile &= ~BT_INFO_HID; +// if(pBtCoex->c2hBtProfile != BT_INFO_HID) +// pBtCoex->c2hBtProfile &= ~BT_INFO_HID; } void BTDM_1AntBtCoexist8723A(PADAPTER padapter) { - struct mlme_priv *pmlmepriv; PHAL_DATA_TYPE pHalData; u32 curr_time, delta_time; - pmlmepriv = &padapter->mlmepriv; pHalData = GET_HAL_DATA(padapter); - if (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_SITE_MONITOR) == _TRUE) { // already done in BTDM_1AntForScan() RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under scan progress!!\n")); return; } - if (check_fwstate(pmlmepriv, WIFI_UNDER_LINKING) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_UNDER_LINKING) == _TRUE) { RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under link progress!!\n")); return; @@ -9721,7 +9846,7 @@ void BTDM_1AntBtCoexist8723A(PADAPTER padapter) // under DHCP(Special packet) curr_time = rtw_get_current_time(); - delta_time = curr_time - padapter->pwrctrlpriv.DelayLPSLastTimeStamp; + delta_time = curr_time - adapter_to_pwrctl(padapter)->DelayLPSLastTimeStamp; delta_time = rtw_systime_to_ms(delta_time); if (delta_time < 500) // 500ms { @@ -10321,8 +10446,8 @@ void btdm_2AntCoexTable( PADAPTER padapter,u32 val0x6c0,u32 val0x6c8,u8 val0x6cc PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant; - RTPRINT(FBT, BT_TRACE, ("[BTCoex], write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", - val0x6c0, val0x6c8, val0x6cc)); +// RTPRINT(FBT, BT_TRACE, ("[BTCoex], write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", +// val0x6c0, val0x6c8, val0x6cc)); pBtdm8723->curVal0x6c0 = val0x6c0; pBtdm8723->curVal0x6c8 = val0x6c8; pBtdm8723->curVal0x6cc = val0x6cc; @@ -10361,6 +10486,33 @@ void btdm_2AntIgnoreWlanAct(PADAPTER padapter,u8 bEnable) btdm_SetFwIgnoreWlanAct(padapter,bEnable); pBtdm8723->bPreIgnoreWlanAct = pBtdm8723->bCurIgnoreWlanAct; } +void btdm_2AntSetTable(PADAPTER padapter,u8 byte){ + u8 value; + u32 val0x6c0,val0x6c4; + value =(byte&(BIT4|BIT3))>>3; + + switch(value){ + case 0: + val0x6c0=0x55555555; + val0x6c4=0x55555555; + break; + case 1: + val0x6c0=0x55555555; + val0x6c4=0x5afa5afa; + break; + case 2: + val0x6c0=0x55ff55ff; + val0x6c4=0x5a5a5a5a; + break; + case 3: + val0x6c0=0x55ff55ff; + val0x6c4=0x5afa5afa; + break; + } + RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6c0=0x%x 0x6c4=0x%x\n", val0x6c0, val0x6c4)); + rtw_write32(padapter, 0x6c0, val0x6c0); + rtw_write32(padapter, 0x6c4, val0x6c4); +} void btdm_2AntSetFw3a(PADAPTER padapter,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5) { @@ -10391,6 +10543,7 @@ void btdm_2AntSetFw3a(PADAPTER padapter,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); FillH2CCmd(padapter, 0x3a, 5, H2C_Parameter); + btdm_2AntSetTable(padapter,byte5); // Driver need to set the Coex Table value after FW version 35. } void btdm_2AntPsTdma(PADAPTER padapter,u8 bTurnOn,u8 type) @@ -10434,64 +10587,64 @@ void btdm_2AntPsTdma(PADAPTER padapter,u8 bTurnOn,u8 type) { case 1: default: - btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xe1, 0x98); break; case 2: - btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xe1, 0x98); break; case 3: - btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xe1, 0x98); break; case 4: - btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0xa1, 0x80); + btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0xe1, 0x80); break; case 5: - btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x60, 0x98); break; case 6: - btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x60, 0x98); break; case 7: - btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x60, 0x98); break; case 8: - btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0x20, 0x80); + btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0x60, 0x80); break; case 9: - btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xe1, 0x98); break; case 10: - btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xe1, 0x98); break; case 11: - btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xe1, 0x98); break; case 12: - btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xe1, 0x98); break; case 13: - btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x60, 0x98); break; case 14: - btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x60, 0x98); break; case 15: - btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x60, 0x98); break; case 16: - btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0x60, 0x98); break; case 17: - btdm_2AntSetFw3a(padapter, 0xa3, 0x2f, 0x2f, 0x20, 0x80); + btdm_2AntSetFw3a(padapter, 0xa3, 0x2f, 0x2f, 0x60, 0x80); break; case 18: - btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xe1, 0x98); break; case 19: - btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0xe1, 0x98); break; case 20: - btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0x60, 0x98); break; } } @@ -10572,11 +10725,11 @@ u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter) PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant; u8 bCommon=_FALSE; - RTPRINT(FBT, BT_TRACE, ("%s :BTDM_IsWifiConnectionExist =%x check_fwstate=%x pmlmepriv->fw_state=0x%x\n",__func__,BTDM_IsWifiConnectionExist(padapter),check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING)),padapter->mlmepriv.fw_state)); + RTPRINT(FBT, BT_TRACE, ("%s :BTDM_IsWifiConnectionExist =%x BTDM_CheckFWState=%x pmlmepriv->fw_state=0x%x\n",__func__,BTDM_IsWifiConnectionExist(padapter),BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING)),padapter->mlmepriv.fw_state)); // if(!BTDM_IsWifiBusy(padapter) && - if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& + if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& (BT_2ANT_BT_STATUS_IDLE == pBtdm8723->btStatus) ) { RTPRINT(FBT, BT_TRACE, ("Wifi idle + Bt idle!!\n")); @@ -10597,7 +10750,7 @@ u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter) bCommon = _TRUE; } // else if( BTDM_IsWifiBusy(padapter) && - else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&& + else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&& (BT_2ANT_BT_STATUS_IDLE == pBtdm8723->btStatus) ) { RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + BT idle!!\n")); @@ -10618,7 +10771,7 @@ u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter) bCommon = _TRUE; } // else if(!BTDM_IsWifiBusy(padapter) && - else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& + else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& (BT_2ANT_BT_STATUS_CONNECTED_IDLE == pBtdm8723->btStatus) ) { RTPRINT(FBT, BT_TRACE, ("Wifi idle + Bt connected idle!!\n")); @@ -10639,7 +10792,7 @@ u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter) bCommon = _TRUE; } // else if(BTDM_IsWifiBusy(padapter) && - else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&& + else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&& (BT_2ANT_BT_STATUS_CONNECTED_IDLE == pBtdm8723->btStatus) ) { RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + Bt connected idle!!\n")); @@ -10660,7 +10813,7 @@ u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter) bCommon = _TRUE; } // else if(!BTDM_IsWifiBusy(padapter) && - else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& + else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& (BT_2ANT_BT_STATUS_NON_IDLE == pBtdm8723->btStatus) ) { RTPRINT(FBT, BT_TRACE, ("Wifi idle + BT non-idle!!\n")); @@ -11573,7 +11726,7 @@ void btdm_2AntTdmaDurationAdjust(PADAPTER padapter,u8 bScoHid,u8 bTxPause,u8 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", pBtdm8723->curPsTdma, pBtdm8723->psTdmaDuAdjType)); - if( check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _FALSE ) + if( BTDM_CheckFWState(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _FALSE ) { btdm_2AntPsTdma(padapter, _TRUE, pBtdm8723->psTdmaDuAdjType); } @@ -13362,6 +13515,22 @@ u8 btdm_BtWifiAntNum(PADAPTER padapter) return Ant_x2; } +u8 btdm_GetBtState(PADAPTER padapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723; + + return pBtCoex->c2hBtInfo; +} + +u8 btdm_IsBtInquiryPage(PADAPTER padapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723; + + return pBtCoex->bC2hBtInquiryPage; +} + void btdm_BtHwCountersMonitor(PADAPTER padapter) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); @@ -13580,7 +13749,7 @@ void BTDM_SetFwChnlInfo(PADAPTER padapter, RT_MEDIA_STATUS mstatus) H2C_Parameter[0] = 0x1; // 0: disconnected, 1:connected } - if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_ASOC_STATE) == _TRUE) { // channel chnl = pmlmeext->cur_channel; @@ -13619,7 +13788,10 @@ void BTDM_SetFwChnlInfo(PADAPTER padapter, RT_MEDIA_STATUS mstatus) // RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x19=0x%x\n", // H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); - FillH2CCmd(padapter, 0x19, 3, H2C_Parameter); + if (btdm_BtWifiAntNum(padapter) == Ant_x2) + { + FillH2CCmd(padapter, 0x19, 3, H2C_Parameter); + } } u8 BTDM_IsWifiConnectionExist(PADAPTER padapter) @@ -13630,8 +13802,21 @@ u8 BTDM_IsWifiConnectionExist(PADAPTER padapter) if (BTHCI_HsConnectionEstablished(padapter)) bRet = _TRUE; - if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE) +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->pbuddy_adapter != NULL) + { + if ((BTDM_CheckFWState(padapter, WIFI_ASOC_STATE) == _TRUE) || (BTDM_CheckFWState(padapter->pbuddy_adapter, WIFI_ASOC_STATE) == _TRUE)) + bRet = _TRUE; + } + else + { + if (BTDM_CheckFWState(padapter, WIFI_ASOC_STATE) == _TRUE) + bRet = _TRUE; + } +#else + if (BTDM_CheckFWState(padapter, WIFI_ASOC_STATE) == _TRUE) bRet = _TRUE; +#endif return bRet; } @@ -13649,7 +13834,7 @@ void BTDM_SetFw3a( if (BTDM_1Ant8723A(padapter) == _TRUE) { - if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _FALSE) && + if ((BTDM_CheckFWState(padapter, WIFI_STATION_STATE) == _FALSE) && (get_fwstate(&padapter->mlmepriv) != WIFI_NULL_STATE)) // for softap mode { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); @@ -13859,6 +14044,7 @@ void BTDM_FwC2hBtInfo8723A(PADAPTER padapter, u8 *tmpBuf, u8 length) RTPRINT(FBT, BT_TRACE, ("[BTC2H], BT info[%d]=[", length)); pBtCoex->btRetryCnt = 0; + pBtCoex->AclTp=0; for (i=0; ibtInfoExt=tmpBuf[i]&BIT(0); + pBtCoex->btInfoExt=tmpBuf[i]&BIT(0); //EDR_BR break; + case 4: + pBtCoex->AclTp=tmpBuf[i]; + break; + case 5: + pBtCoex->AclTp |=(tmpBuf[i]<<8); + break; } if (i == length-1) @@ -14328,6 +14520,16 @@ void BTDM_BTCoexist8723A(PADAPTER padapter) BTDM_QueryBtInformation(padapter); } +u8 BTDM_GetBtState8723A(PADAPTER padapter) +{ + return btdm_GetBtState(padapter); +} + +u8 BTDM_IsBtInquiryPage8723A(PADAPTER padapter) +{ + return btdm_IsBtInquiryPage(padapter); +} + // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc8723.c ===== #endif @@ -15239,7 +15441,7 @@ void BTDM_CheckBTIdleChange1Ant(PADAPTER padapter) MgntIsLinkInProgress(pMgntInfo) || MgntScanInProgress(pMgntInfo)) #else - if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _TRUE) #endif { BTDM_SetAntenna(padapter, BTDM_ANT_WIFI); @@ -18164,16 +18366,14 @@ void BTDM_CheckWiFiState(PADAPTER padapter) s32 BTDM_GetRxSS(PADAPTER padapter) { // PMGNT_INFO pMgntInfo = &padapter->MgntInfo; - struct mlme_priv *pmlmepriv; PHAL_DATA_TYPE pHalData; s32 UndecoratedSmoothedPWDB = 0; - pmlmepriv = &padapter->mlmepriv; pHalData = GET_HAL_DATA(padapter); // if (pMgntInfo->bMediaConnect) // Default port - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + if (BTDM_CheckFWState(padapter, _FW_LINKED) == _TRUE) { UndecoratedSmoothedPWDB = GET_UNDECORATED_AVERAGE_RSSI(padapter); } @@ -18189,16 +18389,14 @@ s32 BTDM_GetRxSS(PADAPTER padapter) s32 BTDM_GetRxBeaconSS(PADAPTER padapter) { // PMGNT_INFO pMgntInfo = &padapter->MgntInfo; - struct mlme_priv *pmlmepriv; PHAL_DATA_TYPE pHalData; s32 pwdbBeacon = 0; - pmlmepriv = &padapter->mlmepriv; pHalData = GET_HAL_DATA(padapter); // if (pMgntInfo->bMediaConnect) // Default port - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + if (BTDM_CheckFWState(padapter, _FW_LINKED) == _TRUE) { //pwdbBeacon = pHalData->dmpriv.UndecoratedSmoothedBeacon; pwdbBeacon= pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB; @@ -18666,7 +18864,7 @@ u8 BTDM_DisableEDCATurbo(PADAPTER padapter) if ((pHalData->bt_coexist.last_aggr_num != aggr_num) || !pHalData->bt_coexist.bEDCAInitialized) { RTPRINT(FBT, BT_TRACE, ("BT write AGGR NUM = 0x%x\n", aggr_num)); - rtw_write16(padapter, REG_MAX_AGGR_NUM, aggr_num); + rtw_write8(padapter, REG_MAX_AGGR_NUM, aggr_num); pHalData->bt_coexist.last_aggr_num = aggr_num; } } @@ -18893,7 +19091,7 @@ void BTDM_TurnOffBtCoexistBeforeEnterLPS(PADAPTER padapter) PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt; PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); // PRT_POWER_SAVE_CONTROL pPSC = GET_POWER_SAVE_CONTROL(pMgntInfo); - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); // Add temporarily. @@ -18928,7 +19126,7 @@ void BTDM_TurnOffBtCoexistBeforeEnterIPS(PADAPTER padapter) PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt; PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); // PRT_POWER_SAVE_CONTROL pPSC = GET_POWER_SAVE_CONTROL(pMgntInfo); - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); if (!pHalData->bt_coexist.BluetoothCoexist) return; @@ -19008,6 +19206,9 @@ void dm_CheckBTState(_adapter *pAdapter) rtw_write8(pAdapter, 0xf6, value); rtw_write8(pAdapter, 0x3A, 0x31); } + else{ + return; + } regvalue32 = rtw_read32(pAdapter, 0xc0); //DBG_871X("Get 0xc0 = 0x%x\n",regvalue32); @@ -19016,6 +19217,9 @@ void dm_CheckBTState(_adapter *pAdapter) value |= 0x4; rtw_write8(pAdapter, 0xcc, value); } + else{ + return; + } regValue8 = rtw_read8(pAdapter, 0x6b); //0x6b[28] //DBG_871X("Get 0x6b = 0x%x\n",regValue8); @@ -19042,6 +19246,7 @@ void check_bt_status_work(void *data) { struct delayed_work *dwork; PADAPTER padapter; + struct pwrctrl_priv *pwrpriv ; dwork = container_of(data, struct delayed_work, work); padapter = container_of(dwork, struct _ADAPTER, checkbt_work); @@ -19051,7 +19256,9 @@ void check_bt_status_work(void *data) return; }; - dm_CheckBTState(padapter); + pwrpriv = adapter_to_pwrctl(padapter); + if (pwrpriv->bInSuspend == _FALSE) + dm_CheckBTState(padapter); } #endif void BTDM_Coexist(PADAPTER padapter) @@ -19261,8 +19468,33 @@ u8 BTDM_IsWifiBusy(PADAPTER padapter) PBT30Info pBTInfo = GET_BT_INFO(padapter); PBT_TRAFFIC pBtTraffic = &pBTInfo->BtTraffic; +#ifdef CONFIG_CONCURRENT_MODE + struct mlme_priv *pbuddy_mlmepriv; + + if (padapter->pbuddy_adapter != NULL) + { + pbuddy_mlmepriv = &(padapter->pbuddy_adapter->mlmepriv); + +#if 1 + if ((btdm_BtWifiAntNum(padapter) == Ant_x1) && ((BT_IsBtDisabled(padapter) == _TRUE) || ((BT_IsBtDisabled(padapter) == _FALSE && (BT_GetBtState(padapter) <= BT_INFO_STATE_CONNECT_IDLE))))) + { + if (((padapter->iface_type == IFACE_PORT0) && (check_fwstate(pbuddy_mlmepriv, _FW_LINKED) == _TRUE)) || + ((padapter->iface_type == IFACE_PORT1) && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE))) + return _TRUE; + } +#endif + + if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > WIFI_BUSY_TRAFFIC_TH ||pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > WIFI_BUSY_TRAFFIC_TH || + pbuddy_mlmepriv->LinkDetectInfo.NumRxOkInPeriod > WIFI_BUSY_TRAFFIC_TH || pbuddy_mlmepriv->LinkDetectInfo.NumTxOkInPeriod > WIFI_BUSY_TRAFFIC_TH || + pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic || + pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic) + return _TRUE; + else + return _FALSE; + } +#endif - if (pmlmepriv->LinkDetectInfo.bBusyTraffic || + if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > WIFI_BUSY_TRAFFIC_TH ||pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > WIFI_BUSY_TRAFFIC_TH || pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic || pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic) return _TRUE; @@ -19707,6 +19939,25 @@ u8 BTDM_IsBtDisabled(PADAPTER padapter) return _FALSE; } +sint BTDM_CheckFWState(PADAPTER padapter, sint state) +{ + if (check_fwstate(&padapter->mlmepriv, state) == _FALSE) + { +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->pbuddy_adapter != NULL) + { + if (check_fwstate(&padapter->pbuddy_adapter->mlmepriv, state) == _TRUE) + { + return _TRUE; + } + } +#endif + return _FALSE; + } + + return _TRUE; +} + //============================================ // Started with "WA_" means this is a work around function. // Because fw need to count bt HW counters diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_cmd.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_cmd.c index ce088bc86590..47e8c631f46f 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_cmd.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_cmd.c @@ -1,1159 +1,1185 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8723A_CMD_C_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - - -#define RTL92C_MAX_H2C_BOX_NUMS 4 -#define RTL92C_MAX_CMD_LEN 5 -#define MESSAGE_BOX_SIZE 4 -#define EX_MESSAGE_BOX_SIZE 2 - - -static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 msgbox_num) -{ - u8 read_down = _FALSE; - int retry_cnts = 100; - - u8 valid; - - //DBG_8192C(" _is_fw_read_cmd_down ,reg_1cc(%x),msg_box(%d)...\n",rtw_read8(padapter,REG_HMETFR),msgbox_num); - - do{ - valid = rtw_read8(padapter,REG_HMETFR) & BIT(msgbox_num); - if(0 == valid ){ - read_down = _TRUE; - } - }while( (!read_down) && (retry_cnts--)); - - return read_down; - -} - - -/***************************************** -* H2C Msg format : -*| 31 - 8 |7 | 6 - 0 | -*| h2c_msg |Ext_bit |CMD_ID | -* -******************************************/ -s32 FillH2CCmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer) -{ - u8 bcmd_down = _FALSE; - s32 retry_cnts = 100; - u8 h2c_box_num; - u32 msgbox_addr; - u32 msgbox_ex_addr; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u32 h2c_cmd = 0; - u16 h2c_cmd_ex = 0; - s32 ret = _FAIL; - -_func_enter_; - - padapter = GET_PRIMARY_ADAPTER(padapter); - pHalData = GET_HAL_DATA(padapter); - - _enter_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); - - if (!pCmdBuffer) { - goto exit; - } - if (CmdLen > RTL92C_MAX_CMD_LEN) { - goto exit; - } - if (padapter->bSurpriseRemoved == _TRUE) - goto exit; - - //pay attention to if race condition happened in H2C cmd setting. - do{ - h2c_box_num = pHalData->LastHMEBoxNum; - - if(!_is_fw_read_cmd_down(padapter, h2c_box_num)){ - DBG_8192C(" fw read cmd failed...\n"); - goto exit; - } - - if(CmdLen<=3) - { - _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen ); - } - else{ - _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer, EX_MESSAGE_BOX_SIZE); - _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer+2,( CmdLen-EX_MESSAGE_BOX_SIZE)); - *(u8*)(&h2c_cmd) |= BIT(7); - } - - *(u8*)(&h2c_cmd) |= ElementID; - - if(h2c_cmd & BIT(7)){ - msgbox_ex_addr = REG_HMEBOX_EXT_0 + (h2c_box_num *EX_MESSAGE_BOX_SIZE); - h2c_cmd_ex = le16_to_cpu( h2c_cmd_ex ); - rtw_write16(padapter, msgbox_ex_addr, h2c_cmd_ex); - } - msgbox_addr =REG_HMEBOX_0 + (h2c_box_num *MESSAGE_BOX_SIZE); - h2c_cmd = le32_to_cpu( h2c_cmd ); - rtw_write32(padapter,msgbox_addr, h2c_cmd); - - bcmd_down = _TRUE; - - // DBG_8192C("MSG_BOX:%d,CmdLen(%d), reg:0x%x =>h2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" - // ,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex); - - pHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL92C_MAX_H2C_BOX_NUMS; - - }while((!bcmd_down) && (retry_cnts--)); - - ret = _SUCCESS; - -exit: - - _exit_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); - -_func_exit_; - - return ret; -} - -u8 rtl8192c_h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) -{ - u8 ElementID, CmdLen; - u8 *pCmdBuffer; - struct cmd_msg_parm *pcmdmsg; - - if(!pbuf) - return H2C_PARAMETERS_ERROR; - - pcmdmsg = (struct cmd_msg_parm*)pbuf; - ElementID = pcmdmsg->eid; - CmdLen = pcmdmsg->sz; - pCmdBuffer = pcmdmsg->buf; - - FillH2CCmd(padapter, ElementID, CmdLen, pCmdBuffer); - - return H2C_SUCCESS; -} - -#if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) -u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter *padapter ,u8 bfwpoll, u16 period) -{ - u8 res=_SUCCESS; - struct H2C_SS_RFOFF_PARAM param; - DBG_8192C("==>%s bfwpoll(%x)\n",__FUNCTION__,bfwpoll); - param.gpio_period = period;//Polling GPIO_11 period time - param.ROFOn = (_TRUE == bfwpoll)?1:0; - FillH2CCmd(padapter, SELECTIVE_SUSPEND_ROF_CMD, sizeof(param), (u8*)(¶m)); - return res; -} -#endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED - -u8 rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param) -{ - u8 res=_SUCCESS; - -_func_enter_; - - *((u32*) param ) = cpu_to_le32( *((u32*) param ) ); - - FillH2CCmd(padapter, RSSI_SETTING_EID, 3, param); - -_func_exit_; - - return res; -} - -u8 rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg) -{ - u8 buf[5]; - u8 res=_SUCCESS; - -_func_enter_; - - _rtw_memset(buf, 0, 5); - mask = cpu_to_le32( mask ); - _rtw_memcpy(buf, &mask, 4); - buf[4] = arg; - - FillH2CCmd(padapter, MACID_CONFIG_EID, 5, buf); - -_func_exit_; - - return res; - -} - -//bitmap[0:27] = tx_rate_bitmap -//bitmap[28:31]= Rate Adaptive id -//arg[0:4] = macid -//arg[5] = Short GI -void rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg, u8 rssi_level) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - u8 macid = arg&0x1f; - -#ifdef CONFIG_ODM_REFRESH_RAMASK - u8 raid = (bitmap>>28) & 0x0f; - -#ifdef CONFIG_CONCURRENT_MODE - if(rtw_buddy_adapter_up(pAdapter) && pAdapter->adapter_type > PRIMARY_ADAPTER) - pHalData = GET_HAL_DATA(pAdapter->pbuddy_adapter); -#endif //CONFIG_CONCURRENT_MODE - - bitmap &=0x0fffffff; - if(rssi_level != DM_RATR_STA_INIT) - bitmap = ODM_Get_Rate_Bitmap(&pHalData->odmpriv, macid, bitmap, rssi_level); - - bitmap |= ((raid<<28)&0xf0000000); -#endif //CONFIG_ODM_REFRESH_RAMASK - - - if(pHalData->fw_ractrl == _TRUE) - { - rtl8192c_set_raid_cmd(pAdapter, bitmap, arg); - } - else - { - u8 init_rate, shortGIrate=_FALSE; - - init_rate = get_highest_rate_idx(bitmap&0x0fffffff)&0x3f; - - - shortGIrate = (arg&BIT(5)) ? _TRUE:_FALSE; - - if (shortGIrate==_TRUE) - init_rate |= BIT(6); - - rtw_write8(pAdapter, (REG_INIDATA_RATE_SEL+macid), (u8)init_rate); - } - -} - -void rtl8723a_set_FwPwrMode_cmd(PADAPTER padapter, u8 Mode) -{ - SETPWRMODE_PARM H2CSetPwrMode; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - -_func_enter_; - - DBG_871X("%s: Mode=%d SmartPS=%d UAPSD=%d BcnMode=0x%02x\n", __FUNCTION__, - Mode, pwrpriv->smart_ps, padapter->registrypriv.uapsd_enable, pwrpriv->bcn_ant_mode); - - H2CSetPwrMode.Mode = Mode; - H2CSetPwrMode.SmartPS = pwrpriv->smart_ps; - H2CSetPwrMode.AwakeInterval = 1; - H2CSetPwrMode.bAllQueueUAPSD = padapter->registrypriv.uapsd_enable; - H2CSetPwrMode.BcnAntMode = pwrpriv->bcn_ant_mode; - - FillH2CCmd(padapter, SET_PWRMODE_EID, sizeof(H2CSetPwrMode), (u8 *)&H2CSetPwrMode); - -_func_exit_; -} - -void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 rate_len, pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - - //DBG_871X("%s\n", __FUNCTION__); - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); - - SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); - //pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_BEACON); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); - - //timestamp will be inserted by hardware - pframe += 8; - pktlen += 8; - - // beacon interval: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pktlen += 2; - - // capability info: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pktlen += 2; - - if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - //DBG_871X("ie len=%d\n", cur_network->IELength); - pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs); - _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen); - - goto _ConstructBeacon; - } - - //below for ad-hoc mode - - // SSID - pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen); - - // supported rates... - rate_len = rtw_get_rateset_len(cur_network->SupportedRates); - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen); - - // DS parameter set - pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen); - - if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - u32 ATIMWindow; - // IBSS Parameter Set... - //ATIMWindow = cur->Configuration.ATIMWindow; - ATIMWindow = 0; - pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen); - } - - - //todo: ERP IE - - - // EXTERNDED SUPPORTED RATE - if (rate_len > 8) - { - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen); - } - - - //todo:HT for adhoc - -_ConstructBeacon: - - if ((pktlen + TXDESC_SIZE) > 512) - { - DBG_871X("beacon frame too large\n"); - return; - } - - *pLength = pktlen; - - //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen); - -} - -void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //DBG_871X("%s\n", __FUNCTION__); - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - // Frame control. - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - SetPwrMgt(fctrl); - SetFrameSubType(pframe, WIFI_PSPOLL); - - // AID. - SetDuration(pframe, (pmlmeinfo->aid | 0xc000)); - - // BSSID. - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - // TA. - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - - *pLength = 16; -} - -void ConstructNullFunctionData( - PADAPTER padapter, - u8 *pframe, - u32 *pLength, - u8 *StaAddr, - u8 bQoS, - u8 AC, - u8 bEosp, - u8 bForcePowerSave) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 pktlen; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &pmlmepriv->cur_network; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - - //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave); - - pwlanhdr = (struct rtw_ieee80211_hdr*)pframe; - - fctrl = &pwlanhdr->frame_ctl; - *(fctrl) = 0; - if (bForcePowerSave) - { - SetPwrMgt(fctrl); - } - - switch(cur_network->network.InfrastructureMode) - { - case Ndis802_11Infrastructure: - SetToDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN); - break; - case Ndis802_11APMode: - SetFrDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); - break; - case Ndis802_11IBSS: - default: - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - break; - } - - SetSeqNum(pwlanhdr, 0); - - if (bQoS == _TRUE) { - struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr; - - SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); - - pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe; - SetPriority(&pwlanqoshdr->qc, AC); - SetEOSP(&pwlanqoshdr->qc, bEosp); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); - } else { - SetFrameSubType(pframe, WIFI_DATA_NULL); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - } - - *pLength = pktlen; -} - -void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u8 *mac, *bssid; - u32 pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - - - //DBG_871X("%s\n", __FUNCTION__); - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - mac = myid(&(padapter->eeprompriv)); - bssid = cur_network->MacAddress; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); - - SetSeqNum(pwlanhdr, 0); - SetFrameSubType(fctrl, WIFI_PROBERSP); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - pframe += pktlen; - - if(cur_network->IELength>MAX_IE_SZ) - return; - - _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); - pframe += cur_network->IELength; - pktlen += cur_network->IELength; - - *pLength = pktlen; -} - -// To check if reserved page content is destroyed by beacon beacuse beacon is too large. -// 2010.06.23. Added by tynli. -VOID -CheckFwRsvdPageContent( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter); - u32 MaxBcnPageNum; - - if(pHalData->FwRsvdPageStartOffset != 0) - { - /*MaxBcnPageNum = PageNum_128(pMgntInfo->MaxBeaconSize); - RT_ASSERT((MaxBcnPageNum <= pHalData->FwRsvdPageStartOffset), - ("CheckFwRsvdPageContent(): The reserved page content has been"\ - "destroyed by beacon!!! MaxBcnPageNum(%d) FwRsvdPageStartOffset(%d)\n!", - MaxBcnPageNum, pHalData->FwRsvdPageStartOffset));*/ - } -} - -// -// Description: Fill the reserved packets that FW will use to RSVD page. -// Now we just send 4 types packet to rsvd page. -// (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp. -// Input: -// bDLFinished - FALSE: At the first time we will send all the packets as a large packet to Hw, -// so we need to set the packet length to total lengh. -// TRUE: At the second time, we should send the first packet (default:beacon) -// to Hw again and set the lengh in descriptor to the real beacon lengh. -// 2009.10.15 by tynli. -static void SetFwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished) -{ - PHAL_DATA_TYPE pHalData; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv; - struct mlme_ext_priv *pmlmeext; - struct mlme_ext_info *pmlmeinfo; - u32 BeaconLength, ProbeRspLength, PSPollLength; - u32 NullDataLength, QosNullLength, BTQosNullLength; - u8 *ReservedPagePacket; - u8 PageNum, PageNeed, TxDescLen; - u16 BufIndex; - u32 TotalPacketLen; - RSVDPAGE_LOC RsvdPageLoc; - - - DBG_871X("%s\n", __FUNCTION__); - - ReservedPagePacket = (u8*)rtw_zmalloc(1000); - if (ReservedPagePacket == NULL) { - DBG_871X("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__); - return; - } - - pHalData = GET_HAL_DATA(padapter); - pxmitpriv = &padapter->xmitpriv; - pmlmeext = &padapter->mlmeextpriv; - pmlmeinfo = &pmlmeext->mlmext_info; - - TxDescLen = TXDESC_SIZE; - PageNum = 0; - - //3 (1) beacon - BufIndex = TXDESC_OFFSET; - ConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BeaconLength); - - // When we count the first page size, we need to reserve description size for the RSVD - // packet, it will be filled in front of the packet in TXPKTBUF. - PageNeed = (u8)PageNum_128(TxDescLen + BeaconLength); - // To reserved 2 pages for beacon buffer. 2010.06.24. - if (PageNeed == 1) - PageNeed += 1; - PageNum += PageNeed; - pHalData->FwRsvdPageStartOffset = PageNum; - - BufIndex += PageNeed*128; - - //3 (2) ps-poll - RsvdPageLoc.LocPsPoll = PageNum; - ConstructPSPoll(padapter, &ReservedPagePacket[BufIndex], &PSPollLength); - rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE, _FALSE); - - PageNeed = (u8)PageNum_128(TxDescLen + PSPollLength); - PageNum += PageNeed; - - BufIndex += PageNeed*128; - - //3 (3) null data - RsvdPageLoc.LocNullData = PageNum; - ConstructNullFunctionData( - padapter, - &ReservedPagePacket[BufIndex], - &NullDataLength, - get_my_bssid(&pmlmeinfo->network), - _FALSE, 0, 0, _FALSE); - rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], NullDataLength, _FALSE, _FALSE); - - PageNeed = (u8)PageNum_128(TxDescLen + NullDataLength); - PageNum += PageNeed; - - BufIndex += PageNeed*128; - - //3 (4) probe response - RsvdPageLoc.LocProbeRsp = PageNum; - ConstructProbeRsp( - padapter, - &ReservedPagePacket[BufIndex], - &ProbeRspLength, - get_my_bssid(&pmlmeinfo->network), - _FALSE); - rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], ProbeRspLength, _FALSE, _FALSE); - - PageNeed = (u8)PageNum_128(TxDescLen + ProbeRspLength); - PageNum += PageNeed; - - BufIndex += PageNeed*128; - - //3 (5) Qos null data - RsvdPageLoc.LocQosNull = PageNum; - ConstructNullFunctionData( - padapter, - &ReservedPagePacket[BufIndex], - &QosNullLength, - get_my_bssid(&pmlmeinfo->network), - _TRUE, 0, 0, _FALSE); - rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], QosNullLength, _FALSE, _FALSE); - - PageNeed = (u8)PageNum_128(TxDescLen + QosNullLength); - PageNum += PageNeed; - - BufIndex += PageNeed*128; - - //3 (6) BT Qos null data - RsvdPageLoc.LocBTQosNull = PageNum; - ConstructNullFunctionData( - padapter, - &ReservedPagePacket[BufIndex], - &BTQosNullLength, - get_my_bssid(&pmlmeinfo->network), - _TRUE, 0, 0, _FALSE); - rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE); - - TotalPacketLen = BufIndex + BTQosNullLength; - - pmgntframe = alloc_mgtxmitframe(pxmitpriv); - if (pmgntframe == NULL) - goto exit; - - // update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->qsel = 0x10; - pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TXDESC_OFFSET; - _rtw_memcpy(pmgntframe->buf_addr, ReservedPagePacket, TotalPacketLen); - - rtw_hal_mgnt_xmit(padapter, pmgntframe); - - DBG_871X("%s: Set RSVD page location to Fw\n", __FUNCTION__); - FillH2CCmd(padapter, RSVD_PAGE_EID, sizeof(RsvdPageLoc), (u8*)&RsvdPageLoc); - -exit: - rtw_mfree(ReservedPagePacket, 1000); -} - -void rtl8723a_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus) -{ - JOINBSSRPT_PARM JoinBssRptParm; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - -_func_enter_; - - DBG_871X("%s mstatus(%x)\n", __FUNCTION__,mstatus); - - if(mstatus == 1) - { - BOOLEAN bRecover = _FALSE; - u8 v8; - - // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. - // Suggested by filen. Added by tynli. - rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); - // Do not set TSF again here or vWiFi beacon DMA INT will not work. - //correct_TSF(padapter, pmlmeext); - // Hw sequende enable by dedault. 2010.06.23. by tynli. - //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF)); - //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); - - // set REG_CR bit 8 - v8 = rtw_read8(padapter, REG_CR+1); - v8 |= BIT(0); // ENSWBCN - rtw_write8(padapter, REG_CR+1, v8); - - // Disable Hw protection for a time which revserd for Hw sending beacon. - // Fix download reserved page packet fail that access collision with the protection time. - // 2010.05.11. Added by tynli. -// SetBcnCtrlReg(padapter, 0, BIT(3)); -// SetBcnCtrlReg(padapter, BIT(4), 0); - SetBcnCtrlReg(padapter, BIT(4), BIT(3)); - - // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. - if (pHalData->RegFwHwTxQCtrl & BIT(6)) - bRecover = _TRUE; - - // To tell Hw the packet is not a real beacon frame. - //U1bTmp = rtw_read8(padapter, REG_FWHW_TXQ_CTRL+2); - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl & ~BIT(6)); - pHalData->RegFwHwTxQCtrl &= ~BIT(6); - SetFwRsvdPagePkt(padapter, 0); - - // 2010.05.11. Added by tynli. -// SetBcnCtrlReg(padapter, BIT3, 0); -// SetBcnCtrlReg(padapter, 0, BIT4); - SetBcnCtrlReg(padapter, BIT(3), BIT(4)); - - // To make sure that if there exists an adapter which would like to send beacon. - // If exists, the origianl value of 0x422[6] will be 1, we should check this to - // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause - // the beacon cannot be sent by HW. - // 2010.06.23. Added by tynli. - if(bRecover) - { - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl | BIT(6)); - pHalData->RegFwHwTxQCtrl |= BIT(6); - } - - // Clear CR[8] or beacon packet will not be send to TxBuf anymore. - v8 = rtw_read8(padapter, REG_CR+1); - v8 &= ~BIT(0); // ~ENSWBCN - rtw_write8(padapter, REG_CR+1, v8); - } - - JoinBssRptParm.OpMode = mstatus; - - FillH2CCmd(padapter, JOINBSS_RPT_EID, sizeof(JoinBssRptParm), (u8 *)&JoinBssRptParm); - -_func_exit_; -} - -#ifdef CONFIG_BT_COEXIST -static void SetFwRsvdPagePkt_BTCoex(PADAPTER padapter) -{ - PHAL_DATA_TYPE pHalData; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv; - struct mlme_ext_priv *pmlmeext; - struct mlme_ext_info *pmlmeinfo; - u8 fakemac[6]={0x00,0xe0,0x4c,0x00,0x00,0x00}; - u32 BeaconLength, ProbeRspLength, PSPollLength; - u32 NullDataLength, QosNullLength, BTQosNullLength; - u8 *ReservedPagePacket; - u8 PageNum, PageNeed, TxDescLen; - u16 BufIndex; - u32 TotalPacketLen; - RSVDPAGE_LOC RsvdPageLoc; - - - DBG_871X("+%s\n", __FUNCTION__); - - ReservedPagePacket = (u8*)rtw_zmalloc(1024); - if (ReservedPagePacket == NULL) { - DBG_871X("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__); - return; - } - - pHalData = GET_HAL_DATA(padapter); - pxmitpriv = &padapter->xmitpriv; - pmlmeext = &padapter->mlmeextpriv; - pmlmeinfo = &pmlmeext->mlmext_info; - - TxDescLen = TXDESC_SIZE; - PageNum = 0; - - //3 (1) beacon - BufIndex = TXDESC_OFFSET; -#if 0 - ConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BeaconLength); - - // When we count the first page size, we need to reserve description size for the RSVD - // packet, it will be filled in front of the packet in TXPKTBUF. - PageNeed = (u8)PageNum_128(TxDescLen + BeaconLength); - // To reserved 2 pages for beacon buffer. 2010.06.24. - if (PageNeed == 1) - PageNeed += 1; -#else - // skip Beacon Packet - PageNeed = 3; -#endif - - PageNum += PageNeed; - pHalData->FwRsvdPageStartOffset = PageNum; - - BufIndex += PageNeed*128; - - //3 (2) ps-poll -#if 0 // skip - RsvdPageLoc.LocPsPoll = PageNum; - ConstructPSPoll(padapter, &ReservedPagePacket[BufIndex], &PSPollLength); - rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE, _FALSE); - - PageNeed = (u8)PageNum_128(TxDescLen + PSPollLength); - PageNum += PageNeed; - - BufIndex += PageNeed*128; -#endif - - //3 (3) null data - RsvdPageLoc.LocNullData = PageNum; - ConstructNullFunctionData( - padapter, - &ReservedPagePacket[BufIndex], - &NullDataLength, - fakemac, - _FALSE, 0, 0, _FALSE); - rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], NullDataLength, _FALSE, _FALSE); - - PageNeed = (u8)PageNum_128(TxDescLen + NullDataLength); - PageNum += PageNeed; - - BufIndex += PageNeed*128; - - //3 (4) probe response -#if 0 // skip - RsvdPageLoc.LocProbeRsp = PageNum; - ConstructProbeRsp( - padapter, - &ReservedPagePacket[BufIndex], - &ProbeRspLength, - get_my_bssid(&pmlmeinfo->network), - _FALSE); - rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], ProbeRspLength, _FALSE, _FALSE); - - PageNeed = (u8)PageNum_128(TxDescLen + ProbeRspLength); - PageNum += PageNeed; - - BufIndex += PageNeed*128; -#endif - - //3 (5) Qos null data -#if 0 // skip - RsvdPageLoc.LocQosNull = PageNum; - ConstructNullFunctionData( - padapter, - &ReservedPagePacket[BufIndex], - &QosNullLength, - get_my_bssid(&pmlmeinfo->network), - _TRUE, 0, 0, _FALSE); - rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], QosNullLength, _FALSE, _FALSE); - - PageNeed = (u8)PageNum_128(TxDescLen + QosNullLength); - PageNum += PageNeed; - - BufIndex += PageNeed*128; -#endif - - //3 (6) BT Qos null data - RsvdPageLoc.LocBTQosNull = PageNum; - ConstructNullFunctionData( - padapter, - &ReservedPagePacket[BufIndex], - &BTQosNullLength, - fakemac, - _TRUE, 0, 0, _FALSE); - rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE); - - TotalPacketLen = BufIndex + BTQosNullLength; - - pmgntframe = alloc_mgtxmitframe(pxmitpriv); - if (pmgntframe == NULL) - goto exit; - - // update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->qsel = 0x10; - pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TXDESC_OFFSET; - _rtw_memcpy(pmgntframe->buf_addr, ReservedPagePacket, TotalPacketLen); - - rtw_hal_mgnt_xmit(padapter, pmgntframe); - - DBG_8192C("%s: Set RSVD page location to Fw\n", __FUNCTION__); - FillH2CCmd(padapter, RSVD_PAGE_EID, sizeof(RsvdPageLoc), (u8*)&RsvdPageLoc); - -exit: - rtw_mfree(ReservedPagePacket, 1024); -} - -void rtl8723a_set_BTCoex_AP_mode_FwRsvdPkt_cmd(PADAPTER padapter) -{ - PHAL_DATA_TYPE pHalData; - u8 bRecover = _FALSE; - - - DBG_8192C("+%s\n", __FUNCTION__); - - pHalData = GET_HAL_DATA(padapter); - - // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. - if (pHalData->RegFwHwTxQCtrl & BIT(6)) - bRecover = _TRUE; - - // To tell Hw the packet is not a real beacon frame. - pHalData->RegFwHwTxQCtrl &= ~BIT(6); - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl); - SetFwRsvdPagePkt_BTCoex(padapter); - - // To make sure that if there exists an adapter which would like to send beacon. - // If exists, the origianl value of 0x422[6] will be 1, we should check this to - // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause - // the beacon cannot be sent by HW. - // 2010.06.23. Added by tynli. - if (bRecover) - { - pHalData->RegFwHwTxQCtrl |= BIT(6); - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl); - } -} -#endif - -#ifdef CONFIG_P2P_PS -void rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); - struct P2P_PS_Offload_t *p2p_ps_offload = &pHalData->p2p_ps_offload; - u8 i; - -_func_enter_; - - switch(p2p_ps_state) - { - case P2P_PS_DISABLE: - DBG_8192C("P2P_PS_DISABLE \n"); - _rtw_memset(p2p_ps_offload, 0 ,1); - break; - case P2P_PS_ENABLE: - DBG_8192C("P2P_PS_ENABLE \n"); - // update CTWindow value. - if( pwdinfo->ctwindow > 0 ) - { - p2p_ps_offload->CTWindow_En = 1; - rtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow); - } - - // hw only support 2 set of NoA - for( i=0 ; inoa_num ; i++) - { - // To control the register setting for which NOA - rtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4)); - if(i == 0) - p2p_ps_offload->NoA0_En = 1; - else - p2p_ps_offload->NoA1_En = 1; - - // config P2P NoA Descriptor Register - //DBG_8192C("%s(): noa_duration = %x\n",__FUNCTION__,pwdinfo->noa_duration[i]); - rtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]); - - //DBG_8192C("%s(): noa_interval = %x\n",__FUNCTION__,pwdinfo->noa_interval[i]); - rtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]); - - //DBG_8192C("%s(): start_time = %x\n",__FUNCTION__,pwdinfo->noa_start_time[i]); - rtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]); - - //DBG_8192C("%s(): noa_count = %x\n",__FUNCTION__,pwdinfo->noa_count[i]); - rtw_write8(padapter, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]); - } - - if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) ) - { - // rst p2p circuit - rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4)); - - p2p_ps_offload->Offload_En = 1; - - if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - p2p_ps_offload->role= 1; - p2p_ps_offload->AllStaSleep = 0; - } - else - { - p2p_ps_offload->role= 0; - } - - p2p_ps_offload->discovery = 0; - } - break; - case P2P_PS_SCAN: - DBG_8192C("P2P_PS_SCAN \n"); - p2p_ps_offload->discovery = 1; - break; - case P2P_PS_SCAN_DONE: - DBG_8192C("P2P_PS_SCAN_DONE \n"); - p2p_ps_offload->discovery = 0; - pwdinfo->p2p_ps_state = P2P_PS_ENABLE; - break; - default: - break; - } - - FillH2CCmd(padapter, P2P_PS_OFFLOAD_EID, 1, (u8 *)p2p_ps_offload); - -_func_exit_; - -} -#endif //CONFIG_P2P_PS - -#ifdef CONFIG_IOL -#include -#ifdef CONFIG_USB_HCI -#include -#endif -int rtl8192c_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt) -{ - IO_OFFLOAD_LOC IoOffloadLoc; - u32 start_time = rtw_get_current_time(); - u32 passing_time_ms; - u8 polling_ret; - int ret = _FAIL; - - if (rtw_IOL_append_END_cmd(xmit_frame) != _SUCCESS) - goto exit; -#ifdef CONFIG_USB_HCI - { - struct pkt_attrib *pattrib = &xmit_frame->attrib; - if(rtw_usb_bulk_size_boundary(adapter,TXDESC_SIZE+pattrib->last_txcmdsz)) - { - if (rtw_IOL_append_END_cmd(xmit_frame) != _SUCCESS) - goto exit; - } - } -#endif //CONFIG_USB_HCI - - - dump_mgntframe_and_wait(adapter, xmit_frame, max_wating_ms); - - IoOffloadLoc.LocCmd = 0; - if(_SUCCESS != FillH2CCmd(adapter, H2C_92C_IO_OFFLOAD, sizeof(IO_OFFLOAD_LOC), (u8 *)&IoOffloadLoc)) - goto exit; - - //polling if the IO offloading is done - while( (passing_time_ms=rtw_get_passing_time_ms(start_time)) <= max_wating_ms) { - #if 0 //C2H - if(0xff == rtw_read8(adapter, REG_C2HEVT_CLEAR)) - break; - #else// 0x1c3 - if(0x00 != (polling_ret=rtw_read8(adapter, 0x1c3))) - break; - #endif - rtw_msleep_os(5); - } - #if 0 //debug - DBG_871X("IOL %s, polling_ret:0x%02x, 0x1c0=0x%08x, 0x1c4=0x%08x, 0x1cc=0x%08x, 0x1e8=0x%08x, 0x130=0x%08x, 0x134=0x%08x\n" - , polling_ret==0xff?"success":"error" - , polling_ret - , rtw_read32(adapter, 0x1c0) - , rtw_read32(adapter, 0x1c4) - , rtw_read32(adapter, 0x1cc) - , rtw_read32(adapter, 0x1e8) - , rtw_read32(adapter, 0x130) - , rtw_read32(adapter, 0x134) - ); - rtw_write32(adapter, 0x1c0, 0x0); - #endif - - if(polling_ret == 0xff) - ret =_SUCCESS; - else { - DBG_871X("IOL %s, polling_ret:0x%02x\n" - //", 0x1c0=0x%08x, 0x1c4=0x%08x, 0x1cc=0x%08x, 0x1e8=0x%08x, 0x130=0x%08x, 0x134=0x%08x\n" - , polling_ret==0xff?"success":"error" - , polling_ret - //, rtw_read32(adapter, 0x1c0) - //, rtw_read32(adapter, 0x1c4) - //, rtw_read32(adapter, 0x1cc) - //, rtw_read32(adapter, 0x1e8) - //, rtw_read32(adapter, 0x130) - //, rtw_read32(adapter, 0x134) - ); - #if 0 //debug - rtw_write16(adapter, 0x1c4, 0x0000); - rtw_msleep_os(10); - DBG_871X("after reset, 0x1c4=0x%08x\n", rtw_read32(adapter, 0x1c4)); - #endif - - } - - { - #if 0 //C2H - u32 c2h_evt; - int i; - c2h_evt = rtw_read32(adapter, REG_C2HEVT_MSG_NORMAL); - DBG_871X("%s io-offloading complete, in %ums: 0x%08x\n", __FUNCTION__, passing_time_ms, c2h_evt); - rtw_write8(adapter, REG_C2HEVT_CLEAR, 0x0); - #else// 0x1c3 - //DBG_871X("%s IOF complete in %ums\n", __FUNCTION__, passing_time_ms); - rtw_write8(adapter, 0x1c3, 0x0); - #endif - } - -exit: - return ret; - -} -#endif //CONFIG_IOL - -#ifdef CONFIG_TSF_RESET_OFFLOAD -/* - ask FW to Reset sync register at Beacon early interrupt -*/ -u8 rtl8723c_reset_tsf(_adapter *padapter, u8 reset_port ) -{ - u8 buf[2]; - u8 res=_SUCCESS; - -_func_enter_; - if (IFACE_PORT0==reset_port) { - buf[0] = 0x1; buf[1] = 0; - - } else{ - buf[0] = 0x0; buf[1] = 0x1; - } - FillH2CCmd(padapter, H2C_RESET_TSF, 2, buf); -_func_exit_; - - return res; -} -#endif // CONFIG_TSF_RESET_OFFLOAD - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8723A_CMD_C_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +#define RTL92C_MAX_H2C_BOX_NUMS 4 +#define RTL92C_MAX_CMD_LEN 5 +#define MESSAGE_BOX_SIZE 4 +#define EX_MESSAGE_BOX_SIZE 2 + + +static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 msgbox_num) +{ + u8 read_down = _FALSE; + int retry_cnts = 100; + + u8 valid; + + //DBG_8192C(" _is_fw_read_cmd_down ,reg_1cc(%x),msg_box(%d)...\n",rtw_read8(padapter,REG_HMETFR),msgbox_num); + + do{ + valid = rtw_read8(padapter,REG_HMETFR) & BIT(msgbox_num); + + if(0 == valid ){ + read_down = _TRUE; + } + }while( (!read_down) && (retry_cnts--)); + + return read_down; + +} + + +/***************************************** +* H2C Msg format : +*| 31 - 8 |7 | 6 - 0 | +*| h2c_msg |Ext_bit |CMD_ID | +* +******************************************/ +s32 FillH2CCmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer) +{ + u8 bcmd_down = _FALSE; + s32 retry_cnts = 100; + u8 h2c_box_num; + u32 msgbox_addr; + u32 msgbox_ex_addr; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u32 h2c_cmd = 0; + u16 h2c_cmd_ex = 0; + s32 ret = _FAIL; + +_func_enter_; + + padapter = GET_PRIMARY_ADAPTER(padapter); + pHalData = GET_HAL_DATA(padapter); + + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); + + if (!pCmdBuffer) { + goto exit; + } + if (CmdLen > RTL92C_MAX_CMD_LEN) { + goto exit; + } + if (padapter->bSurpriseRemoved == _TRUE) + goto exit; + + //pay attention to if race condition happened in H2C cmd setting. + do{ + h2c_box_num = pHalData->LastHMEBoxNum; + + if(!_is_fw_read_cmd_down(padapter, h2c_box_num)){ + DBG_8192C(" fw read cmd failed...\n"); + goto exit; + } + + if(CmdLen<=3) + { + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen ); + } + else{ + _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer, EX_MESSAGE_BOX_SIZE); + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer+2,( CmdLen-EX_MESSAGE_BOX_SIZE)); + *(u8*)(&h2c_cmd) |= BIT(7); + } + + *(u8*)(&h2c_cmd) |= ElementID; + + if(h2c_cmd & BIT(7)){ + msgbox_ex_addr = REG_HMEBOX_EXT_0 + (h2c_box_num *EX_MESSAGE_BOX_SIZE); + h2c_cmd_ex = le16_to_cpu( h2c_cmd_ex ); + rtw_write16(padapter, msgbox_ex_addr, h2c_cmd_ex); + } + msgbox_addr =REG_HMEBOX_0 + (h2c_box_num *MESSAGE_BOX_SIZE); + h2c_cmd = le32_to_cpu( h2c_cmd ); + rtw_write32(padapter,msgbox_addr, h2c_cmd); + + bcmd_down = _TRUE; + + //DBG_8192C("MSG_BOX:%d,CmdLen(%d), reg:0x%x =>h2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" + // ,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex); + + pHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL92C_MAX_H2C_BOX_NUMS; + + }while((!bcmd_down) && (retry_cnts--)); + + ret = _SUCCESS; + +exit: + + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); + +_func_exit_; + + return ret; +} + +u8 rtl8192c_h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) +{ + u8 ElementID, CmdLen; + u8 *pCmdBuffer; + struct cmd_msg_parm *pcmdmsg; + + if(!pbuf) + return H2C_PARAMETERS_ERROR; + + pcmdmsg = (struct cmd_msg_parm*)pbuf; + ElementID = pcmdmsg->eid; + CmdLen = pcmdmsg->sz; + pCmdBuffer = pcmdmsg->buf; + + FillH2CCmd(padapter, ElementID, CmdLen, pCmdBuffer); + + return H2C_SUCCESS; +} + +#if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) +u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter *padapter ,u8 bfwpoll, u16 period) +{ + u8 res=_SUCCESS; + struct H2C_SS_RFOFF_PARAM param; + DBG_8192C("==>%s bfwpoll(%x)\n",__FUNCTION__,bfwpoll); + param.gpio_period = period;//Polling GPIO_11 period time + param.ROFOn = (_TRUE == bfwpoll)?1:0; + FillH2CCmd(padapter, SELECTIVE_SUSPEND_ROF_CMD, sizeof(param), (u8*)(¶m)); + return res; +} +#endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED + +u8 rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param) +{ + u8 res=_SUCCESS; + +_func_enter_; + + *((u32*) param ) = cpu_to_le32( *((u32*) param ) ); + + FillH2CCmd(padapter, RSSI_SETTING_EID, 3, param); + +_func_exit_; + + return res; +} + +u8 rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg) +{ + u8 buf[5]; + u8 res=_SUCCESS; + +_func_enter_; + + _rtw_memset(buf, 0, 5); + mask = cpu_to_le32( mask ); + _rtw_memcpy(buf, &mask, 4); + buf[4] = arg; + + FillH2CCmd(padapter, MACID_CONFIG_EID, 5, buf); + +_func_exit_; + + return res; + +} + +//bitmap[0:27] = tx_rate_bitmap +//bitmap[28:31]= Rate Adaptive id +//arg[0:4] = macid +//arg[5] = Short GI +void rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg, u8 rssi_level) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + u8 macid = arg&0x1f; + +#ifdef CONFIG_ODM_REFRESH_RAMASK + u8 raid = (bitmap>>28) & 0x0f; + bitmap &=0x0fffffff; + if(rssi_level != DM_RATR_STA_INIT) + bitmap = ODM_Get_Rate_Bitmap(&pHalData->odmpriv, macid, bitmap, rssi_level); + + bitmap |= ((raid<<28)&0xf0000000); +#endif //CONFIG_ODM_REFRESH_RAMASK + + + if(pHalData->fw_ractrl == _TRUE) + { + rtl8192c_set_raid_cmd(pAdapter, bitmap, arg); + } + else + { + u8 init_rate, shortGIrate=_FALSE; + + init_rate = get_highest_rate_idx(bitmap&0x0fffffff)&0x3f; + + + shortGIrate = (arg&BIT(5)) ? _TRUE:_FALSE; + + if (shortGIrate==_TRUE) + init_rate |= BIT(6); + + rtw_write8(pAdapter, (REG_INIDATA_RATE_SEL+macid), (u8)init_rate); + } + +} + +void rtl8723a_set_FwPwrMode_cmd(PADAPTER padapter, u8 Mode) +{ + SETPWRMODE_PARM H2CSetPwrMode; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + +_func_enter_; + + H2CSetPwrMode.Mode = Mode; + H2CSetPwrMode.SmartPS = pwrpriv->smart_ps; + H2CSetPwrMode.AwakeInterval = 1; + H2CSetPwrMode.bAllQueueUAPSD = padapter->registrypriv.uapsd_enable; + + if(0 == Mode) + { + /* Leave LPS, set BcnAntMode to 0 */ + H2CSetPwrMode.BcnAntMode = 0; + } + else + { + H2CSetPwrMode.BcnAntMode = pwrpriv->bcn_ant_mode; + } + + DBG_871X("%s: Mode=%d SmartPS=%d UAPSD=%d BcnMode=0x%02x\n", __FUNCTION__, + H2CSetPwrMode.Mode, H2CSetPwrMode.SmartPS, H2CSetPwrMode.bAllQueueUAPSD, H2CSetPwrMode.BcnAntMode); + + FillH2CCmd(padapter, SET_PWRMODE_EID, sizeof(H2CSetPwrMode), (u8 *)&H2CSetPwrMode); + +_func_exit_; +} + + +void rtl8723a_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt ) +{ + u8 opmode,macid; + u16 mst_rpt = cpu_to_le16 (mstatus_rpt); + u32 reg_macid_no_link = REG_MACID_NO_LINK; + opmode = (u8) mst_rpt; + macid = (u8)(mst_rpt >> 8) ; + DBG_871X("### %s: MStatus=%x MACID=%d \n", __FUNCTION__,opmode,macid); + + //Delete select macid (MACID 0~63) from queue list. + if(opmode == 1)// 1:connect + { + rtw_write32(padapter,reg_macid_no_link, (rtw_read32(padapter,reg_macid_no_link) & (~BIT(macid)))); + } + else//0: disconnect + { + rtw_write32(padapter,reg_macid_no_link, (rtw_read32(padapter,reg_macid_no_link)|BIT(macid))); + } +} + + +void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength) +{ + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 rate_len, pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); + + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); + //pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_BEACON); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); + + //timestamp will be inserted by hardware + pframe += 8; + pktlen += 8; + + // beacon interval: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pktlen += 2; + + // capability info: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pktlen += 2; + + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + //DBG_871X("ie len=%d\n", cur_network->IELength); + pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs); + _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen); + + goto _ConstructBeacon; + } + + //below for ad-hoc mode + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen); + + // supported rates... + rate_len = rtw_get_rateset_len(cur_network->SupportedRates); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen); + + // DS parameter set + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen); + + if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + u32 ATIMWindow; + // IBSS Parameter Set... + //ATIMWindow = cur->Configuration.ATIMWindow; + ATIMWindow = 0; + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen); + } + + + //todo: ERP IE + + + // EXTERNDED SUPPORTED RATE + if (rate_len > 8) + { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen); + } + + + //todo:HT for adhoc + +_ConstructBeacon: + + if ((pktlen + TXDESC_SIZE) > 512) + { + DBG_871X("beacon frame too large\n"); + return; + } + + *pLength = pktlen; + + //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen); + +} + +void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength) +{ + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + // Frame control. + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + SetPwrMgt(fctrl); + SetFrameSubType(pframe, WIFI_PSPOLL); + + // AID. + SetDuration(pframe, (pmlmeinfo->aid | 0xc000)); + + // BSSID. + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + // TA. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + + *pLength = 16; +} + +void ConstructNullFunctionData( + PADAPTER padapter, + u8 *pframe, + u32 *pLength, + u8 *StaAddr, + u8 bQoS, + u8 AC, + u8 bEosp, + u8 bForcePowerSave) +{ + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 pktlen; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *cur_network = &pmlmepriv->cur_network; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave); + + pwlanhdr = (struct rtw_ieee80211_hdr*)pframe; + + fctrl = &pwlanhdr->frame_ctl; + *(fctrl) = 0; + if (bForcePowerSave) + { + SetPwrMgt(fctrl); + } + + switch(cur_network->network.InfrastructureMode) + { + case Ndis802_11Infrastructure: + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN); + break; + case Ndis802_11APMode: + SetFrDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + break; + case Ndis802_11IBSS: + default: + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + break; + } + + SetSeqNum(pwlanhdr, 0); + + if (bQoS == _TRUE) { + struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr; + + SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); + + pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe; + SetPriority(&pwlanqoshdr->qc, AC); + SetEOSP(&pwlanqoshdr->qc, bEosp); + + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); + } else { + SetFrameSubType(pframe, WIFI_DATA_NULL); + + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + } + + *pLength = pktlen; +} + +void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) +{ + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u8 *mac, *bssid; + u32 pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + bssid = cur_network->MacAddress; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); + + SetSeqNum(pwlanhdr, 0); + SetFrameSubType(fctrl, WIFI_PROBERSP); + + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += pktlen; + + if(cur_network->IELength>MAX_IE_SZ) + return; + + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); + pframe += cur_network->IELength; + pktlen += cur_network->IELength; + + *pLength = pktlen; +} + +// To check if reserved page content is destroyed by beacon beacuse beacon is too large. +// 2010.06.23. Added by tynli. +VOID +CheckFwRsvdPageContent( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter); + u32 MaxBcnPageNum; + + if(pHalData->FwRsvdPageStartOffset != 0) + { + /*MaxBcnPageNum = PageNum_128(pMgntInfo->MaxBeaconSize); + RT_ASSERT((MaxBcnPageNum <= pHalData->FwRsvdPageStartOffset), + ("CheckFwRsvdPageContent(): The reserved page content has been"\ + "destroyed by beacon!!! MaxBcnPageNum(%d) FwRsvdPageStartOffset(%d)\n!", + MaxBcnPageNum, pHalData->FwRsvdPageStartOffset));*/ + } +} + +// +// Description: Fill the reserved packets that FW will use to RSVD page. +// Now we just send 4 types packet to rsvd page. +// (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp. +// Input: +// bDLFinished - FALSE: At the first time we will send all the packets as a large packet to Hw, +// so we need to set the packet length to total lengh. +// TRUE: At the second time, we should send the first packet (default:beacon) +// to Hw again and set the lengh in descriptor to the real beacon lengh. +// 2009.10.15 by tynli. +static void SetFwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished) +{ + PHAL_DATA_TYPE pHalData; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv; + struct mlme_ext_priv *pmlmeext; + struct mlme_ext_info *pmlmeinfo; + u32 BeaconLength, ProbeRspLength, PSPollLength; + u32 NullDataLength, QosNullLength, BTQosNullLength; + u8 *ReservedPagePacket; + u8 PageNum, PageNeed, TxDescLen; + u16 BufIndex; + u32 TotalPacketLen; + RSVDPAGE_LOC RsvdPageLoc; + + + DBG_871X("%s\n", __FUNCTION__); + + ReservedPagePacket = (u8*)rtw_zmalloc(1000); + if (ReservedPagePacket == NULL) { + DBG_871X("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__); + return; + } + + pHalData = GET_HAL_DATA(padapter); + pxmitpriv = &padapter->xmitpriv; + pmlmeext = &padapter->mlmeextpriv; + pmlmeinfo = &pmlmeext->mlmext_info; + + TxDescLen = TXDESC_SIZE; + PageNum = 0; + + //3 (1) beacon + BufIndex = TXDESC_OFFSET; + ConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BeaconLength); + + // When we count the first page size, we need to reserve description size for the RSVD + // packet, it will be filled in front of the packet in TXPKTBUF. + PageNeed = (u8)PageNum_128(TxDescLen + BeaconLength); + // To reserved 2 pages for beacon buffer. 2010.06.24. + if (PageNeed == 1) + PageNeed += 1; + PageNum += PageNeed; + pHalData->FwRsvdPageStartOffset = PageNum; + + BufIndex += PageNeed*128; + + //3 (2) ps-poll + RsvdPageLoc.LocPsPoll = PageNum; + ConstructPSPoll(padapter, &ReservedPagePacket[BufIndex], &PSPollLength); + rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE, _FALSE); + + PageNeed = (u8)PageNum_128(TxDescLen + PSPollLength); + PageNum += PageNeed; + + BufIndex += PageNeed*128; + + //3 (3) null data + RsvdPageLoc.LocNullData = PageNum; + ConstructNullFunctionData( + padapter, + &ReservedPagePacket[BufIndex], + &NullDataLength, + get_my_bssid(&pmlmeinfo->network), + _FALSE, 0, 0, _FALSE); + rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], NullDataLength, _FALSE, _FALSE); + + PageNeed = (u8)PageNum_128(TxDescLen + NullDataLength); + PageNum += PageNeed; + + BufIndex += PageNeed*128; + + //3 (4) probe response + RsvdPageLoc.LocProbeRsp = PageNum; + ConstructProbeRsp( + padapter, + &ReservedPagePacket[BufIndex], + &ProbeRspLength, + get_my_bssid(&pmlmeinfo->network), + _FALSE); + rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], ProbeRspLength, _FALSE, _FALSE); + + PageNeed = (u8)PageNum_128(TxDescLen + ProbeRspLength); + PageNum += PageNeed; + + BufIndex += PageNeed*128; + + //3 (5) Qos null data + RsvdPageLoc.LocQosNull = PageNum; + ConstructNullFunctionData( + padapter, + &ReservedPagePacket[BufIndex], + &QosNullLength, + get_my_bssid(&pmlmeinfo->network), + _TRUE, 0, 0, _FALSE); + rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], QosNullLength, _FALSE, _FALSE); + + PageNeed = (u8)PageNum_128(TxDescLen + QosNullLength); + PageNum += PageNeed; + + BufIndex += PageNeed*128; + + //3 (6) BT Qos null data + RsvdPageLoc.LocBTQosNull = PageNum; + ConstructNullFunctionData( + padapter, + &ReservedPagePacket[BufIndex], + &BTQosNullLength, + get_my_bssid(&pmlmeinfo->network), + _TRUE, 0, 0, _FALSE); + rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE); + + TotalPacketLen = BufIndex + BTQosNullLength; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + // update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->qsel = 0x10; + pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TXDESC_OFFSET; + _rtw_memcpy(pmgntframe->buf_addr, ReservedPagePacket, TotalPacketLen); + + rtw_hal_mgnt_xmit(padapter, pmgntframe); + + DBG_871X("%s: Set RSVD page location to Fw\n", __FUNCTION__); + FillH2CCmd(padapter, RSVD_PAGE_EID, sizeof(RsvdPageLoc), (u8*)&RsvdPageLoc); + +exit: + rtw_mfree(ReservedPagePacket, 1000); +} + +void rtl8723a_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus) +{ + JOINBSSRPT_PARM JoinBssRptParm; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + +_func_enter_; + + DBG_871X("%s mstatus(%x)\n", __FUNCTION__,mstatus); + + if(mstatus == 1) + { + BOOLEAN bRecover = _FALSE; + u8 v8; + + // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. + // Suggested by filen. Added by tynli. + rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); + // Do not set TSF again here or vWiFi beacon DMA INT will not work. + //correct_TSF(padapter, pmlmeext); + // Hw sequende enable by dedault. 2010.06.23. by tynli. + //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF)); + //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); + + // set REG_CR bit 8 + v8 = rtw_read8(padapter, REG_CR+1); + v8 |= BIT(0); // ENSWBCN + rtw_write8(padapter, REG_CR+1, v8); + + // Disable Hw protection for a time which revserd for Hw sending beacon. + // Fix download reserved page packet fail that access collision with the protection time. + // 2010.05.11. Added by tynli. +// SetBcnCtrlReg(padapter, 0, BIT(3)); +// SetBcnCtrlReg(padapter, BIT(4), 0); + SetBcnCtrlReg(padapter, BIT(4), BIT(3)); + + // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. + if (pHalData->RegFwHwTxQCtrl & BIT(6)) + bRecover = _TRUE; + + // To tell Hw the packet is not a real beacon frame. + //U1bTmp = rtw_read8(padapter, REG_FWHW_TXQ_CTRL+2); + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl & ~BIT(6)); + pHalData->RegFwHwTxQCtrl &= ~BIT(6); + SetFwRsvdPagePkt(padapter, 0); + + // 2010.05.11. Added by tynli. +// SetBcnCtrlReg(padapter, BIT3, 0); +// SetBcnCtrlReg(padapter, 0, BIT4); + SetBcnCtrlReg(padapter, BIT(3), BIT(4)); + + // To make sure that if there exists an adapter which would like to send beacon. + // If exists, the origianl value of 0x422[6] will be 1, we should check this to + // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause + // the beacon cannot be sent by HW. + // 2010.06.23. Added by tynli. + if(bRecover) + { + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl | BIT(6)); + pHalData->RegFwHwTxQCtrl |= BIT(6); + } + + // Clear CR[8] or beacon packet will not be send to TxBuf anymore. + v8 = rtw_read8(padapter, REG_CR+1); + v8 &= ~BIT(0); // ~ENSWBCN + rtw_write8(padapter, REG_CR+1, v8); + } + + JoinBssRptParm.OpMode = mstatus; + + FillH2CCmd(padapter, JOINBSS_RPT_EID, sizeof(JoinBssRptParm), (u8 *)&JoinBssRptParm); + +_func_exit_; +} + +#ifdef CONFIG_BT_COEXIST +static void SetFwRsvdPagePkt_BTCoex(PADAPTER padapter) +{ + PHAL_DATA_TYPE pHalData; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv; + struct mlme_ext_priv *pmlmeext; + struct mlme_ext_info *pmlmeinfo; + u8 fakemac[6]={0x00,0xe0,0x4c,0x00,0x00,0x00}; + u32 BeaconLength, ProbeRspLength, PSPollLength; + u32 NullDataLength, QosNullLength, BTQosNullLength; + u8 *ReservedPagePacket; + u8 PageNum, PageNeed, TxDescLen; + u16 BufIndex; + u32 TotalPacketLen; + RSVDPAGE_LOC RsvdPageLoc; + + + DBG_871X("+%s\n", __FUNCTION__); + + ReservedPagePacket = (u8*)rtw_zmalloc(1024); + if (ReservedPagePacket == NULL) { + DBG_871X("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__); + return; + } + + pHalData = GET_HAL_DATA(padapter); + pxmitpriv = &padapter->xmitpriv; + pmlmeext = &padapter->mlmeextpriv; + pmlmeinfo = &pmlmeext->mlmext_info; + + TxDescLen = TXDESC_SIZE; + PageNum = 0; + + //3 (1) beacon + BufIndex = TXDESC_OFFSET; +#if 0 + ConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BeaconLength); + + // When we count the first page size, we need to reserve description size for the RSVD + // packet, it will be filled in front of the packet in TXPKTBUF. + PageNeed = (u8)PageNum_128(TxDescLen + BeaconLength); + // To reserved 2 pages for beacon buffer. 2010.06.24. + if (PageNeed == 1) + PageNeed += 1; +#else + // skip Beacon Packet + PageNeed = 3; +#endif + + PageNum += PageNeed; + pHalData->FwRsvdPageStartOffset = PageNum; + + BufIndex += PageNeed*128; + + //3 (2) ps-poll +#if 0 // skip + RsvdPageLoc.LocPsPoll = PageNum; + ConstructPSPoll(padapter, &ReservedPagePacket[BufIndex], &PSPollLength); + rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE, _FALSE); + + PageNeed = (u8)PageNum_128(TxDescLen + PSPollLength); + PageNum += PageNeed; + + BufIndex += PageNeed*128; +#endif + + //3 (3) null data + RsvdPageLoc.LocNullData = PageNum; + ConstructNullFunctionData( + padapter, + &ReservedPagePacket[BufIndex], + &NullDataLength, + fakemac, + _FALSE, 0, 0, _FALSE); + rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], NullDataLength, _FALSE, _FALSE); + + PageNeed = (u8)PageNum_128(TxDescLen + NullDataLength); + PageNum += PageNeed; + + BufIndex += PageNeed*128; + + //3 (4) probe response +#if 0 // skip + RsvdPageLoc.LocProbeRsp = PageNum; + ConstructProbeRsp( + padapter, + &ReservedPagePacket[BufIndex], + &ProbeRspLength, + get_my_bssid(&pmlmeinfo->network), + _FALSE); + rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], ProbeRspLength, _FALSE, _FALSE); + + PageNeed = (u8)PageNum_128(TxDescLen + ProbeRspLength); + PageNum += PageNeed; + + BufIndex += PageNeed*128; +#endif + + //3 (5) Qos null data +#if 0 // skip + RsvdPageLoc.LocQosNull = PageNum; + ConstructNullFunctionData( + padapter, + &ReservedPagePacket[BufIndex], + &QosNullLength, + get_my_bssid(&pmlmeinfo->network), + _TRUE, 0, 0, _FALSE); + rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], QosNullLength, _FALSE, _FALSE); + + PageNeed = (u8)PageNum_128(TxDescLen + QosNullLength); + PageNum += PageNeed; + + BufIndex += PageNeed*128; +#endif + + //3 (6) BT Qos null data + RsvdPageLoc.LocBTQosNull = PageNum; + ConstructNullFunctionData( + padapter, + &ReservedPagePacket[BufIndex], + &BTQosNullLength, + fakemac, + _TRUE, 0, 0, _FALSE); + rtl8723a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE); + + TotalPacketLen = BufIndex + BTQosNullLength; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto exit; + + // update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->qsel = 0x10; + pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TXDESC_OFFSET; + _rtw_memcpy(pmgntframe->buf_addr, ReservedPagePacket, TotalPacketLen); + + rtw_hal_mgnt_xmit(padapter, pmgntframe); + + DBG_8192C("%s: Set RSVD page location to Fw\n", __FUNCTION__); + FillH2CCmd(padapter, RSVD_PAGE_EID, sizeof(RsvdPageLoc), (u8*)&RsvdPageLoc); + +exit: + rtw_mfree(ReservedPagePacket, 1024); +} + +void rtl8723a_set_BTCoex_AP_mode_FwRsvdPkt_cmd(PADAPTER padapter) +{ + PHAL_DATA_TYPE pHalData; + u8 bRecover = _FALSE; + + + DBG_8192C("+%s\n", __FUNCTION__); + + pHalData = GET_HAL_DATA(padapter); + + // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. + if (pHalData->RegFwHwTxQCtrl & BIT(6)) + bRecover = _TRUE; + + // To tell Hw the packet is not a real beacon frame. + pHalData->RegFwHwTxQCtrl &= ~BIT(6); + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl); + SetFwRsvdPagePkt_BTCoex(padapter); + + // To make sure that if there exists an adapter which would like to send beacon. + // If exists, the origianl value of 0x422[6] will be 1, we should check this to + // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause + // the beacon cannot be sent by HW. + // 2010.06.23. Added by tynli. + if (bRecover) + { + pHalData->RegFwHwTxQCtrl |= BIT(6); + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl); + } +} +#endif + +#ifdef CONFIG_P2P_PS +void rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + struct P2P_PS_Offload_t *p2p_ps_offload = &pHalData->p2p_ps_offload; + u8 i; + +_func_enter_; + + switch(p2p_ps_state) + { + case P2P_PS_DISABLE: + DBG_8192C("P2P_PS_DISABLE \n"); + _rtw_memset(p2p_ps_offload, 0 ,1); + break; + case P2P_PS_ENABLE: + DBG_8192C("P2P_PS_ENABLE \n"); + // update CTWindow value. + if( pwdinfo->ctwindow > 0 ) + { + p2p_ps_offload->CTWindow_En = 1; + rtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow); + } + + // hw only support 2 set of NoA + for( i=0 ; inoa_num ; i++) + { + // To control the register setting for which NOA + rtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4)); + if(i == 0) + p2p_ps_offload->NoA0_En = 1; + else + p2p_ps_offload->NoA1_En = 1; + + // config P2P NoA Descriptor Register + //DBG_8192C("%s(): noa_duration = %x\n",__FUNCTION__,pwdinfo->noa_duration[i]); + rtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]); + + //DBG_8192C("%s(): noa_interval = %x\n",__FUNCTION__,pwdinfo->noa_interval[i]); + rtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]); + + //DBG_8192C("%s(): start_time = %x\n",__FUNCTION__,pwdinfo->noa_start_time[i]); + rtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]); + + //DBG_8192C("%s(): noa_count = %x\n",__FUNCTION__,pwdinfo->noa_count[i]); + rtw_write8(padapter, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]); + } + + if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) ) + { + // rst p2p circuit + rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4)); + + p2p_ps_offload->Offload_En = 1; + + if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) + { + p2p_ps_offload->role= 1; + p2p_ps_offload->AllStaSleep = 0; + } + else + { + p2p_ps_offload->role= 0; + } + + p2p_ps_offload->discovery = 0; + } + break; + case P2P_PS_SCAN: + DBG_8192C("P2P_PS_SCAN \n"); + p2p_ps_offload->discovery = 1; + break; + case P2P_PS_SCAN_DONE: + DBG_8192C("P2P_PS_SCAN_DONE \n"); + p2p_ps_offload->discovery = 0; + pwdinfo->p2p_ps_state = P2P_PS_ENABLE; + break; + default: + break; + } + + FillH2CCmd(padapter, P2P_PS_OFFLOAD_EID, 1, (u8 *)p2p_ps_offload); + +_func_exit_; + +} +#endif //CONFIG_P2P_PS + +#ifdef CONFIG_IOL +#include +#ifdef CONFIG_USB_HCI +#include +#endif +int rtl8192c_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt) +{ + IO_OFFLOAD_LOC IoOffloadLoc; + u32 start_time = rtw_get_current_time(); + u32 passing_time_ms; + u8 polling_ret; + int ret = _FAIL; + + if (rtw_IOL_append_END_cmd(xmit_frame) != _SUCCESS) + goto exit; +#ifdef CONFIG_USB_HCI + { + struct pkt_attrib *pattrib = &xmit_frame->attrib; + if(rtw_usb_bulk_size_boundary(adapter,TXDESC_SIZE+pattrib->last_txcmdsz)) + { + if (rtw_IOL_append_END_cmd(xmit_frame) != _SUCCESS) + goto exit; + } + } +#endif //CONFIG_USB_HCI + + + dump_mgntframe_and_wait(adapter, xmit_frame, max_wating_ms); + + IoOffloadLoc.LocCmd = 0; + if(_SUCCESS != FillH2CCmd(adapter, H2C_92C_IO_OFFLOAD, sizeof(IO_OFFLOAD_LOC), (u8 *)&IoOffloadLoc)) + goto exit; + + //polling if the IO offloading is done + while( (passing_time_ms=rtw_get_passing_time_ms(start_time)) <= max_wating_ms) { + #if 0 //C2H + if(0xff == rtw_read8(adapter, REG_C2HEVT_CLEAR)) + break; + #else// 0x1c3 + if(0x00 != (polling_ret=rtw_read8(adapter, 0x1c3))) + break; + #endif + rtw_msleep_os(5); + } + #if 0 //debug + DBG_871X("IOL %s, polling_ret:0x%02x, 0x1c0=0x%08x, 0x1c4=0x%08x, 0x1cc=0x%08x, 0x1e8=0x%08x, 0x130=0x%08x, 0x134=0x%08x\n" + , polling_ret==0xff?"success":"error" + , polling_ret + , rtw_read32(adapter, 0x1c0) + , rtw_read32(adapter, 0x1c4) + , rtw_read32(adapter, 0x1cc) + , rtw_read32(adapter, 0x1e8) + , rtw_read32(adapter, 0x130) + , rtw_read32(adapter, 0x134) + ); + rtw_write32(adapter, 0x1c0, 0x0); + #endif + + if(polling_ret == 0xff) + ret =_SUCCESS; + else { + DBG_871X("IOL %s, polling_ret:0x%02x\n" + //", 0x1c0=0x%08x, 0x1c4=0x%08x, 0x1cc=0x%08x, 0x1e8=0x%08x, 0x130=0x%08x, 0x134=0x%08x\n" + , polling_ret==0xff?"success":"error" + , polling_ret + //, rtw_read32(adapter, 0x1c0) + //, rtw_read32(adapter, 0x1c4) + //, rtw_read32(adapter, 0x1cc) + //, rtw_read32(adapter, 0x1e8) + //, rtw_read32(adapter, 0x130) + //, rtw_read32(adapter, 0x134) + ); + #if 0 //debug + rtw_write16(adapter, 0x1c4, 0x0000); + rtw_msleep_os(10); + DBG_871X("after reset, 0x1c4=0x%08x\n", rtw_read32(adapter, 0x1c4)); + #endif + + } + + { + #if 0 //C2H + u32 c2h_evt; + int i; + c2h_evt = rtw_read32(adapter, REG_C2HEVT_MSG_NORMAL); + DBG_871X("%s io-offloading complete, in %ums: 0x%08x\n", __FUNCTION__, passing_time_ms, c2h_evt); + rtw_write8(adapter, REG_C2HEVT_CLEAR, 0x0); + #else// 0x1c3 + //DBG_871X("%s IOF complete in %ums\n", __FUNCTION__, passing_time_ms); + rtw_write8(adapter, 0x1c3, 0x0); + #endif + } + +exit: + return ret; + +} +#endif //CONFIG_IOL + +#ifdef CONFIG_TSF_RESET_OFFLOAD +/* + ask FW to Reset sync register at Beacon early interrupt +*/ +u8 rtl8723c_reset_tsf(_adapter *padapter, u8 reset_port ) +{ + u8 buf[2]; + u8 res=_SUCCESS; + +_func_enter_; + if (IFACE_PORT0==reset_port) { + buf[0] = 0x1; buf[1] = 0; + + } else{ + buf[0] = 0x0; buf[1] = 0x1; + } + FillH2CCmd(padapter, H2C_RESET_TSF, 2, buf); +_func_exit_; + + return res; +} +#endif // CONFIG_TSF_RESET_OFFLOAD + diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_dm.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_dm.c index 6d82a0f7ab9a..bab4925b0959 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_dm.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_dm.c @@ -1,578 +1,581 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -//============================================================ -// Description: -// -// This file is for 92CE/92CU dynamic mechanism only -// -// -//============================================================ -#define _RTL8723A_DM_C_ - -//============================================================ -// include files -//============================================================ -#include -#include -#include -#include - -#include - -//============================================================ -// Global var -//============================================================ - - -static VOID -dm_CheckProtection( - IN PADAPTER Adapter - ) -{ -#if 0 - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - u1Byte CurRate, RateThreshold; - - if(pMgntInfo->pHTInfo->bCurBW40MHz) - RateThreshold = MGN_MCS1; - else - RateThreshold = MGN_MCS3; - - if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold) - { - pMgntInfo->bDmDisableProtect = TRUE; - DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); - } - else - { - pMgntInfo->bDmDisableProtect = FALSE; - DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); - } -#endif -} - -static VOID -dm_CheckStatistics( - IN PADAPTER Adapter - ) -{ -#if 0 - if(!Adapter->MgntInfo.bMediaConnect) - return; - - //2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly. - rtw_hal_get_hwreg( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) ); - - // Calculate current Tx Rate(Successful transmited!!) - - // Calculate current Rx Rate(Successful received!!) - - //for tx tx retry count - rtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) ); -#endif -} - -static void dm_CheckPbcGPIO(_adapter *padapter) -{ - u8 tmp1byte; - u8 bPbcPressed = _FALSE; - - if(!padapter->registrypriv.hw_wps_pbc) - return; - -#ifdef CONFIG_USB_HCI - tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); - tmp1byte |= (HAL_8192C_HW_GPIO_WPS_BIT); - rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as output mode - - tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); - rtw_write8(padapter, GPIO_IN, tmp1byte); //reset the floating voltage level - - tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); - tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); - rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as input mode - - tmp1byte =rtw_read8(padapter, GPIO_IN); - - if (tmp1byte == 0xff) - return ; - - if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT) - { - bPbcPressed = _TRUE; - } -#else - tmp1byte = rtw_read8(padapter, GPIO_IN); - //RT_TRACE(COMP_IO, DBG_TRACE, ("dm_CheckPbcGPIO - %x\n", tmp1byte)); - - if (tmp1byte == 0xff || padapter->init_adpt_in_progress) - return ; - - if((tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)==0) - { - bPbcPressed = _TRUE; - } -#endif - - if( _TRUE == bPbcPressed) - { - // Here we only set bPbcPressed to true - // After trigger PBC, the variable will be set to false - DBG_8192C("CheckPbcGPIO - PBC is pressed\n"); - -#ifdef RTK_DMP_PLATFORM -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) - kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_NET_PBC); -#else - kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC); -#endif -#else - - if ( padapter->pid[0] == 0 ) - { // 0 is the default value and it means the application monitors the HW PBC doesn't privde its pid to driver. - return; - } - -#ifdef PLATFORM_LINUX - rtw_signal_process(padapter->pid[0], SIGUSR1); -#endif -#endif - } -} - -#ifdef CONFIG_PCI_HCI -// -// Description: -// Perform interrupt migration dynamically to reduce CPU utilization. -// -// Assumption: -// 1. Do not enable migration under WIFI test. -// -// Created by Roger, 2010.03.05. -// -VOID -dm_InterruptMigration( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - BOOLEAN bCurrentIntMt, bCurrentACIntDisable; - BOOLEAN IntMtToSet = _FALSE; - BOOLEAN ACIntToSet = _FALSE; - - - // Retrieve current interrupt migration and Tx four ACs IMR settings first. - bCurrentIntMt = pHalData->bInterruptMigration; - bCurrentACIntDisable = pHalData->bDisableTxInt; - - // - // Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics - // when interrupt migration is set before. 2010.03.05. - // - if(!Adapter->registrypriv.wifi_spec && - (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && - pmlmepriv->LinkDetectInfo.bHigherBusyTraffic) - { - IntMtToSet = _TRUE; - - // To check whether we should disable Tx interrupt or not. - if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic ) - ACIntToSet = _TRUE; - } - - //Update current settings. - if( bCurrentIntMt != IntMtToSet ){ - DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet); - if(IntMtToSet) - { - // - // Set interrrupt migration timer and corresponging Tx/Rx counter. - // timer 25ns*0xfa0=100us for 0xf packets. - // 2010.03.05. - // - rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx - pHalData->bInterruptMigration = IntMtToSet; - } - else - { - // Reset all interrupt migration settings. - rtw_write32(Adapter, REG_INT_MIG, 0); - pHalData->bInterruptMigration = IntMtToSet; - } - } - - /*if( bCurrentACIntDisable != ACIntToSet ){ - DBG_8192C("%s(): Update AC interrrupt(%d)\n",__FUNCTION__,ACIntToSet); - if(ACIntToSet) // Disable four ACs interrupts. - { - // - // Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization. - // When extremely highly Rx OK occurs, we will disable Tx interrupts. - // 2010.03.05. - // - UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS ); - pHalData->bDisableTxInt = ACIntToSet; - } - else// Enable four ACs interrupts. - { - UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 ); - pHalData->bDisableTxInt = ACIntToSet; - } - }*/ - -} - -#endif - -// -// Initialize GPIO setting registers -// -static void -dm_InitGPIOSetting( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - u8 tmp1byte; - - tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); - tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); - - rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); -} -//============================================================ -// functions -//============================================================ -static void Init_ODM_ComInfo_8723a(PADAPTER Adapter) -{ - - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - u8 cut_ver,fab_ver; - - // - // Init Value - // - _rtw_memset(pDM_Odm,0,sizeof(pDM_Odm)); - - pDM_Odm->Adapter = Adapter; - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PLATFORM,ODM_CE); - if(Adapter->interface_type == RTW_GSPI ) - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,ODM_ITRF_SDIO); - else - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,Adapter->interface_type);//RTL871X_HCI_TYPE - - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_IC_TYPE,ODM_RTL8723A); - - - if(IS_8723A_A_CUT(pHalData->VersionID)) - { - fab_ver = ODM_UMC; - cut_ver = ODM_CUT_A; - } - else if(IS_8723A_B_CUT(pHalData->VersionID)) - { - fab_ver = ODM_UMC; - cut_ver = ODM_CUT_B; - } - else - { - fab_ver = ODM_TSMC; - cut_ver = ODM_CUT_A; - } - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver); - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver); - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_MP_TEST_CHIP,IS_NORMAL_CHIP(pHalData->VersionID)); - -#ifdef CONFIG_USB_HCI - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BOARD_TYPE,pHalData->BoardType); - - if(pHalData->BoardType == BOARD_USB_High_PA){ - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_LNA,_TRUE); - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_PA,_TRUE); - } -#endif - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PATCH_ID,pHalData->CustomerID); - // ODM_CMNINFO_BINHCT_TEST only for MP Team - ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BWIFI_TEST,Adapter->registrypriv.wifi_spec); - - - if(pHalData->rf_type == RF_1T1R){ - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T1R); - } - else if(pHalData->rf_type == RF_2T2R){ - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_2T2R); - } - else if(pHalData->rf_type == RF_1T2R){ - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T2R); - } -} -static void Update_ODM_ComInfo_8723a(PADAPTER Adapter) -{ - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - int i; - pdmpriv->InitODMFlag = ODM_BB_DIG | -#ifdef CONFIG_ODM_REFRESH_RAMASK - ODM_BB_RA_MASK | -#endif - ODM_BB_DYNAMIC_TXPWR | - ODM_BB_FA_CNT | - ODM_BB_RSSI_MONITOR | - ODM_BB_CCK_PD | - ODM_BB_PWR_SAVE | - ODM_MAC_EDCA_TURBO | - ODM_RF_TX_PWR_TRACK | - ODM_RF_CALIBRATION ; - // - // Pointer reference - // - //ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D - // ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u1Byte_temp)); - - -#ifdef CONFIG_ANTENNA_DIVERSITY - if(pHalData->AntDivCfg) - pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV; -#endif - -#if (MP_DRIVER==1) - if (Adapter->registrypriv.mp_mode == 1) - { - pdmpriv->InitODMFlag = ODM_RF_CALIBRATION | - ODM_RF_TX_PWR_TRACK; - } -#endif//(MP_DRIVER==1) - - ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag); - - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_TX_UNI,&(Adapter->xmitpriv.tx_bytes)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_RX_UNI,&(Adapter->recvpriv.rx_bytes)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_WM_MODE,&(pmlmeext->cur_wireless_mode)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_CHNL_OFFSET,&(pHalData->nCur40MhzPrimeSC)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_MODE,&(Adapter->securitypriv.dot11PrivacyAlgrthm)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BW,&(pHalData->CurrentChannelBW )); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_CHNL,&( pHalData->CurrentChannel)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_NET_CLOSED,&( Adapter->net_closed)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MP_MODE,&(Adapter->registrypriv.mp_mode)); - - //================= only for 8192D ================= - /* - //pHalData->CurrentBandType92D - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pDM_Odm->u1Byte_temp)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_GET_VALUE,&(pDM_Odm->u1Byte_temp)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BUDDY_ADAPTOR,&(pDM_Odm->PADAPTER_temp)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_IS_MASTER,&(pDM_Odm->u1Byte_temp)); - //================= only for 8192D ================= - // driver havn't those variable now - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_OPERATION,&(pDM_Odm->u1Byte_temp)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_DISABLE_EDCA,&(pDM_Odm->u1Byte_temp)); - */ - - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess)); - ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving)); - - - for(i=0; i< NUM_STA; i++) - { - //pDM_Odm->pODM_StaInfo[i] = NULL; - ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS,i,NULL); - } -} - -void -rtl8723a_InitHalDm( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - - u8 i; - - pdmpriv->DM_Type = DM_Type_ByDriver; - pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; - -#ifdef CONFIG_BT_COEXIST - pdmpriv->DMFlag |= DYNAMIC_FUNC_BT; -// btdm_InitBtCoexistDM(Adapter); // Move to BT_CoexistMechanism() -#endif - pdmpriv->InitDMFlag = pdmpriv->DMFlag; - - Update_ODM_ComInfo_8723a(Adapter); - ODM_DMInit(pDM_Odm); - // Save REG_INIDATA_RATE_SEL value for TXDESC. - for(i = 0 ; i<32 ; i++) - { - pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL+i) & 0x3f; - } - -} - -VOID -rtl8723a_HalDmWatchDog( - IN PADAPTER Adapter - ) -{ - BOOLEAN bFwCurrentInPSMode = _FALSE; - BOOLEAN bFwPSAwake = _TRUE; - u8 hw_init_completed = _FALSE; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; -#ifdef CONFIG_CONCURRENT_MODE - PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter; -#endif //CONFIG_CONCURRENT_MODE - - hw_init_completed = Adapter->hw_init_completed; - - if (hw_init_completed == _FALSE) - goto skip_dm; - -#ifdef CONFIG_LPS - #ifdef CONFIG_CONCURRENT_MODE - if (Adapter->iface_type != IFACE_PORT0 && pbuddy_adapter) { - bFwCurrentInPSMode = pbuddy_adapter->pwrctrlpriv.bFwCurrentInPSMode; - rtw_hal_get_hwreg(pbuddy_adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); - } else - #endif //CONFIG_CONCURRENT_MODE - { - bFwCurrentInPSMode = Adapter->pwrctrlpriv.bFwCurrentInPSMode; - rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); - } -#endif - -#ifdef CONFIG_P2P_PS - // Fw is under p2p powersaving mode, driver should stop dynamic mechanism. - // modifed by thomas. 2011.06.11. - if(Adapter->wdinfo.p2p_ps_mode) - bFwPSAwake = _FALSE; -#endif //CONFIG_P2P_PS - - if( (hw_init_completed == _TRUE) - && ((!bFwCurrentInPSMode) && bFwPSAwake)) - { - // - // Calculate Tx/Rx statistics. - // - dm_CheckStatistics(Adapter); - - -#ifdef CONFIG_CONCURRENT_MODE - if(Adapter->adapter_type > PRIMARY_ADAPTER) - goto _record_initrate; -#endif - - // - // Dynamically switch RTS/CTS protection. - // - //dm_CheckProtection(Adapter); - -#ifdef CONFIG_PCI_HCI - // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput. - // Tx Migration settings. - //dm_InterruptMigration(Adapter); - - //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter)) - // PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem)); -#endif -_record_initrate: - - // Read REG_INIDATA_RATE_SEL value for TXDESC. - if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) - { - pdmpriv->INIDATA_RATE[0] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL) & 0x3f; - } - else - { - u8 i; - for(i=1 ; i < (Adapter->stapriv.asoc_sta_count + 1); i++) - { - pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, (REG_INIDATA_RATE_SEL+i)) & 0x3f; - } - } - } - - - //ODM - if (hw_init_completed == _TRUE) - { - u8 bLinked=_FALSE; - - #ifdef CONFIG_DISABLE_ODM - pHalData->odmpriv.SupportAbility = 0; - #endif - - if(rtw_linked_check(Adapter)) - bLinked = _TRUE; - -#ifdef CONFIG_CONCURRENT_MODE - if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)) - bLinked = _TRUE; -#endif //CONFIG_CONCURRENT_MODE - - ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked); - ODM_DMWatchdog(&pHalData->odmpriv); - - } - -skip_dm: - - // Check GPIO to determine current RF on/off and Pbc status. - // Check Hardware Radio ON/OFF or not -#ifdef CONFIG_PCI_HCI - if(pHalData->bGpioHwWpsPbc) -#endif - { - dm_CheckPbcGPIO(Adapter); // Add by hpfan 2008-03-11 - } - -} - -void rtl8723a_init_dm_priv(IN PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T podmpriv = &pHalData->odmpriv; - _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv)); - Init_ODM_ComInfo_8723a(Adapter); -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - //_init_timer(&(pdmpriv->SwAntennaSwitchTimer), Adapter->pnetdev , odm_SW_AntennaSwitchCallback, Adapter); - ODM_InitAllTimers(podmpriv ); -#endif -} - -void rtl8723a_deinit_dm_priv(IN PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PDM_ODM_T podmpriv = &pHalData->odmpriv; -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - //_cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer); - ODM_CancelAllTimers(podmpriv); -#endif -} - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +//============================================================ +// Description: +// +// This file is for 92CE/92CU dynamic mechanism only +// +// +//============================================================ +#define _RTL8723A_DM_C_ + +//============================================================ +// include files +//============================================================ +#include +#include +#include +#include + +#include + +//============================================================ +// Global var +//============================================================ + + +static VOID +dm_CheckProtection( + IN PADAPTER Adapter + ) +{ +#if 0 + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u1Byte CurRate, RateThreshold; + + if(pMgntInfo->pHTInfo->bCurBW40MHz) + RateThreshold = MGN_MCS1; + else + RateThreshold = MGN_MCS3; + + if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold) + { + pMgntInfo->bDmDisableProtect = TRUE; + DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); + } + else + { + pMgntInfo->bDmDisableProtect = FALSE; + DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); + } +#endif +} + +static VOID +dm_CheckStatistics( + IN PADAPTER Adapter + ) +{ +#if 0 + if(!Adapter->MgntInfo.bMediaConnect) + return; + + //2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly. + rtw_hal_get_hwreg( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) ); + + // Calculate current Tx Rate(Successful transmited!!) + + // Calculate current Rx Rate(Successful received!!) + + //for tx tx retry count + rtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) ); +#endif +} + +static void dm_CheckPbcGPIO(_adapter *padapter) +{ + u8 tmp1byte; + u8 bPbcPressed = _FALSE; + + if(!padapter->registrypriv.hw_wps_pbc) + return; + +#ifdef CONFIG_USB_HCI + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); + tmp1byte |= (HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as output mode + + tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IN, tmp1byte); //reset the floating voltage level + + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); + tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as input mode + + tmp1byte =rtw_read8(padapter, GPIO_IN); + + if (tmp1byte == 0xff) + return ; + + if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT) + { + bPbcPressed = _TRUE; + } +#else + tmp1byte = rtw_read8(padapter, GPIO_IN); + //RT_TRACE(COMP_IO, DBG_TRACE, ("dm_CheckPbcGPIO - %x\n", tmp1byte)); + + if (tmp1byte == 0xff || padapter->init_adpt_in_progress) + return ; + + if((tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)==0) + { + bPbcPressed = _TRUE; + } +#endif + + if( _TRUE == bPbcPressed) + { + // Here we only set bPbcPressed to true + // After trigger PBC, the variable will be set to false + DBG_8192C("CheckPbcGPIO - PBC is pressed\n"); + +#ifdef RTK_DMP_PLATFORM +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) + kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_NET_PBC); +#else + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC); +#endif +#else + + if ( padapter->pid[0] == 0 ) + { // 0 is the default value and it means the application monitors the HW PBC doesn't privde its pid to driver. + return; + } + +#ifdef PLATFORM_LINUX + rtw_signal_process(padapter->pid[0], SIGUSR1); +#endif +#endif + } +} + +#ifdef CONFIG_PCI_HCI +// +// Description: +// Perform interrupt migration dynamically to reduce CPU utilization. +// +// Assumption: +// 1. Do not enable migration under WIFI test. +// +// Created by Roger, 2010.03.05. +// +VOID +dm_InterruptMigration( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bCurrentIntMt, bCurrentACIntDisable; + BOOLEAN IntMtToSet = _FALSE; + BOOLEAN ACIntToSet = _FALSE; + + + // Retrieve current interrupt migration and Tx four ACs IMR settings first. + bCurrentIntMt = pHalData->bInterruptMigration; + bCurrentACIntDisable = pHalData->bDisableTxInt; + + // + // Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics + // when interrupt migration is set before. 2010.03.05. + // + if(!Adapter->registrypriv.wifi_spec && + (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && + pmlmepriv->LinkDetectInfo.bHigherBusyTraffic) + { + IntMtToSet = _TRUE; + + // To check whether we should disable Tx interrupt or not. + if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic ) + ACIntToSet = _TRUE; + } + + //Update current settings. + if( bCurrentIntMt != IntMtToSet ){ + DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet); + if(IntMtToSet) + { + // + // Set interrrupt migration timer and corresponging Tx/Rx counter. + // timer 25ns*0xfa0=100us for 0xf packets. + // 2010.03.05. + // + rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx + pHalData->bInterruptMigration = IntMtToSet; + } + else + { + // Reset all interrupt migration settings. + rtw_write32(Adapter, REG_INT_MIG, 0); + pHalData->bInterruptMigration = IntMtToSet; + } + } + + /*if( bCurrentACIntDisable != ACIntToSet ){ + DBG_8192C("%s(): Update AC interrrupt(%d)\n",__FUNCTION__,ACIntToSet); + if(ACIntToSet) // Disable four ACs interrupts. + { + // + // Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization. + // When extremely highly Rx OK occurs, we will disable Tx interrupts. + // 2010.03.05. + // + UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS ); + pHalData->bDisableTxInt = ACIntToSet; + } + else// Enable four ACs interrupts. + { + UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 ); + pHalData->bDisableTxInt = ACIntToSet; + } + }*/ + +} + +#endif + +// +// Initialize GPIO setting registers +// +static void +dm_InitGPIOSetting( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + u8 tmp1byte; + + tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); + tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); + + rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); +} +//============================================================ +// functions +//============================================================ +static void Init_ODM_ComInfo_8723a(PADAPTER Adapter) +{ + + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + u8 cut_ver,fab_ver; + + // + // Init Value + // + _rtw_memset(pDM_Odm,0,sizeof(pDM_Odm)); + + pDM_Odm->Adapter = Adapter; + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PLATFORM,ODM_CE); + if(Adapter->interface_type == RTW_GSPI ) + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,ODM_ITRF_SDIO); + else + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,Adapter->interface_type);//RTL871X_HCI_TYPE + + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_IC_TYPE,ODM_RTL8723A); + + + if(IS_8723A_A_CUT(pHalData->VersionID)) + { + fab_ver = ODM_UMC; + cut_ver = ODM_CUT_A; + } + else if(IS_8723A_B_CUT(pHalData->VersionID)) + { + fab_ver = ODM_UMC; + cut_ver = ODM_CUT_B; + } + else + { + fab_ver = ODM_TSMC; + cut_ver = ODM_CUT_A; + } + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver); + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver); + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_MP_TEST_CHIP,IS_NORMAL_CHIP(pHalData->VersionID)); + +#ifdef CONFIG_USB_HCI + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BOARD_TYPE,pHalData->BoardType); + + if(pHalData->BoardType == BOARD_USB_High_PA){ + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_LNA,_TRUE); + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_PA,_TRUE); + } +#endif + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PATCH_ID,pHalData->CustomerID); + // ODM_CMNINFO_BINHCT_TEST only for MP Team + ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BWIFI_TEST,Adapter->registrypriv.wifi_spec); + + + if(pHalData->rf_type == RF_1T1R){ + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T1R); + } + else if(pHalData->rf_type == RF_2T2R){ + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_2T2R); + } + else if(pHalData->rf_type == RF_1T2R){ + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T2R); + } +} +static void Update_ODM_ComInfo_8723a(PADAPTER Adapter) +{ + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + int i; + + pdmpriv->InitODMFlag = 0 + | ODM_BB_DIG +#ifdef CONFIG_ODM_REFRESH_RAMASK + | ODM_BB_RA_MASK +#endif + | ODM_BB_DYNAMIC_TXPWR + | ODM_BB_FA_CNT + | ODM_BB_RSSI_MONITOR + | ODM_BB_CCK_PD + | ODM_BB_PWR_SAVE + | ODM_MAC_EDCA_TURBO + | ODM_RF_TX_PWR_TRACK + | ODM_RF_CALIBRATION +#ifdef CONFIG_ODM_ADAPTIVITY + | ODM_BB_ADAPTIVITY +#endif + ; + +#ifdef CONFIG_ANTENNA_DIVERSITY + if(pHalData->AntDivCfg) + pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV; +#endif + +#if (MP_DRIVER==1) + if (Adapter->registrypriv.mp_mode == 1) { + pdmpriv->InitODMFlag = 0 + | ODM_RF_CALIBRATION + | ODM_RF_TX_PWR_TRACK + ; + } +#endif//(MP_DRIVER==1) + +#ifdef CONFIG_DISABLE_ODM + pdmpriv->InitODMFlag = 0; +#endif//CONFIG_DISABLE_ODM + + // + // Pointer reference + // + //ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D + // ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u1Byte_temp)); + + ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag); + + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_TX_UNI,&(Adapter->xmitpriv.tx_bytes)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_RX_UNI,&(Adapter->recvpriv.rx_bytes)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_WM_MODE,&(pmlmeext->cur_wireless_mode)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_CHNL_OFFSET,&(pHalData->nCur40MhzPrimeSC)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_MODE,&(Adapter->securitypriv.dot11PrivacyAlgrthm)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BW,&(pHalData->CurrentChannelBW )); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_CHNL,&( pHalData->CurrentChannel)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_NET_CLOSED,&( Adapter->net_closed)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MP_MODE,&(Adapter->registrypriv.mp_mode)); + + //================= only for 8192D ================= + /* + //pHalData->CurrentBandType92D + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pDM_Odm->u1Byte_temp)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_GET_VALUE,&(pDM_Odm->u1Byte_temp)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BUDDY_ADAPTOR,&(pDM_Odm->PADAPTER_temp)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_IS_MASTER,&(pDM_Odm->u1Byte_temp)); + //================= only for 8192D ================= + // driver havn't those variable now + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_OPERATION,&(pDM_Odm->u1Byte_temp)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_DISABLE_EDCA,&(pDM_Odm->u1Byte_temp)); + */ + + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess)); + ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving)); + + + for(i=0; i< NUM_STA; i++) + { + //pDM_Odm->pODM_StaInfo[i] = NULL; + ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS,i,NULL); + } +} + +void +rtl8723a_InitHalDm( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + + u8 i; + + pdmpriv->DM_Type = DM_Type_ByDriver; + pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; + +#ifdef CONFIG_BT_COEXIST + pdmpriv->DMFlag |= DYNAMIC_FUNC_BT; +// btdm_InitBtCoexistDM(Adapter); // Move to BT_CoexistMechanism() +#endif + pdmpriv->InitDMFlag = pdmpriv->DMFlag; + + Update_ODM_ComInfo_8723a(Adapter); + ODM_DMInit(pDM_Odm); + // Save REG_INIDATA_RATE_SEL value for TXDESC. + for(i = 0 ; i<32 ; i++) + { + pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL+i) & 0x3f; + } + +} + +VOID +rtl8723a_HalDmWatchDog( + IN PADAPTER Adapter + ) +{ + BOOLEAN bFwCurrentInPSMode = _FALSE; + BOOLEAN bFwPSAwake = _TRUE; + u8 hw_init_completed = _FALSE; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; +#ifdef CONFIG_CONCURRENT_MODE + PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter; +#endif //CONFIG_CONCURRENT_MODE + + hw_init_completed = Adapter->hw_init_completed; + + if (hw_init_completed == _FALSE) + goto skip_dm; + +#ifdef CONFIG_LPS + bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode; + rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); +#endif + +#ifdef CONFIG_P2P_PS + // Fw is under p2p powersaving mode, driver should stop dynamic mechanism. + // modifed by thomas. 2011.06.11. + if(Adapter->wdinfo.p2p_ps_mode) + bFwPSAwake = _FALSE; +#endif //CONFIG_P2P_PS + + if( (hw_init_completed == _TRUE) + && ((!bFwCurrentInPSMode) && bFwPSAwake)) + { + // + // Calculate Tx/Rx statistics. + // + dm_CheckStatistics(Adapter); + + +#ifdef CONFIG_CONCURRENT_MODE + if(Adapter->adapter_type > PRIMARY_ADAPTER) + goto _record_initrate; +#endif + + // + // Dynamically switch RTS/CTS protection. + // + //dm_CheckProtection(Adapter); + +#ifdef CONFIG_PCI_HCI + // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput. + // Tx Migration settings. + //dm_InterruptMigration(Adapter); + + //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter)) + // PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem)); +#endif +_record_initrate: + + // Read REG_INIDATA_RATE_SEL value for TXDESC. + if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) + { + pdmpriv->INIDATA_RATE[0] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL) & 0x3f; + } + else + { + u8 i; + for(i=1 ; i < (Adapter->stapriv.asoc_sta_count + 1); i++) + { + pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, (REG_INIDATA_RATE_SEL+i)) & 0x3f; + } + } + } + + + //ODM + if (hw_init_completed == _TRUE) + { + u8 bLinked=_FALSE; + + #ifdef CONFIG_DISABLE_ODM + pHalData->odmpriv.SupportAbility = 0; + #endif + + if(rtw_linked_check(Adapter)) + bLinked = _TRUE; + +#ifdef CONFIG_CONCURRENT_MODE + if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)) + bLinked = _TRUE; +#endif //CONFIG_CONCURRENT_MODE + + ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked); + ODM_DMWatchdog(&pHalData->odmpriv); + + } + +skip_dm: + + // Check GPIO to determine current RF on/off and Pbc status. + // Check Hardware Radio ON/OFF or not +#ifdef CONFIG_PCI_HCI + if(pHalData->bGpioHwWpsPbc) +#endif + { + dm_CheckPbcGPIO(Adapter); // Add by hpfan 2008-03-11 + } + +} + +void rtl8723a_init_dm_priv(IN PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T podmpriv = &pHalData->odmpriv; + _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv)); + Init_ODM_ComInfo_8723a(Adapter); +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + //_init_timer(&(pdmpriv->SwAntennaSwitchTimer), Adapter->pnetdev , odm_SW_AntennaSwitchCallback, Adapter); + ODM_InitAllTimers(podmpriv ); +#endif +} + +void rtl8723a_deinit_dm_priv(IN PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PDM_ODM_T podmpriv = &pHalData->odmpriv; +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + //_cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer); + ODM_CancelAllTimers(podmpriv); +#endif +} + diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_hal_init.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_hal_init.c index 2a002f5e5f7c..aef17c95853c 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_hal_init.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_hal_init.c @@ -37,10 +37,6 @@ _FWDownloadEnable( if(enable) { - // 8051 enable - tmp = rtw_read8(padapter, REG_SYS_FUNC_EN+1); - rtw_write8(padapter, REG_SYS_FUNC_EN+1, tmp|0x04); - // MCU firmware download enable. tmp = rtw_read8(padapter, REG_MCUFWDL); rtw_write8(padapter, REG_MCUFWDL, tmp|0x01); @@ -230,6 +226,29 @@ exit: return ret; } +void _8051Reset8723A(PADAPTER padapter) +{ + u8 tmp; + + // Reset 8051 + tmp = rtw_read8(padapter, REG_SYS_FUNC_EN + 1); + rtw_write8(padapter, REG_SYS_FUNC_EN + 1, tmp & (~BIT2)); + + // Reset wrapper + tmp = rtw_read8(padapter, REG_RSV_CTRL + 1); + rtw_write8(padapter, REG_RSV_CTRL + 1, tmp & (~BIT0)); + + // Enable wrapper + tmp = rtw_read8(padapter, REG_RSV_CTRL + 1); + rtw_write8(padapter, REG_RSV_CTRL + 1, tmp | BIT0); + + // 8051 enable + tmp = rtw_read8(padapter, REG_SYS_FUNC_EN+1); + rtw_write8(padapter, REG_SYS_FUNC_EN+1, tmp|BIT2); + + DBG_871X("=====> _8051Reset8723A(): 8051 reset success .\n"); +} + static s32 _FWFreeToGo(PADAPTER padapter) { u32 counter = 0; @@ -242,7 +261,7 @@ static s32 _FWFreeToGo(PADAPTER padapter) } while (counter++ < POLLING_READY_TIMEOUT_COUNT); if (counter >= POLLING_READY_TIMEOUT_COUNT) { - RT_TRACE(_module_hal_init_c_, _drv_err_, ("%s: chksum report fail! REG_MCUFWDL:0x%08x\n", __FUNCTION__, value32)); + DBG_871X("%s: chksum report fail! REG_MCUFWDL:0x%08x\n", __FUNCTION__, value32); return _FAIL; } RT_TRACE(_module_hal_init_c_, _drv_info_, ("%s: Checksum report OK! REG_MCUFWDL:0x%08x\n", __FUNCTION__, value32)); @@ -252,6 +271,8 @@ static s32 _FWFreeToGo(PADAPTER padapter) value32 &= ~WINTINI_RDY; rtw_write32(padapter, REG_MCUFWDL, value32); + _8051Reset8723A(padapter); + // polling for FW ready counter = 0; do { @@ -263,7 +284,7 @@ static s32 _FWFreeToGo(PADAPTER padapter) rtw_udelay_os(5); } while (counter++ < POLLING_READY_TIMEOUT_COUNT); - RT_TRACE(_module_hal_init_c_, _drv_err_, ("%s: Polling FW ready fail!! REG_MCUFWDL:0x%08x\n", __FUNCTION__, value32)); + DBG_871X("%s: Polling FW ready fail!! REG_MCUFWDL:0x%08x\n", __FUNCTION__, value32); return _FAIL; } @@ -412,7 +433,7 @@ int _WriteBTFWtoTxPktBuf8723A( //BT patch is big, we should set 0x209 < 0x40 suggested from Gimmy RT_TRACE(_module_mp_, _drv_info_,("0x209:%x\n", PlatformEFIORead1Byte(Adapter, REG_TDECTRL+1)));//209 < 0x40 -#if 0 +#if 0//def CONFIG_RTL8723A_SDIO PlatformEFIOWrite1Byte(Adapter, REG_TDECTRL+1, 0x30); RT_TRACE(_module_mp_, _drv_info_,("0x209:%x\n", PlatformEFIORead1Byte(Adapter, REG_TDECTRL+1))); @@ -656,6 +677,7 @@ FirmwareDownloadBT(IN PADAPTER Adapter, PRT_FIRMWARE_8723A pFirmware) u1Byte *pBTFirmwareBuf; u4Byte BTFirmwareLen; + u8 i; // // Patch BT Fw. Download BT RAM code to Tx packet buffer. Added by tynli. 2011.10. // Only for 8723AE for Toshiba. Suggested by SD1 Jackie. @@ -667,7 +689,13 @@ FirmwareDownloadBT(IN PADAPTER Adapter, PRT_FIRMWARE_8723A pFirmware) DBG_871X("BT Firmware is ready!!\n"); return _FAIL; }*/ - + PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x2d); + PlatformEFIOWrite4Byte(Adapter, 0x68, 0xa005000c); + rtw_msleep_os(5); + PlatformEFIOWrite4Byte(Adapter, 0x68, 0xb005000c); + PlatformEFIOWrite1Byte(Adapter, 0xCC, 0x29); + for(i=0; i<10; i++) + rtw_msleep_os(100); BTFwImage = (pu1Byte)Rtl8723EFwBTImgArray; BTFwImageLen = Rtl8723EBTImgArrayLength; DBG_871X("BT Firmware is size= %zu!!\n",sizeof(Rtl8723EFwBTImgArray)); @@ -701,33 +729,34 @@ FirmwareDownloadBT(IN PADAPTER Adapter, PRT_FIRMWARE_8723A pFirmware) //for h2c cam here should be set to true Adapter->bFWReady = _TRUE; DBG_871X("FirmwareDownloadBT to _WriteBTFWtoTxPktBuf8723A !\n"); -#if 1 +#ifdef CONFIG_RTL8723A_SDIO + rtStatus = _WriteBTFWtoTxPktBuf8723A(Adapter, pBTFirmwareBuf, BTFirmwareLen, 0); +#else //rtStatus = _WriteBTFWtoTxPktBuf8723A(Adapter, pBTFirmwareBuf, BTFirmwareLen); rtStatus = _WriteBTFWtoTxPktBuf8723A(Adapter, pBTFirmwareBuf+(4096*3), (BTFirmwareLen-(4096*3)), 1); if(rtStatus != _SUCCESS) { - DBG_871X("BT Firmware download to Tx packet buffer first fail!\n"); + DBG_871X("BT Firmware download to Tx packet buffer first fail! \n"); return rtStatus; } rtStatus = _WriteBTFWtoTxPktBuf8723A(Adapter, pBTFirmwareBuf+(4096*2), 4096, 2); if(rtStatus != _SUCCESS) { - DBG_871X("BT Firmware download to Tx packet buffer second fail!\n"); + DBG_871X("BT Firmware download to Tx packet buffer second fail! \n"); return rtStatus; } rtStatus = _WriteBTFWtoTxPktBuf8723A(Adapter, pBTFirmwareBuf+(4096), 4096, 3); if(rtStatus != _SUCCESS) { - DBG_871X("BT Firmware download to Tx packet buffer third fail!\n"); + DBG_871X("BT Firmware download to Tx packet buffer third fail! \n"); return rtStatus; } rtStatus = _WriteBTFWtoTxPktBuf8723A(Adapter, pBTFirmwareBuf, 4096, 4); - - +#endif if(rtStatus != _SUCCESS) { - RT_TRACE(_module_mp_, _drv_info_,("BT Firmware download to Tx packet buffer fail!\n")); - DBG_871X("BT Firmware download to Tx packet buffer fail!\n"); + RT_TRACE(_module_mp_, _drv_info_,("BT Firmware download to Tx packet buffer four fail! \n")); + DBG_871X("BT Firmware download to Tx packet buffer four fail!!\n"); } else { @@ -735,7 +764,7 @@ FirmwareDownloadBT(IN PADAPTER Adapter, PRT_FIRMWARE_8723A pFirmware) SetFwBTFwPatchCmd(Adapter, (u2Byte)BTFirmwareLen); _CheckWLANFwPatchBTFwReady(Adapter); } -#endif + DBG_871X("<===FirmwareDownloadBT(),return %s!\n",rtStatus?"SUCCESS":"FAIL"); return rtStatus; @@ -970,7 +999,7 @@ void rtl8723a_InitializeFirmwareVars(PADAPTER padapter) PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); // Init Fw LPS related. - padapter->pwrctrlpriv.bFwCurrentInPSMode = _FALSE; + adapter_to_pwrctl(padapter)->bFwCurrentInPSMode = _FALSE; // Init H2C counter. by tynli. 2009.12.09. pHalData->LastHMEBoxNum = 0; @@ -982,10 +1011,13 @@ void rtl8723a_InitializeFirmwareVars(PADAPTER padapter) static void rtl8723a_free_hal_data(PADAPTER padapter) { _func_enter_; - if (padapter->HalData) { + + if(padapter->HalData) + { rtw_mfree(padapter->HalData, sizeof(HAL_DATA_TYPE)); padapter->HalData = NULL; } + _func_exit_; } @@ -2589,14 +2621,6 @@ void rtl8723a_SetHalODMVar( case HAL_ODM_STA_INFO: { struct sta_info *psta = (struct sta_info *)pValue1; - #ifdef CONFIG_CONCURRENT_MODE - //get Primary adapter's odmpriv - if(Adapter->adapter_type > PRIMARY_ADAPTER && Adapter->pbuddy_adapter){ - pHalData = GET_HAL_DATA(Adapter->pbuddy_adapter); - podmpriv = &pHalData->odmpriv; - } - #endif - if(bSet){ DBG_8192C("Set STA_(%d) info\n",psta->mac_id); ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,psta); @@ -2721,9 +2745,7 @@ void rtl8723a_set_hal_ops(struct hal_ops *pHalFunc) pHalFunc->SetBeaconRelatedRegistersHandler = &rtl8723a_SetBeaconRelatedRegisters; pHalFunc->Add_RateATid = &rtl8192c_Add_RateATid; -#ifdef CONFIG_CONCURRENT_MODE - pHalFunc->clone_haldata = &rtl8723a_clone_haldata; -#endif + pHalFunc->run_thread= &rtl8723a_start_thread; pHalFunc->cancel_thread= &rtl8723a_stop_thread; @@ -2831,7 +2853,7 @@ void rtl8723a_init_default_value(PADAPTER padapter) // init default value pHalData->fw_ractrl = _FALSE; pHalData->bIQKInitialized = _FALSE; - if (!padapter->pwrctrlpriv.bkeepfwalive) + if (!adapter_to_pwrctl(padapter)->bkeepfwalive) pHalData->LastHMEBoxNum = 0; pHalData->bIQKInitialized = _FALSE; @@ -3905,6 +3927,33 @@ Hal_InitChannelPlan( #endif } +#ifdef CONFIG_RF_GAIN_OFFSET +void Hal_ReadRFGainOffset( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail) +{ + // + // BB_RF Gain Offset from EEPROM + // + if(!AutoloadFail ){ + Adapter->eeprompriv.EEPROMRFGainOffset =PROMContent[EEPROM_RF_GAIN_OFFSET]; + DBG_871X("AutoloadFail =%x,\n", AutoloadFail); + Adapter->eeprompriv.EEPROMRFGainVal=EFUSE_Read1Byte(Adapter, EEPROM_RF_GAIN_VAL); + DBG_871X("Adapter->eeprompriv.EEPROMRFGainVal=%x\n", Adapter->eeprompriv.EEPROMRFGainVal); + } + else{ + Adapter->eeprompriv.EEPROMRFGainOffset = 0; + Adapter->eeprompriv.EEPROMRFGainVal=0xFF; + DBG_871X("else AutoloadFail =%x,\n", AutoloadFail); + } + DBG_871X("EEPRORFGainOffset = 0x%02x\n", Adapter->eeprompriv.EEPROMRFGainOffset); +} +#endif //CONFIG_RF_GAIN_OFFSET + + + + void rtl8723a_cal_txdesc_chksum(struct tx_desc *ptxdesc) { u16 *usPtr = (u16*)ptxdesc; @@ -4351,6 +4400,11 @@ static void hw_var_set_opmode(PADAPTER padapter, u8 variable, u8 *val) } // disable atim wnd +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->iface_type == IFACE_PORT1) + val8 = DIS_TSF_UDT|DIS_ATIM; + else +#endif val8 = DIS_TSF_UDT|EN_BCN_FUNCTION|DIS_ATIM; SetBcnCtrlReg(padapter, val8, ~val8); } @@ -4608,8 +4662,8 @@ static void hw_var_set_mlme_disconnect(PADAPTER padapter, u8 variable, u8 *val) // reset TSF1 rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(1)); - // disable update TSF1 - SetBcnCtrlReg(padapter, DIS_TSF_UDT, 0); + // disable update TSF1, disble BCN function + SetBcnCtrlReg(padapter, DIS_TSF_UDT, EN_BCN_FUNCTION); } else #endif @@ -5315,7 +5369,7 @@ _func_enter_; #define RW_RELEASE_EN BIT(18) #define RXDMA_IDLE BIT(17) - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); u8 trycnt = 100; // pause tx @@ -5353,12 +5407,13 @@ _func_enter_; { u16 v16; u32 i; + #if 0 u8 RetryLimit = 0x01; //rtw_write16(padapter, REG_RL,0x0101); v16 = RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT; rtw_write16(padapter, REG_RL, v16); - + #endif for (i=0; i<1000; i++) { if (rtw_read32(padapter, 0x200) != rtw_read32(padapter, 0x204)) @@ -5372,10 +5427,11 @@ _func_enter_; break; } } - + #if 0 RetryLimit = 0x30; v16 = RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT; rtw_write16(padapter, REG_RL, v16); + #endif } #endif break; @@ -5403,7 +5459,11 @@ _func_enter_; rtw_write8(padapter, REG_NAV_UPPER, (u8)usNavUpper); } break; - + case HW_VAR_H2C_MEDIA_STATUS_RPT: + { + rtl8723a_set_FwMediaStatus_cmd(padapter , (*(u16 *)val)); + } + break; case HW_VAR_BCN_VALID: //BCN_VALID, BIT16 of REG_TDECTRL = BIT0 of REG_TDECTRL+2, write 1 to clear, Clear by sw rtw_write8(padapter, REG_TDECTRL+2, rtw_read8(padapter, REG_TDECTRL+2) | BIT0); @@ -5447,13 +5507,25 @@ void GetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val) } break; + case HW_VAR_CAM_READ: + { + u32 cmd; + u32 *cam_val = (u32*)val; + + cmd = CAM_POLLINIG | CAM_READ | cam_val[1]; + rtw_write32(padapter, RWCAM, cmd); + + cam_val[0]=rtw_read32(padapter, RCAMO); + } + break; + case HW_VAR_FWLPS_RF_ON: { // When we halt NIC, we should check if FW LPS is leave. u32 valRCR; if ((padapter->bSurpriseRemoved == _TRUE) || - (padapter->pwrctrlpriv.rf_pwrstate == rf_off)) + (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off)) { // If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, // because Fw is unload. @@ -5504,7 +5576,13 @@ void GetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val) break; case HW_VAR_CHK_HI_QUEUE_EMPTY: *val = ((rtw_read32(padapter, REG_HGQ_INFORMATION)&0x0000ff00)==0) ? _TRUE:_FALSE; + break; + case HW_VAR_C2HEVT_CLEAR: + *val = rtw_read8(padapter, REG_C2HEVT_CLEAR); break; + case HW_VAR_C2HEVT_MSG_NORMAL: + *val = rtw_read8(padapter, REG_C2HEVT_MSG_NORMAL); + break; } } @@ -5557,40 +5635,14 @@ void rtl8723a_SingleDualAntennaDetection(PADAPTER padapter) } #endif // CONFIG_BT_COEXIST -void rtl8723a_clone_haldata(_adapter* dst_adapter, _adapter* src_adapter) -{ -#ifdef CONFIG_SDIO_HCI - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(dst_adapter); - //_thread_hdl_ SdioXmitThread; - _sema temp_SdioXmitSema; - _sema temp_SdioXmitTerminateSema; - //u8 SdioTxFIFOFreePage[SDIO_TX_FREE_PG_QUEUE]; - _lock temp_SdioTxFIFOFreePageLock; - - _rtw_memcpy(&temp_SdioXmitSema, &(pHalData->SdioXmitSema), sizeof(_sema)); - _rtw_memcpy(&temp_SdioXmitTerminateSema, &(pHalData->SdioXmitTerminateSema), sizeof(_sema)); - _rtw_memcpy(&temp_SdioTxFIFOFreePageLock, &(pHalData->SdioTxFIFOFreePageLock), sizeof(_lock)); - - _rtw_memcpy(dst_adapter->HalData, src_adapter->HalData, dst_adapter->hal_data_sz); - - _rtw_memcpy(&(pHalData->SdioXmitSema), &temp_SdioXmitSema, sizeof(_sema)); - _rtw_memcpy(&(pHalData->SdioXmitTerminateSema), &temp_SdioXmitTerminateSema, sizeof(_sema)); - _rtw_memcpy(&(pHalData->SdioTxFIFOFreePageLock), &temp_SdioTxFIFOFreePageLock, sizeof(_lock)); - -#else - _rtw_memcpy(dst_adapter->HalData, src_adapter->HalData, dst_adapter->hal_data_sz); -#endif - -} - void rtl8723a_start_thread(_adapter *padapter) { #if (defined CONFIG_SDIO_HCI) || (defined CONFIG_GSPI_HCI) #ifndef CONFIG_SDIO_TX_TASKLET - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct xmit_priv *xmitpriv = &padapter->xmitpriv; - pHalData->SdioXmitThread = kthread_run(rtl8723as_xmit_thread, padapter, "RTWHALXT"); - if (IS_ERR(pHalData->SdioXmitThread)) + xmitpriv->SdioXmitThread = kthread_run(rtl8723as_xmit_thread, padapter, "RTWHALXT"); + if (IS_ERR(xmitpriv->SdioXmitThread)) { RT_TRACE(_module_hal_xmit_c_, _drv_err_, ("%s: start rtl8723as_xmit_thread FAIL!!\n", __FUNCTION__)); } @@ -5602,15 +5654,49 @@ void rtl8723a_stop_thread(_adapter *padapter) { #if (defined CONFIG_SDIO_HCI) || (defined CONFIG_GSPI_HCI) #ifndef CONFIG_SDIO_TX_TASKLET - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct xmit_priv *xmitpriv = &padapter->xmitpriv; // stop xmit_buf_thread - if (pHalData->SdioXmitThread ) { - _rtw_up_sema(&pHalData->SdioXmitSema); - _rtw_down_sema(&pHalData->SdioXmitTerminateSema); - pHalData->SdioXmitThread = 0; + if (xmitpriv->SdioXmitThread ) { + _rtw_up_sema(&xmitpriv->SdioXmitSema); + _rtw_down_sema(&xmitpriv->SdioXmitTerminateSema); + xmitpriv->SdioXmitThread = 0; } #endif #endif } +#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) +extern void check_bt_status_work(void *data); +void rtl8723a_init_checkbthang_workqueue(_adapter * adapter) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + adapter->priv_checkbt_wq = alloc_workqueue("sdio_wq", 0, 0); +#else + adapter->priv_checkbt_wq = create_workqueue("sdio_wq"); +#endif + INIT_DELAYED_WORK(&adapter->checkbt_work, (void*)check_bt_status_work); +} + +void rtl8723a_free_checkbthang_workqueue(_adapter * adapter) +{ + if (adapter->priv_checkbt_wq) { + cancel_delayed_work_sync(&adapter->checkbt_work); + flush_workqueue(adapter->priv_checkbt_wq); + destroy_workqueue(adapter->priv_checkbt_wq); + adapter->priv_checkbt_wq = NULL; + } +} +void rtl8723a_cancel_checkbthang_workqueue(_adapter * adapter) +{ + if (adapter->priv_checkbt_wq) { + cancel_delayed_work_sync(&adapter->checkbt_work); + } +} + +void rtl8723a_hal_check_bt_hang(_adapter * adapter) +{ + if (adapter->priv_checkbt_wq) + queue_delayed_work(adapter->priv_checkbt_wq, &(adapter->checkbt_work), 0); +} +#endif diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_mp.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_mp.c index 9ee3996aaad1..c05a0cb39103 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_mp.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_mp.c @@ -1,1179 +1,1214 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8723A_MP_C_ -#ifdef CONFIG_MP_INCLUDED - -#include -#include -#include - - -/*----------------------------------------------------------------------------- - * Function: mpt_SwitchRfSetting - * - * Overview: Change RF Setting when we siwthc channel/rate/BW for MP. - * - * Input: IN PADAPTER pAdapter - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series. - * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3. - * - *---------------------------------------------------------------------------*/ - static void phy_SwitchRfSetting8723A(PADAPTER pAdapter,u8 channel ) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u32 u4RF_IPA[3], u4RF_TXBIAS, u4RF_SYN_G2; - - //default value - { - u4RF_IPA[0] = 0x4F424; //CCK - u4RF_IPA[1] = 0xCF424; //OFDM - u4RF_IPA[2] = 0x8F424; //MCS - u4RF_TXBIAS = 0xC0356; - u4RF_SYN_G2 = 0x4F200; - } - - switch(channel) - { - case 1: - u4RF_IPA[0] = 0x4F40C; - u4RF_IPA[1] = 0xCF466; - u4RF_TXBIAS = 0xC0350; - break; - - case 2: - u4RF_IPA[0] = 0x4F407; - u4RF_TXBIAS = 0xC0350; - break; - - case 3: - u4RF_IPA[0] = 0x4F407; - u4RF_IPA[2] = 0x8F466; - u4RF_TXBIAS = 0xC0350; - break; - - case 5: - case 8: - u4RF_SYN_G2 = 0x0F400; - break; - - case 6: - case 13: - u4RF_IPA[0] = 0x4F40C; - break; - - case 7: - u4RF_IPA[0] = 0x4F40C; - u4RF_SYN_G2 = 0x0F400; - break; - - case 9: - u4RF_IPA[2] = 0x8F454; - u4RF_SYN_G2 = 0x0F400; - break; - - case 11: - u4RF_IPA[0] = 0x4F40C; - u4RF_IPA[1] = 0xCF454; - u4RF_SYN_G2 = 0x0F400; - break; - - default: - u4RF_IPA[0] = 0x4F424; - u4RF_IPA[1] = 0x8F424; - u4RF_IPA[2] = 0xCF424; - u4RF_TXBIAS = 0xC0356; - u4RF_SYN_G2 = 0x4F200; - break; - } - - PHY_SetRFReg(pAdapter, RF_PATH_A, RF_IPA, bRFRegOffsetMask, u4RF_IPA[0]); - PHY_SetRFReg(pAdapter, RF_PATH_A, RF_IPA, bRFRegOffsetMask, u4RF_IPA[1]); - PHY_SetRFReg(pAdapter, RF_PATH_A, RF_IPA, bRFRegOffsetMask, u4RF_IPA[2]); - PHY_SetRFReg(pAdapter, RF_PATH_A, RF_TXBIAS, bRFRegOffsetMask, u4RF_TXBIAS); - PHY_SetRFReg(pAdapter, RF_PATH_A, RF_SYN_G2, bRFRegOffsetMask, u4RF_SYN_G2); - -} - - - - -void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); - u8 ChannelToSw = pMptCtx->MptChannelToSw; - - phy_SwitchRfSetting8723A(pAdapter, ChannelToSw); -} - - - - -s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - - if (!netif_running(padapter->pnetdev)) { - RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: interface not opened!\n")); - return _FAIL; - } - - if (check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { - RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: not in MP mode!\n")); - return _FAIL; - } - - if (enable) - pdmpriv->TxPowerTrackControl = _TRUE; - else - pdmpriv->TxPowerTrackControl = _FALSE; - - return _SUCCESS; -} - -void Hal_GetPowerTracking(PADAPTER padapter, u8 *enable) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - - *enable = pdmpriv->TxPowerTrackControl; -} - -static void Hal_disable_dm(PADAPTER padapter) -{ - u8 v8; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - - //3 1. disable firmware dynamic mechanism - // disable Power Training, Rate Adaptive - v8 = rtw_read8(padapter, REG_BCN_CTRL); - v8 &= ~EN_BCN_FUNCTION; - rtw_write8(padapter, REG_BCN_CTRL, v8); - - //3 2. disable driver dynamic mechanism - // disable Dynamic Initial Gain - // disable High Power - // disable Power Tracking - Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - - // enable APK, LCK and IQK but disable power tracking - pdmpriv->TxPowerTrackControl = _FALSE; - Switch_DM_Func(padapter, DYNAMIC_RF_TX_PWR_TRACK , _TRUE); -} - -void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) -{ - u32 TempVal = 0, TempVal2 = 0, TempVal3 = 0; - u32 CurrCCKSwingVal = 0, CCKSwingIndex = 12; - u8 i; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - - // get current cck swing value and check 0xa22 & 0xa23 later to match the table. - CurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord); - - if (!bInCH14) - { - // Readback the current bb cck swing value and compare with the table to - // get the current swing index - for (i = 0; i < CCK_TABLE_SIZE; i++) - { - if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) && - (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch1_Ch13[i][1])) - { - CCKSwingIndex = i; -// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch1~13, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", -// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); - break; - } - } - - //Write 0xa22 0xa23 - TempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1]<<8) ; - - - //Write 0xa24 ~ 0xa27 - TempVal2 = 0; - TempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3]<<8) + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4]<<16 )+ - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5]<<24); - - //Write 0xa28 0xa29 - TempVal3 = 0; - TempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7]<<8) ; - } - else - { - for (i = 0; i < CCK_TABLE_SIZE; i++) - { - if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch14[i][0]) && - (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch14[i][1])) - { - CCKSwingIndex = i; -// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch14, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", -// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); - break; - } - } - - //Write 0xa22 0xa23 - TempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] + - (CCKSwingTable_Ch14[CCKSwingIndex][1]<<8) ; - - //Write 0xa24 ~ 0xa27 - TempVal2 = 0; - TempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] + - (CCKSwingTable_Ch14[CCKSwingIndex][3]<<8) + - (CCKSwingTable_Ch14[CCKSwingIndex][4]<<16 )+ - (CCKSwingTable_Ch14[CCKSwingIndex][5]<<24); - - //Write 0xa28 0xa29 - TempVal3 = 0; - TempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] + - (CCKSwingTable_Ch14[CCKSwingIndex][7]<<8) ; - } - - write_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal); - write_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2); - write_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3); -} - -void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) -{ - s32 TempCCk; - u8 CCK_index, CCK_index_old; - u8 Action = 0; //0: no action, 1: even->odd, 2:odd->even - u8 TimeOut = 100; - s32 i = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - - - if (!IS_92C_SERIAL(pHalData->VersionID)) - return; -#if 0 - while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) - { - PlatformSleepUs(100); - TimeOut--; - if(TimeOut <= 0) - { - RTPRINT(FINIT, INIT_TxPower, - ("!!!MPT_CCKTxPowerAdjustbyIndex Wait for check CCK gain index too long!!!\n" )); - break; - } - } -#endif - if (beven && !pMptCtx->bMptIndexEven) //odd->even - { - Action = 2; - pMptCtx->bMptIndexEven = _TRUE; - } - else if (!beven && pMptCtx->bMptIndexEven) //even->odd - { - Action = 1; - pMptCtx->bMptIndexEven = _FALSE; - } - - if (Action != 0) - { - //Query CCK default setting From 0xa24 - TempCCk = read_bbreg(pAdapter, rCCK0_TxFilter2, bMaskDWord) & bMaskCCK; - for (i = 0; i < CCK_TABLE_SIZE; i++) - { - if (pHalData->dmpriv.bCCKinCH14) - { - if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4) == _TRUE) - { - CCK_index_old = (u8) i; -// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch 14 %d\n", -// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - else - { - if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4) == _TRUE) - { - CCK_index_old = (u8) i; -// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch14 %d\n", -// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - } - - if (Action == 1) - CCK_index = CCK_index_old - 1; - else - CCK_index = CCK_index_old + 1; - -// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: new CCK_index=0x%x\n", -// CCK_index)); - - //Adjust CCK according to gain index - if (!pHalData->dmpriv.bCCKinCH14) { - rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); - rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); - rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); - rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); - rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); - rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); - rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); - rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); - } else { - rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); - rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); - rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); - rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); - rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); - rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); - rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); - rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); - } - } -#if 0 - RTPRINT(FINIT, INIT_TxPower, - ("MPT_CCKTxPowerAdjustbyIndex 0xa20=%x\n", PlatformEFIORead4Byte(Adapter, 0xa20))); - - PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); -#endif -} -/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ - -/* - * SetChannel - * Description - * Use H2C command to change channel, - * not only modify rf register, but also other setting need to be done. - */ -void Hal_SetChannel(PADAPTER pAdapter) -{ -#if 0 - struct mp_priv *pmp = &pAdapter->mppriv; - -// SelectChannel(pAdapter, pmp->channel); - set_channel_bwmode(pAdapter, pmp->channel, pmp->channel_offset, pmp->bandwidth); -#else - u8 eRFPath; - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct mp_priv *pmp = &pAdapter->mppriv; - u8 channel = pmp->channel; - u8 bandwidth = pmp->bandwidth; - u8 rate = pmp->rateidx; - - - // set RF channel register - for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) - { - if(IS_HARDWARE_TYPE_8192D(pAdapter)) - _write_rfreg(pAdapter, (RF_RADIO_PATH_E)eRFPath, rRfChannel, 0xFF, channel); - else - _write_rfreg(pAdapter, eRFPath, rRfChannel, 0x3FF, channel); - } - Hal_mpt_SwitchRfSetting(pAdapter); - - SelectChannel(pAdapter, channel); - - if (pHalData->CurrentChannel == 14 && !pHalData->dmpriv.bCCKinCH14) { - pHalData->dmpriv.bCCKinCH14 = _TRUE; - Hal_MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); - } - else if (pHalData->CurrentChannel != 14 && pHalData->dmpriv.bCCKinCH14) { - pHalData->dmpriv.bCCKinCH14 = _FALSE; - Hal_MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); - } - -#endif -} - -/* - * Notice - * Switch bandwitdth may change center frequency(channel) - */ -void Hal_SetBandwidth(PADAPTER pAdapter) -{ - struct mp_priv *pmp = &pAdapter->mppriv; - - - SetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset); - Hal_mpt_SwitchRfSetting(pAdapter); -} - -void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower) -{ - u32 tmpval = 0; - - - // rf-A cck tx power - write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]); - tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A]; - write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); - - // rf-B cck tx power - write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]); - tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B]; - write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); - - RT_TRACE(_module_mp_, _drv_notice_, - ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n", - TxPower[RF_PATH_A], TxPower[RF_PATH_B])); -} - -void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower) -{ - u32 TxAGC = 0; - u8 tmpval = 0; - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - - // HT Tx-rf(A) - tmpval = TxPower[RF_PATH_A]; - TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; - - write_bbreg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC); - - if (pHalData->dmpriv.bAPKdone && !IS_NORMAL_CHIP(pHalData->VersionID)) - { - if (tmpval > pMptCtx->APK_bound[RF_PATH_A]) - write_rfreg(pAdapter, RF_PATH_A, 0xe, pHalData->dmpriv.APKoutput[0][0]); - else - write_rfreg(pAdapter, RF_PATH_A, 0xe, pHalData->dmpriv.APKoutput[0][1]); - } - - // HT Tx-rf(B) - tmpval = TxPower[RF_PATH_B]; - TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; - - write_bbreg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC); - - if (pHalData->dmpriv.bAPKdone && !IS_NORMAL_CHIP(pHalData->VersionID)) - { - if (tmpval > pMptCtx->APK_bound[RF_PATH_B]) - write_rfreg(pAdapter, RF_PATH_B, 0xe, pHalData->dmpriv.APKoutput[1][0]); - else - write_rfreg(pAdapter, RF_PATH_B, 0xe, pHalData->dmpriv.APKoutput[1][1]); - } - - RT_TRACE(_module_mp_, _drv_notice_, - ("-SetOFDMTxPower: A[0x%02x] B[0x%02x]\n", - TxPower[RF_PATH_A], TxPower[RF_PATH_B])); -} - -void Hal_SetAntennaPathPower(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u8 TxPowerLevel[MAX_RF_PATH_NUMS]; - u8 rfPath; - - TxPowerLevel[RF_PATH_A] = pAdapter->mppriv.txpoweridx; - TxPowerLevel[RF_PATH_B] = pAdapter->mppriv.txpoweridx_b; - - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - default: - rfPath = RF_PATH_A; - break; - case ANTENNA_B: - rfPath = RF_PATH_B; - break; - case ANTENNA_C: - rfPath = RF_PATH_C; - break; - } - - switch (pHalData->rf_chip) - { - case RF_8225: - case RF_8256: - case RF_6052: - Hal_SetCCKTxPower(pAdapter, TxPowerLevel); - if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate - Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); - Hal_SetOFDMTxPower(pAdapter, TxPowerLevel); - break; - - default: - break; - } -} - -void Hal_SetTxPower(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u8 TxPower = pAdapter->mppriv.txpoweridx; - u8 TxPowerLevel[MAX_RF_PATH_NUMS]; - u8 rf, rfPath; - - for (rf = 0; rf < MAX_RF_PATH_NUMS; rf++) { - TxPowerLevel[rf] = TxPower; - } - - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - default: - rfPath = RF_PATH_A; - break; - case ANTENNA_B: - rfPath = RF_PATH_B; - break; - case ANTENNA_C: - rfPath = RF_PATH_C; - break; - } - - switch (pHalData->rf_chip) - { - // 2008/09/12 MH Test only !! We enable the TX power tracking for MP!!!!! - // We should call normal driver API later!! - case RF_8225: - case RF_8256: - case RF_6052: - Hal_SetCCKTxPower(pAdapter, TxPowerLevel); - if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate - Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); - Hal_SetOFDMTxPower(pAdapter, TxPowerLevel); - break; - - default: - break; - } - -// SetCCKTxPower(pAdapter, TxPower); -// SetOFDMTxPower(pAdapter, TxPower); -} - -void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset) -{ - u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC; - - return ; - - TxAGCOffset_B = (ulTxAGCOffset&0x000000ff); - TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8); - TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16); - - tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B); - write_bbreg(pAdapter, rFPGA0_TxGainStage, - (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC); -} - -void Hal_SetDataRate(PADAPTER pAdapter) -{ - if(!IS_HARDWARE_TYPE_8723A(pAdapter)) - Hal_mpt_SwitchRfSetting(pAdapter); -} - - -void Hal_SetAntenna(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - R_ANTENNA_SELECT_OFDM *p_ofdm_tx; /* OFDM Tx register */ - R_ANTENNA_SELECT_CCK *p_cck_txrx; - - u8 r_rx_antenna_ofdm = 0, r_ant_select_cck_val = 0; - u8 chgTx = 0, chgRx = 0; - u32 r_ant_sel_cck_val = 0, r_ant_select_ofdm_val = 0, r_ofdm_tx_en_val = 0; - - - p_ofdm_tx = (R_ANTENNA_SELECT_OFDM *)&r_ant_select_ofdm_val; - p_cck_txrx = (R_ANTENNA_SELECT_CCK *)&r_ant_select_cck_val; - - p_ofdm_tx->r_ant_ht1 = 0x1; - p_ofdm_tx->r_ant_ht2 = 0x2; // Second TX RF path is A - p_ofdm_tx->r_ant_non_ht = 0x3; // 0x1+0x2=0x3 - - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - p_ofdm_tx->r_tx_antenna = 0x1; - r_ofdm_tx_en_val = 0x1; - p_ofdm_tx->r_ant_l = 0x1; - p_ofdm_tx->r_ant_ht_s1 = 0x1; - p_ofdm_tx->r_ant_non_ht_s1 = 0x1; - p_cck_txrx->r_ccktx_enable = 0x8; - chgTx = 1; - - // From SD3 Willis suggestion !!! Set RF A=TX and B as standby -// if (IS_HARDWARE_TYPE_8192S(pAdapter)) - { - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 1); - r_ofdm_tx_en_val = 0x3; - - // Power save - //cosa r_ant_select_ofdm_val = 0x11111111; - - // We need to close RFB by SW control - if (pHalData->rf_type == RF_2T2R) - { - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 1); - PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 0); - } - } - break; - - case ANTENNA_B: - p_ofdm_tx->r_tx_antenna = 0x2; - r_ofdm_tx_en_val = 0x2; - p_ofdm_tx->r_ant_l = 0x2; - p_ofdm_tx->r_ant_ht_s1 = 0x2; - p_ofdm_tx->r_ant_non_ht_s1 = 0x2; - p_cck_txrx->r_ccktx_enable = 0x4; - chgTx = 1; - - // From SD3 Willis suggestion !!! Set RF A as standby - //if (IS_HARDWARE_TYPE_8192S(pAdapter)) - { - PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 1); - PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); -// r_ofdm_tx_en_val = 0x3; - - // Power save - //cosa r_ant_select_ofdm_val = 0x22222222; - - // 2008/10/31 MH From SD3 Willi's suggestion. We must read RF 1T table. - // 2009/01/08 MH From Sd3 Willis. We need to close RFA by SW control - if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_1T2R) - { - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 1); - PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0); -// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1); - } - } - break; - - case ANTENNA_AB: // For 8192S - p_ofdm_tx->r_tx_antenna = 0x3; - r_ofdm_tx_en_val = 0x3; - p_ofdm_tx->r_ant_l = 0x3; - p_ofdm_tx->r_ant_ht_s1 = 0x3; - p_ofdm_tx->r_ant_non_ht_s1 = 0x3; - p_cck_txrx->r_ccktx_enable = 0xC; - chgTx = 1; - - // From SD3 Willis suggestion !!! Set RF B as standby - //if (IS_HARDWARE_TYPE_8192S(pAdapter)) - { - PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); - PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); - - // Disable Power save - //cosa r_ant_select_ofdm_val = 0x3321333; -#if 0 - // 2008/10/31 MH From SD3 Willi's suggestion. We must read RFA 2T table. - if ((pHalData->VersionID == VERSION_8192S_ACUT)) // For RTL8192SU A-Cut only, by Roger, 2008.11.07. - { - mpt_RFConfigFromPreParaArrary(pAdapter, 1, RF_PATH_A); - } -#endif - // 2009/01/08 MH From Sd3 Willis. We need to enable RFA/B by SW control - if (pHalData->rf_type == RF_2T2R) - { - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0); -// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1); - } - } - break; - - default: - break; - } - - // - // r_rx_antenna_ofdm, bit0=A, bit1=B, bit2=C, bit3=D - // r_cckrx_enable : CCK default, 0=A, 1=B, 2=C, 3=D - // r_cckrx_enable_2 : CCK option, 0=A, 1=B, 2=C, 3=D - // - switch (pAdapter->mppriv.antenna_rx) - { - case ANTENNA_A: - r_rx_antenna_ofdm = 0x1; // A - p_cck_txrx->r_cckrx_enable = 0x0; // default: A - p_cck_txrx->r_cckrx_enable_2 = 0x0; // option: A - chgRx = 1; - break; - - case ANTENNA_B: - r_rx_antenna_ofdm = 0x2; // B - p_cck_txrx->r_cckrx_enable = 0x1; // default: B - p_cck_txrx->r_cckrx_enable_2 = 0x1; // option: B - chgRx = 1; - break; - - case ANTENNA_AB: - r_rx_antenna_ofdm = 0x3; // AB - p_cck_txrx->r_cckrx_enable = 0x0; // default:A - p_cck_txrx->r_cckrx_enable_2 = 0x1; // option:B - chgRx = 1; - break; - - default: - break; - } - - if (chgTx && chgRx) - { - switch(pHalData->rf_chip) - { - case RF_8225: - case RF_8256: - case RF_6052: - //r_ant_sel_cck_val = r_ant_select_cck_val; - PHY_SetBBReg(pAdapter, rFPGA1_TxInfo, 0x7fffffff, r_ant_select_ofdm_val); //OFDM Tx - PHY_SetBBReg(pAdapter, rFPGA0_TxInfo, 0x0000000f, r_ofdm_tx_en_val); //OFDM Tx - PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx - PHY_SetBBReg(pAdapter, rOFDM1_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx - PHY_SetBBReg(pAdapter, rCCK0_AFESetting, bMaskByte3, r_ant_select_cck_val);//r_ant_sel_cck_val); //CCK TxRx - - break; - - default: - break; - } - } - - RT_TRACE(_module_mp_, _drv_notice_, ("-SwitchAntenna: finished\n")); -} - -s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - - if (!netif_running(pAdapter->pnetdev)) { - RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter! Fail: interface not opened!\n")); - return _FAIL; - } - - if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { - RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter: Fail! not in MP mode!\n")); - return _FAIL; - } - - target_ther &= 0xff; - if (target_ther < 0x07) - target_ther = 0x07; - else if (target_ther > 0x1d) - target_ther = 0x1d; - - pHalData->EEPROMThermalMeter = target_ther; - - return _SUCCESS; -} - -void Hal_TriggerRFThermalMeter(PADAPTER pAdapter) -{ - - write_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x60); // 0x24: RF Reg[6:5] - -// RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" )); -} - -u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter) -{ - u32 ThermalValue = 0; - - ThermalValue = _read_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x1F); // 0x24: RF Reg[4:0] -// RT_TRACE(_module_mp_, _drv_alert_, ("ThermalValue = 0x%x\n", ThermalValue)); - return (u8)ThermalValue; -} - -void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value) -{ -#if 0 - fw_cmd(pAdapter, IOCMD_GET_THERMAL_METER); - rtw_msleep_os(1000); - fw_cmd_data(pAdapter, value, 1); - *value &= 0xFF; -#else - - Hal_TriggerRFThermalMeter(pAdapter); - rtw_msleep_os(1000); - *value = Hal_ReadRFThermalMeter(pAdapter); -#endif -} - -void Hal_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - pAdapter->mppriv.MptCtx.bSingleCarrier = bStart; - if (bStart)// Start Single Carrier. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test start\n")); - // 1. if OFDM block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on - - { - // 2. set CCK test mode off, set to CCK normal mode - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); - // 3. turn on scramble setting - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); - } - // 4. Turn On Single Carrier Tx and turn off the other test modes. - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bEnable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); -#ifdef CONFIG_RTL8192C - // 5. Disable TX power saving at STF & LLTF - write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 1); -#endif - } - else// Stop Single Carrier. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test stop\n")); - - // Turn off all test modes. - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); -#ifdef CONFIG_RTL8192C - // Cancel disable TX power saving at STF&LLTF - write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 0); -#endif - //Delay 10 ms //delay_ms(10); - rtw_msleep_os(10); - - //BB Reset - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - } -} - - -void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); - - u8 rfPath; - - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - default: - rfPath = RF_PATH_A; - break; - case ANTENNA_B: - rfPath = RF_PATH_B; - break; - case ANTENNA_C: - rfPath = RF_PATH_C; - break; - } - - pAdapter->mppriv.MptCtx.bSingleTone = bStart; - if (bStart)// Start Single Tone. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test start\n")); - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x0); - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x0); - - if (is92C) - { - _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x01); - rtw_usleep_os(100); - if (rfPath == RF_PATH_A) - write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x10000); // PAD all on. - else if (rfPath == RF_PATH_B) - write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x10000); // PAD all on. - write_rfreg(pAdapter, rfPath, 0x00, 0x2001f); // PAD all on. - rtw_usleep_os(100); - } - else - { - write_rfreg(pAdapter, rfPath, 0x21, 0xd4000); - rtw_usleep_os(100); - write_rfreg(pAdapter, rfPath, 0x00, 0x2001f); // PAD all on. - rtw_usleep_os(100); - } - - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); - - } - else// Stop Single Tone. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test stop\n")); - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1); - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1); - - if (is92C) { - _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x00); - rtw_usleep_os(100); - write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x32d75); // PAD all on. - write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x32d75); // PAD all on. - rtw_usleep_os(100); - } else { - write_rfreg(pAdapter, rfPath, 0x21, 0x54000); - rtw_usleep_os(100); - write_rfreg(pAdapter, rfPath, 0x00, 0x30000); // PAD all on. - rtw_usleep_os(100); - } - - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); - - } - -} - - -void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart) -{ - pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart; - if (bStart) // Start Carrier Suppression. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test start\n")); - //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) - if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) - { - // 1. if CCK block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on - - //Turn Off All Test Mode - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); - - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x0); //turn off scramble setting - - //Set CCK Tx Test Rate - //PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, pMgntInfo->ForcedDataRate); - write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, 0x0); //Set FTxRate to 1Mbps - } - - //Set for dynamic set Power index - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); - - } - else// Stop Carrier Suppression. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test stop\n")); - //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) - if (pAdapter->mppriv.rateidx <= MPT_RATE_11M ) { - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting - - //BB Reset - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - } - //Stop for dynamic set Power index - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); - } - //DbgPrint("\n MPT_ProSetCarrierSupp() is finished. \n"); -} - -void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart) -{ - u32 cckrate; - - if (bStart) - { - RT_TRACE(_module_mp_, _drv_alert_, - ("SetCCKContinuousTx: test start\n")); - - // 1. if CCK block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on - - //Turn Off All Test Mode - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); - //Set CCK Tx Test Rate - #if 0 - switch(pAdapter->mppriv.rateidx) - { - case 2: - cckrate = 0; - break; - case 4: - cckrate = 1; - break; - case 11: - cckrate = 2; - break; - case 22: - cckrate = 3; - break; - default: - cckrate = 0; - break; - } - #else - cckrate = pAdapter->mppriv.rateidx; - #endif - write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, cckrate); - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting - - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); - - // Patch for CCK 11M waveform - if (cckrate == MPT_RATE_1M) - write_bbreg(pAdapter, 0xA71, BIT(6), bDisable); - else - write_bbreg(pAdapter, 0xA71, BIT(6), bEnable); - - - } - else { - RT_TRACE(_module_mp_, _drv_info_, - ("SetCCKContinuousTx: test stop\n")); - - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting - - //BB Reset - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); - } - - pAdapter->mppriv.MptCtx.bCckContTx = bStart; - pAdapter->mppriv.MptCtx.bOfdmContTx = _FALSE; -}/* mpt_StartCckContTx */ - -void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - if (bStart) { - RT_TRACE(_module_mp_, _drv_info_, ("SetOFDMContinuousTx: test start\n")); - // 1. if OFDM block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on - { - - // 2. set CCK test mode off, set to CCK normal mode - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); - - // 3. turn on scramble setting - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); - } - // 4. Turn On Continue Tx and turn off the other test modes. - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bEnable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); - - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); - - } else { - RT_TRACE(_module_mp_,_drv_info_, ("SetOFDMContinuousTx: test stop\n")); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); - //Delay 10 ms - rtw_msleep_os(10); - //BB Reset - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); - } - - pAdapter->mppriv.MptCtx.bCckContTx = _FALSE; - pAdapter->mppriv.MptCtx.bOfdmContTx = bStart; -}/* mpt_StartOfdmContTx */ - -void Hal_SetContinuousTx(PADAPTER pAdapter, u8 bStart) -{ -#if 0 - // ADC turn off [bit24-21] adc port0 ~ port1 - if (bStart) { - write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) & 0xFE1FFFFF); - rtw_usleep_os(100); - } -#endif - RT_TRACE(_module_mp_, _drv_info_, - ("SetContinuousTx: rate:%d\n", pAdapter->mppriv.rateidx)); - - pAdapter->mppriv.MptCtx.bStartContTx = bStart; - if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) - { - Hal_SetCCKContinuousTx(pAdapter, bStart); - } - else if ((pAdapter->mppriv.rateidx >= MPT_RATE_6M) && - (pAdapter->mppriv.rateidx <= MPT_RATE_MCS15)) - { - Hal_SetOFDMContinuousTx(pAdapter, bStart); - } -#if 0 - // ADC turn on [bit24-21] adc port0 ~ port1 - if (!bStart) { - write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) | 0x01E00000); - } -#endif -} - -#endif // CONFIG_MP_INCLUDE - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8723A_MP_C_ +#ifdef CONFIG_MP_INCLUDED + +#include +#include +#include + + +/*----------------------------------------------------------------------------- + * Function: mpt_SwitchRfSetting + * + * Overview: Change RF Setting when we siwthc channel/rate/BW for MP. + * + * Input: IN PADAPTER pAdapter + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series. + * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3. + * + *---------------------------------------------------------------------------*/ + static void phy_SwitchRfSetting8723A(PADAPTER pAdapter,u8 channel ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u32 u4RF_IPA[3], u4RF_TXBIAS, u4RF_SYN_G2; + + DBG_8192C("phy_SwitchRfSetting8723A channel=%d\n",channel); + + + if(channel >= 1 && channel <= 9) + { + DBG_8192C("phy_SwitchRfSetting8723A REG_AFE_PLL_CTRL 0xF0FFFF83\n"); + PHY_SetBBReg(pAdapter, REG_AFE_PLL_CTRL, bMaskDWord, 0xF0FFFF83); + } + else if (channel >= 10 && channel <= 14) + { + DBG_8192C("phy_SwitchRfSetting8723A REG_AFE_PLL_CTRL 0xF2FFFF83\n"); + PHY_SetBBReg(pAdapter, REG_AFE_PLL_CTRL, bMaskDWord, 0xF2FFFF83); + } + + +#if DEV_BUS_TYPE==RT_PCI_INTERFACE + u4Byte u4RF_IPA[3], u4RF_TXBIAS, u4RF_SYN_G2; + //default value + { + u4RF_IPA[0] = 0x4F424; //CCK + u4RF_IPA[1] = 0xCF424; //OFDM + u4RF_IPA[2] = 0x8F424; //MCS + u4RF_TXBIAS = 0xC0356; + u4RF_SYN_G2 = 0x4F200; + } + + switch(channel) + { + case 1: + u4RF_IPA[0] = 0x4F40C; + u4RF_IPA[1] = 0xCF466; + u4RF_TXBIAS = 0xC0350; + u4RF_SYN_G2 = 0x0F400; + break; + + case 2: + u4RF_IPA[0] = 0x4F407; + u4RF_TXBIAS = 0xC0350; + u4RF_SYN_G2 = 0x0F400; + break; + + case 3: + u4RF_IPA[0] = 0x4F407; + u4RF_IPA[2] = 0x8F466; + u4RF_TXBIAS = 0xC0350; + u4RF_SYN_G2 = 0x0F400; + break; + + case 5: + case 8: + u4RF_SYN_G2 = 0x0F400; + break; + + case 6: + case 13: + u4RF_IPA[0] = 0x4F40C; + break; + + case 7: + u4RF_IPA[0] = 0x4F40C; + u4RF_SYN_G2 = 0x0F400; + break; + + case 9: + u4RF_IPA[2] = 0x8F454; + u4RF_SYN_G2 = 0x0F400; + break; + + case 11: + u4RF_IPA[0] = 0x4F40C; + u4RF_IPA[1] = 0xCF454; + u4RF_SYN_G2 = 0x0F400; + break; + + default: + u4RF_IPA[0] = 0x4F424; + u4RF_IPA[1] = 0x8F424; + u4RF_IPA[2] = 0xCF424; + u4RF_TXBIAS = 0xC0356; + u4RF_SYN_G2 = 0x4F200; + break; + } + + PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_IPA, bRFRegOffsetMask, u4RF_IPA[0]); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_IPA, bRFRegOffsetMask, u4RF_IPA[1]); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_IPA, bRFRegOffsetMask, u4RF_IPA[2]); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_TXBIAS, bRFRegOffsetMask, u4RF_TXBIAS); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_SYN_G2, bRFRegOffsetMask, u4RF_SYN_G2); + + if((channel >= 1 && channel <= 5) || (channel >= 8 && channel <= 9)) + { + PHY_SetBBReg(pAdapter, REG_AFE_PLL_CTRL, bMaskDWord, 0xF0FFFF83); + } + else + { + PHY_SetBBReg(pAdapter, REG_AFE_PLL_CTRL, bMaskDWord, 0xF2FFFF83); + } + +#endif + + +} + + + + +void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); + u8 ChannelToSw ; + + pMptCtx->MptChannelToSw=pAdapter->mppriv.channel; + ChannelToSw =pMptCtx->MptChannelToSw; + + phy_SwitchRfSetting8723A(pAdapter, ChannelToSw); +} + + + + +s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + + if (!netif_running(padapter->pnetdev)) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: interface not opened!\n")); + return _FAIL; + } + + if (check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: not in MP mode!\n")); + return _FAIL; + } + + if (enable) + pdmpriv->TxPowerTrackControl = _TRUE; + else + pdmpriv->TxPowerTrackControl = _FALSE; + + return _SUCCESS; +} + +void Hal_GetPowerTracking(PADAPTER padapter, u8 *enable) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + + *enable = pdmpriv->TxPowerTrackControl; +} + +static void Hal_disable_dm(PADAPTER padapter) +{ + u8 v8; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + + //3 1. disable firmware dynamic mechanism + // disable Power Training, Rate Adaptive + v8 = rtw_read8(padapter, REG_BCN_CTRL); + v8 &= ~EN_BCN_FUNCTION; + rtw_write8(padapter, REG_BCN_CTRL, v8); + + //3 2. disable driver dynamic mechanism + // disable Dynamic Initial Gain + // disable High Power + // disable Power Tracking + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + // enable APK, LCK and IQK but disable power tracking + pdmpriv->TxPowerTrackControl = _FALSE; + Switch_DM_Func(padapter, DYNAMIC_RF_TX_PWR_TRACK , _TRUE); +} + +void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) +{ + u32 TempVal = 0, TempVal2 = 0, TempVal3 = 0; + u32 CurrCCKSwingVal = 0, CCKSwingIndex = 12; + u8 i; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + + // get current cck swing value and check 0xa22 & 0xa23 later to match the table. + CurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord); + + if (!bInCH14) + { + // Readback the current bb cck swing value and compare with the table to + // get the current swing index + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) && + (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch1_Ch13[i][1])) + { + CCKSwingIndex = i; +// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch1~13, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", +// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); + break; + } + } + + //Write 0xa22 0xa23 + TempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1]<<8) ; + + + //Write 0xa24 ~ 0xa27 + TempVal2 = 0; + TempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3]<<8) + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4]<<16 )+ + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5]<<24); + + //Write 0xa28 0xa29 + TempVal3 = 0; + TempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7]<<8) ; + } + else + { + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch14[i][0]) && + (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch14[i][1])) + { + CCKSwingIndex = i; +// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch14, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", +// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); + break; + } + } + + //Write 0xa22 0xa23 + TempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] + + (CCKSwingTable_Ch14[CCKSwingIndex][1]<<8) ; + + //Write 0xa24 ~ 0xa27 + TempVal2 = 0; + TempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] + + (CCKSwingTable_Ch14[CCKSwingIndex][3]<<8) + + (CCKSwingTable_Ch14[CCKSwingIndex][4]<<16 )+ + (CCKSwingTable_Ch14[CCKSwingIndex][5]<<24); + + //Write 0xa28 0xa29 + TempVal3 = 0; + TempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] + + (CCKSwingTable_Ch14[CCKSwingIndex][7]<<8) ; + } + + write_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal); + write_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2); + write_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3); +} + +void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) +{ + s32 TempCCk; + u8 CCK_index, CCK_index_old; + u8 Action = 0; //0: no action, 1: even->odd, 2:odd->even + u8 TimeOut = 100; + s32 i = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + + + if (!IS_92C_SERIAL(pHalData->VersionID)) + return; +#if 0 + while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) + { + PlatformSleepUs(100); + TimeOut--; + if(TimeOut <= 0) + { + RTPRINT(FINIT, INIT_TxPower, + ("!!!MPT_CCKTxPowerAdjustbyIndex Wait for check CCK gain index too long!!!\n" )); + break; + } + } +#endif + if (beven && !pMptCtx->bMptIndexEven) //odd->even + { + Action = 2; + pMptCtx->bMptIndexEven = _TRUE; + } + else if (!beven && pMptCtx->bMptIndexEven) //even->odd + { + Action = 1; + pMptCtx->bMptIndexEven = _FALSE; + } + + if (Action != 0) + { + //Query CCK default setting From 0xa24 + TempCCk = read_bbreg(pAdapter, rCCK0_TxFilter2, bMaskDWord) & bMaskCCK; + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (pHalData->dmpriv.bCCKinCH14) + { + if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4) == _TRUE) + { + CCK_index_old = (u8) i; +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch 14 %d\n", +// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + else + { + if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4) == _TRUE) + { + CCK_index_old = (u8) i; +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch14 %d\n", +// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + } + + if (Action == 1) + CCK_index = CCK_index_old - 1; + else + CCK_index = CCK_index_old + 1; + +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: new CCK_index=0x%x\n", +// CCK_index)); + + //Adjust CCK according to gain index + if (!pHalData->dmpriv.bCCKinCH14) { + rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); + rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); + rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); + rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); + rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); + rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); + rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); + rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); + } else { + rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); + rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); + rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); + rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); + rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); + rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); + rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); + rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); + } + } +#if 0 + RTPRINT(FINIT, INIT_TxPower, + ("MPT_CCKTxPowerAdjustbyIndex 0xa20=%x\n", PlatformEFIORead4Byte(Adapter, 0xa20))); + + PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); +#endif +} +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ + +/* + * SetChannel + * Description + * Use H2C command to change channel, + * not only modify rf register, but also other setting need to be done. + */ +void Hal_SetChannel(PADAPTER pAdapter) +{ +#if 0 + struct mp_priv *pmp = &pAdapter->mppriv; + +// SelectChannel(pAdapter, pmp->channel); + set_channel_bwmode(pAdapter, pmp->channel, pmp->channel_offset, pmp->bandwidth); +#else + u8 eRFPath; + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct mp_priv *pmp = &pAdapter->mppriv; + u8 channel = pmp->channel; + u8 bandwidth = pmp->bandwidth; + u8 rate = pmp->rateidx; + + + // set RF channel register + for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) + { + if(IS_HARDWARE_TYPE_8192D(pAdapter)) + _write_rfreg(pAdapter, (RF_RADIO_PATH_E)eRFPath, rRfChannel, 0xFF, channel); + else + _write_rfreg(pAdapter, eRFPath, rRfChannel, 0x3FF, channel); + } + Hal_mpt_SwitchRfSetting(pAdapter); + + SelectChannel(pAdapter, channel); + + if (pHalData->CurrentChannel == 14 && !pHalData->dmpriv.bCCKinCH14) { + pHalData->dmpriv.bCCKinCH14 = _TRUE; + Hal_MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); + } + else if (pHalData->CurrentChannel != 14 && pHalData->dmpriv.bCCKinCH14) { + pHalData->dmpriv.bCCKinCH14 = _FALSE; + Hal_MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); + } + +#endif +} + +/* + * Notice + * Switch bandwitdth may change center frequency(channel) + */ +void Hal_SetBandwidth(PADAPTER pAdapter) +{ + struct mp_priv *pmp = &pAdapter->mppriv; + + + SetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset); + Hal_mpt_SwitchRfSetting(pAdapter); +} + +void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower) +{ + u32 tmpval = 0; + + + // rf-A cck tx power + write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]); + tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A]; + write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); + + // rf-B cck tx power + write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]); + tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B]; + write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); + + RT_TRACE(_module_mp_, _drv_notice_, + ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n", + TxPower[RF_PATH_A], TxPower[RF_PATH_B])); +} + +void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower) +{ + u32 TxAGC = 0; + u8 tmpval = 0; + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + // HT Tx-rf(A) + tmpval = TxPower[RF_PATH_A]; + TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; + + write_bbreg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC); + + if (pHalData->dmpriv.bAPKdone && !IS_NORMAL_CHIP(pHalData->VersionID)) + { + if (tmpval > pMptCtx->APK_bound[RF_PATH_A]) + write_rfreg(pAdapter, RF_PATH_A, 0xe, pHalData->dmpriv.APKoutput[0][0]); + else + write_rfreg(pAdapter, RF_PATH_A, 0xe, pHalData->dmpriv.APKoutput[0][1]); + } + + // HT Tx-rf(B) + tmpval = TxPower[RF_PATH_B]; + TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; + + write_bbreg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC); + + if (pHalData->dmpriv.bAPKdone && !IS_NORMAL_CHIP(pHalData->VersionID)) + { + if (tmpval > pMptCtx->APK_bound[RF_PATH_B]) + write_rfreg(pAdapter, RF_PATH_B, 0xe, pHalData->dmpriv.APKoutput[1][0]); + else + write_rfreg(pAdapter, RF_PATH_B, 0xe, pHalData->dmpriv.APKoutput[1][1]); + } + + RT_TRACE(_module_mp_, _drv_notice_, + ("-SetOFDMTxPower: A[0x%02x] B[0x%02x]\n", + TxPower[RF_PATH_A], TxPower[RF_PATH_B])); +} + +void Hal_SetAntennaPathPower(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 TxPowerLevel[MAX_RF_PATH_NUMS]; + u8 rfPath; + + TxPowerLevel[RF_PATH_A] = pAdapter->mppriv.txpoweridx; + TxPowerLevel[RF_PATH_B] = pAdapter->mppriv.txpoweridx_b; + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + switch (pHalData->rf_chip) + { + case RF_8225: + case RF_8256: + case RF_6052: + Hal_SetCCKTxPower(pAdapter, TxPowerLevel); + if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate + Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); + Hal_SetOFDMTxPower(pAdapter, TxPowerLevel); + break; + + default: + break; + } +} + +void Hal_SetTxPower(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 TxPower = pAdapter->mppriv.txpoweridx; + u8 TxPowerLevel[MAX_RF_PATH_NUMS]; + u8 rf, rfPath; + + for (rf = 0; rf < MAX_RF_PATH_NUMS; rf++) { + TxPowerLevel[rf] = TxPower; + } + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + switch (pHalData->rf_chip) + { + // 2008/09/12 MH Test only !! We enable the TX power tracking for MP!!!!! + // We should call normal driver API later!! + case RF_8225: + case RF_8256: + case RF_6052: + Hal_SetCCKTxPower(pAdapter, TxPowerLevel); + if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate + Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); + Hal_SetOFDMTxPower(pAdapter, TxPowerLevel); + break; + + default: + break; + } + +// SetCCKTxPower(pAdapter, TxPower); +// SetOFDMTxPower(pAdapter, TxPower); +} + +void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset) +{ + u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC; + + return ; + + TxAGCOffset_B = (ulTxAGCOffset&0x000000ff); + TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8); + TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16); + + tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B); + write_bbreg(pAdapter, rFPGA0_TxGainStage, + (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC); +} + +void Hal_SetDataRate(PADAPTER pAdapter) +{ + if(!IS_HARDWARE_TYPE_8723A(pAdapter)) + Hal_mpt_SwitchRfSetting(pAdapter); +} + + +void Hal_SetAntenna(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + R_ANTENNA_SELECT_OFDM *p_ofdm_tx; /* OFDM Tx register */ + R_ANTENNA_SELECT_CCK *p_cck_txrx; + + u8 r_rx_antenna_ofdm = 0, r_ant_select_cck_val = 0; + u8 chgTx = 0, chgRx = 0; + u32 r_ant_sel_cck_val = 0, r_ant_select_ofdm_val = 0, r_ofdm_tx_en_val = 0; + + + p_ofdm_tx = (R_ANTENNA_SELECT_OFDM *)&r_ant_select_ofdm_val; + p_cck_txrx = (R_ANTENNA_SELECT_CCK *)&r_ant_select_cck_val; + + p_ofdm_tx->r_ant_ht1 = 0x1; + p_ofdm_tx->r_ant_ht2 = 0x2; // Second TX RF path is A + p_ofdm_tx->r_ant_non_ht = 0x3; // 0x1+0x2=0x3 + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + p_ofdm_tx->r_tx_antenna = 0x1; + r_ofdm_tx_en_val = 0x1; + p_ofdm_tx->r_ant_l = 0x1; + p_ofdm_tx->r_ant_ht_s1 = 0x1; + p_ofdm_tx->r_ant_non_ht_s1 = 0x1; + p_cck_txrx->r_ccktx_enable = 0x8; + chgTx = 1; + + // From SD3 Willis suggestion !!! Set RF A=TX and B as standby +// if (IS_HARDWARE_TYPE_8192S(pAdapter)) + { + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 1); + r_ofdm_tx_en_val = 0x3; + + // Power save + //cosa r_ant_select_ofdm_val = 0x11111111; + + // We need to close RFB by SW control + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 0); + } + } + break; + + case ANTENNA_B: + p_ofdm_tx->r_tx_antenna = 0x2; + r_ofdm_tx_en_val = 0x2; + p_ofdm_tx->r_ant_l = 0x2; + p_ofdm_tx->r_ant_ht_s1 = 0x2; + p_ofdm_tx->r_ant_non_ht_s1 = 0x2; + p_cck_txrx->r_ccktx_enable = 0x4; + chgTx = 1; + + // From SD3 Willis suggestion !!! Set RF A as standby + //if (IS_HARDWARE_TYPE_8192S(pAdapter)) + { + PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); +// r_ofdm_tx_en_val = 0x3; + + // Power save + //cosa r_ant_select_ofdm_val = 0x22222222; + + // 2008/10/31 MH From SD3 Willi's suggestion. We must read RF 1T table. + // 2009/01/08 MH From Sd3 Willis. We need to close RFA by SW control + if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_1T2R) + { + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0); +// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1); + } + } + break; + + case ANTENNA_AB: // For 8192S + p_ofdm_tx->r_tx_antenna = 0x3; + r_ofdm_tx_en_val = 0x3; + p_ofdm_tx->r_ant_l = 0x3; + p_ofdm_tx->r_ant_ht_s1 = 0x3; + p_ofdm_tx->r_ant_non_ht_s1 = 0x3; + p_cck_txrx->r_ccktx_enable = 0xC; + chgTx = 1; + + // From SD3 Willis suggestion !!! Set RF B as standby + //if (IS_HARDWARE_TYPE_8192S(pAdapter)) + { + PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); + PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); + + // Disable Power save + //cosa r_ant_select_ofdm_val = 0x3321333; +#if 0 + // 2008/10/31 MH From SD3 Willi's suggestion. We must read RFA 2T table. + if ((pHalData->VersionID == VERSION_8192S_ACUT)) // For RTL8192SU A-Cut only, by Roger, 2008.11.07. + { + mpt_RFConfigFromPreParaArrary(pAdapter, 1, RF_PATH_A); + } +#endif + // 2009/01/08 MH From Sd3 Willis. We need to enable RFA/B by SW control + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0); +// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1); + } + } + break; + + default: + break; + } + + // + // r_rx_antenna_ofdm, bit0=A, bit1=B, bit2=C, bit3=D + // r_cckrx_enable : CCK default, 0=A, 1=B, 2=C, 3=D + // r_cckrx_enable_2 : CCK option, 0=A, 1=B, 2=C, 3=D + // + switch (pAdapter->mppriv.antenna_rx) + { + case ANTENNA_A: + r_rx_antenna_ofdm = 0x1; // A + p_cck_txrx->r_cckrx_enable = 0x0; // default: A + p_cck_txrx->r_cckrx_enable_2 = 0x0; // option: A + chgRx = 1; + break; + + case ANTENNA_B: + r_rx_antenna_ofdm = 0x2; // B + p_cck_txrx->r_cckrx_enable = 0x1; // default: B + p_cck_txrx->r_cckrx_enable_2 = 0x1; // option: B + chgRx = 1; + break; + + case ANTENNA_AB: + r_rx_antenna_ofdm = 0x3; // AB + p_cck_txrx->r_cckrx_enable = 0x0; // default:A + p_cck_txrx->r_cckrx_enable_2 = 0x1; // option:B + chgRx = 1; + break; + + default: + break; + } + + if (chgTx && chgRx) + { + switch(pHalData->rf_chip) + { + case RF_8225: + case RF_8256: + case RF_6052: + //r_ant_sel_cck_val = r_ant_select_cck_val; + PHY_SetBBReg(pAdapter, rFPGA1_TxInfo, 0x7fffffff, r_ant_select_ofdm_val); //OFDM Tx + PHY_SetBBReg(pAdapter, rFPGA0_TxInfo, 0x0000000f, r_ofdm_tx_en_val); //OFDM Tx + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx + PHY_SetBBReg(pAdapter, rOFDM1_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx + PHY_SetBBReg(pAdapter, rCCK0_AFESetting, bMaskByte3, r_ant_select_cck_val);//r_ant_sel_cck_val); //CCK TxRx + + break; + + default: + break; + } + } + + RT_TRACE(_module_mp_, _drv_notice_, ("-SwitchAntenna: finished\n")); +} + +s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + if (!netif_running(pAdapter->pnetdev)) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter! Fail: interface not opened!\n")); + return _FAIL; + } + + if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter: Fail! not in MP mode!\n")); + return _FAIL; + } + + target_ther &= 0xff; + if (target_ther < 0x07) + target_ther = 0x07; + else if (target_ther > 0x1d) + target_ther = 0x1d; + + pHalData->EEPROMThermalMeter = target_ther; + + return _SUCCESS; +} + +void Hal_TriggerRFThermalMeter(PADAPTER pAdapter) +{ + + write_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x60); // 0x24: RF Reg[6:5] + +// RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" )); +} + +u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter) +{ + u32 ThermalValue = 0; + + ThermalValue = _read_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x1F); // 0x24: RF Reg[4:0] +// RT_TRACE(_module_mp_, _drv_alert_, ("ThermalValue = 0x%x\n", ThermalValue)); + return (u8)ThermalValue; +} + +void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value) +{ +#if 0 + fw_cmd(pAdapter, IOCMD_GET_THERMAL_METER); + rtw_msleep_os(1000); + fw_cmd_data(pAdapter, value, 1); + *value &= 0xFF; +#else + + Hal_TriggerRFThermalMeter(pAdapter); + rtw_msleep_os(1000); + *value = Hal_ReadRFThermalMeter(pAdapter); +#endif +} + +void Hal_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + pAdapter->mppriv.MptCtx.bSingleCarrier = bStart; + if (bStart)// Start Single Carrier. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test start\n")); + // 1. if OFDM block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on + + { + // 2. set CCK test mode off, set to CCK normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); + // 3. turn on scramble setting + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); + } + // 4. Turn On Single Carrier Tx and turn off the other test modes. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bEnable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); +#ifdef CONFIG_RTL8192C + // 5. Disable TX power saving at STF & LLTF + write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 1); +#endif + } + else// Stop Single Carrier. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test stop\n")); + + // Turn off all test modes. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); +#ifdef CONFIG_RTL8192C + // Cancel disable TX power saving at STF&LLTF + write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 0); +#endif + //Delay 10 ms //delay_ms(10); + rtw_msleep_os(10); + + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } +} + + +void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); + + u8 rfPath; + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + pAdapter->mppriv.MptCtx.bSingleTone = bStart; + if (bStart)// Start Single Tone. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test start\n")); + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x0); + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x0); + + if (is92C) + { + _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x01); + rtw_usleep_os(100); + if (rfPath == RF_PATH_A) + write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x10000); // PAD all on. + else if (rfPath == RF_PATH_B) + write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x10000); // PAD all on. + write_rfreg(pAdapter, rfPath, 0x00, 0x2001f); // PAD all on. + rtw_usleep_os(100); + } + else + { + write_rfreg(pAdapter, rfPath, 0x21, 0xd4000); + rtw_usleep_os(100); + write_rfreg(pAdapter, rfPath, 0x00, 0x2001f); // PAD all on. + rtw_usleep_os(100); + } + + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); + + } + else// Stop Single Tone. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test stop\n")); + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1); + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1); + + if (is92C) { + _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x00); + rtw_usleep_os(100); + write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x32d75); // PAD all on. + write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x32d75); // PAD all on. + rtw_usleep_os(100); + } else { + write_rfreg(pAdapter, rfPath, 0x21, 0x54000); + rtw_usleep_os(100); + write_rfreg(pAdapter, rfPath, 0x00, 0x30000); // PAD all on. + rtw_usleep_os(100); + } + + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); + + } + +} + + +void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart) +{ + pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart; + if (bStart) // Start Carrier Suppression. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test start\n")); + //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) + { + // 1. if CCK block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on + + //Turn Off All Test Mode + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x0); //turn off scramble setting + + //Set CCK Tx Test Rate + //PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, pMgntInfo->ForcedDataRate); + write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, 0x0); //Set FTxRate to 1Mbps + } + + //Set for dynamic set Power index + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); + + } + else// Stop Carrier Suppression. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test stop\n")); + //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M ) { + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting + + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } + //Stop for dynamic set Power index + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); + } + //DbgPrint("\n MPT_ProSetCarrierSupp() is finished. \n"); +} + +void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + u32 cckrate; + + if (bStart) + { + RT_TRACE(_module_mp_, _drv_alert_, + ("SetCCKContinuousTx: test start\n")); + + // 1. if CCK block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on + + //Turn Off All Test Mode + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + //Set CCK Tx Test Rate + #if 0 + switch(pAdapter->mppriv.rateidx) + { + case 2: + cckrate = 0; + break; + case 4: + cckrate = 1; + break; + case 11: + cckrate = 2; + break; + case 22: + cckrate = 3; + break; + default: + cckrate = 0; + break; + } + #else + cckrate = pAdapter->mppriv.rateidx; + #endif + write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, cckrate); + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting + + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); + + // Patch for CCK 11M waveform + if (cckrate == MPT_RATE_1M) + write_bbreg(pAdapter, 0xA71, BIT(6), bDisable); + else + write_bbreg(pAdapter, 0xA71, BIT(6), bEnable); + + + } + else { + RT_TRACE(_module_mp_, _drv_info_, + ("SetCCKContinuousTx: test stop\n")); + + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting + + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); + } + + pAdapter->mppriv.MptCtx.bCckContTx = bStart; + pAdapter->mppriv.MptCtx.bOfdmContTx = _FALSE; +}/* mpt_StartCckContTx */ + +void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + if (bStart) { + RT_TRACE(_module_mp_, _drv_info_, ("SetOFDMContinuousTx: test start\n")); + // 1. if OFDM block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on + { + + // 2. set CCK test mode off, set to CCK normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); + + // 3. turn on scramble setting + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); + } + // 4. Turn On Continue Tx and turn off the other test modes. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bEnable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500); + + } else { + RT_TRACE(_module_mp_,_drv_info_, ("SetOFDMContinuousTx: test stop\n")); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + //Delay 10 ms + rtw_msleep_os(10); + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100); + } + + pAdapter->mppriv.MptCtx.bCckContTx = _FALSE; + pAdapter->mppriv.MptCtx.bOfdmContTx = bStart; +}/* mpt_StartOfdmContTx */ + +void Hal_SetContinuousTx(PADAPTER pAdapter, u8 bStart) +{ +#if 0 + // ADC turn off [bit24-21] adc port0 ~ port1 + if (bStart) { + write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) & 0xFE1FFFFF); + rtw_usleep_os(100); + } +#endif + RT_TRACE(_module_mp_, _drv_info_, + ("SetContinuousTx: rate:%d\n", pAdapter->mppriv.rateidx)); + + pAdapter->mppriv.MptCtx.bStartContTx = bStart; + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) + { + Hal_SetCCKContinuousTx(pAdapter, bStart); + } + else if ((pAdapter->mppriv.rateidx >= MPT_RATE_6M) && + (pAdapter->mppriv.rateidx <= MPT_RATE_MCS15)) + { + Hal_SetOFDMContinuousTx(pAdapter, bStart); + } +#if 0 + // ADC turn on [bit24-21] adc port0 ~ port1 + if (!bStart) { + write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) | 0x01E00000); + } +#endif +} + +#endif // CONFIG_MP_INCLUDE + diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_phycfg.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_phycfg.c index 87e059996a58..0efb64a89055 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_phycfg.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_phycfg.c @@ -1,3397 +1,3406 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8723A_PHYCFG_C_ - -#include -#include -#include -#include - -#ifdef CONFIG_IOL -#include -#endif - -#include - - -/*---------------------------Define Local Constant---------------------------*/ -/* Channel switch:The size of command tables for switch channel*/ -#define MAX_PRECMD_CNT 16 -#define MAX_RFDEPENDCMD_CNT 16 -#define MAX_POSTCMD_CNT 16 - -#define MAX_DOZE_WAITING_TIMES_9x 64 - -/*---------------------------Define Local Constant---------------------------*/ - - -/*------------------------Define global variable-----------------------------*/ - -/*------------------------Define local variable------------------------------*/ - - -/*--------------------Define export function prototype-----------------------*/ -// Please refer to header file -/*--------------------Define export function prototype-----------------------*/ - -/*----------------------------Function Body----------------------------------*/ -// -// 1. BB register R/W API -// - -/** -* Function: phy_CalculateBitShift -* -* OverView: Get shifted position of the BitMask -* -* Input: -* u4Byte BitMask, -* -* Output: none -* Return: u4Byte Return the shift bit bit position of the mask -*/ -static u32 -phy_CalculateBitShift( - u32 BitMask - ) -{ - u32 i; - - for(i=0; i<=31; i++) - { - if ( ((BitMask>>i) & 0x1 ) == 1) - break; - } - - return (i); -} - - -/** -* Function: PHY_QueryBBReg -* -* OverView: Read "sepcific bits" from BB register -* -* Input: -* PADAPTER Adapter, -* u4Byte RegAddr, //The target address to be readback -* u4Byte BitMask //The target bit position in the target address -* //to be readback -* Output: None -* Return: u4Byte Data //The readback register value -* Note: This function is equal to "GetRegSetting" in PHY programming guide -*/ -u32 -rtl8192c_PHY_QueryBBReg( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask - ) -{ - u32 ReturnValue = 0, OriginalValue, BitShift; - u16 BBWaitCounter = 0; - -#if (DISABLE_BB_RF == 1) - return 0; -#endif - - //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx)\n", RegAddr, BitMask)); - - OriginalValue = rtw_read32(Adapter, RegAddr); - BitShift = phy_CalculateBitShift(BitMask); - ReturnValue = (OriginalValue & BitMask) >> BitShift; - - //RTPRINT(FPHY, PHY_BBR, ("BBR MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, OriginalValue)); - //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx), OriginalValue(%#lx)\n", RegAddr, BitMask, OriginalValue)); - - return (ReturnValue); - -} - - -/** -* Function: PHY_SetBBReg -* -* OverView: Write "Specific bits" to BB register (page 8~) -* -* Input: -* PADAPTER Adapter, -* u4Byte RegAddr, //The target address to be modified -* u4Byte BitMask //The target bit position in the target address -* //to be modified -* u4Byte Data //The new register value in the target bit position -* //of the target address -* -* Output: None -* Return: None -* Note: This function is equal to "PutRegSetting" in PHY programming guide -*/ - -VOID -rtl8192c_PHY_SetBBReg( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //u16 BBWaitCounter = 0; - u32 OriginalValue, BitShift; - -#if (DISABLE_BB_RF == 1) - return; -#endif - - //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data)); - - if(BitMask!= bMaskDWord){//if not "double word" write - OriginalValue = rtw_read32(Adapter, RegAddr); - BitShift = phy_CalculateBitShift(BitMask); - Data = ((OriginalValue & (~BitMask)) | (Data << BitShift)); - } - - rtw_write32(Adapter, RegAddr, Data); - - //RTPRINT(FPHY, PHY_BBW, ("BBW MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, Data)); - //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data)); - -} - - -// -// 2. RF register R/W API -// - -/*----------------------------------------------------------------------------- - * Function: phy_FwRFSerialRead() - * - * Overview: We support firmware to execute RF-R/W. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 01/21/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -static u32 -phy_FwRFSerialRead( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 Offset ) -{ - u32 retValue = 0; - //RT_ASSERT(FALSE,("deprecate!\n")); - return (retValue); - -} /* phy_FwRFSerialRead */ - - -/*----------------------------------------------------------------------------- - * Function: phy_FwRFSerialWrite() - * - * Overview: We support firmware to execute RF-R/W. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 01/21/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -static VOID -phy_FwRFSerialWrite( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 Offset, - IN u32 Data ) -{ - //RT_ASSERT(FALSE,("deprecate!\n")); -} - - -/** -* Function: phy_RFSerialRead -* -* OverView: Read regster from RF chips -* -* Input: -* PADAPTER Adapter, -* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D -* u4Byte Offset, //The target address to be read -* -* Output: None -* Return: u4Byte reback value -* Note: Threre are three types of serial operations: -* 1. Software serial write -* 2. Hardware LSSI-Low Speed Serial Interface -* 3. Hardware HSSI-High speed -* serial write. Driver need to implement (1) and (2). -* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() -*/ -static u32 -phy_RFSerialRead( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 Offset - ) -{ - u32 retValue = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; - u32 NewOffset; - u32 tmplong,tmplong2; - u8 RfPiEnable=0; -#if 0 - if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs - return retValue; - if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs - return retValue; -#endif - // - // Make sure RF register offset is correct - // - Offset &= 0x3f; - - // - // Switch page for 8256 RF IC - // - NewOffset = Offset; - - // 2009/06/17 MH We can not execute IO for power save or other accident mode. - //if(RT_CANNOT_IO(Adapter)) - //{ - // RTPRINT(FPHY, PHY_RFR, ("phy_RFSerialRead return all one\n")); - // return 0xFFFFFFFF; - //} - - // For 92S LSSI Read RFLSSIRead - // For RF A/B write 0x824/82c(does not work in the future) - // We must use 0x824 for RF A and B to execute read trigger - tmplong = PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord); - if(eRFPath == RF_PATH_A) - tmplong2 = tmplong; - else - tmplong2 = PHY_QueryBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord); - - tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset<<23) | bLSSIReadEdge; //T65 RF - - PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong&(~bLSSIReadEdge)); - rtw_udelay_os(10);// PlatformStallExecution(10); - - PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, tmplong2); - rtw_udelay_os(100);//PlatformStallExecution(100); - - PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong|bLSSIReadEdge); - rtw_udelay_os(10);//PlatformStallExecution(10); - - if(eRFPath == RF_PATH_A) - RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter1, BIT8); - else if(eRFPath == RF_PATH_B) - RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XB_HSSIParameter1, BIT8); - - if(RfPiEnable) - { // Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF - retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi, bLSSIReadBackData); - //DBG_8192C("Readback from RF-PI : 0x%x\n", retValue); - } - else - { //Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF - retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack, bLSSIReadBackData); - //DBG_8192C("Readback from RF-SI : 0x%x\n", retValue); - } - //DBG_8192C("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBack, retValue); - - return retValue; - -} - - - -/** -* Function: phy_RFSerialWrite -* -* OverView: Write data to RF register (page 8~) -* -* Input: -* PADAPTER Adapter, -* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D -* u4Byte Offset, //The target address to be read -* u4Byte Data //The new register Data in the target bit position -* //of the target to be read -* -* Output: None -* Return: None -* Note: Threre are three types of serial operations: -* 1. Software serial write -* 2. Hardware LSSI-Low Speed Serial Interface -* 3. Hardware HSSI-High speed -* serial write. Driver need to implement (1) and (2). -* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() - * - * Note: For RF8256 only - * The total count of RTL8256(Zebra4) register is around 36 bit it only employs - * 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10]) - * to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration - * programming guide" for more details. - * Thus, we define a sub-finction for RTL8526 register address conversion - * =========================================================== - * Register Mode RegCTL[1] RegCTL[0] Note - * (Reg00[12]) (Reg00[10]) - * =========================================================== - * Reg_Mode0 0 x Reg 0 ~15(0x0 ~ 0xf) - * ------------------------------------------------------------------ - * Reg_Mode1 1 0 Reg 16 ~30(0x1 ~ 0xf) - * ------------------------------------------------------------------ - * Reg_Mode2 1 1 Reg 31 ~ 45(0x1 ~ 0xf) - * ------------------------------------------------------------------ - * - * 2008/09/02 MH Add 92S RF definition - * - * - * -*/ -static VOID -phy_RFSerialWrite( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 Offset, - IN u32 Data - ) -{ - u32 DataAndAddr = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; - u32 NewOffset; - -#if 0 - // We should check valid regs for RF_6052 case. - if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs - return; - if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs - return; -#endif - - // 2009/06/17 MH We can not execute IO for power save or other accident mode. - //if(RT_CANNOT_IO(Adapter)) - //{ - // RTPRINT(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n")); - // return; - //} - - Offset &= 0x3f; - - // - // Shadow Update - // - //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); - - // - // Switch page for 8256 RF IC - // - NewOffset = Offset; - - // - // Put write addr in [5:0] and write data in [31:16] - // - //DataAndAddr = (Data<<16) | (NewOffset&0x3f); - DataAndAddr = ((NewOffset<<20) | (Data&0x000fffff)) & 0x0fffffff; // T65 RF - - // - // Write Operation - // - PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); - //RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%lx]=0x%lx\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr)); - -} - - -/** -* Function: PHY_QueryRFReg -* -* OverView: Query "Specific bits" to RF register (page 8~) -* -* Input: -* PADAPTER Adapter, -* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D -* u4Byte RegAddr, //The target address to be read -* u4Byte BitMask //The target bit position in the target address -* //to be read -* -* Output: None -* Return: u4Byte Readback value -* Note: This function is equal to "GetRFRegSetting" in PHY programming guide -*/ -u32 -rtl8192c_PHY_QueryRFReg( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 RegAddr, - IN u32 BitMask - ) -{ - u32 Original_Value, Readback_Value, BitShift; - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //u8 RFWaitCounter = 0; - //_irqL irqL; - -#if (DISABLE_BB_RF == 1) - return 0; -#endif - - //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), BitMask(%#lx)\n", RegAddr, eRFPath,BitMask)); - -#ifdef CONFIG_USB_HCI - //PlatformAcquireMutex(&pHalData->mxRFOperate); -#else - //_enter_critical(&pHalData->rf_lock, &irqL); -#endif - - - Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); - - BitShift = phy_CalculateBitShift(BitMask); - Readback_Value = (Original_Value & BitMask) >> BitShift; - -#ifdef CONFIG_USB_HCI - //PlatformReleaseMutex(&pHalData->mxRFOperate); -#else - //_exit_critical(&pHalData->rf_lock, &irqL); -#endif - - - //RTPRINT(FPHY, PHY_RFR, ("RFR-%d MASK=0x%lx Addr[0x%lx]=0x%lx\n", eRFPath, BitMask, RegAddr, Original_Value));//BitMask(%#lx),BitMask, - //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), Original_Value(%#lx)\n", - // RegAddr, eRFPath, Original_Value)); - - return (Readback_Value); -} - -/** -* Function: PHY_SetRFReg -* -* OverView: Write "Specific bits" to RF register (page 8~) -* -* Input: -* PADAPTER Adapter, -* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D -* u4Byte RegAddr, //The target address to be modified -* u4Byte BitMask //The target bit position in the target address -* //to be modified -* u4Byte Data //The new register Data in the target bit position -* //of the target address -* -* Output: None -* Return: None -* Note: This function is equal to "PutRFRegSetting" in PHY programming guide -*/ -VOID -rtl8192c_PHY_SetRFReg( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ) -{ - - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //u1Byte RFWaitCounter = 0; - u32 Original_Value, BitShift; - //_irqL irqL; - -#if (DISABLE_BB_RF == 1) - return; -#endif - - //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", - // RegAddr, BitMask, Data, eRFPath)); - //RTPRINT(FINIT, INIT_RF, ("PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", - // RegAddr, BitMask, Data, eRFPath)); - - -#ifdef CONFIG_USB_HCI - //PlatformAcquireMutex(&pHalData->mxRFOperate); -#else - //_enter_critical(&pHalData->rf_lock, &irqL); -#endif - - - // RF data is 12 bits only - if (BitMask != bRFRegOffsetMask) - { - Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); - BitShift = phy_CalculateBitShift(BitMask); - Data = ((Original_Value & (~BitMask)) | (Data<< BitShift)); - } - - phy_RFSerialWrite(Adapter, eRFPath, RegAddr, Data); - - -#ifdef CONFIG_USB_HCI - //PlatformReleaseMutex(&pHalData->mxRFOperate); -#else - //_exit_critical(&pHalData->rf_lock, &irqL); -#endif - - //PHY_QueryRFReg(Adapter,eRFPath,RegAddr,BitMask); - //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", - // RegAddr, BitMask, Data, eRFPath)); - -} - - -// -// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. -// - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigMACWithParaFile() - * - * Overview: This function read BB parameters from general file format, and do register - * Read/Write - * - * Input: PADAPTER Adapter - * ps1Byte pFileName - * - * Output: NONE - * - * Return: RT_STATUS_SUCCESS: configuration file exist - * - * Note: The format of MACPHY_REG.txt is different from PHY and RF. - * [Register][Mask][Value] - *---------------------------------------------------------------------------*/ -static int -phy_ConfigMACWithParaFile( - IN PADAPTER Adapter, - IN u8* pFileName -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - int rtStatus = _SUCCESS; - - return rtStatus; -} - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigMACWithHeaderFile() - * - * Overview: This function read BB parameters from Header file we gen, and do register - * Read/Write - * - * Input: PADAPTER Adapter - * ps1Byte pFileName - * - * Output: NONE - * - * Return: RT_STATUS_SUCCESS: configuration file exist - * - * Note: The format of MACPHY_REG.txt is different from PHY and RF. - * [Register][Mask][Value] - *---------------------------------------------------------------------------*/ -#ifndef CONFIG_PHY_SETTING_WITH_ODM -static int -phy_ConfigMACWithHeaderFile( - IN PADAPTER Adapter -) -{ - u32 i = 0; - u32 ArrayLength = 0; - u32* ptrArray; - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //2008.11.06 Modified by tynli. - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read Rtl819XMACPHY_Array\n")); - ArrayLength = Rtl8723_MAC_ArrayLength; - ptrArray = (u32*)Rtl8723_MAC_Array; - -#ifdef CONFIG_IOL_MAC - { - struct xmit_frame *xmit_frame; - if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) - return _FAIL; - - for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column - rtw_IOL_append_WB_cmd(xmit_frame, ptrArray[i], (u8)ptrArray[i+1]); - } - - return rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0); - } -#else - for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column - rtw_write8(Adapter, ptrArray[i], (u8)ptrArray[i+1]); - } -#endif - - return _SUCCESS; - -} -#endif//#ifndef CONFIG_PHY_SETTING_WITH_ODM - -/*----------------------------------------------------------------------------- - * Function: PHY_MACConfig8192C - * - * Overview: Condig MAC by header file or parameter file. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 08/12/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -s32 PHY_MACConfig8723A(PADAPTER Adapter) -{ - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - s8 *pszMACRegFile; - s8 sz8723MACRegFile[] = RTL8723_PHY_MACREG; - BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); - - - pszMACRegFile = sz8723MACRegFile; - - // - // Config MAC - // -#ifdef CONFIG_EMBEDDED_FWIMG - #ifdef CONFIG_PHY_SETTING_WITH_ODM - if(HAL_STATUS_FAILURE == ODM_ConfigMACWithHeaderFile(&pHalData->odmpriv)) - rtStatus = _FAIL; - #else - rtStatus = phy_ConfigMACWithHeaderFile(Adapter); - #endif//#ifdef CONFIG_PHY_SETTING_WITH_ODM -#else - - // Not make sure EEPROM, add later - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read MACREG.txt\n")); - rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile); -#endif//CONFIG_EMBEDDED_FWIMG - -#ifdef CONFIG_PCI_HCI - //this switching setting cause some 8192cu hw have redownload fw fail issue - //improve 2-stream TX EVM by Jenyu - if(is92C) - rtw_write8(Adapter, REG_SPS0_CTRL+3,0x71); -#endif - - - // 2010.07.13 AMPDU aggregation number 9 - //rtw_write16(Adapter, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); - rtw_write8(Adapter, REG_MAX_AGGR_NUM, 0x0A); //By tynli. 2010.11.18. -#ifdef CONFIG_USB_HCI - if(is92C && (BOARD_USB_DONGLE == pHalData->BoardType)) - rtw_write8(Adapter, 0x40,0x04); -#endif - - return rtStatus; - -} - - -/** -* Function: phy_InitBBRFRegisterDefinition -* -* OverView: Initialize Register definition offset for Radio Path A/B/C/D -* -* Input: -* PADAPTER Adapter, -* -* Output: None -* Return: None -* Note: The initialization value is constant and it should never be changes -*/ -static VOID -phy_InitBBRFRegisterDefinition( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // RF Interface Sowrtware Control - pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870 - pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) - pHalData->PHYRegDef[RF_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 LSBs if read 32-bit from 0x874 - pHalData->PHYRegDef[RF_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) - - // RF Interface Readback Value - pHalData->PHYRegDef[RF_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; // 16 LSBs if read 32-bit from 0x8E0 - pHalData->PHYRegDef[RF_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) - pHalData->PHYRegDef[RF_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 LSBs if read 32-bit from 0x8E4 - pHalData->PHYRegDef[RF_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) - - // RF Interface Output (and Enable) - pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860 - pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864 - - // RF Interface (Output and) Enable - pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) - pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) - - //Addr of LSSI. Wirte RF register by driver - pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter - pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter; - - // RF parameter - pHalData->PHYRegDef[RF_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter; //BB Band Select - pHalData->PHYRegDef[RF_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter; - pHalData->PHYRegDef[RF_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter; - pHalData->PHYRegDef[RF_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter; - - // Tx AGC Gain Stage (same for all path. Should we remove this?) - pHalData->PHYRegDef[RF_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage - pHalData->PHYRegDef[RF_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage - pHalData->PHYRegDef[RF_PATH_C].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage - pHalData->PHYRegDef[RF_PATH_D].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage - - // Tranceiver A~D HSSI Parameter-1 - pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; //wire control parameter1 - pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1; //wire control parameter1 - - // Tranceiver A~D HSSI Parameter-2 - pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2 - pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2 - - // RF switch Control - pHalData->PHYRegDef[RF_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; //TR/Ant switch control - pHalData->PHYRegDef[RF_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl; - pHalData->PHYRegDef[RF_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl; - pHalData->PHYRegDef[RF_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl; - - // AGC control 1 - pHalData->PHYRegDef[RF_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1; - pHalData->PHYRegDef[RF_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1; - pHalData->PHYRegDef[RF_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1; - pHalData->PHYRegDef[RF_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1; - - // AGC control 2 - pHalData->PHYRegDef[RF_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2; - pHalData->PHYRegDef[RF_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2; - pHalData->PHYRegDef[RF_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2; - pHalData->PHYRegDef[RF_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2; - - // RX AFE control 1 - pHalData->PHYRegDef[RF_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance; - pHalData->PHYRegDef[RF_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance; - pHalData->PHYRegDef[RF_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance; - pHalData->PHYRegDef[RF_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance; - - // RX AFE control 1 - pHalData->PHYRegDef[RF_PATH_A].rfRxAFE = rOFDM0_XARxAFE; - pHalData->PHYRegDef[RF_PATH_B].rfRxAFE = rOFDM0_XBRxAFE; - pHalData->PHYRegDef[RF_PATH_C].rfRxAFE = rOFDM0_XCRxAFE; - pHalData->PHYRegDef[RF_PATH_D].rfRxAFE = rOFDM0_XDRxAFE; - - // Tx AFE control 1 - pHalData->PHYRegDef[RF_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance; - pHalData->PHYRegDef[RF_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance; - pHalData->PHYRegDef[RF_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance; - pHalData->PHYRegDef[RF_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance; - - // Tx AFE control 2 - pHalData->PHYRegDef[RF_PATH_A].rfTxAFE = rOFDM0_XATxAFE; - pHalData->PHYRegDef[RF_PATH_B].rfTxAFE = rOFDM0_XBTxAFE; - pHalData->PHYRegDef[RF_PATH_C].rfTxAFE = rOFDM0_XCTxAFE; - pHalData->PHYRegDef[RF_PATH_D].rfTxAFE = rOFDM0_XDTxAFE; - - // Tranceiver LSSI Readback SI mode - pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack; - pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack; - pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack; - pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack; - - // Tranceiver LSSI Readback PI mode - pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback; - pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback; - //pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBackPi = rFPGA0_XC_LSSIReadBack; - //pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBackPi = rFPGA0_XD_LSSIReadBack; - -} - - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithParaFile() - * - * Overview: This function read BB parameters from general file format, and do register - * Read/Write - * - * Input: PADAPTER Adapter - * ps1Byte pFileName - * - * Output: NONE - * - * Return: RT_STATUS_SUCCESS: configuration file exist - * 2008/11/06 MH For 92S we do not support silent reset now. Disable - * parameter file compare!!!!!!?? - * - *---------------------------------------------------------------------------*/ -static int -phy_ConfigBBWithParaFile( - IN PADAPTER Adapter, - IN u8* pFileName -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - int rtStatus = _SUCCESS; - - return rtStatus; -} - - - -//**************************************** -// The following is for High Power PA -//**************************************** -VOID -phy_ConfigBBExternalPA( - IN PADAPTER Adapter -) -{ -#ifdef CONFIG_USB_HCI - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u16 i=0; - u32 temp=0; - - if(!pHalData->ExternalPA) - { - return; - } - - // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the - // same code as SU. It is already updated in PHY_REG_1T_HP.txt. -#if 0 - PHY_SetBBReg(Adapter, 0xee8, BIT28, 1); - temp = PHY_QueryBBReg(Adapter, 0x860, bMaskDWord); - temp |= (BIT26|BIT21|BIT10|BIT5); - PHY_SetBBReg(Adapter, 0x860, bMaskDWord, temp); - PHY_SetBBReg(Adapter, 0x870, BIT10, 0); - PHY_SetBBReg(Adapter, 0xc80, bMaskDWord, 0x20000080); - PHY_SetBBReg(Adapter, 0xc88, bMaskDWord, 0x40000100); -#endif - -#endif -} - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithHeaderFile() - * - * Overview: This function read BB parameters from general file format, and do register - * Read/Write - * - * Input: PADAPTER Adapter - * u1Byte ConfigType 0 => PHY_CONFIG - * 1 =>AGC_TAB - * - * Output: NONE - * - * Return: RT_STATUS_SUCCESS: configuration file exist - * - *---------------------------------------------------------------------------*/ -#ifndef CONFIG_PHY_SETTING_WITH_ODM -static int -phy_ConfigBBWithHeaderFile( - IN PADAPTER Adapter, - IN u8 ConfigType -) -{ - int i; - u32* Rtl819XPHY_REGArray_Table; - u32* Rtl819XAGCTAB_Array_Table; - u16 PHY_REGArrayLen, AGCTAB_ArrayLen; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int ret = _SUCCESS; - - - AGCTAB_ArrayLen = Rtl8723_AGCTAB_1TArrayLength; - Rtl819XAGCTAB_Array_Table = (u32*)Rtl8723_AGCTAB_1TArray; - PHY_REGArrayLen = Rtl8723_PHY_REG_1TArrayLength; - Rtl819XPHY_REGArray_Table = (u32*)Rtl8723_PHY_REG_1TArray; -// RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8723AGCTAB_1TArray\n")); -// RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8723PHY_REG_1TArray\n")); - - if(ConfigType == BaseBand_Config_PHY_REG) - { - #ifdef CONFIG_IOL_BB_PHY_REG - { - struct xmit_frame *xmit_frame; - u32 tmp_value; - - if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) { - ret = _FAIL; - goto exit; - } - - for(i=0;iMCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0])); - } - if(RegAddr == rTxAGC_A_Rate54_24) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1])); - } - if(RegAddr == rTxAGC_A_CCK1_Mcs32) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6])); - } - if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7])); - } - if(RegAddr == rTxAGC_A_Mcs03_Mcs00) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2])); - } - if(RegAddr == rTxAGC_A_Mcs07_Mcs04) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3])); - } - if(RegAddr == rTxAGC_A_Mcs11_Mcs08) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4])); - } - if(RegAddr == rTxAGC_A_Mcs15_Mcs12) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5])); - } - if(RegAddr == rTxAGC_B_Rate18_06) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8])); - } - if(RegAddr == rTxAGC_B_Rate54_24) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9])); - } - if(RegAddr == rTxAGC_B_CCK1_55_Mcs32) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14])); - } - if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15])); - } - if(RegAddr == rTxAGC_B_Mcs03_Mcs00) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10])); - } - if(RegAddr == rTxAGC_B_Mcs07_Mcs04) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11])); - } - if(RegAddr == rTxAGC_B_Mcs11_Mcs08) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12])); - } - if(RegAddr == rTxAGC_B_Mcs15_Mcs12) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13])); - pHalData->pwrGroupCnt++; - } -} -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithPgParaFile - * - * Overview: - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/06/2008 MHC Create Version 0. - * 2009/07/29 tynli (porting from 92SE branch)2009/03/11 Add copy parameter file to buffer for silent reset - *---------------------------------------------------------------------------*/ -static int -phy_ConfigBBWithPgParaFile( - IN PADAPTER Adapter, - IN u8* pFileName) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - int rtStatus = _SUCCESS; - - - return rtStatus; - -} /* phy_ConfigBBWithPgParaFile */ - - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithPgHeaderFile - * - * Overview: Config PHY_REG_PG array - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/06/2008 MHC Add later!!!!!!.. Please modify for new files!!!! - * 11/10/2008 tynli Modify to mew files. - *---------------------------------------------------------------------------*/ -static int -phy_ConfigBBWithPgHeaderFile( - IN PADAPTER Adapter, - IN u8 ConfigType) -{ - int i; - u32* Rtl819XPHY_REGArray_Table_PG; - u16 PHY_REGArrayPGLen; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - - PHY_REGArrayPGLen = Rtl8723_PHY_REG_Array_PGLength; - Rtl819XPHY_REGArray_Table_PG = (u32*)Rtl8723_PHY_REG_Array_PG; - - if(ConfigType == BaseBand_Config_PHY_REG) - { - for(i=0;iBufOfLines), - MAX_LINES_HWCONFIG_TXT, - MAX_BYTES_LINE_HWCONFIG_TXT, - &nLinesRead - ); - if(rtStatus == RT_STATUS_SUCCESS) - { - PlatformMoveMemory(pHalData->BufOfLines6, pHalData->BufOfLines, nLinesRead*MAX_BYTES_LINE_HWCONFIG_TXT); - pHalData->nLinesRead6 = nLinesRead; - } - else - { - // Temporarily skip PHY_REG_MP.txt if file does not exist. - pHalData->nLinesRead6 = 0; - RT_TRACE(COMP_INIT, DBG_LOUD, ("No matched file \r\n")); - return RT_STATUS_SUCCESS; - } - } - else - { - PlatformMoveMemory(pHalData->BufOfLines, pHalData->BufOfLines6, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); - nLinesRead = pHalData->nLinesRead6; - rtStatus = RT_STATUS_SUCCESS; - } - - - if(rtStatus == RT_STATUS_SUCCESS) - { - RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): read %s ok\n", pFileName)); - - for(ithLine = 0; ithLine < nLinesRead; ithLine++) - { - szLine = pHalData->BufOfLines[ithLine]; - - if(!IsCommentString(szLine)) - { - // Get 1st hex value as register offset. - if(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) - { - if(u4bRegOffset == 0xff) - { // Ending. - break; - } - else if (u4bRegOffset == 0xfe) - delay_ms(50); - else if (u4bRegOffset == 0xfd) - delay_ms(5); - else if (u4bRegOffset == 0xfc) - delay_ms(1); - else if (u4bRegOffset == 0xfb) - PlatformStallExecution(50); - else if (u4bRegOffset == 0xfa) - PlatformStallExecution(5); - else if (u4bRegOffset == 0xf9) - PlatformStallExecution(1); - - // Get 2nd hex value as register value. - szLine += u4bMove; - if(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) - { - RT_TRACE(COMP_FPGA, DBG_TRACE, ("[ADDR]%03lX=%08lX\n", u4bRegOffset, u4bRegValue)); - PHY_SetBBReg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue); - - // Add 1us delay between BB/RF register setting. - PlatformStallExecution(1); - } - } - } - } - } - else - { - RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): Failed%s\n", pFileName)); - } -#endif - - return rtStatus; -} - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithMpHeaderFile - * - * Overview: Config PHY_REG_MP array - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 02/04/2010 chiyokolin Modify to new files. - *---------------------------------------------------------------------------*/ -static int -phy_ConfigBBWithMpHeaderFile( - IN PADAPTER Adapter, - IN u1Byte ConfigType) -{ - int i; - u32* Rtl8192CPHY_REGArray_Table_MP; - u16 PHY_REGArrayMPLen; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - - PHY_REGArrayMPLen = Rtl8723_PHY_REG_Array_MPLength; - Rtl8192CPHY_REGArray_Table_MP = (u32*)Rtl8723_PHY_REG_Array_MP; - - if(ConfigType == BaseBand_Config_PHY_REG) - { - for(i=0;iphy_BB8192S_Config_ParaFile\n")); - - pszBBRegFile = sz8723BBRegFile ; - pszAGCTableFile = sz8723AGCTableFile; - pszBBRegPgFile = sz8723BBRegPgFile; - pszBBRegMpFile = sz8723BBRegMpFile; - - // - // 1. Read PHY_REG.TXT BB INIT!! - // We will seperate as 88C / 92C according to chip version - // -#ifdef CONFIG_EMBEDDED_FWIMG - #ifdef CONFIG_PHY_SETTING_WITH_ODM - if(HAL_STATUS_FAILURE ==ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG)) - rtStatus = _FAIL; - #else - rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_PHY_REG); - #endif -#else - // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different - // type of parameter files to phy_reg.txt at first. - rtStatus = phy_ConfigBBWithParaFile(Adapter,pszBBRegFile); -#endif//#ifdef CONFIG_EMBEDDED_FWIMG - - if(rtStatus != _SUCCESS){ - //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg Fail!!")); - goto phy_BB8190_Config_ParaFile_Fail; - } - -#if MP_DRIVER == 1 - if (Adapter->registrypriv.mp_mode == 1) - { - // - // 1.1 Read PHY_REG_MP.TXT BB INIT!! - // We will seperate as 88C / 92C according to chip version - // -#ifdef CONFIG_EMBEDDED_FWIMG - rtStatus = phy_ConfigBBWithMpHeaderFile(Adapter, BaseBand_Config_PHY_REG); -#else - // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different - // type of parameter files to phy_reg.txt at first. - rtStatus = phy_ConfigBBWithMpParaFile(Adapter, pszBBRegMpFile); -#endif - - if(rtStatus != _SUCCESS){ -// RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg MP Fail!!")); - goto phy_BB8190_Config_ParaFile_Fail; - } - } -#endif // #if (MP_DRIVER == 1) - - // - // 20100318 Joseph: Config 2T2R to 1T2R if necessary. - // - if(pHalData->rf_type == RF_1T2R) - { - phy_BB8192C_Config_1T(Adapter); - DBG_8192C("phy_BB8723a_Config_ParaFile():Config to 1T!!\n"); - } - - // - // 2. If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt - // - if (pEEPROM->bautoload_fail_flag == _FALSE) - { - pHalData->pwrGroupCnt = 0; - -#ifdef CONFIG_EMBEDDED_FWIMG - rtStatus = phy_ConfigBBWithPgHeaderFile(Adapter, BaseBand_Config_PHY_REG); -#else - rtStatus = phy_ConfigBBWithPgParaFile(Adapter, pszBBRegPgFile); -#endif - } - - if(rtStatus != _SUCCESS){ - //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():BB_PG Reg Fail!!")); - goto phy_BB8190_Config_ParaFile_Fail; - } - - // - // 3. BB AGC table Initialization - // -#ifdef CONFIG_EMBEDDED_FWIMG - #ifdef CONFIG_PHY_SETTING_WITH_ODM - if(HAL_STATUS_FAILURE ==ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_AGC_TAB)) - rtStatus = _FAIL; - #else - rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_AGC_TAB); - #endif//#ifdef CONFIG_PHY_SETTING_WITH_ODM -#else - //RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_BB8192S_Config_ParaFile AGC_TAB.txt\n")); - rtStatus = phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile); -#endif - - if(rtStatus != _SUCCESS){ - //RT_TRACE(COMP_FPGA, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():AGC Table Fail\n")); - goto phy_BB8190_Config_ParaFile_Fail; - } - -phy_BB8190_Config_ParaFile_Fail: - - return rtStatus; -} - - -int -PHY_BBConfig8723A( - IN PADAPTER Adapter - ) -{ - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 RegVal; - u8 TmpU1B=0; - u8 value8,CrystalCap; - - phy_InitBBRFRegisterDefinition(Adapter); - - if(IS_HARDWARE_TYPE_8723A(Adapter)) - { - // Suggested by Scott. tynli_test. 2010.12.30. - //1. 0x28[1] = 1 - TmpU1B = rtw_read8(Adapter, REG_AFE_PLL_CTRL); - rtw_udelay_os(2); - rtw_write8(Adapter, REG_AFE_PLL_CTRL, (TmpU1B|BIT1)); - rtw_udelay_os(2); - - //2. 0x29[7:0] = 0xFF - rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xff); - rtw_udelay_os(2); - - //3. 0x02[1:0] = 2b'11 - TmpU1B = rtw_read8(Adapter, REG_SYS_FUNC_EN); - rtw_write8(Adapter, REG_SYS_FUNC_EN, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB)); - - //4. 0x25[6] = 0 - TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+1); - rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, (TmpU1B&(~BIT6))); - - //5. 0x24[20] = 0 //Advised by SD3 Alex Wang. 2011.02.09. - TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+2); - rtw_write8(Adapter, REG_AFE_XTAL_CTRL+2, (TmpU1B&(~BIT4))); - - //6. 0x1f[7:0] = 0x07 - rtw_write8(Adapter, REG_RF_CTRL, 0x07); - } - else - { - // Enable BB and RF - RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN); - rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal|BIT13|BIT0|BIT1)); - - // 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF. - rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83); - rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xdb); - - rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB); - -#ifdef CONFIG_USB_HCI - rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD | FEN_BB_GLB_RSTn | FEN_BBRSTB); -#else - rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_BB_GLB_RSTn|FEN_BBRSTB); -#endif - - // 2009/10/21 by SD1 Jong. Modified by tynli. Not in Documented in V8.1. -#ifdef CONFIG_USB_HCI - //To Fix MAC loopback mode fail. Suggested by SD4 Johnny. 2010.03.23. - rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x0f); - rtw_write8(Adapter, 0x15, 0xe9); -#endif - - rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, 0x80); - -#ifdef CONFIG_PCI_HCI - // Force use left antenna by default for 88C. - // if(!IS_92C_SERIAL(pHalData->VersionID) || IS_92C_1T2R(pHalData->VersionID)) - if(Adapter->ledpriv.LedStrategy != SW_LED_MODE10) - { - RegVal = rtw_read32(Adapter, REG_LEDCFG0); - rtw_write32(Adapter, REG_LEDCFG0, RegVal|BIT23); - } -#endif - } - - // - // Config BB and AGC - // - rtStatus = phy_BB8723a_Config_ParaFile(Adapter); - -#ifdef CONFIG_USB_HCI - if(IS_HARDWARE_TYPE_8192CU(Adapter)&&IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) - &&(pHalData->BoardType == BOARD_USB_High_PA)) - rtw_write8(Adapter, 0xc72, 0x50); -#endif -//only for B-cut - if(IS_HARDWARE_TYPE_8723A(Adapter) && pHalData->EEPROMVersion >= 0x01) - { - CrystalCap = pHalData->CrystalCap & 0x3F; - PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6))); - } - - if(IS_HARDWARE_TYPE_8723AE(Adapter)) - PHY_SetBBReg(Adapter, REG_LDOA15_CTRL, bMaskDWord, 0x01572505); - return rtStatus; -} - - -int -PHY_RFConfig8723A( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int rtStatus = _SUCCESS; - - // - // RF config - // - rtStatus = PHY_RF6052_Config8723A(Adapter); - return rtStatus; -} - - -/*----------------------------------------------------------------------------- - * Function: PHY_ConfigRFWithParaFile() - * - * Overview: This function read RF parameters from general file format, and do RF 3-wire - * - * Input: PADAPTER Adapter - * ps1Byte pFileName - * RF_RADIO_PATH_E eRFPath - * - * Output: NONE - * - * Return: RT_STATUS_SUCCESS: configuration file exist - * - * Note: Delay may be required for RF configuration - *---------------------------------------------------------------------------*/ -int -rtl8192c_PHY_ConfigRFWithParaFile( - IN PADAPTER Adapter, - IN u8* pFileName, - RF_RADIO_PATH_E eRFPath -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - int rtStatus = _SUCCESS; - - - return rtStatus; - -} - -//**************************************** -// The following is for High Power PA -//**************************************** -#define HighPowerRadioAArrayLen 22 -//This is for High power PA -u32 Rtl8192S_HighPower_RadioA_Array[HighPowerRadioAArrayLen] = { -0x013,0x00029ea4, -0x013,0x00025e74, -0x013,0x00020ea4, -0x013,0x0001ced0, -0x013,0x00019f40, -0x013,0x00014e70, -0x013,0x000106a0, -0x013,0x0000c670, -0x013,0x000082a0, -0x013,0x00004270, -0x013,0x00000240, -}; - -int -PHY_ConfigRFExternalPA( - IN PADAPTER Adapter, - RF_RADIO_PATH_E eRFPath -) -{ - int rtStatus = _SUCCESS; -#ifdef CONFIG_USB_HCI - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u16 i=0; - - if(!pHalData->ExternalPA) - { - return rtStatus; - } - - // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the - // same code as SU. It is already updated in radio_a_1T_HP.txt. -#if 0 - //add for SU High Power PA - for(i = 0;i PHY_ConfigRFWithHeaderFile() Radio_A:Rtl8723RadioA_1TArray\n")); -// RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> PHY_ConfigRFWithHeaderFile() Radio_B:Rtl8723RadioB_1TArray\n")); - - switch (eRFPath) - { - case RF_PATH_A: - #ifdef CONFIG_IOL_RF_RF90_PATH_A - { - struct xmit_frame *xmit_frame; - if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) { - rtStatus = _FAIL; - goto exit; - } - - for(i = 0;iPHYRegDef[eRFPath]; - u32 NewOffset = 0; - u32 DataAndAddr = 0; - - NewOffset = Rtl819XRadioA_Array_Table[i] & 0x3f; - DataAndAddr = ((NewOffset<<20) | (Rtl819XRadioA_Array_Table[i+1]&0x000fffff)) & 0x0fffffff; // T65 RF - rtw_IOL_append_WD_cmd(xmit_frame, pPhyReg->rf3wireOffset, DataAndAddr); - } - } - rtStatus = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0); - } - #else - for(i = 0;iPHYRegDef[eRFPath]; - u32 NewOffset = 0; - u32 DataAndAddr = 0; - - NewOffset = Rtl819XRadioB_Array_Table[i] & 0x3f; - DataAndAddr = ((NewOffset<<20) | (Rtl819XRadioB_Array_Table[i+1]&0x000fffff)) & 0x0fffffff; // T65 RF - rtw_IOL_append_WD_cmd(xmit_frame, pPhyReg->rf3wireOffset, DataAndAddr); - } - } - rtStatus = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0); - } - #else - for(i = 0;i actually we call PlatformStallExecution()) to do NdisStallExecution() - // [busy wait] instead of NdisMSleep(). So we acquire RT_INITIAL_SPINLOCK - // to run at Dispatch level to achive it. - //cosa PlatformAcquireSpinLock(Adapter, RT_INITIAL_SPINLOCK); - WriteData[i] &= 0xfff; - PHY_SetRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bRFRegOffsetMask, WriteData[i]); - // TODO: we should not delay for such a long time. Ask SD3 - rtw_mdelay_os(10); - ulRegRead = PHY_QueryRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bMaskDWord); - rtw_mdelay_os(10); - //cosa PlatformReleaseSpinLock(Adapter, RT_INITIAL_SPINLOCK); - break; - - default: - rtStatus = _FAIL; - break; - } - - - // - // Check whether readback data is correct - // - if(ulRegRead != WriteData[i]) - { - //RT_TRACE(COMP_FPGA, DBG_LOUD, ("ulRegRead: %lx, WriteData: %lx \n", ulRegRead, WriteData[i])); - rtStatus = _FAIL; - break; - } - } - - return rtStatus; -} - - -VOID -rtl8192c_PHY_GetHWRegOriginalValue( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // read rx initial gain - pHalData->DefaultInitialGain[0] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XAAGCCore1, bMaskByte0); - pHalData->DefaultInitialGain[1] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XBAGCCore1, bMaskByte0); - pHalData->DefaultInitialGain[2] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XCAGCCore1, bMaskByte0); - pHalData->DefaultInitialGain[3] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XDAGCCore1, bMaskByte0); - //RT_TRACE(COMP_INIT, DBG_LOUD, - //("Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x) \n", - //pHalData->DefaultInitialGain[0], pHalData->DefaultInitialGain[1], - //pHalData->DefaultInitialGain[2], pHalData->DefaultInitialGain[3])); - - // read framesync - pHalData->framesync = (u8)PHY_QueryBBReg(Adapter, rOFDM0_RxDetector3, bMaskByte0); - pHalData->framesyncC34 = PHY_QueryBBReg(Adapter, rOFDM0_RxDetector2, bMaskDWord); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Default framesync (0x%x) = 0x%x \n", - // rOFDM0_RxDetector3, pHalData->framesync)); -} - - -// -// Description: -// Map dBm into Tx power index according to -// current HW model, for example, RF and PA, and -// current wireless mode. -// By Bruce, 2008-01-29. -// -static u8 -phy_DbmToTxPwrIdx( - IN PADAPTER Adapter, - IN WIRELESS_MODE WirelessMode, - IN int PowerInDbm - ) -{ - u8 TxPwrIdx = 0; - int Offset = 0; - - - // - // Tested by MP, we found that CCK Index 0 equals to 8dbm, OFDM legacy equals to - // 3dbm, and OFDM HT equals to 0dbm repectively. - // Note: - // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. - // By Bruce, 2008-01-29. - // - switch(WirelessMode) - { - case WIRELESS_MODE_B: - Offset = -7; - break; - - case WIRELESS_MODE_G: - case WIRELESS_MODE_N_24G: - Offset = -8; - break; - default: - Offset = -8; - break; - } - - if((PowerInDbm - Offset) > 0) - { - TxPwrIdx = (u8)((PowerInDbm - Offset) * 2); - } - else - { - TxPwrIdx = 0; - } - - // Tx Power Index is too large. - if(TxPwrIdx > MAX_TXPWR_IDX_NMODE_92S) - TxPwrIdx = MAX_TXPWR_IDX_NMODE_92S; - - return TxPwrIdx; -} - -// -// Description: -// Map Tx power index into dBm according to -// current HW model, for example, RF and PA, and -// current wireless mode. -// By Bruce, 2008-01-29. -// -int -phy_TxPwrIdxToDbm( - IN PADAPTER Adapter, - IN WIRELESS_MODE WirelessMode, - IN u8 TxPwrIdx - ) -{ - int Offset = 0; - int PwrOutDbm = 0; - - // - // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm. - // Note: - // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. - // By Bruce, 2008-01-29. - // - switch(WirelessMode) - { - case WIRELESS_MODE_B: - Offset = -7; - break; - - case WIRELESS_MODE_G: - case WIRELESS_MODE_N_24G: - Offset = -8; - default: - Offset = -8; - break; - } - - PwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part. - - return PwrOutDbm; -} - - -/*----------------------------------------------------------------------------- - * Function: GetTxPowerLevel8190() - * - * Overview: This function is export to "common" moudule - * - * Input: PADAPTER Adapter - * psByte Power Level - * - * Output: NONE - * - * Return: NONE - * - *---------------------------------------------------------------------------*/ -VOID -PHY_GetTxPowerLevel8192C( - IN PADAPTER Adapter, - OUT u32* powerlevel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 TxPwrLevel = 0; - int TxPwrDbm; - - // - // Because the Tx power indexes are different, we report the maximum of them to - // meet the CCX TPC request. By Bruce, 2008-01-31. - // - - // CCK - TxPwrLevel = pHalData->CurrentCckTxPwrIdx; - TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_B, TxPwrLevel); - - // Legacy OFDM - TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx + pHalData->LegacyHTTxPowerDiff; - - // Compare with Legacy OFDM Tx power. - if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm) - TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); - - // HT OFDM - TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx; - - // Compare with HT OFDM Tx power. - if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm) - TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel); - - *powerlevel = TxPwrDbm; -} - - -static void getTxPowerIndex( - IN PADAPTER Adapter, - IN u8 channel, - IN OUT u8* cckPowerLevel, - IN OUT u8* ofdmPowerLevel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 index = (channel -1); - // 1. CCK - cckPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelCck[RF_PATH_A][index]; //RF-A - cckPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelCck[RF_PATH_B][index]; //RF-B - - // 2. OFDM for 1S or 2S - if (GET_RF_TYPE(Adapter) == RF_1T2R || GET_RF_TYPE(Adapter) == RF_1T1R) - { - // Read HT 40 OFDM TX power - ofdmPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelHT40_1S[RF_PATH_A][index]; - ofdmPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelHT40_1S[RF_PATH_B][index]; - } - else if (GET_RF_TYPE(Adapter) == RF_2T2R) - { - // Read HT 40 OFDM TX power - ofdmPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelHT40_2S[RF_PATH_A][index]; - ofdmPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelHT40_2S[RF_PATH_B][index]; - } - //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, set tx power index !!\n", channel)); -} - -static void ccxPowerIndexCheck( - IN PADAPTER Adapter, - IN u8 channel, - IN OUT u8* cckPowerLevel, - IN OUT u8* ofdmPowerLevel - ) -{ -#if 0 - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PRT_CCX_INFO pCcxInfo = GET_CCX_INFO(pMgntInfo); - - // - // CCX 2 S31, AP control of client transmit power: - // 1. We shall not exceed Cell Power Limit as possible as we can. - // 2. Tolerance is +/- 5dB. - // 3. 802.11h Power Contraint takes higher precedence over CCX Cell Power Limit. - // - // TODO: - // 1. 802.11h power contraint - // - // 071011, by rcnjko. - // - if( pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE && - pMgntInfo->mAssoc && - pCcxInfo->bUpdateCcxPwr && - pCcxInfo->bWithCcxCellPwr && - channel == pMgntInfo->dot11CurrentChannelNumber) - { - u1Byte CckCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pCcxInfo->CcxCellPwr); - u1Byte LegacyOfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pCcxInfo->CcxCellPwr); - u1Byte OfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pCcxInfo->CcxCellPwr); - - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", - pCcxInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx)); - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", - channel, cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); - - // CCK - if(cckPowerLevel[0] > CckCellPwrIdx) - cckPowerLevel[0] = CckCellPwrIdx; - // Legacy OFDM, HT OFDM - if(ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff > LegacyOfdmCellPwrIdx) - { - if((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0) - { - ofdmPowerLevel[0] = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff; - } - else - { - ofdmPowerLevel[0] = 0; - } - } - - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", - cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); - } - - pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0]; - pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0]; - - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("PHY_SetTxPowerLevel8192S(): CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", - cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); -#endif -} -/*----------------------------------------------------------------------------- - * Function: SetTxPowerLevel8190() - * - * Overview: This function is export to "HalCommon" moudule - * We must consider RF path later!!!!!!! - * - * Input: PADAPTER Adapter - * u1Byte channel - * - * Output: NONE - * - * Return: NONE - * 2008/11/04 MHC We remove EEPROM_93C56. - * We need to move CCX relative code to independet file. - * 2009/01/21 MHC Support new EEPROM format from SD3 requirement. - * - *---------------------------------------------------------------------------*/ -VOID -PHY_SetTxPowerLevel8192C( - IN PADAPTER Adapter, - IN u8 channel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 cckPowerLevel[2], ofdmPowerLevel[2]; // [0]:RF-A, [1]:RF-B -/* -#if(MP_DRIVER == 1) - if (Adapter->registrypriv.mp_mode == 1) - return; -#endif -*/ - if(pHalData->bTXPowerDataReadFromEEPORM == _FALSE) - return; - - getTxPowerIndex(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]); - //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, cckPowerLevel (A / B) = 0x%x / 0x%x, ofdmPowerLevel (A / B) = 0x%x / 0x%x\n", - // channel, cckPowerLevel[0], cckPowerLevel[1], ofdmPowerLevel[0], ofdmPowerLevel[1])); - - ccxPowerIndexCheck(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]); - - rtl8192c_PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); - rtl8192c_PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel); - -#if 0 - switch(pHalData->rf_chip) - { - case RF_8225: - PHY_SetRF8225CckTxPower(Adapter, cckPowerLevel[0]); - PHY_SetRF8225OfdmTxPower(Adapter, ofdmPowerLevel[0]); - break; - - case RF_8256: - PHY_SetRF8256CCKTxPower(Adapter, cckPowerLevel[0]); - PHY_SetRF8256OFDMTxPower(Adapter, ofdmPowerLevel[0]); - break; - - case RF_6052: - PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); - PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel); - break; - - case RF_8258: - break; - } -#endif - -} - - -// -// Description: -// Update transmit power level of all channel supported. -// -// TODO: -// A mode. -// By Bruce, 2008-02-04. -// -BOOLEAN -PHY_UpdateTxPowerDbm8192C( - IN PADAPTER Adapter, - IN int powerInDbm - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 idx; - u8 rf_path; - - // TODO: A mode Tx power. - u8 CckTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, powerInDbm); - u8 OfdmTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, powerInDbm); - - if(OfdmTxPwrIdx - pHalData->LegacyHTTxPowerDiff > 0) - OfdmTxPwrIdx -= pHalData->LegacyHTTxPowerDiff; - else - OfdmTxPwrIdx = 0; - - //RT_TRACE(COMP_TXAGC, DBG_LOUD, ("PHY_UpdateTxPowerDbm8192S(): %ld dBm , CckTxPwrIdx = %d, OfdmTxPwrIdx = %d\n", powerInDbm, CckTxPwrIdx, OfdmTxPwrIdx)); - - for(idx = 0; idx < 14; idx++) - { - for (rf_path = 0; rf_path < 2; rf_path++) - { - pHalData->TxPwrLevelCck[rf_path][idx] = CckTxPwrIdx; - pHalData->TxPwrLevelHT40_1S[rf_path][idx] = - pHalData->TxPwrLevelHT40_2S[rf_path][idx] = OfdmTxPwrIdx; - } - } - - //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel);//gtest:todo - - return _TRUE; -} - - -/* - Description: - When beacon interval is changed, the values of the - hw registers should be modified. - By tynli, 2008.10.24. - -*/ - - -void -rtl8192c_PHY_SetBeaconHwReg( - IN PADAPTER Adapter, - IN u16 BeaconInterval - ) -{ - -} - - -VOID -PHY_ScanOperationBackup8192C( - IN PADAPTER Adapter, - IN u8 Operation - ) -{ -#if 0 - IO_TYPE IoType; - - if(!Adapter->bDriverStopped) - { - switch(Operation) - { - case SCAN_OPT_BACKUP: - IoType = IO_CMD_PAUSE_DM_BY_SCAN; - rtw_hal_set_hwreg(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType); - - break; - - case SCAN_OPT_RESTORE: - IoType = IO_CMD_RESUME_DM_BY_SCAN; - rtw_hal_set_hwreg(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType); - break; - - default: - RT_TRACE(COMP_SCAN, DBG_LOUD, ("Unknown Scan Backup Operation. \n")); - break; - } - } -#endif -} - -/*----------------------------------------------------------------------------- - * Function: PHY_SetBWModeCallback8192C() - * - * Overview: Timer callback function for SetSetBWMode - * - * Input: PRT_TIMER pTimer - * - * Output: NONE - * - * Return: NONE - * - * Note: (1) We do not take j mode into consideration now - * (2) Will two workitem of "switch channel" and "switch channel bandwidth" run - * concurrently? - *---------------------------------------------------------------------------*/ -static VOID -_PHY_SetBWMode92C( - IN PADAPTER Adapter -) -{ -// PADAPTER Adapter = (PADAPTER)pTimer->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 regBwOpMode; - u8 regRRSR_RSC; - - //return; - - // Added it for 20/40 mhz switch time evaluation by guangan 070531 - //u4Byte NowL, NowH; - //u8Byte BeginTime, EndTime; - - /*RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SetBWModeCallback8192C() Switch to %s bandwidth\n", \ - pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"))*/ - - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - //pHalData->SetBWModeInProgress= _FALSE; - return; - } - - // There is no 40MHz mode in RF_8225. - if(pHalData->rf_chip==RF_8225) - return; - - if(Adapter->bDriverStopped) - return; - - // Added it for 20/40 mhz switch time evaluation by guangan 070531 - //NowL = PlatformEFIORead4Byte(Adapter, TSFR); - //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4); - //BeginTime = ((u8Byte)NowH << 32) + NowL; - - //3// - //3//<1>Set MAC register - //3// - //Adapter->HalFunc.SetBWModeHandler(); - - regBwOpMode = rtw_read8(Adapter, REG_BWOPMODE); - regRRSR_RSC = rtw_read8(Adapter, REG_RRSR+2); - //regBwOpMode = rtw_hal_get_hwreg(Adapter,HW_VAR_BWMODE,(pu1Byte)®BwOpMode); - - switch(pHalData->CurrentChannelBW) - { - case HT_CHANNEL_WIDTH_20: - regBwOpMode |= BW_OPMODE_20MHZ; - // 2007/02/07 Mark by Emily becasue we have not verify whether this register works - rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); - break; - - case HT_CHANNEL_WIDTH_40: - regBwOpMode &= ~BW_OPMODE_20MHZ; - // 2007/02/07 Mark by Emily becasue we have not verify whether this register works - rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); - - regRRSR_RSC = (regRRSR_RSC&0x90) |(pHalData->nCur40MhzPrimeSC<<5); - rtw_write8(Adapter, REG_RRSR+2, regRRSR_RSC); - break; - - default: - /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): - unknown Bandwidth: %#X\n",pHalData->CurrentChannelBW));*/ - break; - } - - //3// - //3//<2>Set PHY related register - //3// - switch(pHalData->CurrentChannelBW) - { - /* 20 MHz channel*/ - case HT_CHANNEL_WIDTH_20: - PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x0); - PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x0); - PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 1); - - break; - - - /* 40 MHz channel*/ - case HT_CHANNEL_WIDTH_40: - PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x1); - PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x1); - - // Set Control channel to upper or lower. These settings are required only for 40MHz - PHY_SetBBReg(Adapter, rCCK0_System, bCCKSideBand, (pHalData->nCur40MhzPrimeSC>>1)); - PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0xC00, pHalData->nCur40MhzPrimeSC); - PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 0); - - PHY_SetBBReg(Adapter, 0x818, (BIT26|BIT27), (pHalData->nCur40MhzPrimeSC==HAL_PRIME_CHNL_OFFSET_LOWER)?2:1); - - break; - - - - default: - /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): unknown Bandwidth: %#X\n"\ - ,pHalData->CurrentChannelBW));*/ - break; - - } - //Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315 - - // Added it for 20/40 mhz switch time evaluation by guangan 070531 - //NowL = PlatformEFIORead4Byte(Adapter, TSFR); - //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4); - //EndTime = ((u8Byte)NowH << 32) + NowL; - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWModeCallback8190Pci: time of SetBWMode = %I64d us!\n", (EndTime - BeginTime))); - - //3<3>Set RF related register - switch(pHalData->rf_chip) - { - case RF_8225: - //PHY_SetRF8225Bandwidth(Adapter, pHalData->CurrentChannelBW); - break; - - case RF_8256: - // Please implement this function in Hal8190PciPhy8256.c - //PHY_SetRF8256Bandwidth(Adapter, pHalData->CurrentChannelBW); - break; - - case RF_8258: - // Please implement this function in Hal8190PciPhy8258.c - // PHY_SetRF8258Bandwidth(); - break; - - case RF_PSEUDO_11N: - // Do Nothing - break; - - case RF_6052: - rtl8192c_PHY_RF6052SetBandwidth(Adapter, pHalData->CurrentChannelBW); - break; - - default: - //RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID)); - break; - } - - //pHalData->SetBWModeInProgress= FALSE; - - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SetBWModeCallback8192C() \n" )); -} - - - /*----------------------------------------------------------------------------- - * Function: SetBWMode8190Pci() - * - * Overview: This function is export to "HalCommon" moudule - * - * Input: PADAPTER Adapter - * HT_CHANNEL_WIDTH Bandwidth //20M or 40M - * - * Output: NONE - * - * Return: NONE - * - * Note: We do not take j mode into consideration now - *---------------------------------------------------------------------------*/ -VOID -PHY_SetBWMode8192C( - IN PADAPTER Adapter, - IN HT_CHANNEL_WIDTH Bandwidth, // 20M or 40M - IN unsigned char Offset // Upper, Lower, or Don't care -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - HT_CHANNEL_WIDTH tmpBW= pHalData->CurrentChannelBW; - // Modified it for 20/40 mhz switch by guangan 070531 - //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo; - - //return; - - //if(pHalData->SwChnlInProgress) -// if(pMgntInfo->bScanInProgress) -// { -// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s Exit because bScanInProgress!\n", -// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")); -// return; -// } - -// if(pHalData->SetBWModeInProgress) -// { -// // Modified it for 20/40 mhz switch by guangan 070531 -// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s cancel last timer because SetBWModeInProgress!\n", -// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")); -// PlatformCancelTimer(Adapter, &pHalData->SetBWModeTimer); -// //return; -// } - - //if(pHalData->SetBWModeInProgress) - // return; - - //pHalData->SetBWModeInProgress= TRUE; - - pHalData->CurrentChannelBW = Bandwidth; - -#if 0 - if(Offset==HT_EXTCHNL_OFFSET_LOWER) - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; - else if(Offset==HT_EXTCHNL_OFFSET_UPPER) - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; - else - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; -#else - pHalData->nCur40MhzPrimeSC = Offset; -#endif - - if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) - { - - #if 0 - //PlatformSetTimer(Adapter, &(pHalData->SetBWModeTimer), 0); - #else - _PHY_SetBWMode92C(Adapter); - #endif - - } - else - { - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() SetBWModeInProgress FALSE driver sleep or unload\n")); - //pHalData->SetBWModeInProgress= FALSE; - pHalData->CurrentChannelBW = tmpBW; - } - -} - - -static void _PHY_SwChnl8192C(PADAPTER Adapter, u8 channel) -{ - u8 eRFPath; - u32 param1, param2; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if ( Adapter->bNotifyChannelChange ) - { - DBG_871X( "[%s] ch = %d\n", __FUNCTION__, channel ); - } - - //s1. pre common command - CmdID_SetTxPowerLevel - PHY_SetTxPowerLevel8192C(Adapter, channel); - - //s2. RF dependent command - CmdID_RF_WriteReg, param1=RF_CHNLBW, param2=channel - param1 = RF_CHNLBW; - param2 = channel; - for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - { - pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | param2); - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, param1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); - } - - - //s3. post common command - CmdID_End, None - -} - -VOID -PHY_SwChnl8192C( // Call after initialization - IN PADAPTER Adapter, - IN u8 channel - ) -{ - //PADAPTER Adapter = ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, _TRUE); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 tmpchannel = pHalData->CurrentChannel; - BOOLEAN bResult = _TRUE; - - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - //pHalData->SwChnlInProgress=FALSE; - return; //return immediately if it is peudo-phy - } - - //if(pHalData->SwChnlInProgress) - // return; - - //if(pHalData->SetBWModeInProgress) - // return; - - //-------------------------------------------- - switch(pHalData->CurrentWirelessMode) - { - case WIRELESS_MODE_A: - case WIRELESS_MODE_N_5G: - //RT_ASSERT((channel>14), ("WIRELESS_MODE_A but channel<=14")); - break; - - case WIRELESS_MODE_B: - //RT_ASSERT((channel<=14), ("WIRELESS_MODE_B but channel>14")); - break; - - case WIRELESS_MODE_G: - case WIRELESS_MODE_N_24G: - //RT_ASSERT((channel<=14), ("WIRELESS_MODE_G but channel>14")); - break; - - default: - //RT_ASSERT(FALSE, ("Invalid WirelessMode(%#x)!!\n", pHalData->CurrentWirelessMode)); - break; - } - //-------------------------------------------- - - //pHalData->SwChnlInProgress = TRUE; - if(channel == 0) - channel = 1; - - pHalData->CurrentChannel=channel; - - //pHalData->SwChnlStage=0; - //pHalData->SwChnlStep=0; - - if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) - { - - #if 0 - //PlatformSetTimer(Adapter, &(pHalData->SwChnlTimer), 0); - #else - _PHY_SwChnl8192C(Adapter, channel); - #endif - - if(bResult) - { - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress TRUE schdule workitem done\n")); - } - else - { - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE schdule workitem error\n")); - //if(IS_HARDWARE_TYPE_8192SU(Adapter)) - //{ - // pHalData->SwChnlInProgress = FALSE; - pHalData->CurrentChannel = tmpchannel; - //} - } - - } - else - { - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE driver sleep or unload\n")); - //if(IS_HARDWARE_TYPE_8192SU(Adapter)) - //{ - // pHalData->SwChnlInProgress = FALSE; - pHalData->CurrentChannel = tmpchannel; - //} - } -} - - -static BOOLEAN -phy_SwChnlStepByStep( - IN PADAPTER Adapter, - IN u8 channel, - IN u8 *stage, - IN u8 *step, - OUT u32 *delay - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PCHANNEL_ACCESS_SETTING pChnlAccessSetting; - SwChnlCmd PreCommonCmd[MAX_PRECMD_CNT]; - u4Byte PreCommonCmdCnt; - SwChnlCmd PostCommonCmd[MAX_POSTCMD_CNT]; - u4Byte PostCommonCmdCnt; - SwChnlCmd RfDependCmd[MAX_RFDEPENDCMD_CNT]; - u4Byte RfDependCmdCnt; - SwChnlCmd *CurrentCmd; - u1Byte eRFPath; - u4Byte RfTXPowerCtrl; - BOOLEAN bAdjRfTXPowerCtrl = _FALSE; - - - RT_ASSERT((Adapter != NULL), ("Adapter should not be NULL\n")); -#if(MP_DRIVER != 1) - RT_ASSERT(IsLegalChannel(Adapter, channel), ("illegal channel: %d\n", channel)); -#endif - RT_ASSERT((pHalData != NULL), ("pHalData should not be NULL\n")); - - pChnlAccessSetting = &Adapter->MgntInfo.Info8185.ChannelAccessSetting; - RT_ASSERT((pChnlAccessSetting != NULL), ("pChnlAccessSetting should not be NULL\n")); - - //for(eRFPath = RF_PATH_A; eRFPath NumTotalRFPath; eRFPath++) - //for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - //{ - // <1> Fill up pre common command. - PreCommonCmdCnt = 0; - phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT, - CmdID_SetTxPowerLevel, 0, 0, 0); - phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT, - CmdID_End, 0, 0, 0); - - // <2> Fill up post common command. - PostCommonCmdCnt = 0; - - phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++, MAX_POSTCMD_CNT, - CmdID_End, 0, 0, 0); - - // <3> Fill up RF dependent command. - RfDependCmdCnt = 0; - switch( pHalData->RFChipID ) - { - case RF_8225: - RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); - // 2008/09/04 MH Change channel. - if(channel==14) channel++; - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_RF_WriteReg, rZebra1_Channel, (0x10+channel-1), 10); - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_End, 0, 0, 0); - break; - - case RF_8256: - // TEST!! This is not the table for 8256!! - RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_RF_WriteReg, rRfChannel, channel, 10); - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_End, 0, 0, 0); - break; - - case RF_6052: - RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_RF_WriteReg, RF_CHNLBW, channel, 10); - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_End, 0, 0, 0); - - break; - - case RF_8258: - break; - - // For FPGA two MAC verification - case RF_PSEUDO_11N: - return TRUE; - default: - RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID)); - return FALSE; - break; - } - - - do{ - switch(*stage) - { - case 0: - CurrentCmd=&PreCommonCmd[*step]; - break; - case 1: - CurrentCmd=&RfDependCmd[*step]; - break; - case 2: - CurrentCmd=&PostCommonCmd[*step]; - break; - } - - if(CurrentCmd->CmdID==CmdID_End) - { - if((*stage)==2) - { - return TRUE; - } - else - { - (*stage)++; - (*step)=0; - continue; - } - } - - switch(CurrentCmd->CmdID) - { - case CmdID_SetTxPowerLevel: - PHY_SetTxPowerLevel8192C(Adapter,channel); - break; - case CmdID_WritePortUlong: - PlatformEFIOWrite4Byte(Adapter, CurrentCmd->Para1, CurrentCmd->Para2); - break; - case CmdID_WritePortUshort: - PlatformEFIOWrite2Byte(Adapter, CurrentCmd->Para1, (u2Byte)CurrentCmd->Para2); - break; - case CmdID_WritePortUchar: - PlatformEFIOWrite1Byte(Adapter, CurrentCmd->Para1, (u1Byte)CurrentCmd->Para2); - break; - case CmdID_RF_WriteReg: // Only modify channel for the register now !!!!! - for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - { -#if 1 - pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | CurrentCmd->Para2); - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); -#else - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, (CurrentCmd->Para2)); -#endif - } - break; - } - - break; - }while(TRUE); - //cosa }/*for(Number of RF paths)*/ - - (*delay)=CurrentCmd->msDelay; - (*step)++; - return FALSE; -#endif - return _TRUE; -} - - -static BOOLEAN -phy_SetSwChnlCmdArray( - SwChnlCmd* CmdTable, - u32 CmdTableIdx, - u32 CmdTableSz, - SwChnlCmdID CmdID, - u32 Para1, - u32 Para2, - u32 msDelay - ) -{ - SwChnlCmd* pCmd; - - if(CmdTable == NULL) - { - //RT_ASSERT(FALSE, ("phy_SetSwChnlCmdArray(): CmdTable cannot be NULL.\n")); - return _FALSE; - } - if(CmdTableIdx >= CmdTableSz) - { - //RT_ASSERT(FALSE, - // ("phy_SetSwChnlCmdArray(): Access invalid index, please check size of the table, CmdTableIdx:%ld, CmdTableSz:%ld\n", - // CmdTableIdx, CmdTableSz)); - return _FALSE; - } - - pCmd = CmdTable + CmdTableIdx; - pCmd->CmdID = CmdID; - pCmd->Para1 = Para1; - pCmd->Para2 = Para2; - pCmd->msDelay = msDelay; - - return _TRUE; -} - - -static void -phy_FinishSwChnlNow( // We should not call this function directly - IN PADAPTER Adapter, - IN u8 channel - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 delay; - - while(!phy_SwChnlStepByStep(Adapter,channel,&pHalData->SwChnlStage,&pHalData->SwChnlStep,&delay)) - { - if(delay>0) - rtw_mdelay_os(delay); - } -#endif -} - - - -// -// Description: -// Switch channel synchronously. Called by SwChnlByDelayHandler. -// -// Implemented by Bruce, 2008-02-14. -// The following procedure is operted according to SwChanlCallback8190Pci(). -// However, this procedure is performed synchronously which should be running under -// passive level. -// -VOID -PHY_SwChnlPhy8192C( // Only called during initialize - IN PADAPTER Adapter, - IN u8 channel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("==>PHY_SwChnlPhy8192S(), switch from channel %d to channel %d.\n", pHalData->CurrentChannel, channel)); - - // Cannot IO. - //if(RT_CANNOT_IO(Adapter)) - // return; - - // Channel Switching is in progress. - //if(pHalData->SwChnlInProgress) - // return; - - //return immediately if it is peudo-phy - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - //pHalData->SwChnlInProgress=FALSE; - return; - } - - //pHalData->SwChnlInProgress = TRUE; - if( channel == 0) - channel = 1; - - pHalData->CurrentChannel=channel; - - //pHalData->SwChnlStage = 0; - //pHalData->SwChnlStep = 0; - - phy_FinishSwChnlNow(Adapter,channel); - - //pHalData->SwChnlInProgress = FALSE; -} - - -// -// Description: -// Configure H/W functionality to enable/disable Monitor mode. -// Note, because we possibly need to configure BB and RF in this function, -// so caller should in PASSIVE_LEVEL. 080118, by rcnjko. -// -VOID -PHY_SetMonitorMode8192C( - IN PADAPTER pAdapter, - IN BOOLEAN bEnableMonitorMode - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - BOOLEAN bFilterOutNonAssociatedBSSID = FALSE; - - //2 Note: we may need to stop antenna diversity. - if(bEnableMonitorMode) - { - bFilterOutNonAssociatedBSSID = FALSE; - RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): enable monitor mode\n")); - - pHalData->bInMonitorMode = TRUE; - pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, TRUE, TRUE); - rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID); - } - else - { - bFilterOutNonAssociatedBSSID = TRUE; - RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): disable monitor mode\n")); - - pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, FALSE, TRUE); - pHalData->bInMonitorMode = FALSE; - rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID); - } -#endif -} - - -/*----------------------------------------------------------------------------- - * Function: PHYCheckIsLegalRfPath8190Pci() - * - * Overview: Check different RF type to execute legal judgement. If RF Path is illegal - * We will return false. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/15/2007 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -BOOLEAN -PHY_CheckIsLegalRfPath8192C( - IN PADAPTER pAdapter, - IN u32 eRFPath) -{ -// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - BOOLEAN rtValue = _TRUE; - - // NOt check RF Path now.! -#if 0 - if (pHalData->RF_Type == RF_1T2R && eRFPath != RF_PATH_A) - { - rtValue = FALSE; - } - if (pHalData->RF_Type == RF_1T2R && eRFPath != RF_PATH_A) - { - - } -#endif - return rtValue; - -} /* PHY_CheckIsLegalRfPath8192C */ - -static VOID _PHY_SetRFPathSwitch( - IN PADAPTER pAdapter, - IN BOOLEAN bMain, - IN BOOLEAN is2T - ) -{ - u8 u1bTmp; - - if(!pAdapter->hw_init_completed) - { - u1bTmp = rtw_read8(pAdapter, REG_LEDCFG2) | BIT7; - rtw_write8(pAdapter, REG_LEDCFG2, u1bTmp); - //PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); - } - - if(is2T) - { - if(bMain) - PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1); //92C_Path_A - else - PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2); //BT - } - else - { - - if(bMain) - PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x2); //Main - else - PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x1); //Aux - } - -} - -//return value TRUE => Main; FALSE => Aux - -static BOOLEAN _PHY_QueryRFPathSwitch( - IN PADAPTER pAdapter, - IN BOOLEAN is2T - ) -{ -// if(is2T) -// return _TRUE; - - if(!pAdapter->hw_init_completed) - { - PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); - } - - if(is2T) - { - if(PHY_QueryBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01) - return _TRUE; - else - return _FALSE; - } - else - { - if(PHY_QueryBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300) == 0x02) - return _TRUE; - else - return _FALSE; - } -} - - -static VOID -_PHY_DumpRFReg(IN PADAPTER pAdapter) -{ - u32 rfRegValue,rfRegOffset; - - //RTPRINT(FINIT, INIT_RF, ("PHY_DumpRFReg()====>\n")); - - for(rfRegOffset = 0x00;rfRegOffset<=0x30;rfRegOffset++){ - rfRegValue = PHY_QueryRFReg(pAdapter,RF_PATH_A, rfRegOffset, bMaskDWord); - //RTPRINT(FINIT, INIT_RF, (" 0x%02x = 0x%08x\n",rfRegOffset,rfRegValue)); - } - //RTPRINT(FINIT, INIT_RF, ("<===== PHY_DumpRFReg()\n")); -} - - -VOID rtl8192c_PHY_SetRFPathSwitch( - IN PADAPTER pAdapter, - IN BOOLEAN bMain - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - -#if DISABLE_BB_RF - return; -#endif - - if(IS_92C_SERIAL( pHalData->VersionID)){ - _PHY_SetRFPathSwitch(pAdapter, bMain, _TRUE); - } - else{ - // For 88C 1T1R - _PHY_SetRFPathSwitch(pAdapter, bMain, _FALSE); - } -} - -// -// Move from phycfg.c to gen.c to be code independent later -// -//-------------------------Move to other DIR later----------------------------*/ -#ifdef CONFIG_USB_HCI - -// -// Description: -// To dump all Tx FIFO LLT related link-list table. -// Added by Roger, 2009.03.10. -// -VOID -DumpBBDbgPort_92CU( - IN PADAPTER Adapter - ) -{ - - //RT_TRACE(COMP_SEND, DBG_WARNING, ("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n")); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("BaseBand Debug Ports:\n")); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0000); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0803); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0a06); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0007); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100); - PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x000f0000); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100); - PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x00150000); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x800, PHY_QueryBBReg(Adapter, 0x0800, bMaskDWord))); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x900, PHY_QueryBBReg(Adapter, 0x0900, bMaskDWord))); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa00, PHY_QueryBBReg(Adapter, 0x0a00, bMaskDWord))); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa54, PHY_QueryBBReg(Adapter, 0x0a54, bMaskDWord))); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa58, PHY_QueryBBReg(Adapter, 0x0a58, bMaskDWord))); - -} -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8723A_PHYCFG_C_ + +#include +#include +#include +#include + +#ifdef CONFIG_IOL +#include +#endif + +#include + + +/*---------------------------Define Local Constant---------------------------*/ +/* Channel switch:The size of command tables for switch channel*/ +#define MAX_PRECMD_CNT 16 +#define MAX_RFDEPENDCMD_CNT 16 +#define MAX_POSTCMD_CNT 16 + +#define MAX_DOZE_WAITING_TIMES_9x 64 + +/*---------------------------Define Local Constant---------------------------*/ + + +/*------------------------Define global variable-----------------------------*/ + +/*------------------------Define local variable------------------------------*/ + + +/*--------------------Define export function prototype-----------------------*/ +// Please refer to header file +/*--------------------Define export function prototype-----------------------*/ + +/*----------------------------Function Body----------------------------------*/ +// +// 1. BB register R/W API +// + +/** +* Function: phy_CalculateBitShift +* +* OverView: Get shifted position of the BitMask +* +* Input: +* u4Byte BitMask, +* +* Output: none +* Return: u4Byte Return the shift bit bit position of the mask +*/ +static u32 +phy_CalculateBitShift( + u32 BitMask + ) +{ + u32 i; + + for(i=0; i<=31; i++) + { + if ( ((BitMask>>i) & 0x1 ) == 1) + break; + } + + return (i); +} + + +/** +* Function: PHY_QueryBBReg +* +* OverView: Read "sepcific bits" from BB register +* +* Input: +* PADAPTER Adapter, +* u4Byte RegAddr, //The target address to be readback +* u4Byte BitMask //The target bit position in the target address +* //to be readback +* Output: None +* Return: u4Byte Data //The readback register value +* Note: This function is equal to "GetRegSetting" in PHY programming guide +*/ +u32 +rtl8192c_PHY_QueryBBReg( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 ReturnValue = 0, OriginalValue, BitShift; + u16 BBWaitCounter = 0; + +#if (DISABLE_BB_RF == 1) + return 0; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx)\n", RegAddr, BitMask)); + + OriginalValue = rtw_read32(Adapter, RegAddr); + BitShift = phy_CalculateBitShift(BitMask); + ReturnValue = (OriginalValue & BitMask) >> BitShift; + + //RTPRINT(FPHY, PHY_BBR, ("BBR MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, OriginalValue)); + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx), OriginalValue(%#lx)\n", RegAddr, BitMask, OriginalValue)); + + return (ReturnValue); + +} + + +/** +* Function: PHY_SetBBReg +* +* OverView: Write "Specific bits" to BB register (page 8~) +* +* Input: +* PADAPTER Adapter, +* u4Byte RegAddr, //The target address to be modified +* u4Byte BitMask //The target bit position in the target address +* //to be modified +* u4Byte Data //The new register value in the target bit position +* //of the target address +* +* Output: None +* Return: None +* Note: This function is equal to "PutRegSetting" in PHY programming guide +*/ + +VOID +rtl8192c_PHY_SetBBReg( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //u16 BBWaitCounter = 0; + u32 OriginalValue, BitShift; + +#if (DISABLE_BB_RF == 1) + return; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data)); + + if(BitMask!= bMaskDWord){//if not "double word" write + OriginalValue = rtw_read32(Adapter, RegAddr); + BitShift = phy_CalculateBitShift(BitMask); + Data = ((OriginalValue & (~BitMask)) | ((Data << BitShift) & BitMask)); + } + + rtw_write32(Adapter, RegAddr, Data); + + //RTPRINT(FPHY, PHY_BBW, ("BBW MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, Data)); + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data)); + +} + + +// +// 2. RF register R/W API +// + +/*----------------------------------------------------------------------------- + * Function: phy_FwRFSerialRead() + * + * Overview: We support firmware to execute RF-R/W. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/21/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static u32 +phy_FwRFSerialRead( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 Offset ) +{ + u32 retValue = 0; + //RT_ASSERT(FALSE,("deprecate!\n")); + return (retValue); + +} /* phy_FwRFSerialRead */ + + +/*----------------------------------------------------------------------------- + * Function: phy_FwRFSerialWrite() + * + * Overview: We support firmware to execute RF-R/W. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/21/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static VOID +phy_FwRFSerialWrite( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u32 Data ) +{ + //RT_ASSERT(FALSE,("deprecate!\n")); +} + + +/** +* Function: phy_RFSerialRead +* +* OverView: Read regster from RF chips +* +* Input: +* PADAPTER Adapter, +* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte Offset, //The target address to be read +* +* Output: None +* Return: u4Byte reback value +* Note: Threre are three types of serial operations: +* 1. Software serial write +* 2. Hardware LSSI-Low Speed Serial Interface +* 3. Hardware HSSI-High speed +* serial write. Driver need to implement (1) and (2). +* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() +*/ +static u32 +phy_RFSerialRead( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 Offset + ) +{ + u32 retValue = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; + u32 NewOffset; + u32 tmplong,tmplong2; + u8 RfPiEnable=0; +#if 0 + if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs + return retValue; + if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs + return retValue; +#endif + // + // Make sure RF register offset is correct + // + Offset &= 0x3f; + + // + // Switch page for 8256 RF IC + // + NewOffset = Offset; + + // 2009/06/17 MH We can not execute IO for power save or other accident mode. + //if(RT_CANNOT_IO(Adapter)) + //{ + // RTPRINT(FPHY, PHY_RFR, ("phy_RFSerialRead return all one\n")); + // return 0xFFFFFFFF; + //} + + // For 92S LSSI Read RFLSSIRead + // For RF A/B write 0x824/82c(does not work in the future) + // We must use 0x824 for RF A and B to execute read trigger + tmplong = PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord); + if(eRFPath == RF_PATH_A) + tmplong2 = tmplong; + else + tmplong2 = PHY_QueryBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord); + + tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset<<23) | bLSSIReadEdge; //T65 RF + + PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong&(~bLSSIReadEdge)); + rtw_udelay_os(10);// PlatformStallExecution(10); + + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, tmplong2); + rtw_udelay_os(100);//PlatformStallExecution(100); + + PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong|bLSSIReadEdge); + rtw_udelay_os(10);//PlatformStallExecution(10); + + if(eRFPath == RF_PATH_A) + RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter1, BIT8); + else if(eRFPath == RF_PATH_B) + RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XB_HSSIParameter1, BIT8); + + if(RfPiEnable) + { // Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF + retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi, bLSSIReadBackData); + //DBG_8192C("Readback from RF-PI : 0x%x\n", retValue); + } + else + { //Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF + retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack, bLSSIReadBackData); + //DBG_8192C("Readback from RF-SI : 0x%x\n", retValue); + } + //DBG_8192C("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBack, retValue); + + return retValue; + +} + + + +/** +* Function: phy_RFSerialWrite +* +* OverView: Write data to RF register (page 8~) +* +* Input: +* PADAPTER Adapter, +* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte Offset, //The target address to be read +* u4Byte Data //The new register Data in the target bit position +* //of the target to be read +* +* Output: None +* Return: None +* Note: Threre are three types of serial operations: +* 1. Software serial write +* 2. Hardware LSSI-Low Speed Serial Interface +* 3. Hardware HSSI-High speed +* serial write. Driver need to implement (1) and (2). +* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() + * + * Note: For RF8256 only + * The total count of RTL8256(Zebra4) register is around 36 bit it only employs + * 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10]) + * to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration + * programming guide" for more details. + * Thus, we define a sub-finction for RTL8526 register address conversion + * =========================================================== + * Register Mode RegCTL[1] RegCTL[0] Note + * (Reg00[12]) (Reg00[10]) + * =========================================================== + * Reg_Mode0 0 x Reg 0 ~15(0x0 ~ 0xf) + * ------------------------------------------------------------------ + * Reg_Mode1 1 0 Reg 16 ~30(0x1 ~ 0xf) + * ------------------------------------------------------------------ + * Reg_Mode2 1 1 Reg 31 ~ 45(0x1 ~ 0xf) + * ------------------------------------------------------------------ + * + * 2008/09/02 MH Add 92S RF definition + * + * + * +*/ +static VOID +phy_RFSerialWrite( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u32 Data + ) +{ + u32 DataAndAddr = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; + u32 NewOffset; + +#if 0 + // We should check valid regs for RF_6052 case. + if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs + return; + if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs + return; +#endif + + // 2009/06/17 MH We can not execute IO for power save or other accident mode. + //if(RT_CANNOT_IO(Adapter)) + //{ + // RTPRINT(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n")); + // return; + //} + + Offset &= 0x3f; + + // + // Shadow Update + // + //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); + + // + // Switch page for 8256 RF IC + // + NewOffset = Offset; + + // + // Put write addr in [5:0] and write data in [31:16] + // + //DataAndAddr = (Data<<16) | (NewOffset&0x3f); + DataAndAddr = ((NewOffset<<20) | (Data&0x000fffff)) & 0x0fffffff; // T65 RF + + // + // Write Operation + // + PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); + //RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%lx]=0x%lx\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr)); + +} + + +/** +* Function: PHY_QueryRFReg +* +* OverView: Query "Specific bits" to RF register (page 8~) +* +* Input: +* PADAPTER Adapter, +* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte RegAddr, //The target address to be read +* u4Byte BitMask //The target bit position in the target address +* //to be read +* +* Output: None +* Return: u4Byte Readback value +* Note: This function is equal to "GetRFRegSetting" in PHY programming guide +*/ +u32 +rtl8192c_PHY_QueryRFReg( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 Original_Value, Readback_Value, BitShift; + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //u8 RFWaitCounter = 0; + //_irqL irqL; + +#if (DISABLE_BB_RF == 1) + return 0; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), BitMask(%#lx)\n", RegAddr, eRFPath,BitMask)); + +#ifdef CONFIG_USB_HCI + //PlatformAcquireMutex(&pHalData->mxRFOperate); +#else + //_enter_critical(&pHalData->rf_lock, &irqL); +#endif + + + Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); + + BitShift = phy_CalculateBitShift(BitMask); + Readback_Value = (Original_Value & BitMask) >> BitShift; + +#ifdef CONFIG_USB_HCI + //PlatformReleaseMutex(&pHalData->mxRFOperate); +#else + //_exit_critical(&pHalData->rf_lock, &irqL); +#endif + + + //RTPRINT(FPHY, PHY_RFR, ("RFR-%d MASK=0x%lx Addr[0x%lx]=0x%lx\n", eRFPath, BitMask, RegAddr, Original_Value));//BitMask(%#lx),BitMask, + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), Original_Value(%#lx)\n", + // RegAddr, eRFPath, Original_Value)); + + return (Readback_Value); +} + +/** +* Function: PHY_SetRFReg +* +* OverView: Write "Specific bits" to RF register (page 8~) +* +* Input: +* PADAPTER Adapter, +* RF_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte RegAddr, //The target address to be modified +* u4Byte BitMask //The target bit position in the target address +* //to be modified +* u4Byte Data //The new register Data in the target bit position +* //of the target address +* +* Output: None +* Return: None +* Note: This function is equal to "PutRFRegSetting" in PHY programming guide +*/ +VOID +rtl8192c_PHY_SetRFReg( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ + + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //u1Byte RFWaitCounter = 0; + u32 Original_Value, BitShift; + //_irqL irqL; + +#if (DISABLE_BB_RF == 1) + return; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", + // RegAddr, BitMask, Data, eRFPath)); + //RTPRINT(FINIT, INIT_RF, ("PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", + // RegAddr, BitMask, Data, eRFPath)); + + +#ifdef CONFIG_USB_HCI + //PlatformAcquireMutex(&pHalData->mxRFOperate); +#else + //_enter_critical(&pHalData->rf_lock, &irqL); +#endif + + + // RF data is 12 bits only + if (BitMask != bRFRegOffsetMask) + { + Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); + BitShift = phy_CalculateBitShift(BitMask); + Data = ((Original_Value & (~BitMask)) | (Data<< BitShift)); + } + + phy_RFSerialWrite(Adapter, eRFPath, RegAddr, Data); + + +#ifdef CONFIG_USB_HCI + //PlatformReleaseMutex(&pHalData->mxRFOperate); +#else + //_exit_critical(&pHalData->rf_lock, &irqL); +#endif + + //PHY_QueryRFReg(Adapter,eRFPath,RegAddr,BitMask); + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", + // RegAddr, BitMask, Data, eRFPath)); + +} + + +// +// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. +// + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigMACWithParaFile() + * + * Overview: This function read BB parameters from general file format, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + * Note: The format of MACPHY_REG.txt is different from PHY and RF. + * [Register][Mask][Value] + *---------------------------------------------------------------------------*/ +static int +phy_ConfigMACWithParaFile( + IN PADAPTER Adapter, + IN u8* pFileName +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + return rtStatus; +} + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigMACWithHeaderFile() + * + * Overview: This function read BB parameters from Header file we gen, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + * Note: The format of MACPHY_REG.txt is different from PHY and RF. + * [Register][Mask][Value] + *---------------------------------------------------------------------------*/ +#ifndef CONFIG_PHY_SETTING_WITH_ODM +static int +phy_ConfigMACWithHeaderFile( + IN PADAPTER Adapter +) +{ + u32 i = 0; + u32 ArrayLength = 0; + u32* ptrArray; + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //2008.11.06 Modified by tynli. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read Rtl819XMACPHY_Array\n")); + ArrayLength = Rtl8723_MAC_ArrayLength; + ptrArray = (u32*)Rtl8723_MAC_Array; + +#ifdef CONFIG_IOL_MAC + { + struct xmit_frame *xmit_frame; + if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) + return _FAIL; + + for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column + rtw_IOL_append_WB_cmd(xmit_frame, ptrArray[i], (u8)ptrArray[i+1]); + } + + return rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0); + } +#else + for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column + rtw_write8(Adapter, ptrArray[i], (u8)ptrArray[i+1]); + } +#endif + + return _SUCCESS; + +} +#endif//#ifndef CONFIG_PHY_SETTING_WITH_ODM + +/*----------------------------------------------------------------------------- + * Function: PHY_MACConfig8192C + * + * Overview: Condig MAC by header file or parameter file. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 08/12/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +s32 PHY_MACConfig8723A(PADAPTER Adapter) +{ + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + s8 *pszMACRegFile; + s8 sz8723MACRegFile[] = RTL8723_PHY_MACREG; + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); + + + pszMACRegFile = sz8723MACRegFile; + + // + // Config MAC + // +#ifdef CONFIG_EMBEDDED_FWIMG + #ifdef CONFIG_PHY_SETTING_WITH_ODM + if(HAL_STATUS_FAILURE == ODM_ConfigMACWithHeaderFile(&pHalData->odmpriv)) + rtStatus = _FAIL; + #else + rtStatus = phy_ConfigMACWithHeaderFile(Adapter); + #endif//#ifdef CONFIG_PHY_SETTING_WITH_ODM +#else + + // Not make sure EEPROM, add later + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read MACREG.txt\n")); + rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile); +#endif//CONFIG_EMBEDDED_FWIMG + +#ifdef CONFIG_PCI_HCI + //this switching setting cause some 8192cu hw have redownload fw fail issue + //improve 2-stream TX EVM by Jenyu + if(is92C) + rtw_write8(Adapter, REG_SPS0_CTRL+3,0x71); +#endif + + + // 2010.07.13 AMPDU aggregation number 9 + //rtw_write8(Adapter, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); + rtw_write8(Adapter, REG_MAX_AGGR_NUM, 0x0A); //By tynli. 2010.11.18. +#ifdef CONFIG_USB_HCI + if(is92C && (BOARD_USB_DONGLE == pHalData->BoardType)) + rtw_write8(Adapter, 0x40,0x04); +#endif + + return rtStatus; + +} + + +/** +* Function: phy_InitBBRFRegisterDefinition +* +* OverView: Initialize Register definition offset for Radio Path A/B/C/D +* +* Input: +* PADAPTER Adapter, +* +* Output: None +* Return: None +* Note: The initialization value is constant and it should never be changes +*/ +static VOID +phy_InitBBRFRegisterDefinition( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // RF Interface Sowrtware Control + pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870 + pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) + pHalData->PHYRegDef[RF_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 LSBs if read 32-bit from 0x874 + pHalData->PHYRegDef[RF_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) + + // RF Interface Readback Value + pHalData->PHYRegDef[RF_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; // 16 LSBs if read 32-bit from 0x8E0 + pHalData->PHYRegDef[RF_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) + pHalData->PHYRegDef[RF_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 LSBs if read 32-bit from 0x8E4 + pHalData->PHYRegDef[RF_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) + + // RF Interface Output (and Enable) + pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860 + pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864 + + // RF Interface (Output and) Enable + pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) + pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) + + //Addr of LSSI. Wirte RF register by driver + pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter + pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter; + + // RF parameter + pHalData->PHYRegDef[RF_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter; //BB Band Select + pHalData->PHYRegDef[RF_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter; + pHalData->PHYRegDef[RF_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter; + pHalData->PHYRegDef[RF_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter; + + // Tx AGC Gain Stage (same for all path. Should we remove this?) + pHalData->PHYRegDef[RF_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + pHalData->PHYRegDef[RF_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + pHalData->PHYRegDef[RF_PATH_C].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + pHalData->PHYRegDef[RF_PATH_D].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + + // Tranceiver A~D HSSI Parameter-1 + pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; //wire control parameter1 + pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1; //wire control parameter1 + + // Tranceiver A~D HSSI Parameter-2 + pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2 + pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2 + + // RF switch Control + pHalData->PHYRegDef[RF_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; //TR/Ant switch control + pHalData->PHYRegDef[RF_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl; + pHalData->PHYRegDef[RF_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl; + pHalData->PHYRegDef[RF_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl; + + // AGC control 1 + pHalData->PHYRegDef[RF_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1; + pHalData->PHYRegDef[RF_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1; + pHalData->PHYRegDef[RF_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1; + pHalData->PHYRegDef[RF_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1; + + // AGC control 2 + pHalData->PHYRegDef[RF_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2; + pHalData->PHYRegDef[RF_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2; + pHalData->PHYRegDef[RF_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2; + pHalData->PHYRegDef[RF_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2; + + // RX AFE control 1 + pHalData->PHYRegDef[RF_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance; + pHalData->PHYRegDef[RF_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance; + pHalData->PHYRegDef[RF_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance; + pHalData->PHYRegDef[RF_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance; + + // RX AFE control 1 + pHalData->PHYRegDef[RF_PATH_A].rfRxAFE = rOFDM0_XARxAFE; + pHalData->PHYRegDef[RF_PATH_B].rfRxAFE = rOFDM0_XBRxAFE; + pHalData->PHYRegDef[RF_PATH_C].rfRxAFE = rOFDM0_XCRxAFE; + pHalData->PHYRegDef[RF_PATH_D].rfRxAFE = rOFDM0_XDRxAFE; + + // Tx AFE control 1 + pHalData->PHYRegDef[RF_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance; + pHalData->PHYRegDef[RF_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance; + pHalData->PHYRegDef[RF_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance; + pHalData->PHYRegDef[RF_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance; + + // Tx AFE control 2 + pHalData->PHYRegDef[RF_PATH_A].rfTxAFE = rOFDM0_XATxAFE; + pHalData->PHYRegDef[RF_PATH_B].rfTxAFE = rOFDM0_XBTxAFE; + pHalData->PHYRegDef[RF_PATH_C].rfTxAFE = rOFDM0_XCTxAFE; + pHalData->PHYRegDef[RF_PATH_D].rfTxAFE = rOFDM0_XDTxAFE; + + // Tranceiver LSSI Readback SI mode + pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack; + pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack; + pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack; + pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack; + + // Tranceiver LSSI Readback PI mode + pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback; + pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback; + //pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBackPi = rFPGA0_XC_LSSIReadBack; + //pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBackPi = rFPGA0_XD_LSSIReadBack; + +} + + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithParaFile() + * + * Overview: This function read BB parameters from general file format, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * 2008/11/06 MH For 92S we do not support silent reset now. Disable + * parameter file compare!!!!!!?? + * + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithParaFile( + IN PADAPTER Adapter, + IN u8* pFileName +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + return rtStatus; +} + + + +//**************************************** +// The following is for High Power PA +//**************************************** +VOID +phy_ConfigBBExternalPA( + IN PADAPTER Adapter +) +{ +#ifdef CONFIG_USB_HCI + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 i=0; + u32 temp=0; + + if(!pHalData->ExternalPA) + { + return; + } + + // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the + // same code as SU. It is already updated in PHY_REG_1T_HP.txt. +#if 0 + PHY_SetBBReg(Adapter, 0xee8, BIT28, 1); + temp = PHY_QueryBBReg(Adapter, 0x860, bMaskDWord); + temp |= (BIT26|BIT21|BIT10|BIT5); + PHY_SetBBReg(Adapter, 0x860, bMaskDWord, temp); + PHY_SetBBReg(Adapter, 0x870, BIT10, 0); + PHY_SetBBReg(Adapter, 0xc80, bMaskDWord, 0x20000080); + PHY_SetBBReg(Adapter, 0xc88, bMaskDWord, 0x40000100); +#endif + +#endif +} + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithHeaderFile() + * + * Overview: This function read BB parameters from general file format, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * u1Byte ConfigType 0 => PHY_CONFIG + * 1 =>AGC_TAB + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + *---------------------------------------------------------------------------*/ +#ifndef CONFIG_PHY_SETTING_WITH_ODM +static int +phy_ConfigBBWithHeaderFile( + IN PADAPTER Adapter, + IN u8 ConfigType +) +{ + int i; + u32* Rtl819XPHY_REGArray_Table; + u32* Rtl819XAGCTAB_Array_Table; + u16 PHY_REGArrayLen, AGCTAB_ArrayLen; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int ret = _SUCCESS; + + + AGCTAB_ArrayLen = Rtl8723_AGCTAB_1TArrayLength; + Rtl819XAGCTAB_Array_Table = (u32*)Rtl8723_AGCTAB_1TArray; + PHY_REGArrayLen = Rtl8723_PHY_REG_1TArrayLength; + Rtl819XPHY_REGArray_Table = (u32*)Rtl8723_PHY_REG_1TArray; +// RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8723AGCTAB_1TArray\n")); +// RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8723PHY_REG_1TArray\n")); + + if(ConfigType == BaseBand_Config_PHY_REG) + { + #ifdef CONFIG_IOL_BB_PHY_REG + { + struct xmit_frame *xmit_frame; + u32 tmp_value; + + if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) { + ret = _FAIL; + goto exit; + } + + for(i=0;iMCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0])); + } + if(RegAddr == rTxAGC_A_Rate54_24) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1])); + } + if(RegAddr == rTxAGC_A_CCK1_Mcs32) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6])); + } + if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7])); + } + if(RegAddr == rTxAGC_A_Mcs03_Mcs00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2])); + } + if(RegAddr == rTxAGC_A_Mcs07_Mcs04) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3])); + } + if(RegAddr == rTxAGC_A_Mcs11_Mcs08) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4])); + } + if(RegAddr == rTxAGC_A_Mcs15_Mcs12) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5])); + } + if(RegAddr == rTxAGC_B_Rate18_06) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8])); + } + if(RegAddr == rTxAGC_B_Rate54_24) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9])); + } + if(RegAddr == rTxAGC_B_CCK1_55_Mcs32) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14])); + } + if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15])); + } + if(RegAddr == rTxAGC_B_Mcs03_Mcs00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10])); + } + if(RegAddr == rTxAGC_B_Mcs07_Mcs04) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11])); + } + if(RegAddr == rTxAGC_B_Mcs11_Mcs08) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12])); + } + if(RegAddr == rTxAGC_B_Mcs15_Mcs12) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13])); + pHalData->pwrGroupCnt++; + } +} +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithPgParaFile + * + * Overview: + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/06/2008 MHC Create Version 0. + * 2009/07/29 tynli (porting from 92SE branch)2009/03/11 Add copy parameter file to buffer for silent reset + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithPgParaFile( + IN PADAPTER Adapter, + IN u8* pFileName) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + + return rtStatus; + +} /* phy_ConfigBBWithPgParaFile */ + + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithPgHeaderFile + * + * Overview: Config PHY_REG_PG array + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/06/2008 MHC Add later!!!!!!.. Please modify for new files!!!! + * 11/10/2008 tynli Modify to mew files. + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithPgHeaderFile( + IN PADAPTER Adapter, + IN u8 ConfigType) +{ + int i; + u32* Rtl819XPHY_REGArray_Table_PG; + u16 PHY_REGArrayPGLen; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + + PHY_REGArrayPGLen = Rtl8723_PHY_REG_Array_PGLength; + Rtl819XPHY_REGArray_Table_PG = (u32*)Rtl8723_PHY_REG_Array_PG; + + if(ConfigType == BaseBand_Config_PHY_REG) + { + for(i=0;iBufOfLines), + MAX_LINES_HWCONFIG_TXT, + MAX_BYTES_LINE_HWCONFIG_TXT, + &nLinesRead + ); + if(rtStatus == RT_STATUS_SUCCESS) + { + PlatformMoveMemory(pHalData->BufOfLines6, pHalData->BufOfLines, nLinesRead*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesRead6 = nLinesRead; + } + else + { + // Temporarily skip PHY_REG_MP.txt if file does not exist. + pHalData->nLinesRead6 = 0; + RT_TRACE(COMP_INIT, DBG_LOUD, ("No matched file \r\n")); + return RT_STATUS_SUCCESS; + } + } + else + { + PlatformMoveMemory(pHalData->BufOfLines, pHalData->BufOfLines6, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + nLinesRead = pHalData->nLinesRead6; + rtStatus = RT_STATUS_SUCCESS; + } + + + if(rtStatus == RT_STATUS_SUCCESS) + { + RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): read %s ok\n", pFileName)); + + for(ithLine = 0; ithLine < nLinesRead; ithLine++) + { + szLine = pHalData->BufOfLines[ithLine]; + + if(!IsCommentString(szLine)) + { + // Get 1st hex value as register offset. + if(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) + { + if(u4bRegOffset == 0xff) + { // Ending. + break; + } + else if (u4bRegOffset == 0xfe) + delay_ms(50); + else if (u4bRegOffset == 0xfd) + delay_ms(5); + else if (u4bRegOffset == 0xfc) + delay_ms(1); + else if (u4bRegOffset == 0xfb) + PlatformStallExecution(50); + else if (u4bRegOffset == 0xfa) + PlatformStallExecution(5); + else if (u4bRegOffset == 0xf9) + PlatformStallExecution(1); + + // Get 2nd hex value as register value. + szLine += u4bMove; + if(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) + { + RT_TRACE(COMP_FPGA, DBG_TRACE, ("[ADDR]%03lX=%08lX\n", u4bRegOffset, u4bRegValue)); + PHY_SetBBReg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue); + + // Add 1us delay between BB/RF register setting. + PlatformStallExecution(1); + } + } + } + } + } + else + { + RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): Failed%s\n", pFileName)); + } +#endif + + return rtStatus; +} + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithMpHeaderFile + * + * Overview: Config PHY_REG_MP array + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 02/04/2010 chiyokolin Modify to new files. + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithMpHeaderFile( + IN PADAPTER Adapter, + IN u1Byte ConfigType) +{ + int i; + u32* Rtl8192CPHY_REGArray_Table_MP; + u16 PHY_REGArrayMPLen; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + + PHY_REGArrayMPLen = Rtl8723_PHY_REG_Array_MPLength; + Rtl8192CPHY_REGArray_Table_MP = (u32*)Rtl8723_PHY_REG_Array_MP; + + if(ConfigType == BaseBand_Config_PHY_REG) + { + for(i=0;iphy_BB8192S_Config_ParaFile\n")); + + pszBBRegFile = sz8723BBRegFile ; + pszAGCTableFile = sz8723AGCTableFile; + pszBBRegPgFile = sz8723BBRegPgFile; + pszBBRegMpFile = sz8723BBRegMpFile; + + // + // 1. Read PHY_REG.TXT BB INIT!! + // We will seperate as 88C / 92C according to chip version + // +#ifdef CONFIG_EMBEDDED_FWIMG + #ifdef CONFIG_PHY_SETTING_WITH_ODM + if(HAL_STATUS_FAILURE ==ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG)) + rtStatus = _FAIL; + #else + rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_PHY_REG); + #endif +#else + // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different + // type of parameter files to phy_reg.txt at first. + rtStatus = phy_ConfigBBWithParaFile(Adapter,pszBBRegFile); +#endif//#ifdef CONFIG_EMBEDDED_FWIMG + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg Fail!!")); + goto phy_BB8190_Config_ParaFile_Fail; + } + +#if MP_DRIVER == 1 + if (Adapter->registrypriv.mp_mode == 1) + { + // + // 1.1 Read PHY_REG_MP.TXT BB INIT!! + // We will seperate as 88C / 92C according to chip version + // +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigBBWithMpHeaderFile(Adapter, BaseBand_Config_PHY_REG); +#else + // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different + // type of parameter files to phy_reg.txt at first. + rtStatus = phy_ConfigBBWithMpParaFile(Adapter, pszBBRegMpFile); +#endif + + if(rtStatus != _SUCCESS){ +// RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg MP Fail!!")); + goto phy_BB8190_Config_ParaFile_Fail; + } + } +#endif // #if (MP_DRIVER == 1) + + // + // 20100318 Joseph: Config 2T2R to 1T2R if necessary. + // + if(pHalData->rf_type == RF_1T2R) + { + phy_BB8192C_Config_1T(Adapter); + DBG_8192C("phy_BB8723a_Config_ParaFile():Config to 1T!!\n"); + } + + // + // 2. If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt + // + if (pEEPROM->bautoload_fail_flag == _FALSE) + { + pHalData->pwrGroupCnt = 0; + +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigBBWithPgHeaderFile(Adapter, BaseBand_Config_PHY_REG); +#else + rtStatus = phy_ConfigBBWithPgParaFile(Adapter, pszBBRegPgFile); +#endif + } + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():BB_PG Reg Fail!!")); + goto phy_BB8190_Config_ParaFile_Fail; + } + + // + // 3. BB AGC table Initialization + // +#ifdef CONFIG_EMBEDDED_FWIMG + #ifdef CONFIG_PHY_SETTING_WITH_ODM + if(HAL_STATUS_FAILURE ==ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_AGC_TAB)) + rtStatus = _FAIL; + #else + rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_AGC_TAB); + #endif//#ifdef CONFIG_PHY_SETTING_WITH_ODM +#else + //RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_BB8192S_Config_ParaFile AGC_TAB.txt\n")); + rtStatus = phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile); +#endif + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_FPGA, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():AGC Table Fail\n")); + goto phy_BB8190_Config_ParaFile_Fail; + } + +phy_BB8190_Config_ParaFile_Fail: + + return rtStatus; +} + + +int +PHY_BBConfig8723A( + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 RegVal; + u8 TmpU1B=0; + u8 value8,CrystalCap; + + phy_InitBBRFRegisterDefinition(Adapter); + + if(IS_HARDWARE_TYPE_8723A(Adapter)) + { + // Suggested by Scott. tynli_test. 2010.12.30. + //1. 0x28[1] = 1 + TmpU1B = rtw_read8(Adapter, REG_AFE_PLL_CTRL); + rtw_udelay_os(2); + rtw_write8(Adapter, REG_AFE_PLL_CTRL, (TmpU1B|BIT1)); + rtw_udelay_os(2); + + //2. 0x29[7:0] = 0xFF + rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xff); + rtw_udelay_os(2); + + //3. 0x02[1:0] = 2b'11 + TmpU1B = rtw_read8(Adapter, REG_SYS_FUNC_EN); + rtw_write8(Adapter, REG_SYS_FUNC_EN, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB)); + + //4. 0x25[6] = 0 + TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+1); + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, (TmpU1B&(~BIT6))); + + //5. 0x24[20] = 0 //Advised by SD3 Alex Wang. 2011.02.09. + TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+2); + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+2, (TmpU1B&(~BIT4))); + + //6. 0x1f[7:0] = 0x07 + rtw_write8(Adapter, REG_RF_CTRL, 0x07); + } + else + { + // Enable BB and RF + RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN); + rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal|BIT13|BIT0|BIT1)); + + // 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF. + rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83); + rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xdb); + + rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB); + +#ifdef CONFIG_USB_HCI + rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD | FEN_BB_GLB_RSTn | FEN_BBRSTB); +#else + rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_BB_GLB_RSTn|FEN_BBRSTB); +#endif + + // 2009/10/21 by SD1 Jong. Modified by tynli. Not in Documented in V8.1. +#ifdef CONFIG_USB_HCI + //To Fix MAC loopback mode fail. Suggested by SD4 Johnny. 2010.03.23. + rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x0f); + rtw_write8(Adapter, 0x15, 0xe9); +#endif + + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, 0x80); + +#ifdef CONFIG_PCI_HCI + // Force use left antenna by default for 88C. + // if(!IS_92C_SERIAL(pHalData->VersionID) || IS_92C_1T2R(pHalData->VersionID)) + if(Adapter->ledpriv.LedStrategy != SW_LED_MODE10) + { + RegVal = rtw_read32(Adapter, REG_LEDCFG0); + rtw_write32(Adapter, REG_LEDCFG0, RegVal|BIT23); + } +#endif + } + + // + // Config BB and AGC + // + rtStatus = phy_BB8723a_Config_ParaFile(Adapter); + +#ifdef CONFIG_USB_HCI + if(IS_HARDWARE_TYPE_8192CU(Adapter)&&IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) + &&(pHalData->BoardType == BOARD_USB_High_PA)) + rtw_write8(Adapter, 0xc72, 0x50); +#endif +//only for B-cut + if(IS_HARDWARE_TYPE_8723A(Adapter) && pHalData->EEPROMVersion >= 0x01) + { + CrystalCap = pHalData->CrystalCap & 0x3F; + PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6))); + } + + if(IS_HARDWARE_TYPE_8723AE(Adapter)) + PHY_SetBBReg(Adapter, REG_LDOA15_CTRL, bMaskDWord, 0x01572505); + return rtStatus; +} + + +int +PHY_RFConfig8723A( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + // + // RF config + // + rtStatus = PHY_RF6052_Config8723A(Adapter); + return rtStatus; +} + + +/*----------------------------------------------------------------------------- + * Function: PHY_ConfigRFWithParaFile() + * + * Overview: This function read RF parameters from general file format, and do RF 3-wire + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * RF_RADIO_PATH_E eRFPath + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + * Note: Delay may be required for RF configuration + *---------------------------------------------------------------------------*/ +int +rtl8192c_PHY_ConfigRFWithParaFile( + IN PADAPTER Adapter, + IN u8* pFileName, + RF_RADIO_PATH_E eRFPath +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + + return rtStatus; + +} + +//**************************************** +// The following is for High Power PA +//**************************************** +#define HighPowerRadioAArrayLen 22 +//This is for High power PA +u32 Rtl8192S_HighPower_RadioA_Array[HighPowerRadioAArrayLen] = { +0x013,0x00029ea4, +0x013,0x00025e74, +0x013,0x00020ea4, +0x013,0x0001ced0, +0x013,0x00019f40, +0x013,0x00014e70, +0x013,0x000106a0, +0x013,0x0000c670, +0x013,0x000082a0, +0x013,0x00004270, +0x013,0x00000240, +}; + +int +PHY_ConfigRFExternalPA( + IN PADAPTER Adapter, + RF_RADIO_PATH_E eRFPath +) +{ + int rtStatus = _SUCCESS; +#ifdef CONFIG_USB_HCI + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 i=0; + + if(!pHalData->ExternalPA) + { + return rtStatus; + } + + // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the + // same code as SU. It is already updated in radio_a_1T_HP.txt. +#if 0 + //add for SU High Power PA + for(i = 0;i PHY_ConfigRFWithHeaderFile() Radio_A:Rtl8723RadioA_1TArray\n")); +// RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> PHY_ConfigRFWithHeaderFile() Radio_B:Rtl8723RadioB_1TArray\n")); + + switch (eRFPath) + { + case RF_PATH_A: + #ifdef CONFIG_IOL_RF_RF90_PATH_A + { + struct xmit_frame *xmit_frame; + if((xmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL) { + rtStatus = _FAIL; + goto exit; + } + + for(i = 0;iPHYRegDef[eRFPath]; + u32 NewOffset = 0; + u32 DataAndAddr = 0; + + NewOffset = Rtl819XRadioA_Array_Table[i] & 0x3f; + DataAndAddr = ((NewOffset<<20) | (Rtl819XRadioA_Array_Table[i+1]&0x000fffff)) & 0x0fffffff; // T65 RF + rtw_IOL_append_WD_cmd(xmit_frame, pPhyReg->rf3wireOffset, DataAndAddr); + } + } + rtStatus = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0); + } + #else + for(i = 0;iPHYRegDef[eRFPath]; + u32 NewOffset = 0; + u32 DataAndAddr = 0; + + NewOffset = Rtl819XRadioB_Array_Table[i] & 0x3f; + DataAndAddr = ((NewOffset<<20) | (Rtl819XRadioB_Array_Table[i+1]&0x000fffff)) & 0x0fffffff; // T65 RF + rtw_IOL_append_WD_cmd(xmit_frame, pPhyReg->rf3wireOffset, DataAndAddr); + } + } + rtStatus = rtw_IOL_exec_cmds_sync(Adapter, xmit_frame, 1000,0); + } + #else + for(i = 0;i actually we call PlatformStallExecution()) to do NdisStallExecution() + // [busy wait] instead of NdisMSleep(). So we acquire RT_INITIAL_SPINLOCK + // to run at Dispatch level to achive it. + //cosa PlatformAcquireSpinLock(Adapter, RT_INITIAL_SPINLOCK); + WriteData[i] &= 0xfff; + PHY_SetRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bRFRegOffsetMask, WriteData[i]); + // TODO: we should not delay for such a long time. Ask SD3 + rtw_mdelay_os(10); + ulRegRead = PHY_QueryRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bMaskDWord); + rtw_mdelay_os(10); + //cosa PlatformReleaseSpinLock(Adapter, RT_INITIAL_SPINLOCK); + break; + + default: + rtStatus = _FAIL; + break; + } + + + // + // Check whether readback data is correct + // + if(ulRegRead != WriteData[i]) + { + //RT_TRACE(COMP_FPGA, DBG_LOUD, ("ulRegRead: %lx, WriteData: %lx \n", ulRegRead, WriteData[i])); + rtStatus = _FAIL; + break; + } + } + + return rtStatus; +} + + +VOID +rtl8192c_PHY_GetHWRegOriginalValue( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // read rx initial gain + pHalData->DefaultInitialGain[0] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XAAGCCore1, bMaskByte0); + pHalData->DefaultInitialGain[1] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XBAGCCore1, bMaskByte0); + pHalData->DefaultInitialGain[2] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XCAGCCore1, bMaskByte0); + pHalData->DefaultInitialGain[3] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XDAGCCore1, bMaskByte0); + //RT_TRACE(COMP_INIT, DBG_LOUD, + //("Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x) \n", + //pHalData->DefaultInitialGain[0], pHalData->DefaultInitialGain[1], + //pHalData->DefaultInitialGain[2], pHalData->DefaultInitialGain[3])); + + // read framesync + pHalData->framesync = (u8)PHY_QueryBBReg(Adapter, rOFDM0_RxDetector3, bMaskByte0); + pHalData->framesyncC34 = PHY_QueryBBReg(Adapter, rOFDM0_RxDetector2, bMaskDWord); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Default framesync (0x%x) = 0x%x \n", + // rOFDM0_RxDetector3, pHalData->framesync)); +} + + +// +// Description: +// Map dBm into Tx power index according to +// current HW model, for example, RF and PA, and +// current wireless mode. +// By Bruce, 2008-01-29. +// +static u8 +phy_DbmToTxPwrIdx( + IN PADAPTER Adapter, + IN WIRELESS_MODE WirelessMode, + IN int PowerInDbm + ) +{ + u8 TxPwrIdx = 0; + int Offset = 0; + + + // + // Tested by MP, we found that CCK Index 0 equals to 8dbm, OFDM legacy equals to + // 3dbm, and OFDM HT equals to 0dbm repectively. + // Note: + // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. + // By Bruce, 2008-01-29. + // + switch(WirelessMode) + { + case WIRELESS_MODE_B: + Offset = -7; + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + Offset = -8; + break; + default: + Offset = -8; + break; + } + + if((PowerInDbm - Offset) > 0) + { + TxPwrIdx = (u8)((PowerInDbm - Offset) * 2); + } + else + { + TxPwrIdx = 0; + } + + // Tx Power Index is too large. + if(TxPwrIdx > MAX_TXPWR_IDX_NMODE_92S) + TxPwrIdx = MAX_TXPWR_IDX_NMODE_92S; + + return TxPwrIdx; +} + +// +// Description: +// Map Tx power index into dBm according to +// current HW model, for example, RF and PA, and +// current wireless mode. +// By Bruce, 2008-01-29. +// +int +phy_TxPwrIdxToDbm( + IN PADAPTER Adapter, + IN WIRELESS_MODE WirelessMode, + IN u8 TxPwrIdx + ) +{ + int Offset = 0; + int PwrOutDbm = 0; + + // + // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm. + // Note: + // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. + // By Bruce, 2008-01-29. + // + switch(WirelessMode) + { + case WIRELESS_MODE_B: + Offset = -7; + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + Offset = -8; + default: + Offset = -8; + break; + } + + PwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part. + + return PwrOutDbm; +} + + +/*----------------------------------------------------------------------------- + * Function: GetTxPowerLevel8190() + * + * Overview: This function is export to "common" moudule + * + * Input: PADAPTER Adapter + * psByte Power Level + * + * Output: NONE + * + * Return: NONE + * + *---------------------------------------------------------------------------*/ +VOID +PHY_GetTxPowerLevel8192C( + IN PADAPTER Adapter, + OUT u32* powerlevel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 TxPwrLevel = 0; + int TxPwrDbm; + + // + // Because the Tx power indexes are different, we report the maximum of them to + // meet the CCX TPC request. By Bruce, 2008-01-31. + // + + // CCK + TxPwrLevel = pHalData->CurrentCckTxPwrIdx; + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_B, TxPwrLevel); + + // Legacy OFDM + TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx + pHalData->LegacyHTTxPowerDiff; + + // Compare with Legacy OFDM Tx power. + if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm) + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); + + // HT OFDM + TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx; + + // Compare with HT OFDM Tx power. + if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm) + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel); + + *powerlevel = TxPwrDbm; +} + + +static void getTxPowerIndex( + IN PADAPTER Adapter, + IN u8 channel, + IN OUT u8* cckPowerLevel, + IN OUT u8* ofdmPowerLevel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 index = (channel -1); + // 1. CCK + cckPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelCck[RF_PATH_A][index]; //RF-A + cckPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelCck[RF_PATH_B][index]; //RF-B + + // 2. OFDM for 1S or 2S + if (GET_RF_TYPE(Adapter) == RF_1T2R || GET_RF_TYPE(Adapter) == RF_1T1R) + { + // Read HT 40 OFDM TX power + ofdmPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelHT40_1S[RF_PATH_A][index]; + ofdmPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelHT40_1S[RF_PATH_B][index]; + } + else if (GET_RF_TYPE(Adapter) == RF_2T2R) + { + // Read HT 40 OFDM TX power + ofdmPowerLevel[RF_PATH_A] = pHalData->TxPwrLevelHT40_2S[RF_PATH_A][index]; + ofdmPowerLevel[RF_PATH_B] = pHalData->TxPwrLevelHT40_2S[RF_PATH_B][index]; + } + //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, set tx power index !!\n", channel)); +} + +static void ccxPowerIndexCheck( + IN PADAPTER Adapter, + IN u8 channel, + IN OUT u8* cckPowerLevel, + IN OUT u8* ofdmPowerLevel + ) +{ +#if 0 + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PRT_CCX_INFO pCcxInfo = GET_CCX_INFO(pMgntInfo); + + // + // CCX 2 S31, AP control of client transmit power: + // 1. We shall not exceed Cell Power Limit as possible as we can. + // 2. Tolerance is +/- 5dB. + // 3. 802.11h Power Contraint takes higher precedence over CCX Cell Power Limit. + // + // TODO: + // 1. 802.11h power contraint + // + // 071011, by rcnjko. + // + if( pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE && + pMgntInfo->mAssoc && + pCcxInfo->bUpdateCcxPwr && + pCcxInfo->bWithCcxCellPwr && + channel == pMgntInfo->dot11CurrentChannelNumber) + { + u1Byte CckCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pCcxInfo->CcxCellPwr); + u1Byte LegacyOfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pCcxInfo->CcxCellPwr); + u1Byte OfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pCcxInfo->CcxCellPwr); + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", + pCcxInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx)); + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", + channel, cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); + + // CCK + if(cckPowerLevel[0] > CckCellPwrIdx) + cckPowerLevel[0] = CckCellPwrIdx; + // Legacy OFDM, HT OFDM + if(ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff > LegacyOfdmCellPwrIdx) + { + if((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0) + { + ofdmPowerLevel[0] = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff; + } + else + { + ofdmPowerLevel[0] = 0; + } + } + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", + cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); + } + + pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0]; + pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0]; + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("PHY_SetTxPowerLevel8192S(): CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", + cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); +#endif +} +/*----------------------------------------------------------------------------- + * Function: SetTxPowerLevel8190() + * + * Overview: This function is export to "HalCommon" moudule + * We must consider RF path later!!!!!!! + * + * Input: PADAPTER Adapter + * u1Byte channel + * + * Output: NONE + * + * Return: NONE + * 2008/11/04 MHC We remove EEPROM_93C56. + * We need to move CCX relative code to independet file. + * 2009/01/21 MHC Support new EEPROM format from SD3 requirement. + * + *---------------------------------------------------------------------------*/ +VOID +PHY_SetTxPowerLevel8192C( + IN PADAPTER Adapter, + IN u8 channel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 cckPowerLevel[2], ofdmPowerLevel[2]; // [0]:RF-A, [1]:RF-B +/* +#if(MP_DRIVER == 1) + if (Adapter->registrypriv.mp_mode == 1) + return; +#endif +*/ + if(pHalData->bTXPowerDataReadFromEEPORM == _FALSE) + return; + + getTxPowerIndex(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]); + //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, cckPowerLevel (A / B) = 0x%x / 0x%x, ofdmPowerLevel (A / B) = 0x%x / 0x%x\n", + // channel, cckPowerLevel[0], cckPowerLevel[1], ofdmPowerLevel[0], ofdmPowerLevel[1])); + + ccxPowerIndexCheck(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]); + + rtl8192c_PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); + rtl8192c_PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel); + +#if 0 + switch(pHalData->rf_chip) + { + case RF_8225: + PHY_SetRF8225CckTxPower(Adapter, cckPowerLevel[0]); + PHY_SetRF8225OfdmTxPower(Adapter, ofdmPowerLevel[0]); + break; + + case RF_8256: + PHY_SetRF8256CCKTxPower(Adapter, cckPowerLevel[0]); + PHY_SetRF8256OFDMTxPower(Adapter, ofdmPowerLevel[0]); + break; + + case RF_6052: + PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); + PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel); + break; + + case RF_8258: + break; + } +#endif + +} + + +// +// Description: +// Update transmit power level of all channel supported. +// +// TODO: +// A mode. +// By Bruce, 2008-02-04. +// +BOOLEAN +PHY_UpdateTxPowerDbm8192C( + IN PADAPTER Adapter, + IN int powerInDbm + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 idx; + u8 rf_path; + + // TODO: A mode Tx power. + u8 CckTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, powerInDbm); + u8 OfdmTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, powerInDbm); + + if(OfdmTxPwrIdx - pHalData->LegacyHTTxPowerDiff > 0) + OfdmTxPwrIdx -= pHalData->LegacyHTTxPowerDiff; + else + OfdmTxPwrIdx = 0; + + //RT_TRACE(COMP_TXAGC, DBG_LOUD, ("PHY_UpdateTxPowerDbm8192S(): %ld dBm , CckTxPwrIdx = %d, OfdmTxPwrIdx = %d\n", powerInDbm, CckTxPwrIdx, OfdmTxPwrIdx)); + + for(idx = 0; idx < 14; idx++) + { + for (rf_path = 0; rf_path < 2; rf_path++) + { + pHalData->TxPwrLevelCck[rf_path][idx] = CckTxPwrIdx; + pHalData->TxPwrLevelHT40_1S[rf_path][idx] = + pHalData->TxPwrLevelHT40_2S[rf_path][idx] = OfdmTxPwrIdx; + } + } + + //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel);//gtest:todo + + return _TRUE; +} + + +/* + Description: + When beacon interval is changed, the values of the + hw registers should be modified. + By tynli, 2008.10.24. + +*/ + + +void +rtl8192c_PHY_SetBeaconHwReg( + IN PADAPTER Adapter, + IN u16 BeaconInterval + ) +{ + +} + + +VOID +PHY_ScanOperationBackup8192C( + IN PADAPTER Adapter, + IN u8 Operation + ) +{ +#if 0 + IO_TYPE IoType; + + if(!Adapter->bDriverStopped) + { + switch(Operation) + { + case SCAN_OPT_BACKUP: + IoType = IO_CMD_PAUSE_DM_BY_SCAN; + rtw_hal_set_hwreg(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType); + + break; + + case SCAN_OPT_RESTORE: + IoType = IO_CMD_RESUME_DM_BY_SCAN; + rtw_hal_set_hwreg(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType); + break; + + default: + RT_TRACE(COMP_SCAN, DBG_LOUD, ("Unknown Scan Backup Operation. \n")); + break; + } + } +#endif +} + +/*----------------------------------------------------------------------------- + * Function: PHY_SetBWModeCallback8192C() + * + * Overview: Timer callback function for SetSetBWMode + * + * Input: PRT_TIMER pTimer + * + * Output: NONE + * + * Return: NONE + * + * Note: (1) We do not take j mode into consideration now + * (2) Will two workitem of "switch channel" and "switch channel bandwidth" run + * concurrently? + *---------------------------------------------------------------------------*/ +static VOID +_PHY_SetBWMode92C( + IN PADAPTER Adapter +) +{ +// PADAPTER Adapter = (PADAPTER)pTimer->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 regBwOpMode; + u8 regRRSR_RSC; + + //return; + + // Added it for 20/40 mhz switch time evaluation by guangan 070531 + //u4Byte NowL, NowH; + //u8Byte BeginTime, EndTime; + + /*RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SetBWModeCallback8192C() Switch to %s bandwidth\n", \ + pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"))*/ + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + //pHalData->SetBWModeInProgress= _FALSE; + return; + } + + // There is no 40MHz mode in RF_8225. + if(pHalData->rf_chip==RF_8225) + return; + + if(Adapter->bDriverStopped) + return; + + // Added it for 20/40 mhz switch time evaluation by guangan 070531 + //NowL = PlatformEFIORead4Byte(Adapter, TSFR); + //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4); + //BeginTime = ((u8Byte)NowH << 32) + NowL; + + //3// + //3//<1>Set MAC register + //3// + //Adapter->HalFunc.SetBWModeHandler(); + + regBwOpMode = rtw_read8(Adapter, REG_BWOPMODE); + regRRSR_RSC = rtw_read8(Adapter, REG_RRSR+2); + //regBwOpMode = rtw_hal_get_hwreg(Adapter,HW_VAR_BWMODE,(pu1Byte)®BwOpMode); + + switch(pHalData->CurrentChannelBW) + { + case HT_CHANNEL_WIDTH_20: + regBwOpMode |= BW_OPMODE_20MHZ; + // 2007/02/07 Mark by Emily becasue we have not verify whether this register works + rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); + break; + + case HT_CHANNEL_WIDTH_40: + regBwOpMode &= ~BW_OPMODE_20MHZ; + // 2007/02/07 Mark by Emily becasue we have not verify whether this register works + rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); + + regRRSR_RSC = (regRRSR_RSC&0x90) |(pHalData->nCur40MhzPrimeSC<<5); + rtw_write8(Adapter, REG_RRSR+2, regRRSR_RSC); + break; + + default: + /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): + unknown Bandwidth: %#X\n",pHalData->CurrentChannelBW));*/ + break; + } + + //3// + //3//<2>Set PHY related register + //3// + switch(pHalData->CurrentChannelBW) + { + /* 20 MHz channel*/ + case HT_CHANNEL_WIDTH_20: + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x0); + PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x0); + PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 1); + + break; + + + /* 40 MHz channel*/ + case HT_CHANNEL_WIDTH_40: + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x1); + PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x1); + + // Set Control channel to upper or lower. These settings are required only for 40MHz + PHY_SetBBReg(Adapter, rCCK0_System, bCCKSideBand, (pHalData->nCur40MhzPrimeSC>>1)); + PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0xC00, pHalData->nCur40MhzPrimeSC); + PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 0); + + PHY_SetBBReg(Adapter, 0x818, (BIT26|BIT27), (pHalData->nCur40MhzPrimeSC==HAL_PRIME_CHNL_OFFSET_LOWER)?2:1); + + break; + + + + default: + /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): unknown Bandwidth: %#X\n"\ + ,pHalData->CurrentChannelBW));*/ + break; + + } + //Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315 + + // Added it for 20/40 mhz switch time evaluation by guangan 070531 + //NowL = PlatformEFIORead4Byte(Adapter, TSFR); + //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4); + //EndTime = ((u8Byte)NowH << 32) + NowL; + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWModeCallback8190Pci: time of SetBWMode = %I64d us!\n", (EndTime - BeginTime))); + + //3<3>Set RF related register + switch(pHalData->rf_chip) + { + case RF_8225: + //PHY_SetRF8225Bandwidth(Adapter, pHalData->CurrentChannelBW); + break; + + case RF_8256: + // Please implement this function in Hal8190PciPhy8256.c + //PHY_SetRF8256Bandwidth(Adapter, pHalData->CurrentChannelBW); + break; + + case RF_8258: + // Please implement this function in Hal8190PciPhy8258.c + // PHY_SetRF8258Bandwidth(); + break; + + case RF_PSEUDO_11N: + // Do Nothing + break; + + case RF_6052: + rtl8192c_PHY_RF6052SetBandwidth(Adapter, pHalData->CurrentChannelBW); + break; + + default: + //RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID)); + break; + } + + //pHalData->SetBWModeInProgress= FALSE; + + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SetBWModeCallback8192C() \n" )); +} + + + /*----------------------------------------------------------------------------- + * Function: SetBWMode8190Pci() + * + * Overview: This function is export to "HalCommon" moudule + * + * Input: PADAPTER Adapter + * HT_CHANNEL_WIDTH Bandwidth //20M or 40M + * + * Output: NONE + * + * Return: NONE + * + * Note: We do not take j mode into consideration now + *---------------------------------------------------------------------------*/ +VOID +PHY_SetBWMode8192C( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth, // 20M or 40M + IN unsigned char Offset // Upper, Lower, or Don't care +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + HT_CHANNEL_WIDTH tmpBW= pHalData->CurrentChannelBW; + // Modified it for 20/40 mhz switch by guangan 070531 + //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo; + + //return; + + //if(pHalData->SwChnlInProgress) +// if(pMgntInfo->bScanInProgress) +// { +// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s Exit because bScanInProgress!\n", +// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")); +// return; +// } + +// if(pHalData->SetBWModeInProgress) +// { +// // Modified it for 20/40 mhz switch by guangan 070531 +// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s cancel last timer because SetBWModeInProgress!\n", +// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")); +// PlatformCancelTimer(Adapter, &pHalData->SetBWModeTimer); +// //return; +// } + + //if(pHalData->SetBWModeInProgress) + // return; + + //pHalData->SetBWModeInProgress= TRUE; + + pHalData->CurrentChannelBW = Bandwidth; + +#if 0 + if(Offset==HT_EXTCHNL_OFFSET_LOWER) + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; + else if(Offset==HT_EXTCHNL_OFFSET_UPPER) + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; + else + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; +#else + pHalData->nCur40MhzPrimeSC = Offset; +#endif + + if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) + { + + #if 0 + //PlatformSetTimer(Adapter, &(pHalData->SetBWModeTimer), 0); + #else + _PHY_SetBWMode92C(Adapter); + #endif + + } + else + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() SetBWModeInProgress FALSE driver sleep or unload\n")); + //pHalData->SetBWModeInProgress= FALSE; + pHalData->CurrentChannelBW = tmpBW; + } + +} + + +static void _PHY_SwChnl8192C(PADAPTER Adapter, u8 channel) +{ + u8 eRFPath; + u32 param1, param2; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if ( Adapter->bNotifyChannelChange ) + { + DBG_871X( "[%s] ch = %d\n", __FUNCTION__, channel ); + } + + //s1. pre common command - CmdID_SetTxPowerLevel + PHY_SetTxPowerLevel8192C(Adapter, channel); + + //s2. RF dependent command - CmdID_RF_WriteReg, param1=RF_CHNLBW, param2=channel + param1 = RF_CHNLBW; + param2 = channel; + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { + pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | param2); + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, param1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); + } + + if(channel >= 1 && channel <= 9) + { + //DBG_8192C("phy_SwitchRfSetting8723A REG_AFE_PLL_CTRL 0xF0FFFF83\n"); + PHY_SetBBReg(Adapter, REG_AFE_PLL_CTRL, bMaskDWord, 0xF0FFFF83); + } + else if (channel >= 10 && channel <= 14) + { + //DBG_8192C("phy_SwitchRfSetting8723A REG_AFE_PLL_CTRL 0xF2FFFF83\n"); + PHY_SetBBReg(Adapter, REG_AFE_PLL_CTRL, bMaskDWord, 0xF2FFFF83); + } + //s3. post common command - CmdID_End, None + +} + +VOID +PHY_SwChnl8192C( // Call after initialization + IN PADAPTER Adapter, + IN u8 channel + ) +{ + //PADAPTER Adapter = ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, _TRUE); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 tmpchannel = pHalData->CurrentChannel; + BOOLEAN bResult = _TRUE; + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + //pHalData->SwChnlInProgress=FALSE; + return; //return immediately if it is peudo-phy + } + + //if(pHalData->SwChnlInProgress) + // return; + + //if(pHalData->SetBWModeInProgress) + // return; + + //-------------------------------------------- + switch(pHalData->CurrentWirelessMode) + { + case WIRELESS_MODE_A: + case WIRELESS_MODE_N_5G: + //RT_ASSERT((channel>14), ("WIRELESS_MODE_A but channel<=14")); + break; + + case WIRELESS_MODE_B: + //RT_ASSERT((channel<=14), ("WIRELESS_MODE_B but channel>14")); + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + //RT_ASSERT((channel<=14), ("WIRELESS_MODE_G but channel>14")); + break; + + default: + //RT_ASSERT(FALSE, ("Invalid WirelessMode(%#x)!!\n", pHalData->CurrentWirelessMode)); + break; + } + //-------------------------------------------- + + //pHalData->SwChnlInProgress = TRUE; + if(channel == 0) + channel = 1; + + pHalData->CurrentChannel=channel; + + //pHalData->SwChnlStage=0; + //pHalData->SwChnlStep=0; + + if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) + { + + #if 0 + //PlatformSetTimer(Adapter, &(pHalData->SwChnlTimer), 0); + #else + _PHY_SwChnl8192C(Adapter, channel); + #endif + + if(bResult) + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress TRUE schdule workitem done\n")); + } + else + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE schdule workitem error\n")); + //if(IS_HARDWARE_TYPE_8192SU(Adapter)) + //{ + // pHalData->SwChnlInProgress = FALSE; + pHalData->CurrentChannel = tmpchannel; + //} + } + + } + else + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE driver sleep or unload\n")); + //if(IS_HARDWARE_TYPE_8192SU(Adapter)) + //{ + // pHalData->SwChnlInProgress = FALSE; + pHalData->CurrentChannel = tmpchannel; + //} + } +} + + +static BOOLEAN +phy_SwChnlStepByStep( + IN PADAPTER Adapter, + IN u8 channel, + IN u8 *stage, + IN u8 *step, + OUT u32 *delay + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PCHANNEL_ACCESS_SETTING pChnlAccessSetting; + SwChnlCmd PreCommonCmd[MAX_PRECMD_CNT]; + u4Byte PreCommonCmdCnt; + SwChnlCmd PostCommonCmd[MAX_POSTCMD_CNT]; + u4Byte PostCommonCmdCnt; + SwChnlCmd RfDependCmd[MAX_RFDEPENDCMD_CNT]; + u4Byte RfDependCmdCnt; + SwChnlCmd *CurrentCmd; + u1Byte eRFPath; + u4Byte RfTXPowerCtrl; + BOOLEAN bAdjRfTXPowerCtrl = _FALSE; + + + RT_ASSERT((Adapter != NULL), ("Adapter should not be NULL\n")); +#if(MP_DRIVER != 1) + RT_ASSERT(IsLegalChannel(Adapter, channel), ("illegal channel: %d\n", channel)); +#endif + RT_ASSERT((pHalData != NULL), ("pHalData should not be NULL\n")); + + pChnlAccessSetting = &Adapter->MgntInfo.Info8185.ChannelAccessSetting; + RT_ASSERT((pChnlAccessSetting != NULL), ("pChnlAccessSetting should not be NULL\n")); + + //for(eRFPath = RF_PATH_A; eRFPath NumTotalRFPath; eRFPath++) + //for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + //{ + // <1> Fill up pre common command. + PreCommonCmdCnt = 0; + phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT, + CmdID_SetTxPowerLevel, 0, 0, 0); + phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT, + CmdID_End, 0, 0, 0); + + // <2> Fill up post common command. + PostCommonCmdCnt = 0; + + phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++, MAX_POSTCMD_CNT, + CmdID_End, 0, 0, 0); + + // <3> Fill up RF dependent command. + RfDependCmdCnt = 0; + switch( pHalData->RFChipID ) + { + case RF_8225: + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); + // 2008/09/04 MH Change channel. + if(channel==14) channel++; + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_RF_WriteReg, rZebra1_Channel, (0x10+channel-1), 10); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_End, 0, 0, 0); + break; + + case RF_8256: + // TEST!! This is not the table for 8256!! + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_RF_WriteReg, rRfChannel, channel, 10); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_End, 0, 0, 0); + break; + + case RF_6052: + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_RF_WriteReg, RF_CHNLBW, channel, 10); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_End, 0, 0, 0); + + break; + + case RF_8258: + break; + + // For FPGA two MAC verification + case RF_PSEUDO_11N: + return TRUE; + default: + RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID)); + return FALSE; + break; + } + + + do{ + switch(*stage) + { + case 0: + CurrentCmd=&PreCommonCmd[*step]; + break; + case 1: + CurrentCmd=&RfDependCmd[*step]; + break; + case 2: + CurrentCmd=&PostCommonCmd[*step]; + break; + } + + if(CurrentCmd->CmdID==CmdID_End) + { + if((*stage)==2) + { + return TRUE; + } + else + { + (*stage)++; + (*step)=0; + continue; + } + } + + switch(CurrentCmd->CmdID) + { + case CmdID_SetTxPowerLevel: + PHY_SetTxPowerLevel8192C(Adapter,channel); + break; + case CmdID_WritePortUlong: + PlatformEFIOWrite4Byte(Adapter, CurrentCmd->Para1, CurrentCmd->Para2); + break; + case CmdID_WritePortUshort: + PlatformEFIOWrite2Byte(Adapter, CurrentCmd->Para1, (u2Byte)CurrentCmd->Para2); + break; + case CmdID_WritePortUchar: + PlatformEFIOWrite1Byte(Adapter, CurrentCmd->Para1, (u1Byte)CurrentCmd->Para2); + break; + case CmdID_RF_WriteReg: // Only modify channel for the register now !!!!! + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { +#if 1 + pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | CurrentCmd->Para2); + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); +#else + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, (CurrentCmd->Para2)); +#endif + } + break; + } + + break; + }while(TRUE); + //cosa }/*for(Number of RF paths)*/ + + (*delay)=CurrentCmd->msDelay; + (*step)++; + return FALSE; +#endif + return _TRUE; +} + + +static BOOLEAN +phy_SetSwChnlCmdArray( + SwChnlCmd* CmdTable, + u32 CmdTableIdx, + u32 CmdTableSz, + SwChnlCmdID CmdID, + u32 Para1, + u32 Para2, + u32 msDelay + ) +{ + SwChnlCmd* pCmd; + + if(CmdTable == NULL) + { + //RT_ASSERT(FALSE, ("phy_SetSwChnlCmdArray(): CmdTable cannot be NULL.\n")); + return _FALSE; + } + if(CmdTableIdx >= CmdTableSz) + { + //RT_ASSERT(FALSE, + // ("phy_SetSwChnlCmdArray(): Access invalid index, please check size of the table, CmdTableIdx:%ld, CmdTableSz:%ld\n", + // CmdTableIdx, CmdTableSz)); + return _FALSE; + } + + pCmd = CmdTable + CmdTableIdx; + pCmd->CmdID = CmdID; + pCmd->Para1 = Para1; + pCmd->Para2 = Para2; + pCmd->msDelay = msDelay; + + return _TRUE; +} + + +static void +phy_FinishSwChnlNow( // We should not call this function directly + IN PADAPTER Adapter, + IN u8 channel + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 delay; + + while(!phy_SwChnlStepByStep(Adapter,channel,&pHalData->SwChnlStage,&pHalData->SwChnlStep,&delay)) + { + if(delay>0) + rtw_mdelay_os(delay); + } +#endif +} + + + +// +// Description: +// Switch channel synchronously. Called by SwChnlByDelayHandler. +// +// Implemented by Bruce, 2008-02-14. +// The following procedure is operted according to SwChanlCallback8190Pci(). +// However, this procedure is performed synchronously which should be running under +// passive level. +// +VOID +PHY_SwChnlPhy8192C( // Only called during initialize + IN PADAPTER Adapter, + IN u8 channel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("==>PHY_SwChnlPhy8192S(), switch from channel %d to channel %d.\n", pHalData->CurrentChannel, channel)); + + // Cannot IO. + //if(RT_CANNOT_IO(Adapter)) + // return; + + // Channel Switching is in progress. + //if(pHalData->SwChnlInProgress) + // return; + + //return immediately if it is peudo-phy + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + //pHalData->SwChnlInProgress=FALSE; + return; + } + + //pHalData->SwChnlInProgress = TRUE; + if( channel == 0) + channel = 1; + + pHalData->CurrentChannel=channel; + + //pHalData->SwChnlStage = 0; + //pHalData->SwChnlStep = 0; + + phy_FinishSwChnlNow(Adapter,channel); + + //pHalData->SwChnlInProgress = FALSE; +} + + +// +// Description: +// Configure H/W functionality to enable/disable Monitor mode. +// Note, because we possibly need to configure BB and RF in this function, +// so caller should in PASSIVE_LEVEL. 080118, by rcnjko. +// +VOID +PHY_SetMonitorMode8192C( + IN PADAPTER pAdapter, + IN BOOLEAN bEnableMonitorMode + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN bFilterOutNonAssociatedBSSID = FALSE; + + //2 Note: we may need to stop antenna diversity. + if(bEnableMonitorMode) + { + bFilterOutNonAssociatedBSSID = FALSE; + RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): enable monitor mode\n")); + + pHalData->bInMonitorMode = TRUE; + pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, TRUE, TRUE); + rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID); + } + else + { + bFilterOutNonAssociatedBSSID = TRUE; + RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): disable monitor mode\n")); + + pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, FALSE, TRUE); + pHalData->bInMonitorMode = FALSE; + rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID); + } +#endif +} + + +/*----------------------------------------------------------------------------- + * Function: PHYCheckIsLegalRfPath8190Pci() + * + * Overview: Check different RF type to execute legal judgement. If RF Path is illegal + * We will return false. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/15/2007 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +BOOLEAN +PHY_CheckIsLegalRfPath8192C( + IN PADAPTER pAdapter, + IN u32 eRFPath) +{ +// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN rtValue = _TRUE; + + // NOt check RF Path now.! +#if 0 + if (pHalData->RF_Type == RF_1T2R && eRFPath != RF_PATH_A) + { + rtValue = FALSE; + } + if (pHalData->RF_Type == RF_1T2R && eRFPath != RF_PATH_A) + { + + } +#endif + return rtValue; + +} /* PHY_CheckIsLegalRfPath8192C */ + +static VOID _PHY_SetRFPathSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN bMain, + IN BOOLEAN is2T + ) +{ + u8 u1bTmp; + + if(!pAdapter->hw_init_completed) + { + u1bTmp = rtw_read8(pAdapter, REG_LEDCFG2) | BIT7; + rtw_write8(pAdapter, REG_LEDCFG2, u1bTmp); + //PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); + } + + if(is2T) + { + if(bMain) + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1); //92C_Path_A + else + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2); //BT + } + else + { + + if(bMain) + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x2); //Main + else + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x1); //Aux + } + +} + +//return value TRUE => Main; FALSE => Aux + +static BOOLEAN _PHY_QueryRFPathSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN is2T + ) +{ +// if(is2T) +// return _TRUE; + + if(!pAdapter->hw_init_completed) + { + PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); + } + + if(is2T) + { + if(PHY_QueryBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01) + return _TRUE; + else + return _FALSE; + } + else + { + if(PHY_QueryBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300) == 0x02) + return _TRUE; + else + return _FALSE; + } +} + + +static VOID +_PHY_DumpRFReg(IN PADAPTER pAdapter) +{ + u32 rfRegValue,rfRegOffset; + + //RTPRINT(FINIT, INIT_RF, ("PHY_DumpRFReg()====>\n")); + + for(rfRegOffset = 0x00;rfRegOffset<=0x30;rfRegOffset++){ + rfRegValue = PHY_QueryRFReg(pAdapter,RF_PATH_A, rfRegOffset, bMaskDWord); + //RTPRINT(FINIT, INIT_RF, (" 0x%02x = 0x%08x\n",rfRegOffset,rfRegValue)); + } + //RTPRINT(FINIT, INIT_RF, ("<===== PHY_DumpRFReg()\n")); +} + + +VOID rtl8192c_PHY_SetRFPathSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN bMain + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + +#if DISABLE_BB_RF + return; +#endif + + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_SetRFPathSwitch(pAdapter, bMain, _TRUE); + } + else{ + // For 88C 1T1R + _PHY_SetRFPathSwitch(pAdapter, bMain, _FALSE); + } +} + +// +// Move from phycfg.c to gen.c to be code independent later +// +//-------------------------Move to other DIR later----------------------------*/ +#ifdef CONFIG_USB_HCI + +// +// Description: +// To dump all Tx FIFO LLT related link-list table. +// Added by Roger, 2009.03.10. +// +VOID +DumpBBDbgPort_92CU( + IN PADAPTER Adapter + ) +{ + + //RT_TRACE(COMP_SEND, DBG_WARNING, ("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n")); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("BaseBand Debug Ports:\n")); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0000); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0803); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0a06); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0007); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100); + PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x000f0000); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100); + PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x00150000); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x800, PHY_QueryBBReg(Adapter, 0x0800, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x900, PHY_QueryBBReg(Adapter, 0x0900, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa00, PHY_QueryBBReg(Adapter, 0x0a00, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa54, PHY_QueryBBReg(Adapter, 0x0a54, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa58, PHY_QueryBBReg(Adapter, 0x0a58, bMaskDWord))); + +} +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_rf6052.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_rf6052.c index c86782f695e6..b6449371f5a7 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_rf6052.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_rf6052.c @@ -1,985 +1,985 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -/****************************************************************************** - * - * - * Module: rtl8192c_rf6052.c ( Source C File) - * - * Note: Provide RF 6052 series relative API. - * - * Function: - * - * Export: - * - * Abbrev: - * - * History: - * Data Who Remark - * - * 09/25/2008 MHC Create initial version. - * 11/05/2008 MHC Add API for tw power setting. - * - * -******************************************************************************/ - -#define _RTL8723A_RF6052_C_ - -#include -#include -#include -#include - -#include - -/*---------------------------Define Local Constant---------------------------*/ -// Define local structure for debug!!!!! -typedef struct RF_Shadow_Compare_Map { - // Shadow register value - u32 Value; - // Compare or not flag - u8 Compare; - // Record If it had ever modified unpredicted - u8 ErrorOrNot; - // Recorver Flag - u8 Recorver; - // - u8 Driver_Write; -}RF_SHADOW_T; -/*---------------------------Define Local Constant---------------------------*/ - - -/*------------------------Define global variable-----------------------------*/ -/*------------------------Define global variable-----------------------------*/ - - -/*------------------------Define local variable------------------------------*/ -// 2008/11/20 MH For Debug only, RF -//static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG] = {0}; -static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG]; -/*------------------------Define local variable------------------------------*/ - - -/*----------------------------------------------------------------------------- - * Function: RF_ChangeTxPath - * - * Overview: For RL6052, we must change some RF settign for 1T or 2T. - * - * Input: u2Byte DataRate // 0x80-8f, 0x90-9f - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 09/25/2008 MHC Create Version 0. - * Firmwaer support the utility later. - * - *---------------------------------------------------------------------------*/ -void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, - IN u16 DataRate) -{ -// We do not support gain table change inACUT now !!!! Delete later !!! -#if 0//(RTL92SE_FPGA_VERIFY == 0) - static u1Byte RF_Path_Type = 2; // 1 = 1T 2= 2T - static u4Byte tx_gain_tbl1[6] - = {0x17f50, 0x11f40, 0x0cf30, 0x08720, 0x04310, 0x00100}; - static u4Byte tx_gain_tbl2[6] - = {0x15ea0, 0x10e90, 0x0c680, 0x08250, 0x04040, 0x00030}; - u1Byte i; - - if (RF_Path_Type == 2 && (DataRate&0xF) <= 0x7) - { - // Set TX SYNC power G2G3 loop filter - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, - RF_TXPA_G2, bRFRegOffsetMask, 0x0f000); - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, - RF_TXPA_G3, bRFRegOffsetMask, 0xeacf1); - - // Change TX AGC gain table - for (i = 0; i < 6; i++) - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, - RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl1[i]); - - // Set PA to high value - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, - RF_TXPA_G2, bRFRegOffsetMask, 0x01e39); - } - else if (RF_Path_Type == 1 && (DataRate&0xF) >= 0x8) - { - // Set TX SYNC power G2G3 loop filter - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, - RF_TXPA_G2, bRFRegOffsetMask, 0x04440); - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, - RF_TXPA_G3, bRFRegOffsetMask, 0xea4f1); - - // Change TX AGC gain table - for (i = 0; i < 6; i++) - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, - RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl2[i]); - - // Set PA low gain - PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, - RF_TXPA_G2, bRFRegOffsetMask, 0x01e19); - } -#endif - -} /* RF_ChangeTxPath */ - - -/*----------------------------------------------------------------------------- - * Function: PHY_RF6052SetBandwidth() - * - * Overview: This function is called by SetBWModeCallback8190Pci() only - * - * Input: PADAPTER Adapter - * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M - * - * Output: NONE - * - * Return: NONE - * - * Note: For RF type 0222D - *---------------------------------------------------------------------------*/ -VOID -rtl8192c_PHY_RF6052SetBandwidth( - IN PADAPTER Adapter, - IN HT_CHANNEL_WIDTH Bandwidth) //20M or 40M -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - switch(Bandwidth) - { - case HT_CHANNEL_WIDTH_20: - pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | 0x0400); - PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); - break; - - case HT_CHANNEL_WIDTH_40: - pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff)); - PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); - break; - - default: - //RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetRF8225Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth )); - break; - } - -} - - -/*----------------------------------------------------------------------------- - * Function: PHY_RF6052SetCckTxPower - * - * Overview: - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/05/2008 MHC Simulate 8192series.. - * - *---------------------------------------------------------------------------*/ - -VOID -rtl8192c_PHY_RF6052SetCckTxPower( - IN PADAPTER Adapter, - IN u8* pPowerlevel) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo; - u32 TxAGC[2]={0, 0}, tmpval=0; - BOOLEAN TurboScanOff = _FALSE; - u8 idx1, idx2; - u8* ptr; - - // 2010/10/18 MH Accorsing to SD3 eechou's suggestion, we need to disable turbo scan for RU. - // Otherwise, external PA will be broken if power index > 0x20. -#ifdef CONFIG_USB_HCI - if (pHalData->EEPROMRegulatory != 0 || pHalData->ExternalPA) -#else - if (pHalData->EEPROMRegulatory != 0) -#endif - { - //DbgPrint("TurboScanOff=1 EEPROMRegulatory=%d ExternalPA=%d\n", pHalData->EEPROMRegulatory, pHalData->ExternalPA); - TurboScanOff = _TRUE; - } - - if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS) - { - TxAGC[RF_PATH_A] = 0x3f3f3f3f; - TxAGC[RF_PATH_B] = 0x3f3f3f3f; - - TurboScanOff = _TRUE;//disable turbo scan - - if(TurboScanOff) - { - for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) - { - TxAGC[idx1] = - pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | - (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); -#ifdef CONFIG_USB_HCI - // 2010/10/18 MH For external PA module. We need to limit power index to be less than 0x20. - if (TxAGC[idx1] > 0x20 && pHalData->ExternalPA) - TxAGC[idx1] = 0x20; -#endif - } - } - } - else - { -// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. -// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. -// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. - if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) - { - TxAGC[RF_PATH_A] = 0x10101010; - TxAGC[RF_PATH_B] = 0x10101010; - } - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) - { - TxAGC[RF_PATH_A] = 0x00000000; - TxAGC[RF_PATH_B] = 0x00000000; - } - else - { - for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) - { - TxAGC[idx1] = - pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | - (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); - } - - if(pHalData->EEPROMRegulatory==0) - { - tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][6]) + - (pHalData->MCSTxPowerLevelOriginalOffset[0][7]<<8); - TxAGC[RF_PATH_A] += tmpval; - - tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][14]) + - (pHalData->MCSTxPowerLevelOriginalOffset[0][15]<<24); - TxAGC[RF_PATH_B] += tmpval; - } - } - } - - for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) - { - ptr = (u8*)(&(TxAGC[idx1])); - for(idx2=0; idx2<4; idx2++) - { - if(*ptr > RF6052_MAX_TX_PWR) - *ptr = RF6052_MAX_TX_PWR; - ptr++; - } - } - - // rf-A cck tx power - tmpval = TxAGC[RF_PATH_A]&0xff; - PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, tmpval); - //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_A_CCK1_Mcs32)); - tmpval = TxAGC[RF_PATH_A]>>8; - PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); - //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); - - // rf-B cck tx power - tmpval = TxAGC[RF_PATH_B]>>24; - PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, tmpval); - //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); - tmpval = TxAGC[RF_PATH_B]&0x00ffffff; - PHY_SetBBReg(Adapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); - //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", - // tmpval, rTxAGC_B_CCK1_55_Mcs32)); - -} /* PHY_RF6052SetCckTxPower */ - -// -// powerbase0 for OFDM rates -// powerbase1 for HT MCS rates -// -static void getPowerBase( - IN PADAPTER Adapter, - IN u8* pPowerLevel, - IN u8 Channel, - IN OUT u32* OfdmBase, - IN OUT u32* MCSBase - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 powerBase0, powerBase1; - u8 Legacy_pwrdiff=0; - s8 HT20_pwrdiff=0; - u8 i, powerlevel[2]; - - for(i=0; i<2; i++) - { - powerlevel[i] = pPowerLevel[i]; - Legacy_pwrdiff = pHalData->TxPwrLegacyHtDiff[i][Channel-1]; - powerBase0 = powerlevel[i] + Legacy_pwrdiff; - - powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0; - *(OfdmBase+i) = powerBase0; - //RTPRINT(FPHY, PHY_TXPWR, (" [OFDM power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(OfdmBase+i))); - } - - for(i=0; i<2; i++) - { - //Check HT20 to HT40 diff - if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) - { - HT20_pwrdiff = pHalData->TxPwrHt20Diff[i][Channel-1]; - powerlevel[i] += HT20_pwrdiff; - } - powerBase1 = powerlevel[i]; - powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1; - *(MCSBase+i) = powerBase1; - //RTPRINT(FPHY, PHY_TXPWR, (" [MCS power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(MCSBase+i))); - } -} - -static void getTxPowerWriteValByRegulatory( - IN PADAPTER Adapter, - IN u8 Channel, - IN u8 index, - IN u32* powerBase0, - IN u32* powerBase1, - OUT u32* pOutWriteVal - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u8 i, chnlGroup, pwr_diff_limit[4]; - u32 writeVal, customer_limit, rf; - - // - // Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate - // - for(rf=0; rf<2; rf++) - { - switch(pHalData->EEPROMRegulatory) - { - case 0: // Realtek better performance - // increase power diff defined by Realtek for large power - chnlGroup = 0; - //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", - // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); - writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + - ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - case 1: // Realtek regulatory - // increase power diff defined by Realtek for regulatory - { - if(pHalData->pwrGroupCnt == 1) - chnlGroup = 0; - if(pHalData->pwrGroupCnt >= 3) - { - if(Channel <= 3) - chnlGroup = 0; - else if(Channel >= 4 && Channel <= 9) - chnlGroup = 1; - else if(Channel > 9) - chnlGroup = 2; - - if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) - chnlGroup++; - else - chnlGroup+=4; - } - //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", - //chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); - writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + - ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - } - break; - case 2: // Better regulatory - // don't increase any power diff - writeVal = ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("Better regulatory, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - case 3: // Customer defined power diff. - // increase power diff defined by customer. - chnlGroup = 0; - //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", - // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); - - if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) - { - //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 40MHz rf(%c) = 0x%x\n", - // ((rf==0)?'A':'B'), pHalData->PwrGroupHT40[rf][Channel-1])); - } - else - { - //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 20MHz rf(%c) = 0x%x\n", - // ((rf==0)?'A':'B'), pHalData->PwrGroupHT20[rf][Channel-1])); - } - for (i=0; i<4; i++) - { - pwr_diff_limit[i] = (u8)((pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]&(0x7f<<(i*8)))>>(i*8)); - if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) - { - if(pwr_diff_limit[i] > pHalData->PwrGroupHT40[rf][Channel-1]) - pwr_diff_limit[i] = pHalData->PwrGroupHT40[rf][Channel-1]; - } - else - { - if(pwr_diff_limit[i] > pHalData->PwrGroupHT20[rf][Channel-1]) - pwr_diff_limit[i] = pHalData->PwrGroupHT20[rf][Channel-1]; - } - } - customer_limit = (pwr_diff_limit[3]<<24) | (pwr_diff_limit[2]<<16) | - (pwr_diff_limit[1]<<8) | (pwr_diff_limit[0]); - //RTPRINT(FPHY, PHY_TXPWR, ("Customer's limit rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), customer_limit)); - - writeVal = customer_limit + ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("Customer, writeVal rf(%c)= 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - default: - chnlGroup = 0; - writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + - ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - } - -// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. -// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. -// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. - - if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) - writeVal = 0x14141414; - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) - writeVal = 0x00000000; - - - // 20100628 Joseph: High power mode for BT-Coexist mechanism. - // This mechanism is only applied when Driver-Highpower-Mechanism is OFF. - if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT1) - { - //RTPRINT(FBT, BT_TRACE, ("Tx Power (-6)\n")); - writeVal = writeVal - 0x06060606; - } - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT2) - { - //RTPRINT(FBT, BT_TRACE, ("Tx Power (-0)\n")); - writeVal = writeVal; - } - *(pOutWriteVal+rf) = writeVal; - } -} - -static void writeOFDMPowerReg( - IN PADAPTER Adapter, - IN u8 index, - IN u32* pValue - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u16 RegOffset_A[6] = { rTxAGC_A_Rate18_06, rTxAGC_A_Rate54_24, - rTxAGC_A_Mcs03_Mcs00, rTxAGC_A_Mcs07_Mcs04, - rTxAGC_A_Mcs11_Mcs08, rTxAGC_A_Mcs15_Mcs12}; - u16 RegOffset_B[6] = { rTxAGC_B_Rate18_06, rTxAGC_B_Rate54_24, - rTxAGC_B_Mcs03_Mcs00, rTxAGC_B_Mcs07_Mcs04, - rTxAGC_B_Mcs11_Mcs08, rTxAGC_B_Mcs15_Mcs12}; - u8 i, rf, pwr_val[4]; - u32 writeVal; - u16 RegOffset; - - for(rf=0; rf<2; rf++) - { - writeVal = pValue[rf]; - for(i=0; i<4; i++) - { - pwr_val[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8)); - if (pwr_val[i] > RF6052_MAX_TX_PWR) - pwr_val[i] = RF6052_MAX_TX_PWR; - } - writeVal = (pwr_val[3]<<24) | (pwr_val[2]<<16) |(pwr_val[1]<<8) |pwr_val[0]; - - if(rf == 0) - RegOffset = RegOffset_A[index]; - else - RegOffset = RegOffset_B[index]; - - PHY_SetBBReg(Adapter, RegOffset, bMaskDWord, writeVal); - //RTPRINT(FPHY, PHY_TXPWR, ("Set 0x%x = %08x\n", RegOffset, writeVal)); - - // 201005115 Joseph: Set Tx Power diff for Tx power training mechanism. - if(((pHalData->rf_type == RF_2T2R) && - (RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs15_Mcs12))|| - ((pHalData->rf_type != RF_2T2R) && - (RegOffset == rTxAGC_A_Mcs07_Mcs04 || RegOffset == rTxAGC_B_Mcs07_Mcs04)) ) - { - writeVal = pwr_val[3]; - if(RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_A_Mcs07_Mcs04) - RegOffset = 0xc90; - if(RegOffset == rTxAGC_B_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs07_Mcs04) - RegOffset = 0xc98; - for(i=0; i<3; i++) - { - if(i!=2) - writeVal = (writeVal>8)?(writeVal-8):0; - else - writeVal = (writeVal>6)?(writeVal-6):0; - rtw_write8(Adapter, (u32)(RegOffset+i), (u8)writeVal); - } - } - } -} -/*----------------------------------------------------------------------------- - * Function: PHY_RF6052SetOFDMTxPower - * - * Overview: For legacy and HY OFDM, we must read EEPROM TX power index for - * different channel and read original value in TX power register area from - * 0xe00. We increase offset and original value to be correct tx pwr. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/05/2008 MHC Simulate 8192 series method. - * 01/06/2009 MHC 1. Prevent Path B tx power overflow or underflow dure to - * A/B pwr difference or legacy/HT pwr diff. - * 2. We concern with path B legacy/HT OFDM difference. - * 01/22/2009 MHC Support new EPRO format from SD3. - * - *---------------------------------------------------------------------------*/ -VOID -rtl8192c_PHY_RF6052SetOFDMTxPower( - IN PADAPTER Adapter, - IN u8* pPowerLevel, - IN u8 Channel) -{ - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 writeVal[2], powerBase0[2], powerBase1[2]; - u8 index = 0; - - getPowerBase(Adapter, pPowerLevel, Channel, &powerBase0[0], &powerBase1[0]); - - for(index=0; index<6; index++) - { - getTxPowerWriteValByRegulatory(Adapter, Channel, index, - &powerBase0[0], &powerBase1[0], &writeVal[0]); - - writeOFDMPowerReg(Adapter, index, &writeVal[0]); - } - -} - - -static VOID -phy_RF6052_Config_HardCode( - IN PADAPTER Adapter - ) -{ - - // Set Default Bandwidth to 20M - //Adapter->HalFunc .SetBWModeHandler(Adapter, HT_CHANNEL_WIDTH_20); - - // TODO: Set Default Channel to channel one for RTL8225 - -} - -static int -phy_RF6052_Config_ParaFile( - IN PADAPTER Adapter - ) -{ - u32 u4RegValue; - u8 eRFPath; - BB_REGISTER_DEFINITION_T *pPhyReg; - - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - static char sz8723RadioAFile[] = RTL8723_PHY_RADIO_A; - static char sz8723RadioBFile[] = RTL8723_PHY_RADIO_B; - char *pszRadioAFile, *pszRadioBFile; - - - pszRadioAFile = sz8723RadioAFile; - pszRadioBFile = sz8723RadioBFile; - - - //3//----------------------------------------------------------------- - //3// <2> Initialize RF - //3//----------------------------------------------------------------- - //for(eRFPath = RF_PATH_A; eRFPath NumTotalRFPath; eRFPath++) - for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - { - - pPhyReg = &pHalData->PHYRegDef[eRFPath]; - - /*----Store original RFENV control type----*/ - switch(eRFPath) - { - case RF_PATH_A: - case RF_PATH_C: - u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV); - break; - case RF_PATH_B : - case RF_PATH_D: - u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16); - break; - } - - /*----Set RF_ENV enable----*/ - PHY_SetBBReg(Adapter, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1); - rtw_udelay_os(1);//PlatformStallExecution(1); - - /*----Set RF_ENV output high----*/ - PHY_SetBBReg(Adapter, pPhyReg->rfintfo, bRFSI_RFENV, 0x1); - rtw_udelay_os(1);//PlatformStallExecution(1); - - /* Set bit number of Address and Data for RF register */ - PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0); // Set 1 to 4 bits for 8255 - rtw_udelay_os(1);//PlatformStallExecution(1); - - PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0); // Set 0 to 12 bits for 8255 - rtw_udelay_os(1);//PlatformStallExecution(1); - - /*----Initialize RF fom connfiguration file----*/ - switch(eRFPath) - { - case RF_PATH_A: -#ifdef CONFIG_EMBEDDED_FWIMG - #ifdef CONFIG_PHY_SETTING_WITH_ODM - if(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,(ODM_RF_RADIO_PATH_E)eRFPath, (ODM_RF_RADIO_PATH_E)eRFPath)) - rtStatus= _FAIL; - #else - rtStatus= rtl8723a_PHY_ConfigRFWithHeaderFile(Adapter,(RF_RADIO_PATH_E)eRFPath); - #endif//#ifdef CONFIG_PHY_SETTING_WITH_ODM -#else - rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, (RF_RADIO_PATH_E)eRFPath); -#endif//#ifdef CONFIG_EMBEDDED_FWIMG - break; - case RF_PATH_B: -#ifdef CONFIG_EMBEDDED_FWIMG - #ifdef CONFIG_PHY_SETTING_WITH_ODM - if(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,(ODM_RF_RADIO_PATH_E)eRFPath, (ODM_RF_RADIO_PATH_E)eRFPath)) - rtStatus= _FAIL; - #else - rtStatus = rtl8723a_PHY_ConfigRFWithHeaderFile(Adapter,(RF_RADIO_PATH_E)eRFPath); - #endif -#else - rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, (RF_RADIO_PATH_E)eRFPath); -#endif - break; - case RF_PATH_C: - break; - case RF_PATH_D: - break; - } - - /*----Restore RFENV control type----*/; - switch(eRFPath) - { - case RF_PATH_A: - case RF_PATH_C: - PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue); - break; - case RF_PATH_B : - case RF_PATH_D: - PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue); - break; - } - - if(rtStatus != _SUCCESS){ - //RT_TRACE(COMP_FPGA, DBG_LOUD, ("phy_RF6052_Config_ParaFile():Radio[%d] Fail!!", eRFPath)); - goto phy_RF6052_Config_ParaFile_Fail; - } - - } - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile()\n")); - return rtStatus; - -phy_RF6052_Config_ParaFile_Fail: - return rtStatus; -} - - -int -PHY_RF6052_Config8723A( - IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int rtStatus = _SUCCESS; - - // - // Initialize general global value - // - // TODO: Extend RF_PATH_C and RF_PATH_D in the future - if(pHalData->rf_type == RF_1T1R) - pHalData->NumTotalRFPath = 1; - else - pHalData->NumTotalRFPath = 2; - - // - // Config BB and RF - // - rtStatus = phy_RF6052_Config_ParaFile(Adapter); - return rtStatus; - -} - - -// -// ==> RF shadow Operation API Code Section!!! -// -/*----------------------------------------------------------------------------- - * Function: PHY_RFShadowRead - * PHY_RFShadowWrite - * PHY_RFShadowCompare - * PHY_RFShadowRecorver - * PHY_RFShadowCompareAll - * PHY_RFShadowRecorverAll - * PHY_RFShadowCompareFlagSet - * PHY_RFShadowRecorverFlagSet - * - * Overview: When we set RF register, we must write shadow at first. - * When we are running, we must compare shadow abd locate error addr. - * Decide to recorver or not. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/20/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -u32 -PHY_RFShadowRead( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 Offset) -{ - return RF_Shadow[eRFPath][Offset].Value; - -} /* PHY_RFShadowRead */ - - -VOID -PHY_RFShadowWrite( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 Offset, - IN u32 Data) -{ - RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask); - RF_Shadow[eRFPath][Offset].Driver_Write = _TRUE; - -} /* PHY_RFShadowWrite */ - - -BOOLEAN -PHY_RFShadowCompare( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 Offset) -{ - u32 reg; - // Check if we need to check the register - if (RF_Shadow[eRFPath][Offset].Compare == _TRUE) - { - reg = PHY_QueryRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask); - // Compare shadow and real rf register for 20bits!! - if (RF_Shadow[eRFPath][Offset].Value != reg) - { - // Locate error position. - RF_Shadow[eRFPath][Offset].ErrorOrNot = _TRUE; - //RT_TRACE(COMP_INIT, DBG_LOUD, - //("PHY_RFShadowCompare RF-%d Addr%02lx Err = %05lx\n", - //eRFPath, Offset, reg)); - } - return RF_Shadow[eRFPath][Offset].ErrorOrNot ; - } - return _FALSE; -} /* PHY_RFShadowCompare */ - - -VOID -PHY_RFShadowRecorver( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 Offset) -{ - // Check if the address is error - if (RF_Shadow[eRFPath][Offset].ErrorOrNot == _TRUE) - { - // Check if we need to recorver the register. - if (RF_Shadow[eRFPath][Offset].Recorver == _TRUE) - { - PHY_SetRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask, - RF_Shadow[eRFPath][Offset].Value); - //RT_TRACE(COMP_INIT, DBG_LOUD, - //("PHY_RFShadowRecorver RF-%d Addr%02lx=%05lx", - //eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value)); - } - } - -} /* PHY_RFShadowRecorver */ - - -VOID -PHY_RFShadowCompareAll( - IN PADAPTER Adapter) -{ - u32 eRFPath; - u32 Offset; - - for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) - { - for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) - { - PHY_RFShadowCompare(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset); - } - } - -} /* PHY_RFShadowCompareAll */ - - -VOID -PHY_RFShadowRecorverAll( - IN PADAPTER Adapter) -{ - u32 eRFPath; - u32 Offset; - - for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) - { - for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) - { - PHY_RFShadowRecorver(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset); - } - } - -} /* PHY_RFShadowRecorverAll */ - - -VOID -PHY_RFShadowCompareFlagSet( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 Offset, - IN u8 Type) -{ - // Set True or False!!! - RF_Shadow[eRFPath][Offset].Compare = Type; - -} /* PHY_RFShadowCompareFlagSet */ - - -VOID -PHY_RFShadowRecorverFlagSet( - IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 Offset, - IN u8 Type) -{ - // Set True or False!!! - RF_Shadow[eRFPath][Offset].Recorver= Type; - -} /* PHY_RFShadowRecorverFlagSet */ - - -VOID -PHY_RFShadowCompareFlagSetAll( - IN PADAPTER Adapter) -{ - u32 eRFPath; - u32 Offset; - - for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) - { - for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) - { - // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! - if (Offset != 0x26 && Offset != 0x27) - PHY_RFShadowCompareFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _FALSE); - else - PHY_RFShadowCompareFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _TRUE); - } - } - -} /* PHY_RFShadowCompareFlagSetAll */ - - -VOID -PHY_RFShadowRecorverFlagSetAll( - IN PADAPTER Adapter) -{ - u32 eRFPath; - u32 Offset; - - for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) - { - for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) - { - // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! - if (Offset != 0x26 && Offset != 0x27) - PHY_RFShadowRecorverFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _FALSE); - else - PHY_RFShadowRecorverFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _TRUE); - } - } - -} /* PHY_RFShadowCompareFlagSetAll */ - -VOID -PHY_RFShadowRefresh( - IN PADAPTER Adapter) -{ - u32 eRFPath; - u32 Offset; - - for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) - { - for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) - { - RF_Shadow[eRFPath][Offset].Value = 0; - RF_Shadow[eRFPath][Offset].Compare = _FALSE; - RF_Shadow[eRFPath][Offset].Recorver = _FALSE; - RF_Shadow[eRFPath][Offset].ErrorOrNot = _FALSE; - RF_Shadow[eRFPath][Offset].Driver_Write = _FALSE; - } - } - -} /* PHY_RFShadowRead */ - -/* End of HalRf6052.c */ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/****************************************************************************** + * + * + * Module: rtl8192c_rf6052.c ( Source C File) + * + * Note: Provide RF 6052 series relative API. + * + * Function: + * + * Export: + * + * Abbrev: + * + * History: + * Data Who Remark + * + * 09/25/2008 MHC Create initial version. + * 11/05/2008 MHC Add API for tw power setting. + * + * +******************************************************************************/ + +#define _RTL8723A_RF6052_C_ + +#include +#include +#include +#include + +#include + +/*---------------------------Define Local Constant---------------------------*/ +// Define local structure for debug!!!!! +typedef struct RF_Shadow_Compare_Map { + // Shadow register value + u32 Value; + // Compare or not flag + u8 Compare; + // Record If it had ever modified unpredicted + u8 ErrorOrNot; + // Recorver Flag + u8 Recorver; + // + u8 Driver_Write; +}RF_SHADOW_T; +/*---------------------------Define Local Constant---------------------------*/ + + +/*------------------------Define global variable-----------------------------*/ +/*------------------------Define global variable-----------------------------*/ + + +/*------------------------Define local variable------------------------------*/ +// 2008/11/20 MH For Debug only, RF +//static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG] = {0}; +static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG]; +/*------------------------Define local variable------------------------------*/ + + +/*----------------------------------------------------------------------------- + * Function: RF_ChangeTxPath + * + * Overview: For RL6052, we must change some RF settign for 1T or 2T. + * + * Input: u2Byte DataRate // 0x80-8f, 0x90-9f + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 09/25/2008 MHC Create Version 0. + * Firmwaer support the utility later. + * + *---------------------------------------------------------------------------*/ +void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, + IN u16 DataRate) +{ +// We do not support gain table change inACUT now !!!! Delete later !!! +#if 0//(RTL92SE_FPGA_VERIFY == 0) + static u1Byte RF_Path_Type = 2; // 1 = 1T 2= 2T + static u4Byte tx_gain_tbl1[6] + = {0x17f50, 0x11f40, 0x0cf30, 0x08720, 0x04310, 0x00100}; + static u4Byte tx_gain_tbl2[6] + = {0x15ea0, 0x10e90, 0x0c680, 0x08250, 0x04040, 0x00030}; + u1Byte i; + + if (RF_Path_Type == 2 && (DataRate&0xF) <= 0x7) + { + // Set TX SYNC power G2G3 loop filter + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x0f000); + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, + RF_TXPA_G3, bRFRegOffsetMask, 0xeacf1); + + // Change TX AGC gain table + for (i = 0; i < 6; i++) + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, + RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl1[i]); + + // Set PA to high value + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x01e39); + } + else if (RF_Path_Type == 1 && (DataRate&0xF) >= 0x8) + { + // Set TX SYNC power G2G3 loop filter + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x04440); + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, + RF_TXPA_G3, bRFRegOffsetMask, 0xea4f1); + + // Change TX AGC gain table + for (i = 0; i < 6; i++) + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, + RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl2[i]); + + // Set PA low gain + PHY_SetRFReg(Adapter, (RF_RADIO_PATH_E)RF_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x01e19); + } +#endif + +} /* RF_ChangeTxPath */ + + +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetBandwidth() + * + * Overview: This function is called by SetBWModeCallback8190Pci() only + * + * Input: PADAPTER Adapter + * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M + * + * Output: NONE + * + * Return: NONE + * + * Note: For RF type 0222D + *---------------------------------------------------------------------------*/ +VOID +rtl8192c_PHY_RF6052SetBandwidth( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth) //20M or 40M +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch(Bandwidth) + { + case HT_CHANNEL_WIDTH_20: + pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | 0x0400); + PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); + break; + + case HT_CHANNEL_WIDTH_40: + pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff)); + PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); + break; + + default: + //RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetRF8225Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth )); + break; + } + +} + + +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetCckTxPower + * + * Overview: + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/05/2008 MHC Simulate 8192series.. + * + *---------------------------------------------------------------------------*/ + +VOID +rtl8192c_PHY_RF6052SetCckTxPower( + IN PADAPTER Adapter, + IN u8* pPowerlevel) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo; + u32 TxAGC[2]={0, 0}, tmpval=0; + BOOLEAN TurboScanOff = _FALSE; + u8 idx1, idx2; + u8* ptr; + + // 2010/10/18 MH Accorsing to SD3 eechou's suggestion, we need to disable turbo scan for RU. + // Otherwise, external PA will be broken if power index > 0x20. +#ifdef CONFIG_USB_HCI + if (pHalData->EEPROMRegulatory != 0 || pHalData->ExternalPA) +#else + if (pHalData->EEPROMRegulatory != 0) +#endif + { + //DbgPrint("TurboScanOff=1 EEPROMRegulatory=%d ExternalPA=%d\n", pHalData->EEPROMRegulatory, pHalData->ExternalPA); + TurboScanOff = _TRUE; + } + + if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS) + { + TxAGC[RF_PATH_A] = 0x3f3f3f3f; + TxAGC[RF_PATH_B] = 0x3f3f3f3f; + + TurboScanOff = _TRUE;//disable turbo scan + + if(TurboScanOff) + { + for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) + { + TxAGC[idx1] = + pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | + (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); +#ifdef CONFIG_USB_HCI + // 2010/10/18 MH For external PA module. We need to limit power index to be less than 0x20. + if (TxAGC[idx1] > 0x20 && pHalData->ExternalPA) + TxAGC[idx1] = 0x20; +#endif + } + } + } + else + { +// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. +// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. +// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) + { + TxAGC[RF_PATH_A] = 0x10101010; + TxAGC[RF_PATH_B] = 0x10101010; + } + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) + { + TxAGC[RF_PATH_A] = 0x00000000; + TxAGC[RF_PATH_B] = 0x00000000; + } + else + { + for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) + { + TxAGC[idx1] = + pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | + (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); + } + + if(pHalData->EEPROMRegulatory==0) + { + tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][6]) + + (pHalData->MCSTxPowerLevelOriginalOffset[0][7]<<8); + TxAGC[RF_PATH_A] += tmpval; + + tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][14]) + + (pHalData->MCSTxPowerLevelOriginalOffset[0][15]<<24); + TxAGC[RF_PATH_B] += tmpval; + } + } + } + + for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++) + { + ptr = (u8*)(&(TxAGC[idx1])); + for(idx2=0; idx2<4; idx2++) + { + if(*ptr > RF6052_MAX_TX_PWR) + *ptr = RF6052_MAX_TX_PWR; + ptr++; + } + } + + // rf-A cck tx power + tmpval = TxAGC[RF_PATH_A]&0xff; + PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_A_CCK1_Mcs32)); + tmpval = TxAGC[RF_PATH_A]>>8; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); + + // rf-B cck tx power + tmpval = TxAGC[RF_PATH_B]>>24; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); + tmpval = TxAGC[RF_PATH_B]&0x00ffffff; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", + // tmpval, rTxAGC_B_CCK1_55_Mcs32)); + +} /* PHY_RF6052SetCckTxPower */ + +// +// powerbase0 for OFDM rates +// powerbase1 for HT MCS rates +// +static void getPowerBase( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel, + IN OUT u32* OfdmBase, + IN OUT u32* MCSBase + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 powerBase0, powerBase1; + u8 Legacy_pwrdiff=0; + s8 HT20_pwrdiff=0; + u8 i, powerlevel[2]; + + for(i=0; i<2; i++) + { + powerlevel[i] = pPowerLevel[i]; + Legacy_pwrdiff = pHalData->TxPwrLegacyHtDiff[i][Channel-1]; + powerBase0 = powerlevel[i] + Legacy_pwrdiff; + + powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0; + *(OfdmBase+i) = powerBase0; + //RTPRINT(FPHY, PHY_TXPWR, (" [OFDM power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(OfdmBase+i))); + } + + for(i=0; i<2; i++) + { + //Check HT20 to HT40 diff + if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) + { + HT20_pwrdiff = pHalData->TxPwrHt20Diff[i][Channel-1]; + powerlevel[i] += HT20_pwrdiff; + } + powerBase1 = powerlevel[i]; + powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1; + *(MCSBase+i) = powerBase1; + //RTPRINT(FPHY, PHY_TXPWR, (" [MCS power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(MCSBase+i))); + } +} + +static void getTxPowerWriteValByRegulatory( + IN PADAPTER Adapter, + IN u8 Channel, + IN u8 index, + IN u32* powerBase0, + IN u32* powerBase1, + OUT u32* pOutWriteVal + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 i, chnlGroup, pwr_diff_limit[4]; + u32 writeVal, customer_limit, rf; + + // + // Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate + // + for(rf=0; rf<2; rf++) + { + switch(pHalData->EEPROMRegulatory) + { + case 0: // Realtek better performance + // increase power diff defined by Realtek for large power + chnlGroup = 0; + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + case 1: // Realtek regulatory + // increase power diff defined by Realtek for regulatory + { + if(pHalData->pwrGroupCnt == 1) + chnlGroup = 0; + if(pHalData->pwrGroupCnt >= 3) + { + if(Channel <= 3) + chnlGroup = 0; + else if(Channel >= 4 && Channel <= 9) + chnlGroup = 1; + else if(Channel > 9) + chnlGroup = 2; + + if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) + chnlGroup++; + else + chnlGroup+=4; + } + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + //chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + } + break; + case 2: // Better regulatory + // don't increase any power diff + writeVal = ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Better regulatory, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + case 3: // Customer defined power diff. + // increase power diff defined by customer. + chnlGroup = 0; + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + + if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) + { + //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 40MHz rf(%c) = 0x%x\n", + // ((rf==0)?'A':'B'), pHalData->PwrGroupHT40[rf][Channel-1])); + } + else + { + //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 20MHz rf(%c) = 0x%x\n", + // ((rf==0)?'A':'B'), pHalData->PwrGroupHT20[rf][Channel-1])); + } + for (i=0; i<4; i++) + { + pwr_diff_limit[i] = (u8)((pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]&(0x7f<<(i*8)))>>(i*8)); + if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) + { + if(pwr_diff_limit[i] > pHalData->PwrGroupHT40[rf][Channel-1]) + pwr_diff_limit[i] = pHalData->PwrGroupHT40[rf][Channel-1]; + } + else + { + if(pwr_diff_limit[i] > pHalData->PwrGroupHT20[rf][Channel-1]) + pwr_diff_limit[i] = pHalData->PwrGroupHT20[rf][Channel-1]; + } + } + customer_limit = (pwr_diff_limit[3]<<24) | (pwr_diff_limit[2]<<16) | + (pwr_diff_limit[1]<<8) | (pwr_diff_limit[0]); + //RTPRINT(FPHY, PHY_TXPWR, ("Customer's limit rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), customer_limit)); + + writeVal = customer_limit + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Customer, writeVal rf(%c)= 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + default: + chnlGroup = 0; + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + } + +// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. +// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. +// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. + + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) + writeVal = 0x14141414; + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) + writeVal = 0x00000000; + + + // 20100628 Joseph: High power mode for BT-Coexist mechanism. + // This mechanism is only applied when Driver-Highpower-Mechanism is OFF. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT1) + { + //RTPRINT(FBT, BT_TRACE, ("Tx Power (-6)\n")); + writeVal = writeVal - 0x06060606; + } + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT2) + { + //RTPRINT(FBT, BT_TRACE, ("Tx Power (-0)\n")); + writeVal = writeVal; + } + *(pOutWriteVal+rf) = writeVal; + } +} + +static void writeOFDMPowerReg( + IN PADAPTER Adapter, + IN u8 index, + IN u32* pValue + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 RegOffset_A[6] = { rTxAGC_A_Rate18_06, rTxAGC_A_Rate54_24, + rTxAGC_A_Mcs03_Mcs00, rTxAGC_A_Mcs07_Mcs04, + rTxAGC_A_Mcs11_Mcs08, rTxAGC_A_Mcs15_Mcs12}; + u16 RegOffset_B[6] = { rTxAGC_B_Rate18_06, rTxAGC_B_Rate54_24, + rTxAGC_B_Mcs03_Mcs00, rTxAGC_B_Mcs07_Mcs04, + rTxAGC_B_Mcs11_Mcs08, rTxAGC_B_Mcs15_Mcs12}; + u8 i, rf, pwr_val[4]; + u32 writeVal; + u16 RegOffset; + + for(rf=0; rf<2; rf++) + { + writeVal = pValue[rf]; + for(i=0; i<4; i++) + { + pwr_val[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8)); + if (pwr_val[i] > RF6052_MAX_TX_PWR) + pwr_val[i] = RF6052_MAX_TX_PWR; + } + writeVal = (pwr_val[3]<<24) | (pwr_val[2]<<16) |(pwr_val[1]<<8) |pwr_val[0]; + + if(rf == 0) + RegOffset = RegOffset_A[index]; + else + RegOffset = RegOffset_B[index]; + + PHY_SetBBReg(Adapter, RegOffset, bMaskDWord, writeVal); + //RTPRINT(FPHY, PHY_TXPWR, ("Set 0x%x = %08x\n", RegOffset, writeVal)); + + // 201005115 Joseph: Set Tx Power diff for Tx power training mechanism. + if(((pHalData->rf_type == RF_2T2R) && + (RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs15_Mcs12))|| + ((pHalData->rf_type != RF_2T2R) && + (RegOffset == rTxAGC_A_Mcs07_Mcs04 || RegOffset == rTxAGC_B_Mcs07_Mcs04)) ) + { + writeVal = pwr_val[3]; + if(RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_A_Mcs07_Mcs04) + RegOffset = 0xc90; + if(RegOffset == rTxAGC_B_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs07_Mcs04) + RegOffset = 0xc98; + for(i=0; i<3; i++) + { + if(i!=2) + writeVal = (writeVal>8)?(writeVal-8):0; + else + writeVal = (writeVal>6)?(writeVal-6):0; + rtw_write8(Adapter, (u32)(RegOffset+i), (u8)writeVal); + } + } + } +} +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetOFDMTxPower + * + * Overview: For legacy and HY OFDM, we must read EEPROM TX power index for + * different channel and read original value in TX power register area from + * 0xe00. We increase offset and original value to be correct tx pwr. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/05/2008 MHC Simulate 8192 series method. + * 01/06/2009 MHC 1. Prevent Path B tx power overflow or underflow dure to + * A/B pwr difference or legacy/HT pwr diff. + * 2. We concern with path B legacy/HT OFDM difference. + * 01/22/2009 MHC Support new EPRO format from SD3. + * + *---------------------------------------------------------------------------*/ +VOID +rtl8192c_PHY_RF6052SetOFDMTxPower( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel) +{ + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 writeVal[2], powerBase0[2], powerBase1[2]; + u8 index = 0; + + getPowerBase(Adapter, pPowerLevel, Channel, &powerBase0[0], &powerBase1[0]); + + for(index=0; index<6; index++) + { + getTxPowerWriteValByRegulatory(Adapter, Channel, index, + &powerBase0[0], &powerBase1[0], &writeVal[0]); + + writeOFDMPowerReg(Adapter, index, &writeVal[0]); + } + +} + + +static VOID +phy_RF6052_Config_HardCode( + IN PADAPTER Adapter + ) +{ + + // Set Default Bandwidth to 20M + //Adapter->HalFunc .SetBWModeHandler(Adapter, HT_CHANNEL_WIDTH_20); + + // TODO: Set Default Channel to channel one for RTL8225 + +} + +static int +phy_RF6052_Config_ParaFile( + IN PADAPTER Adapter + ) +{ + u32 u4RegValue; + u8 eRFPath; + BB_REGISTER_DEFINITION_T *pPhyReg; + + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + static char sz8723RadioAFile[] = RTL8723_PHY_RADIO_A; + static char sz8723RadioBFile[] = RTL8723_PHY_RADIO_B; + char *pszRadioAFile, *pszRadioBFile; + + + pszRadioAFile = sz8723RadioAFile; + pszRadioBFile = sz8723RadioBFile; + + + //3//----------------------------------------------------------------- + //3// <2> Initialize RF + //3//----------------------------------------------------------------- + //for(eRFPath = RF_PATH_A; eRFPath NumTotalRFPath; eRFPath++) + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { + + pPhyReg = &pHalData->PHYRegDef[eRFPath]; + + /*----Store original RFENV control type----*/ + switch(eRFPath) + { + case RF_PATH_A: + case RF_PATH_C: + u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV); + break; + case RF_PATH_B : + case RF_PATH_D: + u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16); + break; + } + + /*----Set RF_ENV enable----*/ + PHY_SetBBReg(Adapter, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1); + rtw_udelay_os(1);//PlatformStallExecution(1); + + /*----Set RF_ENV output high----*/ + PHY_SetBBReg(Adapter, pPhyReg->rfintfo, bRFSI_RFENV, 0x1); + rtw_udelay_os(1);//PlatformStallExecution(1); + + /* Set bit number of Address and Data for RF register */ + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0); // Set 1 to 4 bits for 8255 + rtw_udelay_os(1);//PlatformStallExecution(1); + + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0); // Set 0 to 12 bits for 8255 + rtw_udelay_os(1);//PlatformStallExecution(1); + + /*----Initialize RF fom connfiguration file----*/ + switch(eRFPath) + { + case RF_PATH_A: +#ifdef CONFIG_EMBEDDED_FWIMG + #ifdef CONFIG_PHY_SETTING_WITH_ODM + if(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,(ODM_RF_RADIO_PATH_E)eRFPath, (ODM_RF_RADIO_PATH_E)eRFPath)) + rtStatus= _FAIL; + #else + rtStatus= rtl8723a_PHY_ConfigRFWithHeaderFile(Adapter,(RF_RADIO_PATH_E)eRFPath); + #endif//#ifdef CONFIG_PHY_SETTING_WITH_ODM +#else + rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, (RF_RADIO_PATH_E)eRFPath); +#endif//#ifdef CONFIG_EMBEDDED_FWIMG + break; + case RF_PATH_B: +#ifdef CONFIG_EMBEDDED_FWIMG + #ifdef CONFIG_PHY_SETTING_WITH_ODM + if(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,(ODM_RF_RADIO_PATH_E)eRFPath, (ODM_RF_RADIO_PATH_E)eRFPath)) + rtStatus= _FAIL; + #else + rtStatus = rtl8723a_PHY_ConfigRFWithHeaderFile(Adapter,(RF_RADIO_PATH_E)eRFPath); + #endif +#else + rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, (RF_RADIO_PATH_E)eRFPath); +#endif + break; + case RF_PATH_C: + break; + case RF_PATH_D: + break; + } + + /*----Restore RFENV control type----*/; + switch(eRFPath) + { + case RF_PATH_A: + case RF_PATH_C: + PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue); + break; + case RF_PATH_B : + case RF_PATH_D: + PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue); + break; + } + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_FPGA, DBG_LOUD, ("phy_RF6052_Config_ParaFile():Radio[%d] Fail!!", eRFPath)); + goto phy_RF6052_Config_ParaFile_Fail; + } + + } + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile()\n")); + return rtStatus; + +phy_RF6052_Config_ParaFile_Fail: + return rtStatus; +} + + +int +PHY_RF6052_Config8723A( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + // + // Initialize general global value + // + // TODO: Extend RF_PATH_C and RF_PATH_D in the future + if(pHalData->rf_type == RF_1T1R) + pHalData->NumTotalRFPath = 1; + else + pHalData->NumTotalRFPath = 2; + + // + // Config BB and RF + // + rtStatus = phy_RF6052_Config_ParaFile(Adapter); + return rtStatus; + +} + + +// +// ==> RF shadow Operation API Code Section!!! +// +/*----------------------------------------------------------------------------- + * Function: PHY_RFShadowRead + * PHY_RFShadowWrite + * PHY_RFShadowCompare + * PHY_RFShadowRecorver + * PHY_RFShadowCompareAll + * PHY_RFShadowRecorverAll + * PHY_RFShadowCompareFlagSet + * PHY_RFShadowRecorverFlagSet + * + * Overview: When we set RF register, we must write shadow at first. + * When we are running, we must compare shadow abd locate error addr. + * Decide to recorver or not. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/20/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +u32 +PHY_RFShadowRead( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 Offset) +{ + return RF_Shadow[eRFPath][Offset].Value; + +} /* PHY_RFShadowRead */ + + +VOID +PHY_RFShadowWrite( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u32 Data) +{ + RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask); + RF_Shadow[eRFPath][Offset].Driver_Write = _TRUE; + +} /* PHY_RFShadowWrite */ + + +BOOLEAN +PHY_RFShadowCompare( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 Offset) +{ + u32 reg; + // Check if we need to check the register + if (RF_Shadow[eRFPath][Offset].Compare == _TRUE) + { + reg = PHY_QueryRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask); + // Compare shadow and real rf register for 20bits!! + if (RF_Shadow[eRFPath][Offset].Value != reg) + { + // Locate error position. + RF_Shadow[eRFPath][Offset].ErrorOrNot = _TRUE; + //RT_TRACE(COMP_INIT, DBG_LOUD, + //("PHY_RFShadowCompare RF-%d Addr%02lx Err = %05lx\n", + //eRFPath, Offset, reg)); + } + return RF_Shadow[eRFPath][Offset].ErrorOrNot ; + } + return _FALSE; +} /* PHY_RFShadowCompare */ + + +VOID +PHY_RFShadowRecorver( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 Offset) +{ + // Check if the address is error + if (RF_Shadow[eRFPath][Offset].ErrorOrNot == _TRUE) + { + // Check if we need to recorver the register. + if (RF_Shadow[eRFPath][Offset].Recorver == _TRUE) + { + PHY_SetRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask, + RF_Shadow[eRFPath][Offset].Value); + //RT_TRACE(COMP_INIT, DBG_LOUD, + //("PHY_RFShadowRecorver RF-%d Addr%02lx=%05lx", + //eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value)); + } + } + +} /* PHY_RFShadowRecorver */ + + +VOID +PHY_RFShadowCompareAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + PHY_RFShadowCompare(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset); + } + } + +} /* PHY_RFShadowCompareAll */ + + +VOID +PHY_RFShadowRecorverAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + PHY_RFShadowRecorver(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset); + } + } + +} /* PHY_RFShadowRecorverAll */ + + +VOID +PHY_RFShadowCompareFlagSet( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u8 Type) +{ + // Set True or False!!! + RF_Shadow[eRFPath][Offset].Compare = Type; + +} /* PHY_RFShadowCompareFlagSet */ + + +VOID +PHY_RFShadowRecorverFlagSet( + IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u8 Type) +{ + // Set True or False!!! + RF_Shadow[eRFPath][Offset].Recorver= Type; + +} /* PHY_RFShadowRecorverFlagSet */ + + +VOID +PHY_RFShadowCompareFlagSetAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! + if (Offset != 0x26 && Offset != 0x27) + PHY_RFShadowCompareFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _FALSE); + else + PHY_RFShadowCompareFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _TRUE); + } + } + +} /* PHY_RFShadowCompareFlagSetAll */ + + +VOID +PHY_RFShadowRecorverFlagSetAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! + if (Offset != 0x26 && Offset != 0x27) + PHY_RFShadowRecorverFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _FALSE); + else + PHY_RFShadowRecorverFlagSet(Adapter, (RF_RADIO_PATH_E)eRFPath, Offset, _TRUE); + } + } + +} /* PHY_RFShadowCompareFlagSetAll */ + +VOID +PHY_RFShadowRefresh( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + RF_Shadow[eRFPath][Offset].Value = 0; + RF_Shadow[eRFPath][Offset].Compare = _FALSE; + RF_Shadow[eRFPath][Offset].Recorver = _FALSE; + RF_Shadow[eRFPath][Offset].ErrorOrNot = _FALSE; + RF_Shadow[eRFPath][Offset].Driver_Write = _FALSE; + } + } + +} /* PHY_RFShadowRead */ + +/* End of HalRf6052.c */ + diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_rxdesc.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_rxdesc.c index a94370cd1a75..f030eb821291 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_rxdesc.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_rxdesc.c @@ -245,7 +245,7 @@ void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pp // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) // - if(padapter->pwrctrlpriv.rf_pwrstate == rf_on) + if(adapter_to_pwrctl(padapter)->rf_pwrstate == rf_on) cck_highpwr = (u8)pHalData->bCckHighPower; else cck_highpwr = _FALSE; diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_sreset.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_sreset.c index 3edd244c0825..24028a36508d 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_sreset.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_sreset.c @@ -1,104 +1,111 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8723A_SRESET_C_ - -#include -#include - - -#ifdef DBG_CONFIG_ERROR_DETECT -void rtl8723a_sreset_xmit_status_check(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - unsigned long current_time; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - unsigned int diff_time; - u32 txdma_status; - - - if( (txdma_status=rtw_read32(padapter, REG_TXDMA_STATUS)) !=0x00){ - DBG_871X("%s REG_TXDMA_STATUS:0x%08x\n", __FUNCTION__, txdma_status); - rtw_hal_sreset_reset(padapter); - } - -#ifdef CONFIG_USB_HCI - //total xmit irp = 4 - //DBG_8192C("==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\n",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt); - //if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1) - current_time = rtw_get_current_time(); - - if(0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) { - - diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_time); - - if (diff_time > 2000) { - if (psrtpriv->last_tx_complete_time == 0) { - psrtpriv->last_tx_complete_time = current_time; - } - else{ - diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time); - if (diff_time > 4000) { - //padapter->Wifi_Error_Status = WIFI_TX_HANG; - DBG_871X("%s tx hang\n", __FUNCTION__); - rtw_hal_sreset_reset(padapter); - } - } - } - } -#endif // #ifdef CONFIG_USB_HCI - - if (psrtpriv->dbg_trigger_point == SRESET_TGP_XMIT_STATUS) { - psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; - rtw_hal_sreset_reset(padapter); - return; - } -} - -void rtl8723a_sreset_linked_status_check(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; -#if 0 - u32 regc50,regc58,reg824,reg800; - regc50 = rtw_read32(padapter,0xc50); - regc58 = rtw_read32(padapter,0xc58); - reg824 = rtw_read32(padapter,0x824); - reg800 = rtw_read32(padapter,0x800); - if( ((regc50&0xFFFFFF00)!= 0x69543400)|| - ((regc58&0xFFFFFF00)!= 0x69543400)|| - (((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))|| - ( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000))) - { - DBG_8192C("%s regc50:0x%08x, regc58:0x%08x, reg824:0x%08x, reg800:0x%08x,\n", __FUNCTION__, - regc50, regc58, reg824, reg800); - rtw_hal_sreset_reset(padapter); - } -#endif - - if (psrtpriv->dbg_trigger_point == SRESET_TGP_LINK_STATUS) { - psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; - rtw_hal_sreset_reset(padapter); - return; - } -} -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8723A_SRESET_C_ + +#include +#include + + +#ifdef DBG_CONFIG_ERROR_DETECT +void rtl8723a_sreset_xmit_status_check(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + unsigned long current_time; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + unsigned int diff_time; + u32 txdma_status; + + + if( (txdma_status=rtw_read32(padapter, REG_TXDMA_STATUS)) !=0x00){ + DBG_871X("%s REG_TXDMA_STATUS:0x%08x\n", __FUNCTION__, txdma_status); + rtw_hal_sreset_reset(padapter); + } + +#ifdef CONFIG_USB_HCI + //total xmit irp = 4 + //DBG_8192C("==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\n",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt); + //if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1) + current_time = rtw_get_current_time(); + + if(0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) { + + diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_time); + + if (diff_time > 2000) { + if (psrtpriv->last_tx_complete_time == 0) { + psrtpriv->last_tx_complete_time = current_time; + } + else{ + diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time); + if (diff_time > 4000) { + u32 ability; + + //padapter->Wifi_Error_Status = WIFI_TX_HANG; + rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DM_FUNC, &ability); + + DBG_871X("%s tx hang %s\n", __FUNCTION__, + (ability & ODM_BB_ADAPTIVITY)? "ODM_BB_ADAPTIVITY" : ""); + + if (!(ability & ODM_BB_ADAPTIVITY)) + rtw_hal_sreset_reset(padapter); + } + } + } + } +#endif // #ifdef CONFIG_USB_HCI + + if (psrtpriv->dbg_trigger_point == SRESET_TGP_XMIT_STATUS) { + psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; + rtw_hal_sreset_reset(padapter); + return; + } +} + +void rtl8723a_sreset_linked_status_check(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; +#if 0 + u32 regc50,regc58,reg824,reg800; + regc50 = rtw_read32(padapter,0xc50); + regc58 = rtw_read32(padapter,0xc58); + reg824 = rtw_read32(padapter,0x824); + reg800 = rtw_read32(padapter,0x800); + if( ((regc50&0xFFFFFF00)!= 0x69543400)|| + ((regc58&0xFFFFFF00)!= 0x69543400)|| + (((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))|| + ( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000))) + { + DBG_8192C("%s regc50:0x%08x, regc58:0x%08x, reg824:0x%08x, reg800:0x%08x,\n", __FUNCTION__, + regc50, regc58, reg824, reg800); + rtw_hal_sreset_reset(padapter); + } +#endif + + if (psrtpriv->dbg_trigger_point == SRESET_TGP_LINK_STATUS) { + psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; + rtw_hal_sreset_reset(padapter); + return; + } +} +#endif + diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_xmit.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_xmit.c index d2dc99074f20..7f705a93c118 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_xmit.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_xmit.c @@ -1,65 +1,65 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8723A_XMIT_C_ - -#include -#include -#include -#include - -#ifdef CONFIG_XMIT_ACK -void dump_txrpt_ccx_8723a(void *buf) -{ - struct txrpt_ccx_8723a *txrpt_ccx = buf; - - DBG_871X("%s:\n" - "tag1:%u, rsvd:%u, int_bt:%u, int_tri:%u, int_ccx:%u\n" - "mac_id:%u, pkt_drop:%u, pkt_ok:%u, bmc:%u\n" - "retry_cnt:%u, lifetime_over:%u, retry_over:%u\n" - "ccx_qtime:%u\n" - "final_data_rate:0x%02x\n" - "qsel:%u, sw:0x%03x\n" - , __func__ - , txrpt_ccx->tag1, txrpt_ccx->rsvd, txrpt_ccx->int_bt, txrpt_ccx->int_tri, txrpt_ccx->int_ccx - , txrpt_ccx->mac_id, txrpt_ccx->pkt_drop, txrpt_ccx->pkt_ok, txrpt_ccx->bmc - , txrpt_ccx->retry_cnt, txrpt_ccx->lifetime_over, txrpt_ccx->retry_over - , txrpt_ccx_qtime_8723a(txrpt_ccx) - , txrpt_ccx->final_data_rate - , txrpt_ccx->qsel, txrpt_ccx_sw_8723a(txrpt_ccx) - ); -} - -void handle_txrpt_ccx_8723a(_adapter *adapter, void *buf) -{ - struct txrpt_ccx_8723a *txrpt_ccx = buf; - - #ifdef DBG_CCX - dump_txrpt_ccx_8723a(buf); - #endif - - if (txrpt_ccx->int_ccx) { - if (txrpt_ccx->pkt_ok) - rtw_ack_tx_done(&adapter->xmitpriv, RTW_SCTX_DONE_SUCCESS); - else - rtw_ack_tx_done(&adapter->xmitpriv, RTW_SCTX_DONE_CCX_PKT_FAIL); - } -} -#endif //CONFIG_XMIT_ACK - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8723A_XMIT_C_ + +#include +#include +#include +#include + +#ifdef CONFIG_XMIT_ACK +void dump_txrpt_ccx_8723a(void *buf) +{ + struct txrpt_ccx_8723a *txrpt_ccx = buf; + + DBG_871X("%s:\n" + "tag1:%u, rsvd:%u, int_bt:%u, int_tri:%u, int_ccx:%u\n" + "mac_id:%u, pkt_drop:%u, pkt_ok:%u, bmc:%u\n" + "retry_cnt:%u, lifetime_over:%u, retry_over:%u\n" + "ccx_qtime:%u\n" + "final_data_rate:0x%02x\n" + "qsel:%u, sw:0x%03x\n" + , __func__ + , txrpt_ccx->tag1, txrpt_ccx->rsvd, txrpt_ccx->int_bt, txrpt_ccx->int_tri, txrpt_ccx->int_ccx + , txrpt_ccx->mac_id, txrpt_ccx->pkt_drop, txrpt_ccx->pkt_ok, txrpt_ccx->bmc + , txrpt_ccx->retry_cnt, txrpt_ccx->lifetime_over, txrpt_ccx->retry_over + , txrpt_ccx_qtime_8723a(txrpt_ccx) + , txrpt_ccx->final_data_rate + , txrpt_ccx->qsel, txrpt_ccx_sw_8723a(txrpt_ccx) + ); +} + +void handle_txrpt_ccx_8723a(_adapter *adapter, void *buf) +{ + struct txrpt_ccx_8723a *txrpt_ccx = buf; + + #ifdef DBG_CCX + dump_txrpt_ccx_8723a(buf); + #endif + + if (txrpt_ccx->int_ccx) { + if (txrpt_ccx->pkt_ok) + rtw_ack_tx_done(&adapter->xmitpriv, RTW_SCTX_DONE_SUCCESS); + else + rtw_ack_tx_done(&adapter->xmitpriv, RTW_SCTX_DONE_CCX_PKT_FAIL); + } +} +#endif //CONFIG_XMIT_ACK + diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_led.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_led.c index b7511deaf49f..597bb30261d8 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_led.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_led.c @@ -1,129 +1,129 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8723AS_LED_C_ - -#include "drv_types.h" -#include "rtl8723a_hal.h" - -//================================================================================ -// LED object. -//================================================================================ - - -//================================================================================ -// Prototype of protected function. -//================================================================================ - -//================================================================================ -// LED_819xUsb routines. -//================================================================================ - -// -// Description: -// Turn on LED according to LedPin specified. -// -void -SwLedOn( - _adapter *padapter, - PLED_871x pLed -) -{ - u8 LedCfg; - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) - { - return; - } - - pLed->bLedOn = _TRUE; - -} - - -// -// Description: -// Turn off LED according to LedPin specified. -// -void -SwLedOff( - _adapter *padapter, - PLED_871x pLed -) -{ - u8 LedCfg; - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - if((padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) - { - goto exit; - } - -exit: - pLed->bLedOn = _FALSE; - -} - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ - -//================================================================================ -// Default LED behavior. -//================================================================================ - -// -// Description: -// Initialize all LED_871x objects. -// -void -rtl8723as_InitSwLeds( - _adapter *padapter - ) -{ - struct led_priv *pledpriv = &(padapter->ledpriv); - - pledpriv->LedControlHandler = LedControl871x; -#if 0 - - InitLed871x(padapter, &(pledpriv->SwLed0), LED_PIN_LED0); - - InitLed871x(padapter,&(pledpriv->SwLed1), LED_PIN_LED1); -#endif -} - - -// -// Description: -// DeInitialize all LED_819xUsb objects. -// -void -rtl8723as_DeInitSwLeds( - _adapter *padapter - ) -{ -#if 0 - struct led_priv *ledpriv = &(padapter->ledpriv); - - DeInitLed871x( &(ledpriv->SwLed0) ); - DeInitLed871x( &(ledpriv->SwLed1) ); -#endif -} - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTL8723AS_LED_C_ + +#include "drv_types.h" +#include "rtl8723a_hal.h" + +//================================================================================ +// LED object. +//================================================================================ + + +//================================================================================ +// Prototype of protected function. +//================================================================================ + +//================================================================================ +// LED_819xUsb routines. +//================================================================================ + +// +// Description: +// Turn on LED according to LedPin specified. +// +void +SwLedOn( + _adapter *padapter, + PLED_871x pLed +) +{ + u8 LedCfg; + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + return; + } + + pLed->bLedOn = _TRUE; + +} + + +// +// Description: +// Turn off LED according to LedPin specified. +// +void +SwLedOff( + _adapter *padapter, + PLED_871x pLed +) +{ + u8 LedCfg; + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if((padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + goto exit; + } + +exit: + pLed->bLedOn = _FALSE; + +} + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ + +//================================================================================ +// Default LED behavior. +//================================================================================ + +// +// Description: +// Initialize all LED_871x objects. +// +void +rtl8723as_InitSwLeds( + _adapter *padapter + ) +{ + struct led_priv *pledpriv = &(padapter->ledpriv); + + pledpriv->LedControlHandler = LedControl871x; +#if 0 + + InitLed871x(padapter, &(pledpriv->SwLed0), LED_PIN_LED0); + + InitLed871x(padapter,&(pledpriv->SwLed1), LED_PIN_LED1); +#endif +} + + +// +// Description: +// DeInitialize all LED_819xUsb objects. +// +void +rtl8723as_DeInitSwLeds( + _adapter *padapter + ) +{ +#if 0 + struct led_priv *ledpriv = &(padapter->ledpriv); + + DeInitLed871x( &(ledpriv->SwLed0) ); + DeInitLed871x( &(ledpriv->SwLed1) ); +#endif +} + diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_recv.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_recv.c index d2baae9e28ca..ad2066fe9610 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_recv.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_recv.c @@ -155,12 +155,7 @@ void update_recvframe_phyinfo( } pkt_info.Rate = pattrib->mcs_rate; - #ifdef CONFIG_CONCURRENT_MODE - //get Primary adapter's odmpriv - if(padapter->adapter_type > PRIMARY_ADAPTER){ - pHalData = GET_HAL_DATA(padapter->pbuddy_adapter); - } - #endif + //rtl8192c_query_rx_phy_status(precvframe, pphy_status); //_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL); ODM_PhyStatusQuery(&pHalData->odmpriv,pPHYInfo,(u8 *)pphy_status,&(pkt_info)); @@ -234,24 +229,24 @@ static s32 pre_recv_entry(union recv_frame *precvframe, struct recv_buf *precvbu _rtw_memcpy(&precvframe_if2->u.hdr.attrib, &precvframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib)); pattrib = &precvframe_if2->u.hdr.attrib; - //driver need to set skb len for skb_copy(). - //If skb->len is zero, skb_copy() will not copy data from original skb. + //driver need to set skb len for rtw_skb_copy(). + //If skb->len is zero, rtw_skb_copy() will not copy data from original skb. skb_put(precvframe->u.hdr.pkt, pattrib->pkt_len); - pkt_copy = skb_copy( precvframe->u.hdr.pkt, GFP_ATOMIC); + pkt_copy = rtw_skb_copy(precvframe->u.hdr.pkt); if (pkt_copy == NULL) { if((pattrib->mfrag == 1)&&(pattrib->frag_num == 0)) { - DBG_8192C("pre_recv_entry(): skb_copy fail , drop frag frame \n"); + DBG_8192C("pre_recv_entry(): rtw_skb_copy fail , drop frag frame \n"); rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue); return ret; } - pkt_copy = skb_clone( precvframe->u.hdr.pkt, GFP_ATOMIC); + pkt_copy = rtw_skb_clone(precvframe->u.hdr.pkt); if(pkt_copy == NULL) { - DBG_8192C("pre_recv_entry(): skb_clone fail , drop frame\n"); + DBG_8192C("pre_recv_entry(): rtw_skb_clone fail , drop frame\n"); rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue); return ret; } @@ -330,9 +325,11 @@ void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf) // fix Hardware RX data error, drop whole recv_buffer if ((!(pHalData->ReceiveConfig & RCR_ACRC32)) && pattrib->crc_err) { - #if !(MP_DRIVER==1) - DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__); - #endif + if (padapter->registrypriv.mp_mode == 1) + padapter->mppriv.rx_crcerrpktcount++; + else + DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__); + rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue); break; } @@ -352,6 +349,7 @@ void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf) if ((pattrib->crc_err) || (pattrib->icv_err)) { + if (padapter->registrypriv.mp_mode == 0) DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err); rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue); } @@ -386,11 +384,8 @@ void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf) alloc_sz += 14; } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pkt_copy = __dev_alloc_skb(alloc_sz, GFP_KERNEL); -#else - pkt_copy = __netdev_alloc_skb(padapter->pnetdev, alloc_sz, GFP_KERNEL); -#endif + pkt_copy = rtw_skb_alloc(alloc_sz); + if(pkt_copy) { pkt_copy->dev = padapter->pnetdev; @@ -411,7 +406,7 @@ void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf) break; } - precvframe->u.hdr.pkt = skb_clone(precvbuf->pskb, GFP_ATOMIC); + precvframe->u.hdr.pkt = rtw_skb_clone(precvbuf->pskb); if(precvframe->u.hdr.pkt) { _pkt *pkt_clone = precvframe->u.hdr.pkt; @@ -424,7 +419,7 @@ void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf) } else { - DBG_8192C("rtl8723as_recv_tasklet: skb_clone fail\n"); + DBG_8192C("rtl8723as_recv_tasklet: rtw_skb_clone fail\n"); rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue); break; } @@ -531,9 +526,11 @@ static void rtl8723as_recv_tasklet(void *priv) // fix Hardware RX data error, drop whole recv_buffer if ((!(pHalData->ReceiveConfig & RCR_ACRC32)) && pattrib->crc_err) { - #if !(MP_DRIVER==1) - DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__); - #endif + if (padapter->registrypriv.mp_mode == 1) + padapter->mppriv.rx_crcerrpktcount++; + else + DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__); + rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue); break; } @@ -553,6 +550,7 @@ static void rtl8723as_recv_tasklet(void *priv) if ((pattrib->crc_err) || (pattrib->icv_err)) { + if (padapter->registrypriv.mp_mode == 0) DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err); rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue); } @@ -587,11 +585,8 @@ static void rtl8723as_recv_tasklet(void *priv) alloc_sz += 14; } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pkt_copy = dev_alloc_skb(alloc_sz); -#else - pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz); -#endif + pkt_copy = rtw_skb_alloc(alloc_sz); + if(pkt_copy) { pkt_copy->dev = padapter->pnetdev; @@ -612,7 +607,7 @@ static void rtl8723as_recv_tasklet(void *priv) break; } - precvframe->u.hdr.pkt = skb_clone(precvbuf->pskb, GFP_ATOMIC); + precvframe->u.hdr.pkt = rtw_skb_clone(precvbuf->pskb); if(precvframe->u.hdr.pkt) { _pkt *pkt_clone = precvframe->u.hdr.pkt; @@ -625,7 +620,7 @@ static void rtl8723as_recv_tasklet(void *priv) } else { - DBG_8192C("rtl8723as_recv_tasklet: skb_clone fail\n"); + DBG_8192C("rtl8723as_recv_tasklet: rtw_skb_clone fail\n"); rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue); break; } @@ -730,7 +725,10 @@ static void rtl8723as_recv_tasklet(void *priv) // fix Hardware RX data error, drop whole recv_buffer if ((!(pHalData->ReceiveConfig & RCR_ACRC32)) && pattrib->crc_err) { - DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__); + if (padapter->registrypriv.mp_mode == 1) + padapter->mppriv.rx_crcerrpktcount++; + else + DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__); rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue); break; } @@ -748,12 +746,13 @@ static void rtl8723as_recv_tasklet(void *priv) if ((pattrib->crc_err) || (pattrib->icv_err)) { + if (padapter->registrypriv.mp_mode == 0) DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err); rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue); } else { - ppkt = skb_clone(precvbuf->pskb, GFP_ATOMIC); + ppkt = rtw_skb_clone(precvbuf->pskb); if (ppkt == NULL) { RT_TRACE(_module_rtl871x_recv_c_, _drv_crit_, ("rtl8723as_recv_tasklet: no enough memory to allocate SKB!\n")); @@ -819,7 +818,7 @@ static void rtl8723as_recv_tasklet(void *priv) ptr = precvbuf->pdata; } - dev_kfree_skb_any(precvbuf->pskb); + rtw_skb_free(precvbuf->pskb); precvbuf->pskb = NULL; rtw_enqueue_recvbuf(precvbuf, &precvpriv->free_recv_buf_queue); } while (1); @@ -876,11 +875,7 @@ s32 rtl8723as_init_recv_priv(PADAPTER padapter) SIZE_PTR tmpaddr=0; SIZE_PTR alignment=0; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - precvbuf->pskb = __dev_alloc_skb(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, GFP_KERNEL); -#else - precvbuf->pskb = __netdev_alloc_skb(padapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, GFP_KERNEL); -#endif + precvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); if(precvbuf->pskb) { diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_xmit.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_xmit.c index eb7e41af96c1..a07063a16bba 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_xmit.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_xmit.c @@ -105,7 +105,13 @@ s32 rtl8723_dequeue_writeport(PADAPTER padapter, u8 *freePage) } // _exit_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql); - ret = (padapter->bDriverStopped == _TRUE) || (padapter->bSurpriseRemoved == _TRUE); + ret = (padapter->bDriverStopped == _TRUE) || (padapter->bSurpriseRemoved == _TRUE) +#ifdef CONFIG_CONCURRENT_MODE + ||((padapter->pbuddy_adapter) + && ((padapter->pbuddy_adapter->bSurpriseRemoved) ||(padapter->pbuddy_adapter->bDriverStopped))) +#endif + ; + if (ret) { RT_TRACE(_module_hal_xmit_c_, _drv_notice_, ("%s: bSurpriseRemoved(update TX FIFO page)\n", __func__)); @@ -114,11 +120,27 @@ s32 rtl8723_dequeue_writeport(PADAPTER padapter, u8 *freePage) n++; //if ((n & 0x3FF) == 0) - if ((n % 2) == 0) + if ((n % 100) == 0) { - if (n > 5000) { + if (n >= 5000) { + u8 reg_value_1 = 0; + u8 reg_value_2 = 0; + u8 reg_value_3 = 0; + DBG_8192C(KERN_NOTICE "%s: FIFO starvation!(%d) len=%d agg=%d page=(R)%d(A)%d\n", __func__, n, pxmitbuf->len, pxmitbuf->agg_num, pxmitbuf->pg_num, freePage[PageIdx] + freePage[PUBLIC_QUEUE_IDX]); + + //try to recover the transmission + reg_value_1 = rtw_read8(padapter, REG_SYS_FUNC_EN); + reg_value_2 = rtw_read8(padapter, REG_CR); + reg_value_3 = rtw_read8(padapter, REG_TXPAUSE); + DBG_871X("Before recovery: REG_SYS_FUNC_EN = 0x%X, REG_CR = 0x%X, REG_TXPAUSE = 0x%X\n", reg_value_1, reg_value_2, reg_value_3); + + rtw_write8(padapter, REG_SYS_FUNC_EN, reg_value_1 | 0x01); + rtw_write8(padapter, REG_CR, reg_value_2 | 0xC0); + rtw_write8(padapter, REG_TXPAUSE, 0); + DBG_871X("After recovery: REG_SYS_FUNC_EN = 0x%X, REG_CR = 0x%X, REG_TXPAUSE = 0x%X\n", + rtw_read8(padapter, REG_SYS_FUNC_EN), rtw_read8(padapter, REG_CR), rtw_read8(padapter, REG_TXPAUSE)); } else { //RT_TRACE(_module_hal_xmit_c_, _drv_notice_, // ("%s: FIFO starvation!(%d) len=%d agg=%d page=(R)%d(A)%d\n", @@ -348,6 +370,7 @@ static s32 xmit_xmitframes(PADAPTER padapter, struct xmit_priv *pxmitpriv) if (ret == _FAIL) { RT_TRACE(_module_hal_xmit_c_, _drv_err_, ("%s: coalesce FAIL!", __FUNCTION__)); // Todo: error handler + DBG_871X("%s: coalesce FAIL!", __FUNCTION__); } else { k++; if (k != 1) @@ -421,16 +444,14 @@ static s32 xmit_xmitframes(PADAPTER padapter, struct xmit_priv *pxmitpriv) s32 rtl8723as_xmit_handler(PADAPTER padapter) { struct xmit_priv *pxmitpriv; - PHAL_DATA_TYPE phal; s32 ret; _irqL irql; pxmitpriv = &padapter->xmitpriv; - phal = GET_HAL_DATA(padapter); wait: - ret = _rtw_down_sema(&phal->SdioXmitSema); + ret = _rtw_down_sema(&pxmitpriv->SdioXmitSema); if (_FAIL == ret) { RT_TRACE(_module_hal_xmit_c_, _drv_emerg_, ("%s: down sema fail!\n", __FUNCTION__)); return _FAIL; @@ -475,13 +496,11 @@ thread_return rtl8723as_xmit_thread(thread_context context) { PADAPTER padapter; struct xmit_priv *pxmitpriv; - PHAL_DATA_TYPE phal; s32 ret; padapter = (PADAPTER)context; pxmitpriv = &padapter->xmitpriv; - phal = GET_HAL_DATA(padapter); ret = _SUCCESS; thread_enter("RTWHALXT"); @@ -493,7 +512,7 @@ thread_return rtl8723as_xmit_thread(thread_context context) } } while (_SUCCESS == ret); - _rtw_up_sema(&phal->SdioXmitTerminateSema); + _rtw_up_sema(&pxmitpriv->SdioXmitTerminateSema); RT_TRACE(_module_hal_xmit_c_, _drv_notice_, ("-%s\n", __FUNCTION__)); @@ -556,14 +575,12 @@ s32 rtl8723as_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe) s32 rtl8723as_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe) { struct xmit_priv *pxmitpriv; - PHAL_DATA_TYPE phal; _irqL irql; s32 err; pxmitframe->attrib.qsel = pxmitframe->attrib.priority; pxmitpriv = &padapter->xmitpriv; - phal = GET_HAL_DATA(padapter); #ifdef CONFIG_80211N_HT if ((pxmitframe->frame_tag == DATA_FRAMETAG) && @@ -589,7 +606,7 @@ s32 rtl8723as_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe) return _TRUE; } - _rtw_up_sema(&phal->SdioXmitSema); + _rtw_up_sema(&pxmitpriv->SdioXmitSema); return _FALSE; } @@ -597,7 +614,6 @@ s32 rtl8723as_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe) s32 rtl8723as_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe) { struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); s32 err; if ((err=rtw_xmitframe_enqueue(padapter, pxmitframe)) != _SUCCESS) @@ -613,7 +629,7 @@ s32 rtl8723as_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmit #ifdef CONFIG_SDIO_TX_TASKLET tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); #else - _rtw_up_sema(&pHalData->SdioXmitSema); + _rtw_up_sema(&pxmitpriv->SdioXmitSema); #endif } @@ -629,14 +645,15 @@ s32 rtl8723as_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmit */ s32 rtl8723as_init_xmit_priv(PADAPTER padapter) { + struct xmit_priv *xmitpriv = &padapter->xmitpriv; PHAL_DATA_TYPE phal; phal = GET_HAL_DATA(padapter); _rtw_spinlock_init(&phal->SdioTxFIFOFreePageLock); - _rtw_init_sema(&phal->SdioXmitSema, 0); - _rtw_init_sema(&phal->SdioXmitTerminateSema, 0); + _rtw_init_sema(&xmitpriv->SdioXmitSema, 0); + _rtw_init_sema(&xmitpriv->SdioXmitTerminateSema, 0); return _SUCCESS; } diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_halinit.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_halinit.c index f02e85a9c44e..bd4429d3e11c 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_halinit.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_halinit.c @@ -823,7 +823,7 @@ static void _RfPowerSave(PADAPTER padapter) pHalData = GET_HAL_DATA(padapter); // pMgntInfo = &padapter->MgntInfo; - pwrctrlpriv = &padapter->pwrctrlpriv; + pwrctrlpriv = adapter_to_pwrctl(padapter); // // 2010/08/11 MH Merge from 8192SE for Minicard init. We need to confirm current radio status @@ -989,7 +989,7 @@ static BOOLEAN HalDetectPwrDownMode(PADAPTER Adapter) { u8 tmpvalue; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter); EFUSE_ShadowRead(Adapter, 1, 0x7B/*EEPROM_RF_OPT3_92C*/, (u32 *)&tmpvalue); @@ -1024,7 +1024,7 @@ static u32 rtl8723as_hal_init(PADAPTER padapter) pHalData = GET_HAL_DATA(padapter); - pwrctrlpriv = &padapter->pwrctrlpriv; + pwrctrlpriv = adapter_to_pwrctl(padapter); pregistrypriv = &padapter->registrypriv; is92C = IS_92C_SERIAL(pHalData->VersionID); @@ -1112,7 +1112,7 @@ static u32 rtl8723as_hal_init(PADAPTER padapter) } else #endif - rtw_write8(padapter, REG_EARLY_MODE_CONTROL, 0); + //rtw_write8(padapter, REG_EARLY_MODE_CONTROL, 0); #if (MP_DRIVER == 1) if (padapter->registrypriv.mp_mode == 1) @@ -1121,7 +1121,7 @@ static u32 rtl8723as_hal_init(PADAPTER padapter) //RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("%s: Don't Download Firmware!!\n", __FUNCTION__)); //padapter->bFWReady = _FALSE; } - else +// else #endif { ret = rtl8723a_FirmwareDownload(padapter); @@ -1841,7 +1841,7 @@ static u32 Hal_readPGDataFromConfigFile( temp[2] = 0; // add end of string '\0' - fp = filp_open("/system/etc/wifi/wifi_efuse.map", O_RDWR, 0644); + fp = filp_open("/system/etc/wifi/wifi_efuse.map", O_RDONLY, 0); if (IS_ERR(fp)) { pEEPROM->bloadfile_fail_flag = _TRUE; DBG_871X("Error, Efuse configure file doesn't exist.\n"); @@ -1981,6 +1981,11 @@ readAdapterInfo( Hal_InitChannelPlan(padapter); Hal_CustomizeByCustomerID_8723AS(padapter); +#ifdef CONFIG_RF_GAIN_OFFSET + Hal_ReadRFGainOffset(padapter, hwinfo, pEEPROM->bautoload_fail_flag); +#endif //CONFIG_RF_GAIN_OFFSET + + RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("<==== readpadapterInfo_8723S()\n")); } @@ -2102,6 +2107,9 @@ _func_enter_; switch (variable) { + case HW_VAR_GET_CPWM: + *val = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HCPWM1); + break; default: GetHwReg8723A(padapter, variable, val); break; @@ -2142,22 +2150,11 @@ GetHalDefVar8723ASDIO( case HAL_DEF_DBG_DUMP_RXPKT: *(( u8*)pValue) = pHalData->bDumpRxPkt; break; - case HAL_DEF_DBG_DM_FUNC: - *(( u32*)pValue) =pHalData->odmpriv.SupportAbility; - break; case HW_VAR_MAX_RX_AMPDU_FACTOR: *(( u32*)pValue) = MAX_AMPDU_FACTOR_64K; - break; - case HW_DEF_ODM_DBG_FLAG: - { - u8Byte DebugComponents = *((u32*)pValue); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - printk("pDM_Odm->DebugComponents = 0x%llx \n",pDM_Odm->DebugComponents ); - } break; default: - //RT_TRACE(COMP_INIT, DBG_WARNING, ("GetHalDefVar8723ASDIO(): Unkown variable: %d!\n", eVariable)); - bResult = _FAIL; + bResult = GetHalDefVar(Adapter, eVariable, pValue); break; } @@ -2222,27 +2219,8 @@ SetHalDefVar8723ASDIO( } } break; - case HW_DEF_FA_CNT_DUMP: - { - u8 bRSSIDump = *((u8*)pValue); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - if(bRSSIDump) - pDM_Odm->DebugComponents = ODM_COMP_DIG|ODM_COMP_FA_CNT ; - else - pDM_Odm->DebugComponents = 0; - - } - break; - case HW_DEF_ODM_DBG_FLAG: - { - u8Byte DebugComponents = *((u8Byte*)pValue); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - pDM_Odm->DebugComponents = DebugComponents; - } - break; default: - //RT_TRACE(COMP_INIT, DBG_TRACE, ("SetHalDefVar819xUsb(): Unkown variable: %d!\n", eVariable)); - bResult = _FAIL; + bResult = SetHalDefVar(Adapter, eVariable, pValue); break; } @@ -2263,10 +2241,7 @@ void UpdateHalRAMask8192CUsb(PADAPTER padapter, u32 mac_id, u8 rssi_level) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); -#ifdef CONFIG_CONCURRENT_MODE - if(rtw_buddy_adapter_up(padapter) && padapter->adapter_type > PRIMARY_ADAPTER) - pHalData = GET_HAL_DATA(padapter->pbuddy_adapter); -#endif //CONFIG_CONCURRENT_MODE + if (mac_id >= NUM_STA) //CAM_SIZE { @@ -2378,14 +2353,21 @@ void rtl8723as_set_hal_ops(PADAPTER padapter) _func_enter_; - //set hardware operation functions - padapter->HalData = rtw_zmalloc(sizeof(HAL_DATA_TYPE)); - if (padapter->HalData == NULL) { - RT_TRACE(_module_hci_hal_init_c_, _drv_err_, - ("can't alloc memory for HAL DATA\n")); + +#ifdef CONFIG_CONCURRENT_MODE + if(padapter->isprimary) +#endif //CONFIG_CONCURRENT_MODE + { + //set hardware operation functions + padapter->HalData = rtw_zmalloc(sizeof(HAL_DATA_TYPE)); + if(padapter->HalData == NULL){ + DBG_8192C("cant not alloc memory for HAL DATA \n"); + } } + + //_rtw_memset(padapter->HalData, 0, sizeof(HAL_DATA_TYPE)); + padapter->hal_data_sz = sizeof(HAL_DATA_TYPE); - padapter->hal_data_sz = sizeof(HAL_DATA_TYPE); rtl8723a_set_hal_ops(pHalFunc); diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_ops.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_ops.c index a5e60de92085..c319fb5ec643 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_ops.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_ops.c @@ -19,34 +19,12 @@ #define _SDIO_OPS_C_ #include +#include #include #include //#define SDIO_DEBUG_IO 1 -#define SDIO_ERR_VAL8 0xEA -#define SDIO_ERR_VAL16 0xEAEA -#define SDIO_ERR_VAL32 0xEAEAEAEA - -extern u8 sd_f0_read8(PSDIO_DATA psdio, u32 addr, s32 *err); -extern void sd_f0_write8(PSDIO_DATA psdio, u32 addr, s32 *err); - -extern s32 _sd_cmd52_read(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata); -extern s32 _sd_cmd52_write(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata); -extern s32 sd_cmd52_read(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata); -extern s32 sd_cmd52_write(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata); - -extern u8 sd_read8(PSDIO_DATA psdio, u32 addr, s32 *err); -extern u16 sd_read16(PSDIO_DATA psdio, u32 addr, s32 *err); -extern u32 sd_read32(PSDIO_DATA psdio, u32 addr, s32 *err); -extern s32 _sd_read(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata); -extern s32 sd_read(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata); -extern void sd_write8(PSDIO_DATA psdio, u32 addr, u8 v, s32 *err); -extern void sd_write16(PSDIO_DATA psdio, u32 addr, u16 v, s32 *err); -extern void sd_write32(PSDIO_DATA psdio, u32 addr, u32 v, s32 *err); -extern s32 _sd_write(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata); -extern s32 sd_write(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata); - // // Description: // The following mapping is for SDIO host local register space. @@ -183,18 +161,12 @@ static u32 _cvrt2ftaddr(const u32 addr, u8 *pdeviceId, u16 *poffset) u8 sdio_read8(struct intf_hdl *pintfhdl, u32 addr) { - struct dvobj_priv *psdiodev; - PSDIO_DATA psdio; u32 ftaddr; u8 val; _func_enter_; - - psdiodev = pintfhdl->pintf_dev; - psdio = &psdiodev->intf_data; - ftaddr = _cvrt2ftaddr(addr, NULL, NULL); - val = sd_read8(psdio, ftaddr, NULL); + val = sd_read8(pintfhdl, ftaddr, NULL); _func_exit_; @@ -203,18 +175,13 @@ _func_exit_; u16 sdio_read16(struct intf_hdl *pintfhdl, u32 addr) { - struct dvobj_priv *psdiodev; - PSDIO_DATA psdio; u32 ftaddr; u16 val; _func_enter_; - psdiodev = pintfhdl->pintf_dev; - psdio = &psdiodev->intf_data; - ftaddr = _cvrt2ftaddr(addr, NULL, NULL); - sd_cmd52_read(psdio, ftaddr, 2, (u8*)&val); + sd_cmd52_read(pintfhdl, ftaddr, 2, (u8*)&val); val = le16_to_cpu(val); _func_exit_; @@ -225,8 +192,6 @@ _func_exit_; u32 sdio_read32(struct intf_hdl *pintfhdl, u32 addr) { PADAPTER padapter; - struct dvobj_priv *psdiodev; - PSDIO_DATA psdio; u8 bMacPwrCtrlOn; u8 deviceId; u16 offset; @@ -238,8 +203,6 @@ u32 sdio_read32(struct intf_hdl *pintfhdl, u32 addr) _func_enter_; padapter = pintfhdl->padapter; - psdiodev = pintfhdl->pintf_dev; - psdio = &psdiodev->intf_data; ftaddr = _cvrt2ftaddr(addr, &deviceId, &offset); @@ -247,11 +210,11 @@ _func_enter_; if (((deviceId == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) || (_FALSE == bMacPwrCtrlOn) #ifdef CONFIG_LPS_LCLK - || (_TRUE == padapter->pwrctrlpriv.bFwCurrentInPSMode) + || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode) #endif ) { - err = sd_cmd52_read(psdio, ftaddr, 4, (u8*)&val); + err = sd_cmd52_read(pintfhdl, ftaddr, 4, (u8*)&val); #ifdef SDIO_DEBUG_IO if (!err) { #endif @@ -268,7 +231,7 @@ _func_enter_; // 4 bytes alignment shift = ftaddr & 0x3; if (shift == 0) { - val = sd_read32(psdio, ftaddr, NULL); + val = sd_read32(pintfhdl, ftaddr, NULL); } else { u8 *ptmpbuf; @@ -279,7 +242,7 @@ _func_enter_; } ftaddr &= ~(u16)0x3; - sd_read(psdio, ftaddr, 8, ptmpbuf); + sd_read(pintfhdl, ftaddr, 8, ptmpbuf); _rtw_memcpy(&val, ptmpbuf+shift, 4); val = le32_to_cpu(val); @@ -294,8 +257,6 @@ _func_exit_; s32 sdio_readN(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pbuf) { PADAPTER padapter; - struct dvobj_priv *psdiodev; - PSDIO_DATA psdio; u8 bMacPwrCtrlOn; u8 deviceId; u16 offset; @@ -306,8 +267,6 @@ s32 sdio_readN(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pbuf) _func_enter_; padapter = pintfhdl->padapter; - psdiodev = pintfhdl->pintf_dev; - psdio = &psdiodev->intf_data; err = 0; ftaddr = _cvrt2ftaddr(addr, &deviceId, &offset); @@ -316,18 +275,18 @@ _func_enter_; if (((deviceId == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) || (_FALSE == bMacPwrCtrlOn) #ifdef CONFIG_LPS_LCLK - || (_TRUE == padapter->pwrctrlpriv.bFwCurrentInPSMode) + || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode) #endif ) { - err = sd_cmd52_read(psdio, ftaddr, cnt, pbuf); + err = sd_cmd52_read(pintfhdl, ftaddr, cnt, pbuf); return err; } // 4 bytes alignment shift = ftaddr & 0x3; if (shift == 0) { - err = sd_read(psdio, ftaddr, cnt, pbuf); + err = sd_read(pintfhdl, ftaddr, cnt, pbuf); } else { u8 *ptmpbuf; u32 n; @@ -336,7 +295,7 @@ _func_enter_; n = cnt + shift; ptmpbuf = rtw_malloc(n); if (NULL == ptmpbuf) return -1; - err = sd_read(psdio, ftaddr, n, ptmpbuf); + err = sd_read(pintfhdl, ftaddr, n, ptmpbuf); if (!err) _rtw_memcpy(pbuf, ptmpbuf+shift, cnt); rtw_mfree(ptmpbuf, n); @@ -349,18 +308,13 @@ _func_exit_; s32 sdio_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) { - struct dvobj_priv *psdiodev; - PSDIO_DATA psdio; u32 ftaddr; s32 err; _func_enter_; - psdiodev = pintfhdl->pintf_dev; - psdio = &psdiodev->intf_data; - ftaddr = _cvrt2ftaddr(addr, NULL, NULL); - sd_write8(psdio, ftaddr, val, &err); + sd_write8(pintfhdl, ftaddr, val, &err); _func_exit_; @@ -369,20 +323,15 @@ _func_exit_; s32 sdio_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) { - struct dvobj_priv *psdiodev; - PSDIO_DATA psdio; u32 ftaddr; u8 shift; s32 err; _func_enter_; - psdiodev = pintfhdl->pintf_dev; - psdio = &psdiodev->intf_data; - ftaddr = _cvrt2ftaddr(addr, NULL, NULL); val = cpu_to_le16(val); - err = sd_cmd52_write(psdio, ftaddr, 2, (u8*)&val); + err = sd_cmd52_write(pintfhdl, ftaddr, 2, (u8*)&val); _func_exit_; @@ -392,8 +341,6 @@ _func_exit_; s32 sdio_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) { PADAPTER padapter; - struct dvobj_priv *psdiodev; - PSDIO_DATA psdio; u8 bMacPwrCtrlOn; u8 deviceId; u16 offset; @@ -404,8 +351,6 @@ s32 sdio_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) _func_enter_; padapter = pintfhdl->padapter; - psdiodev = pintfhdl->pintf_dev; - psdio = &psdiodev->intf_data; err = 0; ftaddr = _cvrt2ftaddr(addr, &deviceId, &offset); @@ -414,12 +359,12 @@ _func_enter_; if (((deviceId == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) || (_FALSE == bMacPwrCtrlOn) #ifdef CONFIG_LPS_LCLK - || (_TRUE == padapter->pwrctrlpriv.bFwCurrentInPSMode) + || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode) #endif ) { val = cpu_to_le32(val); - err = sd_cmd52_write(psdio, ftaddr, 4, (u8*)&val); + err = sd_cmd52_write(pintfhdl, ftaddr, 4, (u8*)&val); return err; } @@ -428,16 +373,16 @@ _func_enter_; #if 1 if (shift == 0) { - sd_write32(psdio, ftaddr, val, &err); + sd_write32(pintfhdl, ftaddr, val, &err); } else { val = cpu_to_le32(val); - err = sd_cmd52_write(psdio, ftaddr, 4, (u8*)&val); + err = sd_cmd52_write(pintfhdl, ftaddr, 4, (u8*)&val); } #else if (shift == 0) { - sd_write32(psdio, ftaddr, val, &err); + sd_write32(pintfhdl, ftaddr, val, &err); } else { u8 *ptmpbuf; @@ -445,14 +390,14 @@ _func_enter_; if (NULL == ptmpbuf) return (-1); ftaddr &= ~(u16)0x3; - err = sd_read(psdio, ftaddr, 8, ptmpbuf); + err = sd_read(pintfhdl, ftaddr, 8, ptmpbuf); if (err) { rtw_mfree(ptmpbuf, 8); return err; } val = cpu_to_le32(val); _rtw_memcpy(ptmpbuf+shift, &val, 4); - err = sd_write(psdio, ftaddr, 8, ptmpbuf); + err = sd_write(pintfhdl, ftaddr, 8, ptmpbuf); rtw_mfree(ptmpbuf, 8); } @@ -466,8 +411,6 @@ _func_exit_; s32 sdio_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8* pbuf) { PADAPTER padapter; - struct dvobj_priv *psdiodev; - PSDIO_DATA psdio; u8 bMacPwrCtrlOn; u8 deviceId; u16 offset; @@ -478,8 +421,6 @@ s32 sdio_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8* pbuf) _func_enter_; padapter = pintfhdl->padapter; - psdiodev = pintfhdl->pintf_dev; - psdio = &psdiodev->intf_data; err = 0; ftaddr = _cvrt2ftaddr(addr, &deviceId, &offset); @@ -488,17 +429,17 @@ _func_enter_; if (((deviceId == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) || (_FALSE == bMacPwrCtrlOn) #ifdef CONFIG_LPS_LCLK - || (_TRUE == padapter->pwrctrlpriv.bFwCurrentInPSMode) + || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode) #endif ) { - err = sd_cmd52_write(psdio, ftaddr, cnt, pbuf); + err = sd_cmd52_write(pintfhdl, ftaddr, cnt, pbuf); return err; } shift = ftaddr & 0x3; if (shift == 0) { - err = sd_write(psdio, ftaddr, cnt, pbuf); + err = sd_write(pintfhdl, ftaddr, cnt, pbuf); } else { u8 *ptmpbuf; u32 n; @@ -507,13 +448,13 @@ _func_enter_; n = cnt + shift; ptmpbuf = rtw_malloc(n); if (NULL == ptmpbuf) return -1; - err = sd_read(psdio, ftaddr, 4, ptmpbuf); + err = sd_read(pintfhdl, ftaddr, 4, ptmpbuf); if (err) { rtw_mfree(ptmpbuf, n); return err; } _rtw_memcpy(ptmpbuf+shift, pbuf, cnt); - err = sd_write(psdio, ftaddr, n, ptmpbuf); + err = sd_write(pintfhdl, ftaddr, n, ptmpbuf); rtw_mfree(ptmpbuf, n); } @@ -600,7 +541,7 @@ static u32 sdio_read_port( #endif } - err = _sd_read(psdio, addr, cnt, mem); + err = _sd_read(pintfhdl, addr, cnt, mem); #ifdef SDIO_DYNAMIC_ALLOC_MEM if ((oldcnt != cnt) && (oldmem)) { @@ -643,6 +584,12 @@ static u32 sdio_write_port( padapter = pintfhdl->padapter; psdio = &adapter_to_dvobj(padapter)->intf_data; + if(padapter->hw_init_completed == _FALSE) + { + DBG_871X("%s [addr=0x%x cnt=%d] padapter->hw_init_completed == _FALSE \n",__func__,addr,cnt); + return _FAIL; + } + cnt = _RND4(cnt); HalSdioGetCmdAddr8723ASdio(padapter, addr, cnt >> 2, &addr); @@ -650,7 +597,7 @@ static u32 sdio_write_port( cnt = _RND(cnt, psdio->block_transfer_len); // cnt = sdio_align_size(cnt); - err = sd_write(psdio, addr, cnt, xmitbuf->pdata); + err = sd_write(pintfhdl, addr, cnt, xmitbuf->pdata); rtw_sctx_done_err(&xmitbuf->sctx, err ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS); @@ -688,21 +635,20 @@ s32 _sdio_local_read( u32 cnt, u8 *pbuf) { - PSDIO_DATA psdio; + struct intf_hdl * pintfhdl; u8 bMacPwrCtrlOn; s32 err; u8 *ptmpbuf; u32 n; - - psdio = &adapter_to_dvobj(padapter)->intf_data; - + pintfhdl=&padapter->iopriv.intf; + HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); if (_FALSE == bMacPwrCtrlOn) { - err = _sd_cmd52_read(psdio, addr, cnt, pbuf); + err = _sd_cmd52_read(pintfhdl, addr, cnt, pbuf); return err; } @@ -711,7 +657,7 @@ s32 _sdio_local_read( if (!ptmpbuf) return (-1); - err = _sd_read(psdio, addr, n, ptmpbuf); + err = _sd_read(pintfhdl, addr, n, ptmpbuf); if (!err) _rtw_memcpy(pbuf, ptmpbuf, cnt); @@ -730,25 +676,23 @@ s32 sdio_local_read( u32 cnt, u8 *pbuf) { - PSDIO_DATA psdio; + struct intf_hdl * pintfhdl; u8 bMacPwrCtrlOn; s32 err; u8 *ptmpbuf; u32 n; - - psdio = &adapter_to_dvobj(padapter)->intf_data; - + pintfhdl=&padapter->iopriv.intf; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); if ((_FALSE == bMacPwrCtrlOn) #ifdef CONFIG_LPS_LCLK - || (_TRUE == padapter->pwrctrlpriv.bFwCurrentInPSMode) + || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode) #endif ) { - err = sd_cmd52_read(psdio, addr, cnt, pbuf); + err = sd_cmd52_read(pintfhdl, addr, cnt, pbuf); return err; } @@ -757,7 +701,7 @@ s32 sdio_local_read( if (!ptmpbuf) return (-1); - err = sd_read(psdio, addr, n, ptmpbuf); + err = sd_read(pintfhdl, addr, n, ptmpbuf); if (!err) _rtw_memcpy(pbuf, ptmpbuf, cnt); @@ -776,7 +720,7 @@ s32 _sdio_local_write( u32 cnt, u8 *pbuf) { - PSDIO_DATA psdio; + struct intf_hdl * pintfhdl; u8 bMacPwrCtrlOn; s32 err; u8 *ptmpbuf; @@ -787,18 +731,17 @@ s32 _sdio_local_write( if(cnt & 0x3) DBG_8192C("%s, size must be the multiple of 4 \n", __FUNCTION__); - psdio = &adapter_to_dvobj(padapter)->intf_data; - + pintfhdl=&padapter->iopriv.intf; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); if ((_FALSE == bMacPwrCtrlOn) #ifdef CONFIG_LPS_LCLK - || (_TRUE == padapter->pwrctrlpriv.bFwCurrentInPSMode) + || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode) #endif ) { - err = _sd_cmd52_write(psdio, addr, cnt, pbuf); + err = _sd_cmd52_write(pintfhdl, addr, cnt, pbuf); return err; } @@ -808,7 +751,7 @@ s32 _sdio_local_write( _rtw_memcpy(ptmpbuf, pbuf, cnt); - err = _sd_write(psdio, addr, cnt, ptmpbuf); + err = _sd_write(pintfhdl, addr, cnt, ptmpbuf); if (ptmpbuf) rtw_mfree(ptmpbuf, cnt); @@ -825,7 +768,7 @@ s32 sdio_local_write( u32 cnt, u8 *pbuf) { - PSDIO_DATA psdio; + struct intf_hdl * pintfhdl; u8 bMacPwrCtrlOn; s32 err; u8 *ptmpbuf; @@ -836,18 +779,18 @@ s32 sdio_local_write( if(cnt & 0x3) DBG_8192C("%s, size must be the multiple of 4 \n", __FUNCTION__); - psdio = &adapter_to_dvobj(padapter)->intf_data; - + pintfhdl=&padapter->iopriv.intf; + HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); if ((_FALSE == bMacPwrCtrlOn) #ifdef CONFIG_LPS_LCLK - || (_TRUE == padapter->pwrctrlpriv.bFwCurrentInPSMode) + || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode) #endif ) { - err = sd_cmd52_write(psdio, addr, cnt, pbuf); + err = sd_cmd52_write(pintfhdl, addr, cnt, pbuf); return err; } @@ -857,7 +800,7 @@ s32 sdio_local_write( _rtw_memcpy(ptmpbuf, pbuf, cnt); - err = sd_write(psdio, addr, cnt, ptmpbuf); + err = sd_write(pintfhdl, addr, cnt, ptmpbuf); if (ptmpbuf) rtw_mfree(ptmpbuf, cnt); @@ -867,26 +810,24 @@ s32 sdio_local_write( u8 SdioLocalCmd52Read1Byte(PADAPTER padapter, u32 addr) { - PSDIO_DATA psdio; + struct intf_hdl * pintfhdl; u8 val = 0; - - psdio = &adapter_to_dvobj(padapter)->intf_data; + pintfhdl=&padapter->iopriv.intf; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); - sd_cmd52_read(psdio, addr, 1, &val); + sd_cmd52_read(pintfhdl, addr, 1, &val); return val; } u16 SdioLocalCmd52Read2Byte(PADAPTER padapter, u32 addr) { - PSDIO_DATA psdio; + struct intf_hdl * pintfhdl; u16 val = 0; - - psdio = &adapter_to_dvobj(padapter)->intf_data; + pintfhdl=&padapter->iopriv.intf; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); - sd_cmd52_read(psdio, addr, 2, (u8*)&val); + sd_cmd52_read(pintfhdl, addr, 2, (u8*)&val); val = le16_to_cpu(val); @@ -895,13 +836,12 @@ u16 SdioLocalCmd52Read2Byte(PADAPTER padapter, u32 addr) u32 SdioLocalCmd52Read4Byte(PADAPTER padapter, u32 addr) { - PSDIO_DATA psdio; + struct intf_hdl * pintfhdl; u32 val = 0; - - psdio = &adapter_to_dvobj(padapter)->intf_data; + pintfhdl=&padapter->iopriv.intf; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); - sd_cmd52_read(psdio, addr, 4, (u8*)&val); + sd_cmd52_read(pintfhdl, addr, 4, (u8*)&val); val = le32_to_cpu(val); @@ -910,60 +850,55 @@ u32 SdioLocalCmd52Read4Byte(PADAPTER padapter, u32 addr) u32 SdioLocalCmd53Read4Byte(PADAPTER padapter, u32 addr) { - PSDIO_DATA psdio; + struct intf_hdl * pintfhdl; u8 bMacPwrCtrlOn; - u32 val; + u32 val=0; - - val = 0; - psdio = &adapter_to_dvobj(padapter)->intf_data; + pintfhdl=&padapter->iopriv.intf; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); if ((_FALSE == bMacPwrCtrlOn) #ifdef CONFIG_LPS_LCLK - || (_TRUE == padapter->pwrctrlpriv.bFwCurrentInPSMode) + || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode) #endif ) { - sd_cmd52_read(psdio, addr, 4, (u8*)&val); + sd_cmd52_read(pintfhdl, addr, 4, (u8*)&val); val = le32_to_cpu(val); } else - val = sd_read32(psdio, addr, NULL); + val = sd_read32(pintfhdl, addr, NULL); return val; } void SdioLocalCmd52Write1Byte(PADAPTER padapter, u32 addr, u8 v) { - PSDIO_DATA psdio; - + struct intf_hdl * pintfhdl; - psdio = &adapter_to_dvobj(padapter)->intf_data; + pintfhdl=&padapter->iopriv.intf; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); - sd_cmd52_write(psdio, addr, 1, &v); + sd_cmd52_write(pintfhdl, addr, 1, &v); } void SdioLocalCmd52Write2Byte(PADAPTER padapter, u32 addr, u16 v) { - PSDIO_DATA psdio; + struct intf_hdl * pintfhdl; - - psdio = &adapter_to_dvobj(padapter)->intf_data; + pintfhdl=&padapter->iopriv.intf; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); v = cpu_to_le16(v); - sd_cmd52_write(psdio, addr, 2, (u8*)&v); + sd_cmd52_write(pintfhdl, addr, 2, (u8*)&v); } void SdioLocalCmd52Write4Byte(PADAPTER padapter, u32 addr, u32 v) { - PSDIO_DATA psdio; - + struct intf_hdl * pintfhdl; - psdio = &adapter_to_dvobj(padapter)->intf_data; + pintfhdl=&padapter->iopriv.intf; HalSdioGetCmdAddr8723ASdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); v = cpu_to_le32(v); - sd_cmd52_write(psdio, addr, 4, (u8*)&v); + sd_cmd52_write(pintfhdl, addr, 4, (u8*)&v); } #if 0 @@ -1147,13 +1082,17 @@ void InitInterrupt8723ASdio(PADAPTER padapter) // SDIO_HIMR_TXBCNOK_MSK | // SDIO_HIMR_TXBCNERR_MSK | // SDIO_HIMR_BCNERLY_INT_MSK | +#ifndef CONFIG_DETECT_C2H_BY_POLLING #if defined( CONFIG_BT_COEXIST) || defined(CONFIG_MP_INCLUDED) SDIO_HIMR_C2HCMD_MSK | #endif +#endif +#ifndef CONFIG_DETECT_CPWM_BY_POLLING #ifdef CONFIG_LPS_LCLK SDIO_HIMR_CPWM1_MSK | // SDIO_HIMR_CPWM2_MSK | #endif +#endif // SDIO_HIMR_HSISR_IND_MSK | // SDIO_HIMR_GTINT3_IND_MSK | // SDIO_HIMR_GTINT4_IND_MSK | @@ -1412,11 +1351,8 @@ static struct recv_buf* sd_recv_rxfifo(PADAPTER padapter, u32 size) SIZE_PTR tmpaddr=0; SIZE_PTR alignment=0; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - precvbuf->pskb = __dev_alloc_skb(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, GFP_KERNEL); -#else - precvbuf->pskb = __netdev_alloc_skb(padapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, GFP_KERNEL); -#endif + precvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); + if(precvbuf->pskb) { precvbuf->pskb->dev = padapter->pnetdev; @@ -1467,11 +1403,9 @@ static struct recv_buf* sd_recv_rxfifo(PADAPTER padapter, u32 size) //3 1. alloc skb // align to block size allocsize = _RND(readsize, adapter_to_dvobj(padapter)->intf_data.block_transfer_len); -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - ppkt = __dev_alloc_skb(allocsize, GFP_KERNEL); -#else - ppkt = __netdev_alloc_skb(padapter->pnetdev, allocsize, GFP_KERNEL); -#endif + + ppkt = rtw_skb_alloc(allocsize); + if (ppkt == NULL) { RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("%s: alloc_skb fail! alloc=%d read=%d\n", __FUNCTION__, allocsize, readsize)); return NULL; @@ -1482,7 +1416,7 @@ static struct recv_buf* sd_recv_rxfifo(PADAPTER padapter, u32 size) // rtw_read_port(padapter, WLAN_RX0FF_DEVICE_ID, readsize, preadbuf); ret = sdio_read_port(&padapter->iopriv.intf, WLAN_RX0FF_DEVICE_ID, readsize, preadbuf); if (ret == _FAIL) { - dev_kfree_skb_any(ppkt); + rtw_skb_free(ppkt); RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("%s: read port FAIL!\n", __FUNCTION__)); return NULL; } @@ -1491,7 +1425,7 @@ static struct recv_buf* sd_recv_rxfifo(PADAPTER padapter, u32 size) precvpriv = &padapter->recvpriv; precvbuf = rtw_dequeue_recvbuf(&precvpriv->free_recv_buf_queue); if (precvbuf == NULL) { - dev_kfree_skb_any(ppkt); + rtw_skb_free(ppkt); RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("%s: alloc recvbuf FAIL!\n", __FUNCTION__)); return NULL; } @@ -1538,6 +1472,7 @@ void sd_int_dpc(PADAPTER padapter) HAL_DATA_TYPE *phal; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct intf_hdl * pintfhdl=&padapter->iopriv.intf; phal = GET_HAL_DATA(padapter); if (phal->sdio_hisr & SDIO_HISR_CPWM1) @@ -1546,14 +1481,14 @@ void sd_int_dpc(PADAPTER padapter) #ifdef CONFIG_LPS_RPWM_TIMER u8 bcancelled; - _cancel_timer(&padapter->pwrctrlpriv.pwr_rpwm_timer, &bcancelled); + _cancel_timer(&(adapter_to_pwrctl(padapter)->pwr_rpwm_timer), &bcancelled); #endif // CONFIG_LPS_RPWM_TIMER _sdio_local_read(padapter, SDIO_REG_HCPWM1, 1, &report.state); #ifdef CONFIG_LPS_LCLK //cpwm_int_hdl(padapter, &report); - _set_workitem(&padapter->pwrctrlpriv.cpwm_event); + _set_workitem(&(adapter_to_pwrctl(padapter)->cpwm_event)); #endif } @@ -1567,8 +1502,8 @@ void sd_int_dpc(PADAPTER padapter) { addr = REG_TXDMA_STATUS; HalSdioGetCmdAddr8723ASdio(padapter, WLAN_IOREG_DEVICE_ID, addr, &addr); - _sd_read(&dvobj->intf_data, addr, 4, status); - _sd_write(&dvobj->intf_data, addr, 4, status); + _sd_read(pintfhdl, addr, 4, status); + _sd_write(pintfhdl, addr, 4, status); DBG_8192C("%s: SDIO_HISR_TXERR (0x%08x)\n", __func__, le32_to_cpu(*(u32*)status)); rtw_mfree(status, 4); } else { @@ -1595,10 +1530,15 @@ void sd_int_dpc(PADAPTER padapter) if (c2h_id_filter_ccx_8723a(c2h_evt->id)) { /* Handle CCX report here */ rtw_hal_c2h_handler(padapter, c2h_evt); + rtw_mfree((u8*)c2h_evt, 16); } else { rtw_c2h_wk_cmd(padapter, (u8 *)c2h_evt); } } + else + { + rtw_mfree((u8*)c2h_evt, 16); + } } else { /* Error handling for malloc fail */ if (rtw_cbuf_push(padapter->evtpriv.c2h_queue, (void*)NULL) != _SUCCESS) diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/rtl8723au_recv.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/rtl8723au_recv.c index e09d04fdb8b9..330c41c8f044 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/rtl8723au_recv.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/rtl8723au_recv.c @@ -149,12 +149,7 @@ int rtl8192cu_init_recv_priv(_adapter *padapter) for(i=0; ipnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, GFP_KERNEL); - #endif + pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); if(pskb) { @@ -215,7 +210,7 @@ void rtl8192cu_free_recv_priv (_adapter *padapter) DBG_8192C(KERN_WARNING "rx_skb_queue not empty\n"); } - skb_queue_purge(&precvpriv->rx_skb_queue); + rtw_skb_queue_purge(&precvpriv->rx_skb_queue); #ifdef CONFIG_PREALLOC_RECV_SKB @@ -223,7 +218,7 @@ void rtl8192cu_free_recv_priv (_adapter *padapter) DBG_8192C(KERN_WARNING "free_recv_skb_queue not empty, %d\n", skb_queue_len(&precvpriv->free_recv_skb_queue)); } - skb_queue_purge(&precvpriv->free_recv_skb_queue); + rtw_skb_queue_purge(&precvpriv->free_recv_skb_queue); #endif @@ -340,13 +335,6 @@ void update_recvframe_phyinfo( } pkt_info.Rate = pattrib->mcs_rate; - #ifdef CONFIG_CONCURRENT_MODE - //get Primary adapter's odmpriv - if(padapter->adapter_type > PRIMARY_ADAPTER){ - pHalData = GET_HAL_DATA(padapter->pbuddy_adapter); - } - #endif - //rtl8192c_query_rx_phy_status(precvframe, pphy_status); //_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL); ODM_PhyStatusQuery(&pHalData->odmpriv,pPHYInfo,(u8 *)pphy_status,&(pkt_info)); diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/rtl8723au_xmit.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/rtl8723au_xmit.c index d53be6245199..1ab9bafb7338 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/rtl8723au_xmit.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/rtl8723au_xmit.c @@ -673,15 +673,11 @@ s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv //pxmitframe->agg_num = 1; // alloc xmitframe should assign to 1. pxmitframe->pkt_offset = 1; // first frame of aggregation, reserve offset -#ifdef IDEA_CONDITION - rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); -#else - res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); - if (res == _FALSE) { -// rtw_free_xmitframe(pxmitpriv, pxmitframe); + if (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) { + DBG_871X("%s coalesce 1st xmitframe failed \n",__FUNCTION__); continue; } -#endif + // always return ndis_packet after rtw_xmitframe_coalesce rtw_os_xmit_complete(padapter, pxmitframe); @@ -777,15 +773,12 @@ s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv pxmitframe->agg_num = 0; // not first frame of aggregation pxmitframe->pkt_offset = 0; // not first frame of aggregation, no need to reserve offset -#ifdef IDEA_CONDITION - rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); -#else - res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); - if (res == _FALSE) { + if (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) { + DBG_871X("%s coalesce failed \n",__FUNCTION__); rtw_free_xmitframe(pxmitpriv, pxmitframe); continue; } -#endif + // always return ndis_packet after rtw_xmitframe_coalesce rtw_os_xmit_complete(padapter, pxmitframe); @@ -1112,7 +1105,7 @@ static void rtl8192cu_hostap_mgnt_xmit_cb(struct urb *urb) //DBG_8192C("%s\n", __FUNCTION__); - dev_kfree_skb_any(skb); + rtw_skb_free(skb); #endif } @@ -1145,11 +1138,7 @@ s32 rtl8192cu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) if ((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT) goto _exit; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pxmit_skb = dev_alloc_skb(len + TXDESC_SIZE); -#else - pxmit_skb = netdev_alloc_skb(pnetdev, len + TXDESC_SIZE); -#endif + pxmit_skb = rtw_skb_alloc(len + TXDESC_SIZE); if(!pxmit_skb) goto _exit; @@ -1230,7 +1219,7 @@ s32 rtl8192cu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) _exit: - dev_kfree_skb_any(skb); + rtw_skb_free(skb); #endif diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_halinit.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_halinit.c index 2a200ff69d46..01726d1f5d40 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_halinit.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_halinit.c @@ -343,7 +343,10 @@ _InitQueueReservedPage( u8 value8; BOOLEAN bWiFiConfig = pregistrypriv->wifi_spec; //u32 txQPageNum, txQPageUnit,txQRemainPage; - + + if( (pregistrypriv->wifi_spec==_TRUE) ||(pregistrypriv->qos_opt_enable==_TRUE)) + bWiFiConfig = _TRUE; + { //for WMM //RT_ASSERT((outEPNum>=2), ("for WMM ,number of out-ep must more than or equal to 2!\n")); @@ -591,9 +594,11 @@ _InitHardwareDropIncorrectBulkOut( IN PADAPTER Adapter ) { +#ifdef ENABLE_USB_DROP_INCORRECT_OUT u32 value32 = rtw_read32(Adapter, REG_TXDMA_OFFSET_CHK); value32 |= DROP_DATA_EN; rtw_write32(Adapter, REG_TXDMA_OFFSET_CHK, value32); +#endif } static VOID @@ -1178,9 +1183,8 @@ static VOID _BBTurnOnBlock( #define MgntActSet_RF_State(...) static void _RfPowerSave(PADAPTER padapter) { -#if 0 - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + PHAL_DATA_TYPE pHalData; + struct pwrctrl_priv *pwrctrl; rt_rf_power_state eRfPowerStateToSet; u8 u1bTmp; @@ -1188,6 +1192,10 @@ static void _RfPowerSave(PADAPTER padapter) #if (DISABLE_BB_RF) return; #endif + + pHalData = GET_HAL_DATA(padapter); + pwrctrl = adapter_to_pwrctl(padapter); + // // 2010/08/11 MH Merge from 8192SE for Minicard init. We need to confirm current radio status // and then decide to enable RF or not.!!!??? For Selective suspend mode. We may not @@ -1197,35 +1205,38 @@ static void _RfPowerSave(PADAPTER padapter) // in MgntActSet_RF_State() after wake up, because the value of pHalData->eRFPowerState // is the same as eRfOff, we should change it to eRfOn after we config RF parameters. // Added by tynli. 2010.03.30. - ppwrctrl->rf_pwrstate = rf_on; - RT_CLEAR_PS_LEVEL(ppwrctrl, RT_RF_OFF_LEVL_HALT_NIC); + pwrctrl->rf_pwrstate = rf_on; + RT_CLEAR_PS_LEVEL(pwrctrl, RT_RF_OFF_LEVL_HALT_NIC); //Added by chiyokolin, 2011.10.12 for Tx rtw_write8(padapter, REG_TXPAUSE, 0x00); // 20100326 Joseph: Copy from GPIOChangeRFWorkItemCallBack() function to check HW radio on/off. // 20100329 Joseph: Revise and integrate the HW/SW radio off code in initialization. - +#if 1 + pwrctrl->b_hw_radio_off = _FALSE; + eRfPowerStateToSet = rf_on; +#else eRfPowerStateToSet = (rt_rf_power_state) RfOnOffDetect(padapter); - ppwrctrl->rfoff_reason |= eRfPowerStateToSet==rf_on ? RF_CHANGE_BY_INIT : RF_CHANGE_BY_HW; - ppwrctrl->rfoff_reason |= (ppwrctrl->reg_rfoff) ? RF_CHANGE_BY_SW : 0; + pwrctrl->rfoff_reason |= eRfPowerStateToSet==rf_on ? RF_CHANGE_BY_INIT : RF_CHANGE_BY_HW; + pwrctrl->rfoff_reason |= (pwrctrl->reg_rfoff) ? RF_CHANGE_BY_SW : 0; - if (ppwrctrl->rfoff_reason & RF_CHANGE_BY_HW) - ppwrctrl->b_hw_radio_off = _TRUE; + if (pwrctrl->rfoff_reason & RF_CHANGE_BY_HW) + pwrctrl->b_hw_radio_off = _TRUE; - if (ppwrctrl->reg_rfoff == _TRUE) + if (pwrctrl->reg_rfoff == _TRUE) { // User disable RF via registry. - RT_TRACE(_module_hci_hal_init_c_, _drv_notice_, ("InitializeAdapter8192CUsb(): Turn off RF for RegRfOff.\n")); + RT_TRACE(_module_hci_hal_init_c_, _drv_notice_, ("%s: Turn off RF for RegRfOff\n", __FUNCTION__)); MgntActSet_RF_State(padapter, rf_off, RF_CHANGE_BY_SW, _TRUE); // if (padapter->bSlaveOfDMSP) // return; } - else if (ppwrctrl->rfoff_reason > RF_CHANGE_BY_PS) + else if (pwrctrl->rfoff_reason > RF_CHANGE_BY_PS) { // H/W or S/W RF OFF before sleep. RT_TRACE(_module_hci_hal_init_c_, _drv_notice_, ("InitializeAdapter8192CUsb(): Turn off RF for RfOffReason(%ld).\n", pMgntInfo->RfOffReason)); - MgntActSet_RF_State(padapter, rf_off, ppwrctrl->rfoff_reason, _TRUE); + MgntActSet_RF_State(padapter, rf_off, pwrctrl->rfoff_reason, _TRUE); } else { @@ -1252,22 +1263,23 @@ static void _RfPowerSave(PADAPTER padapter) else #endif { - ppwrctrl->rf_pwrstate = rf_off; - ppwrctrl->rfoff_reason = RF_CHANGE_BY_INIT; - MgntActSet_RF_State(padapter, rf_on, ppwrctrl->rfoff_reason, _TRUE); + pwrctrl->rf_pwrstate = rf_off; + pwrctrl->rfoff_reason = RF_CHANGE_BY_INIT; + MgntActSet_RF_State(padapter, rf_on, pwrctrl->rfoff_reason, _TRUE); } - ppwrctrl->rfoff_reason = 0; - ppwrctrl->b_hw_radio_off = _FALSE; - ppwrctrl->rf_pwrstate = rf_on; + pwrctrl->rfoff_reason = 0; + pwrctrl->b_hw_radio_off = _FALSE; + pwrctrl->rf_pwrstate = rf_on; if (padapter->ledpriv.LedControlHandler) padapter->ledpriv.LedControlHandler(padapter, LED_CTL_POWER_ON); } - +#endif // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c. // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1. if (pHalData->pwrdown && eRfPowerStateToSet == rf_off) { + DBG_871X("%s pwrdown\n", __FUNCTION__); // Enable register area 0x0-0xc. rtw_write8(padapter, REG_RSV_CTRL, 0x0); @@ -1280,7 +1292,6 @@ static void _RfPowerSave(PADAPTER padapter) u1bTmp |= WL_HWPDN_EN; rtw_write8(padapter, REG_MULTI_FUNC_CTRL, u1bTmp); } -#endif } enum { @@ -1298,7 +1309,7 @@ HalDetectPwrDownMode( { u8 tmpvalue; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter); EFUSE_ShadowRead(Adapter, 1, EEPROM_RF_OPT3, (u32 *)&tmpvalue); @@ -1423,7 +1434,7 @@ rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter ) u8 val8; rt_rf_power_state rfpowerstate = rf_off; - if(pAdapter->pwrctrlpriv.bHWPowerdown) + if(adapter_to_pwrctl(pAdapter)->bHWPowerdown) { val8 = rtw_read8(pAdapter, REG_HSISR); DBG_8192C("pwrdown, 0x5c(BIT7)=%02x\n", val8); @@ -1446,7 +1457,7 @@ u32 rtl8723au_hal_init(PADAPTER Adapter) u8 val8 = 0; u32 boundary, status = _SUCCESS; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter); struct registry_priv *pregistrypriv = &Adapter->registrypriv; u8 is92C = IS_92C_SERIAL(pHalData->VersionID); rt_rf_power_state eRfPowerStateToSet; @@ -1530,7 +1541,7 @@ u32 rtl8723au_hal_init(PADAPTER Adapter) _func_enter_; HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BEGIN); - if(Adapter->pwrctrlpriv.bkeepfwalive) + if(pwrctrlpriv->bkeepfwalive) { _ps_open_RF(Adapter); @@ -1825,13 +1836,15 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC02); _InitAdhocWorkaroundParams(Adapter); #endif -#if ENABLE_USB_DROP_INCORRECT_OUT _InitHardwareDropIncorrectBulkOut(Adapter); -#endif #if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_TX_MCAST2UNI) + +#ifdef CONFIG_CHECK_AC_LIFETIME // Enable lifetime check for the four ACs rtw_write8(Adapter, REG_LIFETIME_EN, 0x0F); +#endif // CONFIG_CHECK_AC_LIFETIME + #ifdef CONFIG_TX_MCAST2UNI rtw_write16(Adapter, REG_PKT_VO_VI_LIFE_TIME, 0x0400); // unit: 256us. 256ms rtw_write16(Adapter, REG_PKT_BE_BK_LIFE_TIME, 0x0400); // unit: 256us. 256ms @@ -2027,6 +2040,7 @@ phy_SsPwrSwitch92CU( IN int bRegSSPwrLvl ) { + struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); u8 value8; @@ -2152,9 +2166,9 @@ phy_SsPwrSwitch92CU( // (2)Reg878[21:19]= 0 //Turn off RF-B // (3) RegC04[7:4]= 0 // turn off all paths for packet detection // (4) Reg800[1] = 1 // enable preamble power saving - Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter, bMaskDWord); - Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskDWord); - Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(Adapter, rFPGA0_RFMOD, bMaskDWord); + pwrctl->PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter, bMaskDWord); + pwrctl->PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskDWord); + pwrctl->PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(Adapter, rFPGA0_RFMOD, bMaskDWord); if (pHalData->rf_type == RF_2T2R) { PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x380038, 0); @@ -2167,7 +2181,7 @@ phy_SsPwrSwitch92CU( PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT1,1); // 2 .AFE control register to power down. bit[30:22] - Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(Adapter, rRx_Wait_CCA, bMaskDWord); + pwrctl->PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(Adapter, rRx_Wait_CCA, bMaskDWord); if (pHalData->rf_type == RF_2T2R) PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x00DB25A0); else if (pHalData->rf_type == RF_1T1R) @@ -2216,9 +2230,9 @@ phy_SsPwrSwitch92CU( // (2)Reg878[21:19]= 0 //Turn off RF-B // (3) RegC04[7:4]= 0 // turn off all paths for packet detection // (4) Reg800[1] = 1 // enable preamble power saving - Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter, bMaskDWord); - Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskDWord); - Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(Adapter, rFPGA0_RFMOD, bMaskDWord); + pwrctl->PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter, bMaskDWord); + pwrctl->PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskDWord); + pwrctl->PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(Adapter, rFPGA0_RFMOD, bMaskDWord); if (pHalData->rf_type == RF_2T2R) { PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x380038, 0); @@ -2231,7 +2245,7 @@ phy_SsPwrSwitch92CU( PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT1,1); // 2 .AFE control register to power down. bit[30:22] - Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(Adapter, rRx_Wait_CCA, bMaskDWord); + pwrctl->PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(Adapter, rRx_Wait_CCA, bMaskDWord); if (pHalData->rf_type == RF_2T2R) PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x00DB25A0); else if (pHalData->rf_type == RF_1T1R) @@ -3153,33 +3167,35 @@ readAntennaDiversity( // Read HW power down mode selection static void _ReadPSSetting(IN PADAPTER Adapter,IN u8*PROMContent,IN u8 AutoloadFail) { + struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter); + if(AutoloadFail){ - Adapter->pwrctrlpriv.bHWPowerdown = _FALSE; - Adapter->pwrctrlpriv.bSupportRemoteWakeup = _FALSE; + pwrctl->bHWPowerdown = _FALSE; + pwrctl->bSupportRemoteWakeup = _FALSE; } else { //if(SUPPORT_HW_RADIO_DETECT(Adapter)) - Adapter->pwrctrlpriv.bHWPwrPindetect = Adapter->registrypriv.hwpwrp_detect; + pwrctl->bHWPwrPindetect = Adapter->registrypriv.hwpwrp_detect; //else - //Adapter->pwrctrlpriv.bHWPwrPindetect = _FALSE;//dongle not support new + //pwrctl->bHWPwrPindetect = _FALSE;//dongle not support new //hw power down mode selection , 0:rf-off / 1:power down if(Adapter->registrypriv.hwpdn_mode==2) - Adapter->pwrctrlpriv.bHWPowerdown = (PROMContent[EEPROM_RF_OPT3] & BIT4); + pwrctl->bHWPowerdown = (PROMContent[EEPROM_RF_OPT3] & BIT4); else - Adapter->pwrctrlpriv.bHWPowerdown = Adapter->registrypriv.hwpdn_mode; + pwrctl->bHWPowerdown = Adapter->registrypriv.hwpdn_mode; // decide hw if support remote wakeup function // if hw supported, 8051 (SIE) will generate WeakUP signal( D+/D- toggle) when autoresume - Adapter->pwrctrlpriv.bSupportRemoteWakeup = (PROMContent[EEPROM_TEST_USB_OPT] & BIT1)?_TRUE :_FALSE; + pwrctl->bSupportRemoteWakeup = (PROMContent[EEPROM_TEST_USB_OPT] & BIT1)?_TRUE :_FALSE; //if(SUPPORT_HW_RADIO_DETECT(Adapter)) - //Adapter->registrypriv.usbss_enable = Adapter->pwrctrlpriv.bSupportRemoteWakeup ; + //Adapter->registrypriv.usbss_enable = pwrctl->bSupportRemoteWakeup ; DBG_8192C("%s...bHWPwrPindetect(%x)-bHWPowerdown(%x) ,bSupportRemoteWakeup(%x)\n",__FUNCTION__, - Adapter->pwrctrlpriv.bHWPwrPindetect,Adapter->pwrctrlpriv.bHWPowerdown ,Adapter->pwrctrlpriv.bSupportRemoteWakeup); + pwrctl->bHWPwrPindetect, pwrctl->bHWPowerdown, pwrctl->bSupportRemoteWakeup); DBG_8192C("### PS params=> power_mgnt(%x),usbss_enable(%x) ###\n",Adapter->registrypriv.power_mgnt,Adapter->registrypriv.usbss_enable); @@ -3651,6 +3667,9 @@ _func_enter_; switch (variable) { + case HW_VAR_GET_CPWM: + *val = rtw_read8(Adapter, REG_USB_HCPWM); + break; default: GetHwReg8723A(Adapter, variable, val); break; @@ -3700,22 +3719,11 @@ GetHalDefVar8192CUsb( case HAL_DEF_DBG_DUMP_RXPKT: *(( u8*)pValue) = pHalData->bDumpRxPkt; break; - case HAL_DEF_DBG_DM_FUNC: - *(( u32*)pValue) =pHalData->odmpriv.SupportAbility; - break; case HW_VAR_MAX_RX_AMPDU_FACTOR: *(( u32*)pValue) = MAX_AMPDU_FACTOR_64K; break; - case HW_DEF_ODM_DBG_FLAG: - { - u8Byte DebugComponents = *((u32*)pValue); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - printk("pDM_Odm->DebugComponents = 0x%llx \n",pDM_Odm->DebugComponents ); - } - break; default: - //RT_TRACE(COMP_INIT, DBG_WARNING, ("GetHalDefVar8192CUsb(): Unkown variable: %d!\n", eVariable)); - bResult = _FAIL; + bResult = GetHalDefVar(Adapter, eVariable, pValue); break; } @@ -3783,27 +3791,8 @@ SetHalDefVar8192CUsb( } } break; - case HW_DEF_FA_CNT_DUMP: - { - u8 bRSSIDump = *((u8*)pValue); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - if(bRSSIDump) - pDM_Odm->DebugComponents = ODM_COMP_DIG|ODM_COMP_FA_CNT ; - else - pDM_Odm->DebugComponents = 0; - - } - break; - case HW_DEF_ODM_DBG_FLAG: - { - u8Byte DebugComponents = *((u8Byte*)pValue); - PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); - pDM_Odm->DebugComponents = DebugComponents; - } - break; default: - //RT_TRACE(COMP_INIT, DBG_TRACE, ("SetHalDefVar819xUsb(): Unkown variable: %d!\n", eVariable)); - bResult = _FAIL; + bResult = SetHalDefVar(Adapter, eVariable, pValue); break; } @@ -3857,10 +3846,6 @@ void UpdateHalRAMask8192CUsb(PADAPTER padapter, u32 mac_id,u8 rssi_level ) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); -#ifdef CONFIG_CONCURRENT_MODE - if(rtw_buddy_adapter_up(padapter) && padapter->adapter_type > PRIMARY_ADAPTER) - pHalData = GET_HAL_DATA(padapter->pbuddy_adapter); -#endif //CONFIG_CONCURRENT_MODE if (mac_id >= NUM_STA) //CAM_SIZE { @@ -4002,10 +3987,17 @@ void rtl8723au_set_hal_ops(_adapter * padapter) _func_enter_; - padapter->HalData = rtw_zmalloc(sizeof(HAL_DATA_TYPE)); - if(padapter->HalData == NULL){ - DBG_8192C("cant not alloc memory for HAL DATA \n"); +#ifdef CONFIG_CONCURRENT_MODE + if(padapter->isprimary) +#endif //CONFIG_CONCURRENT_MODE + { + //set hardware operation functions + padapter->HalData = rtw_zmalloc(sizeof(HAL_DATA_TYPE)); + if(padapter->HalData == NULL){ + DBG_8192C("cant not alloc memory for HAL DATA \n"); + } } + //_rtw_memset(padapter->HalData, 0, sizeof(HAL_DATA_TYPE)); padapter->hal_data_sz = sizeof(HAL_DATA_TYPE); diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_ops_linux.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_ops_linux.c index 78c429248a85..375e87f9b618 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_ops_linux.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_ops_linux.c @@ -66,8 +66,8 @@ static int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u //DBG_871X("%s %s:%d\n",__FUNCTION__, current->comm, current->pid); - if((padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)){ - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:(padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + if((padapter->bSurpriseRemoved) ||(dvobj_to_pwrctl(pdvobjpriv)->pnp_bstop_trx)){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:(padapter->bSurpriseRemoved ||pwrctl->pnp_bstop_trx)!!!\n")); status = -EPERM; goto exit; } @@ -133,7 +133,7 @@ static int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u if ( status == len) // Success this control transfer. { - rtw_reset_continual_urb_error(pdvobjpriv); + rtw_reset_continual_io_error(pdvobjpriv); if ( requesttype == 0x01 ) { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. _rtw_memcpy( pdata, pIo_buf, len ); @@ -166,7 +166,7 @@ static int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u } } - if(rtw_inc_and_chk_continual_urb_error(pdvobjpriv) == _TRUE ){ + if(rtw_inc_and_chk_continual_io_error(pdvobjpriv) == _TRUE ){ padapter->bSurpriseRemoved = _TRUE; break; } @@ -526,7 +526,7 @@ InterruptRecognized8723AU( if( ((pHalData->IntArray[0])&UHIMR_CPWM)){ // DBG_8192C("%s HIMR=0x%x\n",__func__,pHalData->IntArray[0]); //cpwm_int_hdl(Adapter, &report); - _set_workitem(&Adapter->pwrctrlpriv.cpwm_event); + _set_workitem(&(adapter_to_pwrctl(Adapter)->cpwm_event)); pHalData->IntArray[0]&= ~UHIMR_CPWM; // DBG_8192C("%s HIMR=0x%x\n",__func__,pHalData->IntArray[0]); } @@ -710,7 +710,10 @@ static int recvbuf2recvframe(_adapter *padapter, struct recv_buf *precvbuf) pattrib = &precvframe->u.hdr.attrib; if(pattrib->crc_err){ - DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__); + if (padapter->registrypriv.mp_mode == 1) + padapter->mppriv.rx_crcerrpktcount++; + else + DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__); rtw_free_recvframe(precvframe, pfree_recv_queue); goto _exit_recvbuf2recvframe; } @@ -754,11 +757,8 @@ static int recvbuf2recvframe(_adapter *padapter, struct recv_buf *precvbuf) alloc_sz += 14; } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pkt_copy = dev_alloc_skb(alloc_sz); -#else - pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz); -#endif + pkt_copy = rtw_skb_alloc(alloc_sz); + if(pkt_copy) { pkt_copy->dev = padapter->pnetdev; @@ -773,7 +773,7 @@ static int recvbuf2recvframe(_adapter *padapter, struct recv_buf *precvbuf) else { DBG_8192C("recvbuf2recvframe:can not allocate memory for skb copy\n"); - //precvframe->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); + //precvframe->u.hdr.pkt = rtw_skb_clone(pskb); //precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pbuf; //precvframe->u.hdr.rx_end = pbuf + (pkt_offset>1612?pkt_offset:1612); @@ -879,7 +879,7 @@ static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) } else { - rtw_reset_continual_urb_error(adapter_to_dvobj(padapter)); + rtw_reset_continual_io_error(adapter_to_dvobj(padapter)); precvbuf->transfer_len = purb->actual_length; @@ -895,7 +895,7 @@ static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status); - if(rtw_inc_and_chk_continual_urb_error(adapter_to_dvobj(padapter)) == _TRUE ){ + if(rtw_inc_and_chk_continual_io_error(adapter_to_dvobj(padapter)) == _TRUE ){ padapter->bSurpriseRemoved = _TRUE; } @@ -911,6 +911,9 @@ static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); break; case -EPROTO: + case -EILSEQ: + case -ETIME: + case -ECOMM: case -EOVERFLOW: #ifdef DBG_CONFIG_ERROR_DETECT { @@ -949,9 +952,9 @@ static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) _func_enter_; - if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||dvobj_to_pwrctl(pdvobj)->pnp_bstop_trx) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||pwrctl->pnp_bstop_trx)!!!\n")); return _FAIL; } @@ -1158,11 +1161,8 @@ static s32 pre_recv_entry(union recv_frame *precvframe, struct recv_stat *prxsta alloc_sz += 14; } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pkt_copy = dev_alloc_skb(alloc_sz); -#else - pkt_copy = netdev_alloc_skb(secondary_padapter->pnetdev, alloc_sz); -#endif + pkt_copy = rtw_skb_alloc(alloc_sz); + if(pkt_copy) { pkt_copy->dev = secondary_padapter->pnetdev; @@ -1257,7 +1257,10 @@ static int recvbuf2recvframe(_adapter *padapter, _pkt *pskb) pattrib = &precvframe->u.hdr.attrib; if(pattrib->crc_err){ - DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__); + if (padapter->registrypriv.mp_mode == 1) + padapter->mppriv.rx_crcerrpktcount++; + else + DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__); rtw_free_recvframe(precvframe, pfree_recv_queue); goto _exit_recvbuf2recvframe; } @@ -1301,11 +1304,8 @@ static int recvbuf2recvframe(_adapter *padapter, _pkt *pskb) alloc_sz += 14; } -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pkt_copy = dev_alloc_skb(alloc_sz); -#else - pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz); -#endif + pkt_copy = rtw_skb_alloc(alloc_sz); + if(pkt_copy) { pkt_copy->dev = padapter->pnetdev; @@ -1326,7 +1326,7 @@ static int recvbuf2recvframe(_adapter *padapter, _pkt *pskb) goto _exit_recvbuf2recvframe; } - precvframe->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); + precvframe->u.hdr.pkt = rtw_skb_clone(pskb); if(precvframe->u.hdr.pkt) { precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail @@ -1335,7 +1335,7 @@ static int recvbuf2recvframe(_adapter *padapter, _pkt *pskb) } else { - DBG_8192C("recvbuf2recvframe: skb_clone fail\n"); + DBG_8192C("recvbuf2recvframe: rtw_skb_clone fail\n"); rtw_free_recvframe(precvframe, pfree_recv_queue); goto _exit_recvbuf2recvframe; } @@ -1406,7 +1406,7 @@ void rtl8192cu_recv_tasklet(void *priv) if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) { DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n"); - dev_kfree_skb_any(pskb); + rtw_skb_free(pskb); break; } @@ -1421,7 +1421,7 @@ void rtl8192cu_recv_tasklet(void *priv) skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); #else - dev_kfree_skb_any(pskb); + rtw_skb_free(pskb); #endif } @@ -1461,7 +1461,7 @@ static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) #else if(precvbuf->pskb){ DBG_8192C("==> free skb(%p)\n",precvbuf->pskb); - dev_kfree_skb_any(precvbuf->pskb); + rtw_skb_free(precvbuf->pskb); } #endif DBG_8192C("%s()-%d: RX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) bReadPortCancel(%d)\n", @@ -1480,7 +1480,7 @@ static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) } else { - rtw_reset_continual_urb_error(adapter_to_dvobj(padapter)); + rtw_reset_continual_io_error(adapter_to_dvobj(padapter)); precvbuf->transfer_len = purb->actual_length; skb_put(precvbuf->pskb, purb->actual_length); @@ -1500,7 +1500,7 @@ static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status); - if(rtw_inc_and_chk_continual_urb_error(adapter_to_dvobj(padapter)) == _TRUE ){ + if(rtw_inc_and_chk_continual_io_error(adapter_to_dvobj(padapter)) == _TRUE ){ padapter->bSurpriseRemoved = _TRUE; } @@ -1516,6 +1516,9 @@ static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); break; case -EPROTO: + case -EILSEQ: + case -ETIME: + case -ECOMM: case -EOVERFLOW: #ifdef DBG_CONFIG_ERROR_DETECT { @@ -1559,9 +1562,9 @@ static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) _func_enter_; - if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||dvobj_to_pwrctl(pdvobj)->pnp_bstop_trx) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||pwrctl->pnp_bstop_trx)!!!\n")); return _FAIL; } @@ -1583,12 +1586,8 @@ _func_enter_; //re-assign for linux based on skb if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL)) { - //precvbuf->pskb = alloc_skb(MAX_RECVBUF_SZ, GFP_ATOMIC);//don't use this after v2.6.25 -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - precvbuf->pskb = dev_alloc_skb(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); -#else - precvbuf->pskb = netdev_alloc_skb(adapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); -#endif + precvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); + if(precvbuf->pskb == NULL) { RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("init_recvbuf(): alloc_skb fail!\n")); diff --git a/drivers/net/wireless/rtl8723as/ifcfg-wlan0 b/drivers/net/wireless/rtl8723as/ifcfg-wlan0 index 7ecb7ae62c7f..20dcbec2b1ae 100755 --- a/drivers/net/wireless/rtl8723as/ifcfg-wlan0 +++ b/drivers/net/wireless/rtl8723as/ifcfg-wlan0 @@ -1,4 +1,4 @@ -#DHCP client -DEVICE=wlan0 -BOOTPROTO=dhcp +#DHCP client +DEVICE=wlan0 +BOOTPROTO=dhcp ONBOOT=yes \ No newline at end of file diff --git a/drivers/net/wireless/rtl8723as/include/Hal8188EPhyCfg.h b/drivers/net/wireless/rtl8723as/include/Hal8188EPhyCfg.h index 2260f18d1a83..e9b97cc15ecf 100755 --- a/drivers/net/wireless/rtl8723as/include/Hal8188EPhyCfg.h +++ b/drivers/net/wireless/rtl8723as/include/Hal8188EPhyCfg.h @@ -1,428 +1,429 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8188EPHYCFG_H__ -#define __INC_HAL8188EPHYCFG_H__ - - -/*--------------------------Define Parameters-------------------------------*/ -#define LOOP_LIMIT 5 -#define MAX_STALL_TIME 50 //us -#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) -#define MAX_TXPWR_IDX_NMODE_92S 63 -#define Reset_Cnt_Limit 3 - -#define IQK_MAC_REG_NUM 4 -#define IQK_ADDA_REG_NUM 16 -#define IQK_BB_REG_NUM 9 -#define HP_THERMAL_NUM 8 - -#ifdef CONFIG_PCI_HCI -#define MAX_AGGR_NUM 0x0B -#else -#define MAX_AGGR_NUM 0x07 -#endif // CONFIG_PCI_HCI - - -/*--------------------------Define Parameters-------------------------------*/ - - -/*------------------------------Define structure----------------------------*/ -typedef enum _SwChnlCmdID{ - CmdID_End, - CmdID_SetTxPowerLevel, - CmdID_BBRegWrite10, - CmdID_WritePortUlong, - CmdID_WritePortUshort, - CmdID_WritePortUchar, - CmdID_RF_WriteReg, -}SwChnlCmdID; - - -/* 1. Switch channel related */ -typedef struct _SwChnlCmd{ - SwChnlCmdID CmdID; - u32 Para1; - u32 Para2; - u32 msDelay; -}SwChnlCmd; - -typedef enum _HW90_BLOCK{ - HW90_BLOCK_MAC = 0, - HW90_BLOCK_PHY0 = 1, - HW90_BLOCK_PHY1 = 2, - HW90_BLOCK_RF = 3, - HW90_BLOCK_MAXIMUM = 4, // Never use this -}HW90_BLOCK_E, *PHW90_BLOCK_E; - -typedef enum _RF_RADIO_PATH{ - RF_PATH_A = 0, //Radio Path A - RF_PATH_B = 1, //Radio Path B - RF_PATH_C = 2, //Radio Path C - RF_PATH_D = 3, //Radio Path D - //RF_PATH_MAX //Max RF number 90 support -}RF_RADIO_PATH_E, *PRF_RADIO_PATH_E; - -#define MAX_PG_GROUP 13 - -#define RF_PATH_MAX 2 -#define MAX_RF_PATH RF_PATH_MAX -#define MAX_TX_COUNT_88E 1 -#define MAX_TX_COUNT MAX_TX_COUNT_88E // 4 //path numbers - -#define CHANNEL_MAX_NUMBER 14 // 14 is the max channel number -#define MAX_CHNL_GROUP_24G 6 // ch1~2, ch3~5, ch6~8,ch9~11,ch12~13,CH 14 total six groups -#define CHANNEL_GROUP_MAX_88E 6 - -typedef enum _WIRELESS_MODE { - WIRELESS_MODE_UNKNOWN = 0x00, - WIRELESS_MODE_A = BIT2, - WIRELESS_MODE_B = BIT0, - WIRELESS_MODE_G = BIT1, - WIRELESS_MODE_AUTO = BIT5, - WIRELESS_MODE_N_24G = BIT3, - WIRELESS_MODE_N_5G = BIT4, - WIRELESS_MODE_AC = BIT6 -} WIRELESS_MODE; - - -typedef enum _PHY_Rate_Tx_Power_Offset_Area{ - RA_OFFSET_LEGACY_OFDM1, - RA_OFFSET_LEGACY_OFDM2, - RA_OFFSET_HT_OFDM1, - RA_OFFSET_HT_OFDM2, - RA_OFFSET_HT_OFDM3, - RA_OFFSET_HT_OFDM4, - RA_OFFSET_HT_CCK, -}RA_OFFSET_AREA,*PRA_OFFSET_AREA; - - -/* BB/RF related */ -typedef enum _RF_TYPE_8190P{ - RF_TYPE_MIN, // 0 - RF_8225=1, // 1 11b/g RF for verification only - RF_8256=2, // 2 11b/g/n - RF_8258=3, // 3 11a/b/g/n RF - RF_6052=4, // 4 11b/g/n RF - //RF_6052=5, // 4 11b/g/n RF - // TODO: We sholud remove this psudo PHY RF after we get new RF. - RF_PSEUDO_11N=5, // 5, It is a temporality RF. -}RF_TYPE_8190P_E,*PRF_TYPE_8190P_E; - - -typedef struct _BB_REGISTER_DEFINITION{ - u32 rfintfs; // set software control: - // 0x870~0x877[8 bytes] - - u32 rfintfi; // readback data: - // 0x8e0~0x8e7[8 bytes] - - u32 rfintfo; // output data: - // 0x860~0x86f [16 bytes] - - u32 rfintfe; // output enable: - // 0x860~0x86f [16 bytes] - - u32 rf3wireOffset; // LSSI data: - // 0x840~0x84f [16 bytes] - - u32 rfLSSI_Select; // BB Band Select: - // 0x878~0x87f [8 bytes] - - u32 rfTxGainStage; // Tx gain stage: - // 0x80c~0x80f [4 bytes] - - u32 rfHSSIPara1; // wire parameter control1 : - // 0x820~0x823,0x828~0x82b, 0x830~0x833, 0x838~0x83b [16 bytes] - - u32 rfHSSIPara2; // wire parameter control2 : - // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes] - - u32 rfSwitchControl; //Tx Rx antenna control : - // 0x858~0x85f [16 bytes] - - u32 rfAGCControl1; //AGC parameter control1 : - // 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, 0xc68~0xc6b [16 bytes] - - u32 rfAGCControl2; //AGC parameter control2 : - // 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, 0xc6c~0xc6f [16 bytes] - - u32 rfRxIQImbalance; //OFDM Rx IQ imbalance matrix : - // 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, 0xc2c~0xc2f [16 bytes] - - u32 rfRxAFE; //Rx IQ DC ofset and Rx digital filter, Rx DC notch filter : - // 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, 0xc28~0xc2b [16 bytes] - - u32 rfTxIQImbalance; //OFDM Tx IQ imbalance matrix - // 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, 0xc98~0xc9b [16 bytes] - - u32 rfTxAFE; //Tx IQ DC Offset and Tx DFIR type - // 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, 0xc9c~0xc9f [16 bytes] - - u32 rfLSSIReadBack; //LSSI RF readback data SI mode - // 0x8a0~0x8af [16 bytes] - - u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B - -}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T; - -typedef struct _R_ANTENNA_SELECT_OFDM{ - u32 r_tx_antenna:4; - u32 r_ant_l:4; - u32 r_ant_non_ht:4; - u32 r_ant_ht1:4; - u32 r_ant_ht2:4; - u32 r_ant_ht_s1:4; - u32 r_ant_non_ht_s1:4; - u32 OFDM_TXSC:2; - u32 Reserved:2; -}R_ANTENNA_SELECT_OFDM; - -typedef struct _R_ANTENNA_SELECT_CCK{ - u8 r_cckrx_enable_2:2; - u8 r_cckrx_enable:2; - u8 r_ccktx_enable:4; -}R_ANTENNA_SELECT_CCK; - -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ - - -/*------------------------Export Marco Definition---------------------------*/ -/*------------------------Export Marco Definition---------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ -// -// BB and RF register read/write -// -u32 rtl8188e_PHY_QueryBBReg( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask ); -void rtl8188e_PHY_SetBBReg( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); -u32 rtl8188e_PHY_QueryRFReg( IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 RegAddr, - IN u32 BitMask ); -void rtl8188e_PHY_SetRFReg( IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); - -// -// Initialization related function -// -/* MAC/BB/RF HAL config */ -int PHY_MACConfig8188E(IN PADAPTER Adapter ); -int PHY_BBConfig8188E(IN PADAPTER Adapter ); -int PHY_RFConfig8188E(IN PADAPTER Adapter ); - -/* RF config */ -int rtl8188e_PHY_ConfigRFWithParaFile(IN PADAPTER Adapter, IN u8 * pFileName, RF_RADIO_PATH_E eRFPath); -int rtl8188e_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter, - IN RF_RADIO_PATH_E eRFPath); - -/* Read initi reg value for tx power setting. */ -void rtl8192c_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter ); - -// -// RF Power setting -// -//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter, -// IN RT_RF_POWER_STATE eRFPowerState); - -// -// BB TX Power R/W -// -void PHY_GetTxPowerLevel8188E( IN PADAPTER Adapter, - OUT u32* powerlevel ); -void PHY_SetTxPowerLevel8188E( IN PADAPTER Adapter, - IN u8 channel ); -BOOLEAN PHY_UpdateTxPowerDbm8188E( IN PADAPTER Adapter, - IN int powerInDbm ); - -// -VOID -PHY_ScanOperationBackup8188E(IN PADAPTER Adapter, - IN u8 Operation ); - -// -// Switch bandwidth for 8192S -// -//extern void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer ); -void PHY_SetBWMode8188E( IN PADAPTER pAdapter, - IN HT_CHANNEL_WIDTH ChnlWidth, - IN unsigned char Offset ); - -// -// Set FW CMD IO for 8192S. -// -//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter, -// IN IO_TYPE IOType); - -// -// Set A2 entry to fw for 8192S -// -extern void FillA2Entry8192C( IN PADAPTER Adapter, - IN u8 index, - IN u8* val); - - -// -// channel switch related funciton -// -//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer ); -void PHY_SwChnl8188E( IN PADAPTER pAdapter, - IN u8 channel ); - // Call after initialization -void PHY_SwChnlPhy8192C( IN PADAPTER pAdapter, - IN u8 channel ); - -void ChkFwCmdIoDone( IN PADAPTER Adapter); - -// -// BB/MAC/RF other monitor API -// -void PHY_SetMonitorMode8192C(IN PADAPTER pAdapter, - IN BOOLEAN bEnableMonitorMode ); - -BOOLEAN PHY_CheckIsLegalRfPath8192C(IN PADAPTER pAdapter, - IN u32 eRFPath ); - -VOID PHY_SetRFPathSwitch_8188E(IN PADAPTER pAdapter, IN BOOLEAN bMain); - -extern VOID -PHY_SwitchEphyParameter( - IN PADAPTER Adapter - ); - -extern VOID -PHY_EnableHostClkReq( - IN PADAPTER Adapter - ); - -BOOLEAN -SetAntennaConfig92C( - IN PADAPTER Adapter, - IN u8 DefaultAnt - ); - -#ifdef CONFIG_PHY_SETTING_WITH_ODM -VOID -storePwrIndexDiffRateOffset( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ); -#endif //CONFIG_PHY_SETTING_WITH_ODM -/*--------------------------Exported Function prototype---------------------*/ - -#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtl8188e_PHY_QueryBBReg((Adapter), (RegAddr), (BitMask)) -#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtl8188e_PHY_SetBBReg((Adapter), (RegAddr), (BitMask), (Data)) -#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtl8188e_PHY_QueryRFReg((Adapter), (eRFPath), (RegAddr), (BitMask)) -#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8188e_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) - -#define PHY_SetMacReg PHY_SetBBReg - - -// -// Initialization related function -// -/* MAC/BB/RF HAL config */ -//extern s32 PHY_MACConfig8723(PADAPTER padapter); -//s32 PHY_BBConfig8723(PADAPTER padapter); -//s32 PHY_RFConfig8723(PADAPTER padapter); - - - -//================================================================== -// Note: If SIC_ENABLE under PCIE, because of the slow operation -// you should -// 2) "#define RTL8723_FPGA_VERIFICATION 1" in Precomp.h.WlanE.Windows -// 3) "#define RTL8190_Download_Firmware_From_Header 0" in Precomp.h.WlanE.Windows if needed. -// -#if (RTL8188E_SUPPORT == 1) && (RTL8188E_FPGA_TRUE_PHY_VERIFICATION == 1) -#define SIC_ENABLE 1 -#define SIC_HW_SUPPORT 1 -#else -#define SIC_ENABLE 0 -#define SIC_HW_SUPPORT 0 -#endif -//================================================================== - - -#define SIC_MAX_POLL_CNT 5 - -#if(SIC_HW_SUPPORT == 1) -#define SIC_CMD_READY 0 -#define SIC_CMD_PREWRITE 0x1 -#if(RTL8188E_SUPPORT == 1) -#define SIC_CMD_WRITE 0x40 -#define SIC_CMD_PREREAD 0x2 -#define SIC_CMD_READ 0x80 -#define SIC_CMD_INIT 0xf0 -#define SIC_INIT_VAL 0xff - -#define SIC_INIT_REG 0x1b7 -#define SIC_CMD_REG 0x1EB // 1byte -#define SIC_ADDR_REG 0x1E8 // 1b4~1b5, 2 bytes -#define SIC_DATA_REG 0x1EC // 1b0~1b3 -#else -#define SIC_CMD_WRITE 0x11 -#define SIC_CMD_PREREAD 0x2 -#define SIC_CMD_READ 0x12 -#define SIC_CMD_INIT 0x1f -#define SIC_INIT_VAL 0xff - -#define SIC_INIT_REG 0x1b7 -#define SIC_CMD_REG 0x1b6 // 1byte -#define SIC_ADDR_REG 0x1b4 // 1b4~1b5, 2 bytes -#define SIC_DATA_REG 0x1b0 // 1b0~1b3 -#endif -#else -#define SIC_CMD_READY 0 -#define SIC_CMD_WRITE 1 -#define SIC_CMD_READ 2 - -#if(RTL8188E_SUPPORT == 1) -#define SIC_CMD_REG 0x1EB // 1byte -#define SIC_ADDR_REG 0x1E8 // 1b9~1ba, 2 bytes -#define SIC_DATA_REG 0x1EC // 1bc~1bf -#else -#define SIC_CMD_REG 0x1b8 // 1byte -#define SIC_ADDR_REG 0x1b9 // 1b9~1ba, 2 bytes -#define SIC_DATA_REG 0x1bc // 1bc~1bf -#endif -#endif - -#if(SIC_ENABLE == 1) -VOID SIC_Init(IN PADAPTER Adapter); -#endif - - -#endif // __INC_HAL8192CPHYCFG_H - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8188EPHYCFG_H__ +#define __INC_HAL8188EPHYCFG_H__ + + +/*--------------------------Define Parameters-------------------------------*/ +#define LOOP_LIMIT 5 +#define MAX_STALL_TIME 50 //us +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) +#define MAX_TXPWR_IDX_NMODE_92S 63 +#define Reset_Cnt_Limit 3 + +#define IQK_MAC_REG_NUM 4 +#define IQK_ADDA_REG_NUM 16 +#define IQK_BB_REG_NUM 9 +#define HP_THERMAL_NUM 8 + +#ifdef CONFIG_PCI_HCI +#define MAX_AGGR_NUM 0x0B +#else +#define MAX_AGGR_NUM 0x07 +#endif // CONFIG_PCI_HCI + + +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ +typedef enum _SwChnlCmdID{ + CmdID_End, + CmdID_SetTxPowerLevel, + CmdID_BBRegWrite10, + CmdID_WritePortUlong, + CmdID_WritePortUshort, + CmdID_WritePortUchar, + CmdID_RF_WriteReg, +}SwChnlCmdID; + + +/* 1. Switch channel related */ +typedef struct _SwChnlCmd{ + SwChnlCmdID CmdID; + u32 Para1; + u32 Para2; + u32 msDelay; +}SwChnlCmd; + +typedef enum _HW90_BLOCK{ + HW90_BLOCK_MAC = 0, + HW90_BLOCK_PHY0 = 1, + HW90_BLOCK_PHY1 = 2, + HW90_BLOCK_RF = 3, + HW90_BLOCK_MAXIMUM = 4, // Never use this +}HW90_BLOCK_E, *PHW90_BLOCK_E; + +typedef enum _RF_RADIO_PATH{ + RF_PATH_A = 0, //Radio Path A + RF_PATH_B = 1, //Radio Path B + RF_PATH_C = 2, //Radio Path C + RF_PATH_D = 3, //Radio Path D + //RF_PATH_MAX //Max RF number 90 support +}RF_RADIO_PATH_E, *PRF_RADIO_PATH_E; + +#define MAX_PG_GROUP 13 + +#define RF_PATH_MAX 2 +#define MAX_RF_PATH RF_PATH_MAX +#define MAX_TX_COUNT_88E 1 +#define MAX_TX_COUNT MAX_TX_COUNT_88E // 4 //path numbers + +#define CHANNEL_MAX_NUMBER 14 // 14 is the max channel number +#define MAX_CHNL_GROUP_24G 6 // ch1~2, ch3~5, ch6~8,ch9~11,ch12~13,CH 14 total six groups +#define CHANNEL_GROUP_MAX_88E 6 + +typedef enum _WIRELESS_MODE { + WIRELESS_MODE_UNKNOWN = 0x00, + WIRELESS_MODE_A = BIT2, + WIRELESS_MODE_B = BIT0, + WIRELESS_MODE_G = BIT1, + WIRELESS_MODE_AUTO = BIT5, + WIRELESS_MODE_N_24G = BIT3, + WIRELESS_MODE_N_5G = BIT4, + WIRELESS_MODE_AC = BIT6 +} WIRELESS_MODE; + + +typedef enum _PHY_Rate_Tx_Power_Offset_Area{ + RA_OFFSET_LEGACY_OFDM1, + RA_OFFSET_LEGACY_OFDM2, + RA_OFFSET_HT_OFDM1, + RA_OFFSET_HT_OFDM2, + RA_OFFSET_HT_OFDM3, + RA_OFFSET_HT_OFDM4, + RA_OFFSET_HT_CCK, +}RA_OFFSET_AREA,*PRA_OFFSET_AREA; + + +/* BB/RF related */ +typedef enum _RF_TYPE_8190P{ + RF_TYPE_MIN, // 0 + RF_8225=1, // 1 11b/g RF for verification only + RF_8256=2, // 2 11b/g/n + RF_8258=3, // 3 11a/b/g/n RF + RF_6052=4, // 4 11b/g/n RF + //RF_6052=5, // 4 11b/g/n RF + // TODO: We sholud remove this psudo PHY RF after we get new RF. + RF_PSEUDO_11N=5, // 5, It is a temporality RF. +}RF_TYPE_8190P_E,*PRF_TYPE_8190P_E; + + +typedef struct _BB_REGISTER_DEFINITION{ + u32 rfintfs; // set software control: + // 0x870~0x877[8 bytes] + + u32 rfintfi; // readback data: + // 0x8e0~0x8e7[8 bytes] + + u32 rfintfo; // output data: + // 0x860~0x86f [16 bytes] + + u32 rfintfe; // output enable: + // 0x860~0x86f [16 bytes] + + u32 rf3wireOffset; // LSSI data: + // 0x840~0x84f [16 bytes] + + u32 rfLSSI_Select; // BB Band Select: + // 0x878~0x87f [8 bytes] + + u32 rfTxGainStage; // Tx gain stage: + // 0x80c~0x80f [4 bytes] + + u32 rfHSSIPara1; // wire parameter control1 : + // 0x820~0x823,0x828~0x82b, 0x830~0x833, 0x838~0x83b [16 bytes] + + u32 rfHSSIPara2; // wire parameter control2 : + // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes] + + u32 rfSwitchControl; //Tx Rx antenna control : + // 0x858~0x85f [16 bytes] + + u32 rfAGCControl1; //AGC parameter control1 : + // 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, 0xc68~0xc6b [16 bytes] + + u32 rfAGCControl2; //AGC parameter control2 : + // 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, 0xc6c~0xc6f [16 bytes] + + u32 rfRxIQImbalance; //OFDM Rx IQ imbalance matrix : + // 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, 0xc2c~0xc2f [16 bytes] + + u32 rfRxAFE; //Rx IQ DC ofset and Rx digital filter, Rx DC notch filter : + // 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, 0xc28~0xc2b [16 bytes] + + u32 rfTxIQImbalance; //OFDM Tx IQ imbalance matrix + // 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, 0xc98~0xc9b [16 bytes] + + u32 rfTxAFE; //Tx IQ DC Offset and Tx DFIR type + // 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, 0xc9c~0xc9f [16 bytes] + + u32 rfLSSIReadBack; //LSSI RF readback data SI mode + // 0x8a0~0x8af [16 bytes] + + u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B + +}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T; + +typedef struct _R_ANTENNA_SELECT_OFDM{ + u32 r_tx_antenna:4; + u32 r_ant_l:4; + u32 r_ant_non_ht:4; + u32 r_ant_ht1:4; + u32 r_ant_ht2:4; + u32 r_ant_ht_s1:4; + u32 r_ant_non_ht_s1:4; + u32 OFDM_TXSC:2; + u32 Reserved:2; +}R_ANTENNA_SELECT_OFDM; + +typedef struct _R_ANTENNA_SELECT_CCK{ + u8 r_cckrx_enable_2:2; + u8 r_cckrx_enable:2; + u8 r_ccktx_enable:4; +}R_ANTENNA_SELECT_CCK; + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + + +/*------------------------Export Marco Definition---------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ +// +// BB and RF register read/write +// +u32 rtl8188e_PHY_QueryBBReg( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask ); +void rtl8188e_PHY_SetBBReg( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); +u32 rtl8188e_PHY_QueryRFReg( IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask ); +void rtl8188e_PHY_SetRFReg( IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); + +// +// Initialization related function +// +/* MAC/BB/RF HAL config */ +int PHY_MACConfig8188E(IN PADAPTER Adapter ); +int PHY_BBConfig8188E(IN PADAPTER Adapter ); +int PHY_RFConfig8188E(IN PADAPTER Adapter ); + +/* RF config */ +int rtl8188e_PHY_ConfigRFWithParaFile(IN PADAPTER Adapter, IN u8 * pFileName, RF_RADIO_PATH_E eRFPath); +int rtl8188e_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter, + IN RF_RADIO_PATH_E eRFPath); + +/* Read initi reg value for tx power setting. */ +void rtl8192c_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter ); + +// +// RF Power setting +// +//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter, +// IN RT_RF_POWER_STATE eRFPowerState); + +// +// BB TX Power R/W +// +void PHY_GetTxPowerLevel8188E( IN PADAPTER Adapter, + OUT u32* powerlevel ); +void PHY_SetTxPowerLevel8188E( IN PADAPTER Adapter, + IN u8 channel ); +BOOLEAN PHY_UpdateTxPowerDbm8188E( IN PADAPTER Adapter, + IN int powerInDbm ); + +// +VOID +PHY_ScanOperationBackup8188E(IN PADAPTER Adapter, + IN u8 Operation ); + +// +// Switch bandwidth for 8192S +// +//extern void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SetBWMode8188E( IN PADAPTER pAdapter, + IN HT_CHANNEL_WIDTH ChnlWidth, + IN unsigned char Offset ); + +// +// Set FW CMD IO for 8192S. +// +//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter, +// IN IO_TYPE IOType); + +// +// Set A2 entry to fw for 8192S +// +extern void FillA2Entry8192C( IN PADAPTER Adapter, + IN u8 index, + IN u8* val); + + +// +// channel switch related funciton +// +//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SwChnl8188E( IN PADAPTER pAdapter, + IN u8 channel ); + // Call after initialization +void PHY_SwChnlPhy8192C( IN PADAPTER pAdapter, + IN u8 channel ); + +void ChkFwCmdIoDone( IN PADAPTER Adapter); + +// +// BB/MAC/RF other monitor API +// +void PHY_SetMonitorMode8192C(IN PADAPTER pAdapter, + IN BOOLEAN bEnableMonitorMode ); + +BOOLEAN PHY_CheckIsLegalRfPath8192C(IN PADAPTER pAdapter, + IN u32 eRFPath ); + +VOID PHY_SetRFPathSwitch_8188E(IN PADAPTER pAdapter, IN BOOLEAN bMain); + +extern VOID +PHY_SwitchEphyParameter( + IN PADAPTER Adapter + ); + +extern VOID +PHY_EnableHostClkReq( + IN PADAPTER Adapter + ); + +BOOLEAN +SetAntennaConfig92C( + IN PADAPTER Adapter, + IN u8 DefaultAnt + ); + +#ifdef CONFIG_PHY_SETTING_WITH_ODM +VOID +storePwrIndexDiffRateOffset( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ); +#endif //CONFIG_PHY_SETTING_WITH_ODM +/*--------------------------Exported Function prototype---------------------*/ + +#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtl8188e_PHY_QueryBBReg((Adapter), (RegAddr), (BitMask)) +#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtl8188e_PHY_SetBBReg((Adapter), (RegAddr), (BitMask), (Data)) +#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtl8188e_PHY_QueryRFReg((Adapter), (eRFPath), (RegAddr), (BitMask)) +#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8188e_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) + +#define PHY_SetMacReg PHY_SetBBReg +#define PHY_QueryMacReg PHY_QueryBBReg + + +// +// Initialization related function +// +/* MAC/BB/RF HAL config */ +//extern s32 PHY_MACConfig8723(PADAPTER padapter); +//s32 PHY_BBConfig8723(PADAPTER padapter); +//s32 PHY_RFConfig8723(PADAPTER padapter); + + + +//================================================================== +// Note: If SIC_ENABLE under PCIE, because of the slow operation +// you should +// 2) "#define RTL8723_FPGA_VERIFICATION 1" in Precomp.h.WlanE.Windows +// 3) "#define RTL8190_Download_Firmware_From_Header 0" in Precomp.h.WlanE.Windows if needed. +// +#if (RTL8188E_SUPPORT == 1) && (RTL8188E_FPGA_TRUE_PHY_VERIFICATION == 1) +#define SIC_ENABLE 1 +#define SIC_HW_SUPPORT 1 +#else +#define SIC_ENABLE 0 +#define SIC_HW_SUPPORT 0 +#endif +//================================================================== + + +#define SIC_MAX_POLL_CNT 5 + +#if(SIC_HW_SUPPORT == 1) +#define SIC_CMD_READY 0 +#define SIC_CMD_PREWRITE 0x1 +#if(RTL8188E_SUPPORT == 1) +#define SIC_CMD_WRITE 0x40 +#define SIC_CMD_PREREAD 0x2 +#define SIC_CMD_READ 0x80 +#define SIC_CMD_INIT 0xf0 +#define SIC_INIT_VAL 0xff + +#define SIC_INIT_REG 0x1b7 +#define SIC_CMD_REG 0x1EB // 1byte +#define SIC_ADDR_REG 0x1E8 // 1b4~1b5, 2 bytes +#define SIC_DATA_REG 0x1EC // 1b0~1b3 +#else +#define SIC_CMD_WRITE 0x11 +#define SIC_CMD_PREREAD 0x2 +#define SIC_CMD_READ 0x12 +#define SIC_CMD_INIT 0x1f +#define SIC_INIT_VAL 0xff + +#define SIC_INIT_REG 0x1b7 +#define SIC_CMD_REG 0x1b6 // 1byte +#define SIC_ADDR_REG 0x1b4 // 1b4~1b5, 2 bytes +#define SIC_DATA_REG 0x1b0 // 1b0~1b3 +#endif +#else +#define SIC_CMD_READY 0 +#define SIC_CMD_WRITE 1 +#define SIC_CMD_READ 2 + +#if(RTL8188E_SUPPORT == 1) +#define SIC_CMD_REG 0x1EB // 1byte +#define SIC_ADDR_REG 0x1E8 // 1b9~1ba, 2 bytes +#define SIC_DATA_REG 0x1EC // 1bc~1bf +#else +#define SIC_CMD_REG 0x1b8 // 1byte +#define SIC_ADDR_REG 0x1b9 // 1b9~1ba, 2 bytes +#define SIC_DATA_REG 0x1bc // 1bc~1bf +#endif +#endif + +#if(SIC_ENABLE == 1) +VOID SIC_Init(IN PADAPTER Adapter); +#endif + + +#endif // __INC_HAL8192CPHYCFG_H + diff --git a/drivers/net/wireless/rtl8723as/include/Hal8188EPhyReg.h b/drivers/net/wireless/rtl8723as/include/Hal8188EPhyReg.h index 56947689797e..1eddfe754e1a 100755 --- a/drivers/net/wireless/rtl8723as/include/Hal8188EPhyReg.h +++ b/drivers/net/wireless/rtl8723as/include/Hal8188EPhyReg.h @@ -1,1111 +1,1111 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8188EPHYREG_H__ -#define __INC_HAL8188EPHYREG_H__ -/*--------------------------Define Parameters-------------------------------*/ -// -// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 -// 3. RF register 0x00-2E -// 4. Bit Mask for BB/RF register -// 5. Other defintion for BB/RF R/W -// - - -// -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 1. Page1(0x100) -// -#define rPMAC_Reset 0x100 -#define rPMAC_TxStart 0x104 -#define rPMAC_TxLegacySIG 0x108 -#define rPMAC_TxHTSIG1 0x10c -#define rPMAC_TxHTSIG2 0x110 -#define rPMAC_PHYDebug 0x114 -#define rPMAC_TxPacketNum 0x118 -#define rPMAC_TxIdle 0x11c -#define rPMAC_TxMACHeader0 0x120 -#define rPMAC_TxMACHeader1 0x124 -#define rPMAC_TxMACHeader2 0x128 -#define rPMAC_TxMACHeader3 0x12c -#define rPMAC_TxMACHeader4 0x130 -#define rPMAC_TxMACHeader5 0x134 -#define rPMAC_TxDataType 0x138 -#define rPMAC_TxRandomSeed 0x13c -#define rPMAC_CCKPLCPPreamble 0x140 -#define rPMAC_CCKPLCPHeader 0x144 -#define rPMAC_CCKCRC16 0x148 -#define rPMAC_OFDMRxCRC32OK 0x170 -#define rPMAC_OFDMRxCRC32Er 0x174 -#define rPMAC_OFDMRxParityEr 0x178 -#define rPMAC_OFDMRxCRC8Er 0x17c -#define rPMAC_CCKCRxRC16Er 0x180 -#define rPMAC_CCKCRxRC32Er 0x184 -#define rPMAC_CCKCRxRC32OK 0x188 -#define rPMAC_TxStatus 0x18c - -// -// 2. Page2(0x200) -// -// The following two definition are only used for USB interface. -#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. -#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. - -// -// 3. Page8(0x800) -// -#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? - -#define rFPGA0_TxInfo 0x804 // Status report?? -#define rFPGA0_PSDFunction 0x808 - -#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? - -#define rFPGA0_RFTiming1 0x810 // Useless now -#define rFPGA0_RFTiming2 0x814 - -#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register -#define rFPGA0_XA_HSSIParameter2 0x824 -#define rFPGA0_XB_HSSIParameter1 0x828 -#define rFPGA0_XB_HSSIParameter2 0x82c - -#define rFPGA0_XA_LSSIParameter 0x840 -#define rFPGA0_XB_LSSIParameter 0x844 - -#define rFPGA0_RFWakeUpParameter 0x850 // Useless now -#define rFPGA0_RFSleepUpParameter 0x854 - -#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch -#define rFPGA0_XCD_SwitchControl 0x85c - -#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch -#define rFPGA0_XB_RFInterfaceOE 0x864 - -#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control -#define rFPGA0_XCD_RFInterfaceSW 0x874 - -#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter -#define rFPGA0_XCD_RFParameter 0x87c - -#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? -#define rFPGA0_AnalogParameter2 0x884 -#define rFPGA0_AnalogParameter3 0x888 -#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy -#define rFPGA0_AnalogParameter4 0x88c - -#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback -#define rFPGA0_XB_LSSIReadBack 0x8a4 -#define rFPGA0_XC_LSSIReadBack 0x8a8 -#define rFPGA0_XD_LSSIReadBack 0x8ac - -#define rFPGA0_PSDReport 0x8b4 // Useless now -#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback -#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback -#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value -#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now - -// -// 4. Page9(0x900) -// -#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? - -#define rFPGA1_TxBlock 0x904 // Useless now -#define rFPGA1_DebugSelect 0x908 // Useless now -#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? - -// -// 5. PageA(0xA00) -// -// Set Control channel to upper or lower. These settings are required only for 40MHz -#define rCCK0_System 0xa00 - -#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI -#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain - -#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series -#define rCCK0_RxAGC2 0xa10 //AGC & DAGC - -#define rCCK0_RxHP 0xa14 - -#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold -#define rCCK0_DSPParameter2 0xa1c //SQ threshold - -#define rCCK0_TxFilter1 0xa20 -#define rCCK0_TxFilter2 0xa24 -#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 -#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report -#define rCCK0_TRSSIReport 0xa50 -#define rCCK0_RxReport 0xa54 //0xa57 -#define rCCK0_FACounterLower 0xa5c //0xa5b -#define rCCK0_FACounterUpper 0xa58 //0xa5c - -// -// PageB(0xB00) -// -#define rPdp_AntA 0xb00 -#define rPdp_AntA_4 0xb04 -#define rConfig_Pmpd_AntA 0xb28 -#define rConfig_AntA 0xb68 -#define rConfig_AntB 0xb6c -#define rPdp_AntB 0xb70 -#define rPdp_AntB_4 0xb74 -#define rConfig_Pmpd_AntB 0xb98 -#define rAPK 0xbd8 - - - -// -// 6. PageC(0xC00) -// -#define rOFDM0_LSTF 0xc00 - -#define rOFDM0_TRxPathEnable 0xc04 -#define rOFDM0_TRMuxPar 0xc08 -#define rOFDM0_TRSWIsolation 0xc0c - -#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter -#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix -#define rOFDM0_XBRxAFE 0xc18 -#define rOFDM0_XBRxIQImbalance 0xc1c -#define rOFDM0_XCRxAFE 0xc20 -#define rOFDM0_XCRxIQImbalance 0xc24 -#define rOFDM0_XDRxAFE 0xc28 -#define rOFDM0_XDRxIQImbalance 0xc2c - -#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain -#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. -#define rOFDM0_RxDetector3 0xc38 //Frame Sync. -#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI - -#define rOFDM0_RxDSP 0xc40 //Rx Sync Path -#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC -#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold -#define rOFDM0_ECCAThreshold 0xc4c // energy CCA - -#define rOFDM0_XAAGCCore1 0xc50 // DIG -#define rOFDM0_XAAGCCore2 0xc54 -#define rOFDM0_XBAGCCore1 0xc58 -#define rOFDM0_XBAGCCore2 0xc5c -#define rOFDM0_XCAGCCore1 0xc60 -#define rOFDM0_XCAGCCore2 0xc64 -#define rOFDM0_XDAGCCore1 0xc68 -#define rOFDM0_XDAGCCore2 0xc6c - -#define rOFDM0_AGCParameter1 0xc70 -#define rOFDM0_AGCParameter2 0xc74 -#define rOFDM0_AGCRSSITable 0xc78 -#define rOFDM0_HTSTFAGC 0xc7c - -#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG -#define rOFDM0_XATxAFE 0xc84 -#define rOFDM0_XBTxIQImbalance 0xc88 -#define rOFDM0_XBTxAFE 0xc8c -#define rOFDM0_XCTxIQImbalance 0xc90 -#define rOFDM0_XCTxAFE 0xc94 -#define rOFDM0_XDTxIQImbalance 0xc98 -#define rOFDM0_XDTxAFE 0xc9c - -#define rOFDM0_RxIQExtAnta 0xca0 -#define rOFDM0_TxCoeff1 0xca4 -#define rOFDM0_TxCoeff2 0xca8 -#define rOFDM0_TxCoeff3 0xcac -#define rOFDM0_TxCoeff4 0xcb0 -#define rOFDM0_TxCoeff5 0xcb4 -#define rOFDM0_TxCoeff6 0xcb8 -#define rOFDM0_RxHPParameter 0xce0 -#define rOFDM0_TxPseudoNoiseWgt 0xce4 -#define rOFDM0_FrameSync 0xcf0 -#define rOFDM0_DFSReport 0xcf4 - - -// -// 7. PageD(0xD00) -// -#define rOFDM1_LSTF 0xd00 -#define rOFDM1_TRxPathEnable 0xd04 - -#define rOFDM1_CFO 0xd08 // No setting now -#define rOFDM1_CSI1 0xd10 -#define rOFDM1_SBD 0xd14 -#define rOFDM1_CSI2 0xd18 -#define rOFDM1_CFOTracking 0xd2c -#define rOFDM1_TRxMesaure1 0xd34 -#define rOFDM1_IntfDet 0xd3c -#define rOFDM1_PseudoNoiseStateAB 0xd50 -#define rOFDM1_PseudoNoiseStateCD 0xd54 -#define rOFDM1_RxPseudoNoiseWgt 0xd58 - -#define rOFDM_PHYCounter1 0xda0 //cca, parity fail -#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail -#define rOFDM_PHYCounter3 0xda8 //MCS not support - -#define rOFDM_ShortCFOAB 0xdac // No setting now -#define rOFDM_ShortCFOCD 0xdb0 -#define rOFDM_LongCFOAB 0xdb4 -#define rOFDM_LongCFOCD 0xdb8 -#define rOFDM_TailCFOAB 0xdbc -#define rOFDM_TailCFOCD 0xdc0 -#define rOFDM_PWMeasure1 0xdc4 -#define rOFDM_PWMeasure2 0xdc8 -#define rOFDM_BWReport 0xdcc -#define rOFDM_AGCReport 0xdd0 -#define rOFDM_RxSNR 0xdd4 -#define rOFDM_RxEVMCSI 0xdd8 -#define rOFDM_SIGReport 0xddc - - -// -// 8. PageE(0xE00) -// -#define rTxAGC_A_Rate18_06 0xe00 -#define rTxAGC_A_Rate54_24 0xe04 -#define rTxAGC_A_CCK1_Mcs32 0xe08 -#define rTxAGC_A_Mcs03_Mcs00 0xe10 -#define rTxAGC_A_Mcs07_Mcs04 0xe14 -#define rTxAGC_A_Mcs11_Mcs08 0xe18 -#define rTxAGC_A_Mcs15_Mcs12 0xe1c - -#define rTxAGC_B_Rate18_06 0x830 -#define rTxAGC_B_Rate54_24 0x834 -#define rTxAGC_B_CCK1_55_Mcs32 0x838 -#define rTxAGC_B_Mcs03_Mcs00 0x83c -#define rTxAGC_B_Mcs07_Mcs04 0x848 -#define rTxAGC_B_Mcs11_Mcs08 0x84c -#define rTxAGC_B_Mcs15_Mcs12 0x868 -#define rTxAGC_B_CCK11_A_CCK2_11 0x86c - -#define rFPGA0_IQK 0xe28 -#define rTx_IQK_Tone_A 0xe30 -#define rRx_IQK_Tone_A 0xe34 -#define rTx_IQK_PI_A 0xe38 -#define rRx_IQK_PI_A 0xe3c - -#define rTx_IQK 0xe40 -#define rRx_IQK 0xe44 -#define rIQK_AGC_Pts 0xe48 -#define rIQK_AGC_Rsp 0xe4c -#define rTx_IQK_Tone_B 0xe50 -#define rRx_IQK_Tone_B 0xe54 -#define rTx_IQK_PI_B 0xe58 -#define rRx_IQK_PI_B 0xe5c -#define rIQK_AGC_Cont 0xe60 - -#define rBlue_Tooth 0xe6c -#define rRx_Wait_CCA 0xe70 -#define rTx_CCK_RFON 0xe74 -#define rTx_CCK_BBON 0xe78 -#define rTx_OFDM_RFON 0xe7c -#define rTx_OFDM_BBON 0xe80 -#define rTx_To_Rx 0xe84 -#define rTx_To_Tx 0xe88 -#define rRx_CCK 0xe8c - -#define rTx_Power_Before_IQK_A 0xe94 -#define rTx_Power_After_IQK_A 0xe9c - -#define rRx_Power_Before_IQK_A 0xea0 -#define rRx_Power_Before_IQK_A_2 0xea4 -#define rRx_Power_After_IQK_A 0xea8 -#define rRx_Power_After_IQK_A_2 0xeac - -#define rTx_Power_Before_IQK_B 0xeb4 -#define rTx_Power_After_IQK_B 0xebc - -#define rRx_Power_Before_IQK_B 0xec0 -#define rRx_Power_Before_IQK_B_2 0xec4 -#define rRx_Power_After_IQK_B 0xec8 -#define rRx_Power_After_IQK_B_2 0xecc - -#define rRx_OFDM 0xed0 -#define rRx_Wait_RIFS 0xed4 -#define rRx_TO_Rx 0xed8 -#define rStandby 0xedc -#define rSleep 0xee0 -#define rPMPD_ANAEN 0xeec - -// -// 7. RF Register 0x00-0x2E (RF 8256) -// RF-0222D 0x00-3F -// -//Zebra1 -#define rZebra1_HSSIEnable 0x0 // Useless now -#define rZebra1_TRxEnable1 0x1 -#define rZebra1_TRxEnable2 0x2 -#define rZebra1_AGC 0x4 -#define rZebra1_ChargePump 0x5 -#define rZebra1_Channel 0x7 // RF channel switch - -//#endif -#define rZebra1_TxGain 0x8 // Useless now -#define rZebra1_TxLPF 0x9 -#define rZebra1_RxLPF 0xb -#define rZebra1_RxHPFCorner 0xc - -//Zebra4 -#define rGlobalCtrl 0 // Useless now -#define rRTL8256_TxLPF 19 -#define rRTL8256_RxLPF 11 - -//RTL8258 -#define rRTL8258_TxLPF 0x11 // Useless now -#define rRTL8258_RxLPF 0x13 -#define rRTL8258_RSSILPF 0xa - -// -// RL6052 Register definition -// -#define RF_AC 0x00 // - -#define RF_IQADJ_G1 0x01 // -#define RF_IQADJ_G2 0x02 // - -#define RF_POW_TRSW 0x05 // - -#define RF_GAIN_RX 0x06 // -#define RF_GAIN_TX 0x07 // - -#define RF_TXM_IDAC 0x08 // -#define RF_IPA_G 0x09 // -#define RF_TXBIAS_G 0x0A -#define RF_TXPA_AG 0x0B -#define RF_IPA_A 0x0C // -#define RF_TXBIAS_A 0x0D -#define RF_BS_PA_APSET_G9_G11 0x0E -#define RF_BS_IQGEN 0x0F // - -#define RF_MODE1 0x10 // -#define RF_MODE2 0x11 // - -#define RF_RX_AGC_HP 0x12 // -#define RF_TX_AGC 0x13 // -#define RF_BIAS 0x14 // -#define RF_IPA 0x15 // -#define RF_TXBIAS 0x16 -#define RF_POW_ABILITY 0x17 // -#define RF_CHNLBW 0x18 // RF channel and BW switch -#define RF_TOP 0x19 // - -#define RF_RX_G1 0x1A // -#define RF_RX_G2 0x1B // - -#define RF_RX_BB2 0x1C // -#define RF_RX_BB1 0x1D // - -#define RF_RCK1 0x1E // -#define RF_RCK2 0x1F // - -#define RF_TX_G1 0x20 // -#define RF_TX_G2 0x21 // -#define RF_TX_G3 0x22 // - -#define RF_TX_BB1 0x23 // - -//#if HARDWARE_TYPE_IS_RTL8192D == 1 -#define RF_T_METER_92D 0x42 // -//#else -#define RF_T_METER_88E 0x42 // -#define RF_T_METER 0x24 // - -//#endif - -#define RF_SYN_G1 0x25 // RF TX Power control -#define RF_SYN_G2 0x26 // RF TX Power control -#define RF_SYN_G3 0x27 // RF TX Power control -#define RF_SYN_G4 0x28 // RF TX Power control -#define RF_SYN_G5 0x29 // RF TX Power control -#define RF_SYN_G6 0x2A // RF TX Power control -#define RF_SYN_G7 0x2B // RF TX Power control -#define RF_SYN_G8 0x2C // RF TX Power control - -#define RF_RCK_OS 0x30 // RF TX PA control -#define RF_TXPA_G1 0x31 // RF TX PA control -#define RF_TXPA_G2 0x32 // RF TX PA control -#define RF_TXPA_G3 0x33 // RF TX PA control -#define RF_TX_BIAS_A 0x35 -#define RF_TX_BIAS_D 0x36 -#define RF_LOBF_9 0x38 -#define RF_RXRF_A3 0x3C // -#define RF_TRSW 0x3F - -#define RF_TXRF_A2 0x41 -#define RF_TXPA_G4 0x46 -#define RF_TXPA_A4 0x4B -#define RF_0x52 0x52 -#define RF_WE_LUT 0xEF - - -// -//Bit Mask -// -// 1. Page1(0x100) -#define bBBResetB 0x100 // Useless now? -#define bGlobalResetB 0x200 -#define bOFDMTxStart 0x4 -#define bCCKTxStart 0x8 -#define bCRC32Debug 0x100 -#define bPMACLoopback 0x10 -#define bTxLSIG 0xffffff -#define bOFDMTxRate 0xf -#define bOFDMTxReserved 0x10 -#define bOFDMTxLength 0x1ffe0 -#define bOFDMTxParity 0x20000 -#define bTxHTSIG1 0xffffff -#define bTxHTMCSRate 0x7f -#define bTxHTBW 0x80 -#define bTxHTLength 0xffff00 -#define bTxHTSIG2 0xffffff -#define bTxHTSmoothing 0x1 -#define bTxHTSounding 0x2 -#define bTxHTReserved 0x4 -#define bTxHTAggreation 0x8 -#define bTxHTSTBC 0x30 -#define bTxHTAdvanceCoding 0x40 -#define bTxHTShortGI 0x80 -#define bTxHTNumberHT_LTF 0x300 -#define bTxHTCRC8 0x3fc00 -#define bCounterReset 0x10000 -#define bNumOfOFDMTx 0xffff -#define bNumOfCCKTx 0xffff0000 -#define bTxIdleInterval 0xffff -#define bOFDMService 0xffff0000 -#define bTxMACHeader 0xffffffff -#define bTxDataInit 0xff -#define bTxHTMode 0x100 -#define bTxDataType 0x30000 -#define bTxRandomSeed 0xffffffff -#define bCCKTxPreamble 0x1 -#define bCCKTxSFD 0xffff0000 -#define bCCKTxSIG 0xff -#define bCCKTxService 0xff00 -#define bCCKLengthExt 0x8000 -#define bCCKTxLength 0xffff0000 -#define bCCKTxCRC16 0xffff -#define bCCKTxStatus 0x1 -#define bOFDMTxStatus 0x2 - -#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) - -// 2. Page8(0x800) -#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD -#define bJapanMode 0x2 -#define bCCKTxSC 0x30 -#define bCCKEn 0x1000000 -#define bOFDMEn 0x2000000 - -#define bOFDMRxADCPhase 0x10000 // Useless now -#define bOFDMTxDACPhase 0x40000 -#define bXATxAGC 0x3f - -#define bAntennaSelect 0x0300 - -#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage -#define bXCTxAGC 0xf000 -#define bXDTxAGC 0xf0000 - -#define bPAStart 0xf0000000 // Useless now -#define bTRStart 0x00f00000 -#define bRFStart 0x0000f000 -#define bBBStart 0x000000f0 -#define bBBCCKStart 0x0000000f -#define bPAEnd 0xf //Reg0x814 -#define bTREnd 0x0f000000 -#define bRFEnd 0x000f0000 -#define bCCAMask 0x000000f0 //T2R -#define bR2RCCAMask 0x00000f00 -#define bHSSI_R2TDelay 0xf8000000 -#define bHSSI_T2RDelay 0xf80000 -#define bContTxHSSI 0x400 //chane gain at continue Tx -#define bIGFromCCK 0x200 -#define bAGCAddress 0x3f -#define bRxHPTx 0x7000 -#define bRxHPT2R 0x38000 -#define bRxHPCCKIni 0xc0000 -#define bAGCTxCode 0xc00000 -#define bAGCRxCode 0x300000 - -#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 -#define b3WireAddressLength 0x400 - -#define b3WireRFPowerDown 0x1 // Useless now -//#define bHWSISelect 0x8 -#define b5GPAPEPolarity 0x40000000 -#define b2GPAPEPolarity 0x80000000 -#define bRFSW_TxDefaultAnt 0x3 -#define bRFSW_TxOptionAnt 0x30 -#define bRFSW_RxDefaultAnt 0x300 -#define bRFSW_RxOptionAnt 0x3000 -#define bRFSI_3WireData 0x1 -#define bRFSI_3WireClock 0x2 -#define bRFSI_3WireLoad 0x4 -#define bRFSI_3WireRW 0x8 -#define bRFSI_3Wire 0xf - -#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW - -#define bRFSI_TRSW 0x20 // Useless now -#define bRFSI_TRSWB 0x40 -#define bRFSI_ANTSW 0x100 -#define bRFSI_ANTSWB 0x200 -#define bRFSI_PAPE 0x400 -#define bRFSI_PAPE5G 0x800 -#define bBandSelect 0x1 -#define bHTSIG2_GI 0x80 -#define bHTSIG2_Smoothing 0x01 -#define bHTSIG2_Sounding 0x02 -#define bHTSIG2_Aggreaton 0x08 -#define bHTSIG2_STBC 0x30 -#define bHTSIG2_AdvCoding 0x40 -#define bHTSIG2_NumOfHTLTF 0x300 -#define bHTSIG2_CRC8 0x3fc -#define bHTSIG1_MCS 0x7f -#define bHTSIG1_BandWidth 0x80 -#define bHTSIG1_HTLength 0xffff -#define bLSIG_Rate 0xf -#define bLSIG_Reserved 0x10 -#define bLSIG_Length 0x1fffe -#define bLSIG_Parity 0x20 -#define bCCKRxPhase 0x4 - -#define bLSSIReadAddress 0x7f800000 // T65 RF - -#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal - -#define bLSSIReadBackData 0xfffff // T65 RF - -#define bLSSIReadOKFlag 0x1000 // Useless now -#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz -#define bRegulator0Standby 0x1 -#define bRegulatorPLLStandby 0x2 -#define bRegulator1Standby 0x4 -#define bPLLPowerUp 0x8 -#define bDPLLPowerUp 0x10 -#define bDA10PowerUp 0x20 -#define bAD7PowerUp 0x200 -#define bDA6PowerUp 0x2000 -#define bXtalPowerUp 0x4000 -#define b40MDClkPowerUP 0x8000 -#define bDA6DebugMode 0x20000 -#define bDA6Swing 0x380000 - -#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ - -#define b80MClkDelay 0x18000000 // Useless -#define bAFEWatchDogEnable 0x20000000 - -#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap -#define bXtalCap23 0x3 -#define bXtalCap92x 0x0f000000 -#define bXtalCap 0x0f000000 - -#define bIntDifClkEnable 0x400 // Useless -#define bExtSigClkEnable 0x800 -#define bBandgapMbiasPowerUp 0x10000 -#define bAD11SHGain 0xc0000 -#define bAD11InputRange 0x700000 -#define bAD11OPCurrent 0x3800000 -#define bIPathLoopback 0x4000000 -#define bQPathLoopback 0x8000000 -#define bAFELoopback 0x10000000 -#define bDA10Swing 0x7e0 -#define bDA10Reverse 0x800 -#define bDAClkSource 0x1000 -#define bAD7InputRange 0x6000 -#define bAD7Gain 0x38000 -#define bAD7OutputCMMode 0x40000 -#define bAD7InputCMMode 0x380000 -#define bAD7Current 0xc00000 -#define bRegulatorAdjust 0x7000000 -#define bAD11PowerUpAtTx 0x1 -#define bDA10PSAtTx 0x10 -#define bAD11PowerUpAtRx 0x100 -#define bDA10PSAtRx 0x1000 -#define bCCKRxAGCFormat 0x200 -#define bPSDFFTSamplepPoint 0xc000 -#define bPSDAverageNum 0x3000 -#define bIQPathControl 0xc00 -#define bPSDFreq 0x3ff -#define bPSDAntennaPath 0x30 -#define bPSDIQSwitch 0x40 -#define bPSDRxTrigger 0x400000 -#define bPSDTxTrigger 0x80000000 -#define bPSDSineToneScale 0x7f000000 -#define bPSDReport 0xffff - -// 3. Page9(0x900) -#define bOFDMTxSC 0x30000000 // Useless -#define bCCKTxOn 0x1 -#define bOFDMTxOn 0x2 -#define bDebugPage 0xfff //reset debug page and also HWord, LWord -#define bDebugItem 0xff //reset debug page and LWord -#define bAntL 0x10 -#define bAntNonHT 0x100 -#define bAntHT1 0x1000 -#define bAntHT2 0x10000 -#define bAntHT1S1 0x100000 -#define bAntNonHTS1 0x1000000 - -// 4. PageA(0xA00) -#define bCCKBBMode 0x3 // Useless -#define bCCKTxPowerSaving 0x80 -#define bCCKRxPowerSaving 0x40 - -#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch - -#define bCCKScramble 0x8 // Useless -#define bCCKAntDiversity 0x8000 -#define bCCKCarrierRecovery 0x4000 -#define bCCKTxRate 0x3000 -#define bCCKDCCancel 0x0800 -#define bCCKISICancel 0x0400 -#define bCCKMatchFilter 0x0200 -#define bCCKEqualizer 0x0100 -#define bCCKPreambleDetect 0x800000 -#define bCCKFastFalseCCA 0x400000 -#define bCCKChEstStart 0x300000 -#define bCCKCCACount 0x080000 -#define bCCKcs_lim 0x070000 -#define bCCKBistMode 0x80000000 -#define bCCKCCAMask 0x40000000 -#define bCCKTxDACPhase 0x4 -#define bCCKRxADCPhase 0x20000000 //r_rx_clk -#define bCCKr_cp_mode0 0x0100 -#define bCCKTxDCOffset 0xf0 -#define bCCKRxDCOffset 0xf -#define bCCKCCAMode 0xc000 -#define bCCKFalseCS_lim 0x3f00 -#define bCCKCS_ratio 0xc00000 -#define bCCKCorgBit_sel 0x300000 -#define bCCKPD_lim 0x0f0000 -#define bCCKNewCCA 0x80000000 -#define bCCKRxHPofIG 0x8000 -#define bCCKRxIG 0x7f00 -#define bCCKLNAPolarity 0x800000 -#define bCCKRx1stGain 0x7f0000 -#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity -#define bCCKRxAGCSatLevel 0x1f000000 -#define bCCKRxAGCSatCount 0xe0 -#define bCCKRxRFSettle 0x1f //AGCsamp_dly -#define bCCKFixedRxAGC 0x8000 -//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 -#define bCCKAntennaPolarity 0x2000 -#define bCCKTxFilterType 0x0c00 -#define bCCKRxAGCReportType 0x0300 -#define bCCKRxDAGCEn 0x80000000 -#define bCCKRxDAGCPeriod 0x20000000 -#define bCCKRxDAGCSatLevel 0x1f000000 -#define bCCKTimingRecovery 0x800000 -#define bCCKTxC0 0x3f0000 -#define bCCKTxC1 0x3f000000 -#define bCCKTxC2 0x3f -#define bCCKTxC3 0x3f00 -#define bCCKTxC4 0x3f0000 -#define bCCKTxC5 0x3f000000 -#define bCCKTxC6 0x3f -#define bCCKTxC7 0x3f00 -#define bCCKDebugPort 0xff0000 -#define bCCKDACDebug 0x0f000000 -#define bCCKFalseAlarmEnable 0x8000 -#define bCCKFalseAlarmRead 0x4000 -#define bCCKTRSSI 0x7f -#define bCCKRxAGCReport 0xfe -#define bCCKRxReport_AntSel 0x80000000 -#define bCCKRxReport_MFOff 0x40000000 -#define bCCKRxRxReport_SQLoss 0x20000000 -#define bCCKRxReport_Pktloss 0x10000000 -#define bCCKRxReport_Lockedbit 0x08000000 -#define bCCKRxReport_RateError 0x04000000 -#define bCCKRxReport_RxRate 0x03000000 -#define bCCKRxFACounterLower 0xff -#define bCCKRxFACounterUpper 0xff000000 -#define bCCKRxHPAGCStart 0xe000 -#define bCCKRxHPAGCFinal 0x1c00 -#define bCCKRxFalseAlarmEnable 0x8000 -#define bCCKFACounterFreeze 0x4000 -#define bCCKTxPathSel 0x10000000 -#define bCCKDefaultRxPath 0xc000000 -#define bCCKOptionRxPath 0x3000000 - -// 5. PageC(0xC00) -#define bNumOfSTF 0x3 // Useless -#define bShift_L 0xc0 -#define bGI_TH 0xc -#define bRxPathA 0x1 -#define bRxPathB 0x2 -#define bRxPathC 0x4 -#define bRxPathD 0x8 -#define bTxPathA 0x1 -#define bTxPathB 0x2 -#define bTxPathC 0x4 -#define bTxPathD 0x8 -#define bTRSSIFreq 0x200 -#define bADCBackoff 0x3000 -#define bDFIRBackoff 0xc000 -#define bTRSSILatchPhase 0x10000 -#define bRxIDCOffset 0xff -#define bRxQDCOffset 0xff00 -#define bRxDFIRMode 0x1800000 -#define bRxDCNFType 0xe000000 -#define bRXIQImb_A 0x3ff -#define bRXIQImb_B 0xfc00 -#define bRXIQImb_C 0x3f0000 -#define bRXIQImb_D 0xffc00000 -#define bDC_dc_Notch 0x60000 -#define bRxNBINotch 0x1f000000 -#define bPD_TH 0xf -#define bPD_TH_Opt2 0xc000 -#define bPWED_TH 0x700 -#define bIfMF_Win_L 0x800 -#define bPD_Option 0x1000 -#define bMF_Win_L 0xe000 -#define bBW_Search_L 0x30000 -#define bwin_enh_L 0xc0000 -#define bBW_TH 0x700000 -#define bED_TH2 0x3800000 -#define bBW_option 0x4000000 -#define bRatio_TH 0x18000000 -#define bWindow_L 0xe0000000 -#define bSBD_Option 0x1 -#define bFrame_TH 0x1c -#define bFS_Option 0x60 -#define bDC_Slope_check 0x80 -#define bFGuard_Counter_DC_L 0xe00 -#define bFrame_Weight_Short 0x7000 -#define bSub_Tune 0xe00000 -#define bFrame_DC_Length 0xe000000 -#define bSBD_start_offset 0x30000000 -#define bFrame_TH_2 0x7 -#define bFrame_GI2_TH 0x38 -#define bGI2_Sync_en 0x40 -#define bSarch_Short_Early 0x300 -#define bSarch_Short_Late 0xc00 -#define bSarch_GI2_Late 0x70000 -#define bCFOAntSum 0x1 -#define bCFOAcc 0x2 -#define bCFOStartOffset 0xc -#define bCFOLookBack 0x70 -#define bCFOSumWeight 0x80 -#define bDAGCEnable 0x10000 -#define bTXIQImb_A 0x3ff -#define bTXIQImb_B 0xfc00 -#define bTXIQImb_C 0x3f0000 -#define bTXIQImb_D 0xffc00000 -#define bTxIDCOffset 0xff -#define bTxQDCOffset 0xff00 -#define bTxDFIRMode 0x10000 -#define bTxPesudoNoiseOn 0x4000000 -#define bTxPesudoNoise_A 0xff -#define bTxPesudoNoise_B 0xff00 -#define bTxPesudoNoise_C 0xff0000 -#define bTxPesudoNoise_D 0xff000000 -#define bCCADropOption 0x20000 -#define bCCADropThres 0xfff00000 -#define bEDCCA_H 0xf -#define bEDCCA_L 0xf0 -#define bLambda_ED 0x300 -#define bRxInitialGain 0x7f -#define bRxAntDivEn 0x80 -#define bRxAGCAddressForLNA 0x7f00 -#define bRxHighPowerFlow 0x8000 -#define bRxAGCFreezeThres 0xc0000 -#define bRxFreezeStep_AGC1 0x300000 -#define bRxFreezeStep_AGC2 0xc00000 -#define bRxFreezeStep_AGC3 0x3000000 -#define bRxFreezeStep_AGC0 0xc000000 -#define bRxRssi_Cmp_En 0x10000000 -#define bRxQuickAGCEn 0x20000000 -#define bRxAGCFreezeThresMode 0x40000000 -#define bRxOverFlowCheckType 0x80000000 -#define bRxAGCShift 0x7f -#define bTRSW_Tri_Only 0x80 -#define bPowerThres 0x300 -#define bRxAGCEn 0x1 -#define bRxAGCTogetherEn 0x2 -#define bRxAGCMin 0x4 -#define bRxHP_Ini 0x7 -#define bRxHP_TRLNA 0x70 -#define bRxHP_RSSI 0x700 -#define bRxHP_BBP1 0x7000 -#define bRxHP_BBP2 0x70000 -#define bRxHP_BBP3 0x700000 -#define bRSSI_H 0x7f0000 //the threshold for high power -#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity -#define bRxSettle_TRSW 0x7 -#define bRxSettle_LNA 0x38 -#define bRxSettle_RSSI 0x1c0 -#define bRxSettle_BBP 0xe00 -#define bRxSettle_RxHP 0x7000 -#define bRxSettle_AntSW_RSSI 0x38000 -#define bRxSettle_AntSW 0xc0000 -#define bRxProcessTime_DAGC 0x300000 -#define bRxSettle_HSSI 0x400000 -#define bRxProcessTime_BBPPW 0x800000 -#define bRxAntennaPowerShift 0x3000000 -#define bRSSITableSelect 0xc000000 -#define bRxHP_Final 0x7000000 -#define bRxHTSettle_BBP 0x7 -#define bRxHTSettle_HSSI 0x8 -#define bRxHTSettle_RxHP 0x70 -#define bRxHTSettle_BBPPW 0x80 -#define bRxHTSettle_Idle 0x300 -#define bRxHTSettle_Reserved 0x1c00 -#define bRxHTRxHPEn 0x8000 -#define bRxHTAGCFreezeThres 0x30000 -#define bRxHTAGCTogetherEn 0x40000 -#define bRxHTAGCMin 0x80000 -#define bRxHTAGCEn 0x100000 -#define bRxHTDAGCEn 0x200000 -#define bRxHTRxHP_BBP 0x1c00000 -#define bRxHTRxHP_Final 0xe0000000 -#define bRxPWRatioTH 0x3 -#define bRxPWRatioEn 0x4 -#define bRxMFHold 0x3800 -#define bRxPD_Delay_TH1 0x38 -#define bRxPD_Delay_TH2 0x1c0 -#define bRxPD_DC_COUNT_MAX 0x600 -//#define bRxMF_Hold 0x3800 -#define bRxPD_Delay_TH 0x8000 -#define bRxProcess_Delay 0xf0000 -#define bRxSearchrange_GI2_Early 0x700000 -#define bRxFrame_Guard_Counter_L 0x3800000 -#define bRxSGI_Guard_L 0xc000000 -#define bRxSGI_Search_L 0x30000000 -#define bRxSGI_TH 0xc0000000 -#define bDFSCnt0 0xff -#define bDFSCnt1 0xff00 -#define bDFSFlag 0xf0000 -#define bMFWeightSum 0x300000 -#define bMinIdxTH 0x7f000000 -#define bDAFormat 0x40000 -#define bTxChEmuEnable 0x01000000 -#define bTRSWIsolation_A 0x7f -#define bTRSWIsolation_B 0x7f00 -#define bTRSWIsolation_C 0x7f0000 -#define bTRSWIsolation_D 0x7f000000 -#define bExtLNAGain 0x7c00 - -// 6. PageE(0xE00) -#define bSTBCEn 0x4 // Useless -#define bAntennaMapping 0x10 -#define bNss 0x20 -#define bCFOAntSumD 0x200 -#define bPHYCounterReset 0x8000000 -#define bCFOReportGet 0x4000000 -#define bOFDMContinueTx 0x10000000 -#define bOFDMSingleCarrier 0x20000000 -#define bOFDMSingleTone 0x40000000 -//#define bRxPath1 0x01 -//#define bRxPath2 0x02 -//#define bRxPath3 0x04 -//#define bRxPath4 0x08 -//#define bTxPath1 0x10 -//#define bTxPath2 0x20 -#define bHTDetect 0x100 -#define bCFOEn 0x10000 -#define bCFOValue 0xfff00000 -#define bSigTone_Re 0x3f -#define bSigTone_Im 0x7f00 -#define bCounter_CCA 0xffff -#define bCounter_ParityFail 0xffff0000 -#define bCounter_RateIllegal 0xffff -#define bCounter_CRC8Fail 0xffff0000 -#define bCounter_MCSNoSupport 0xffff -#define bCounter_FastSync 0xffff -#define bShortCFO 0xfff -#define bShortCFOTLength 12 //total -#define bShortCFOFLength 11 //fraction -#define bLongCFO 0x7ff -#define bLongCFOTLength 11 -#define bLongCFOFLength 11 -#define bTailCFO 0x1fff -#define bTailCFOTLength 13 -#define bTailCFOFLength 12 -#define bmax_en_pwdB 0xffff -#define bCC_power_dB 0xffff0000 -#define bnoise_pwdB 0xffff -#define bPowerMeasTLength 10 -#define bPowerMeasFLength 3 -#define bRx_HT_BW 0x1 -#define bRxSC 0x6 -#define bRx_HT 0x8 -#define bNB_intf_det_on 0x1 -#define bIntf_win_len_cfg 0x30 -#define bNB_Intf_TH_cfg 0x1c0 -#define bRFGain 0x3f -#define bTableSel 0x40 -#define bTRSW 0x80 -#define bRxSNR_A 0xff -#define bRxSNR_B 0xff00 -#define bRxSNR_C 0xff0000 -#define bRxSNR_D 0xff000000 -#define bSNREVMTLength 8 -#define bSNREVMFLength 1 -#define bCSI1st 0xff -#define bCSI2nd 0xff00 -#define bRxEVM1st 0xff0000 -#define bRxEVM2nd 0xff000000 -#define bSIGEVM 0xff -#define bPWDB 0xff00 -#define bSGIEN 0x10000 - -#define bSFactorQAM1 0xf // Useless -#define bSFactorQAM2 0xf0 -#define bSFactorQAM3 0xf00 -#define bSFactorQAM4 0xf000 -#define bSFactorQAM5 0xf0000 -#define bSFactorQAM6 0xf0000 -#define bSFactorQAM7 0xf00000 -#define bSFactorQAM8 0xf000000 -#define bSFactorQAM9 0xf0000000 -#define bCSIScheme 0x100000 - -#define bNoiseLvlTopSet 0x3 // Useless -#define bChSmooth 0x4 -#define bChSmoothCfg1 0x38 -#define bChSmoothCfg2 0x1c0 -#define bChSmoothCfg3 0xe00 -#define bChSmoothCfg4 0x7000 -#define bMRCMode 0x800000 -#define bTHEVMCfg 0x7000000 - -#define bLoopFitType 0x1 // Useless -#define bUpdCFO 0x40 -#define bUpdCFOOffData 0x80 -#define bAdvUpdCFO 0x100 -#define bAdvTimeCtrl 0x800 -#define bUpdClko 0x1000 -#define bFC 0x6000 -#define bTrackingMode 0x8000 -#define bPhCmpEnable 0x10000 -#define bUpdClkoLTF 0x20000 -#define bComChCFO 0x40000 -#define bCSIEstiMode 0x80000 -#define bAdvUpdEqz 0x100000 -#define bUChCfg 0x7000000 -#define bUpdEqz 0x8000000 - -//Rx Pseduo noise -#define bRxPesudoNoiseOn 0x20000000 // Useless -#define bRxPesudoNoise_A 0xff -#define bRxPesudoNoise_B 0xff00 -#define bRxPesudoNoise_C 0xff0000 -#define bRxPesudoNoise_D 0xff000000 -#define bPesudoNoiseState_A 0xffff -#define bPesudoNoiseState_B 0xffff0000 -#define bPesudoNoiseState_C 0xffff -#define bPesudoNoiseState_D 0xffff0000 - -//7. RF Register -//Zebra1 -#define bZebra1_HSSIEnable 0x8 // Useless -#define bZebra1_TRxControl 0xc00 -#define bZebra1_TRxGainSetting 0x07f -#define bZebra1_RxCorner 0xc00 -#define bZebra1_TxChargePump 0x38 -#define bZebra1_RxChargePump 0x7 -#define bZebra1_ChannelNum 0xf80 -#define bZebra1_TxLPFBW 0x400 -#define bZebra1_RxLPFBW 0x600 - -//Zebra4 -#define bRTL8256RegModeCtrl1 0x100 // Useless -#define bRTL8256RegModeCtrl0 0x40 -#define bRTL8256_TxLPFBW 0x18 -#define bRTL8256_RxLPFBW 0x600 - -//RTL8258 -#define bRTL8258_TxLPFBW 0xc // Useless -#define bRTL8258_RxLPFBW 0xc00 -#define bRTL8258_RSSILPFBW 0xc0 - - -// -// Other Definition -// - -//byte endable for sb_write -#define bByte0 0x1 // Useless -#define bByte1 0x2 -#define bByte2 0x4 -#define bByte3 0x8 -#define bWord0 0x3 -#define bWord1 0xc -#define bDWord 0xf - -//for PutRegsetting & GetRegSetting BitMask -#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f -#define bMaskByte1 0xff00 -#define bMaskByte2 0xff0000 -#define bMaskByte3 0xff000000 -#define bMaskHWord 0xffff0000 -#define bMaskLWord 0x0000ffff -#define bMaskDWord 0xffffffff -#define bMask12Bits 0xfff -#define bMaskH4Bits 0xf0000000 -#define bMaskOFDM_D 0xffc00000 -#define bMaskCCK 0x3f3f3f3f - -//for PutRFRegsetting & GetRFRegSetting BitMask -//#define bMask12Bits 0xfffff // RF Reg mask bits -//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF -#define bRFRegOffsetMask 0xfffff - -#define bEnable 0x1 // Useless -#define bDisable 0x0 - -#define LeftAntenna 0x0 // Useless -#define RightAntenna 0x1 - -#define tCheckTxStatus 500 //500ms // Useless -#define tUpdateRxCounter 100 //100ms - -#define rateCCK 0 // Useless -#define rateOFDM 1 -#define rateHT 2 - -//define Register-End -#define bPMAC_End 0x1ff // Useless -#define bFPGAPHY0_End 0x8ff -#define bFPGAPHY1_End 0x9ff -#define bCCKPHY0_End 0xaff -#define bOFDMPHY0_End 0xcff -#define bOFDMPHY1_End 0xdff - -//define max debug item in each debug page -//#define bMaxItem_FPGA_PHY0 0x9 -//#define bMaxItem_FPGA_PHY1 0x3 -//#define bMaxItem_PHY_11B 0x16 -//#define bMaxItem_OFDM_PHY0 0x29 -//#define bMaxItem_OFDM_PHY1 0x0 - -#define bPMACControl 0x0 // Useless -#define bWMACControl 0x1 -#define bWNICControl 0x2 - -#define PathA 0x0 // Useless -#define PathB 0x1 -#define PathC 0x2 -#define PathD 0x3 - -/*--------------------------Define Parameters-------------------------------*/ - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8188EPHYREG_H__ +#define __INC_HAL8188EPHYREG_H__ +/*--------------------------Define Parameters-------------------------------*/ +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c + +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 +#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c + +// +// PageB(0xB00) +// +#define rPdp_AntA 0xb00 +#define rPdp_AntA_4 0xb04 +#define rConfig_Pmpd_AntA 0xb28 +#define rConfig_AntA 0xb68 +#define rConfig_AntB 0xb6c +#define rPdp_AntB 0xb70 +#define rPdp_AntB_4 0xb74 +#define rConfig_Pmpd_AntB 0xb98 +#define rAPK 0xbd8 + + + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxIQExtAnta 0xca0 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 + + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +#define rFPGA0_IQK 0xe28 +#define rTx_IQK_Tone_A 0xe30 +#define rRx_IQK_Tone_A 0xe34 +#define rTx_IQK_PI_A 0xe38 +#define rRx_IQK_PI_A 0xe3c + +#define rTx_IQK 0xe40 +#define rRx_IQK 0xe44 +#define rIQK_AGC_Pts 0xe48 +#define rIQK_AGC_Rsp 0xe4c +#define rTx_IQK_Tone_B 0xe50 +#define rRx_IQK_Tone_B 0xe54 +#define rTx_IQK_PI_B 0xe58 +#define rRx_IQK_PI_B 0xe5c +#define rIQK_AGC_Cont 0xe60 + +#define rBlue_Tooth 0xe6c +#define rRx_Wait_CCA 0xe70 +#define rTx_CCK_RFON 0xe74 +#define rTx_CCK_BBON 0xe78 +#define rTx_OFDM_RFON 0xe7c +#define rTx_OFDM_BBON 0xe80 +#define rTx_To_Rx 0xe84 +#define rTx_To_Tx 0xe88 +#define rRx_CCK 0xe8c + +#define rTx_Power_Before_IQK_A 0xe94 +#define rTx_Power_After_IQK_A 0xe9c + +#define rRx_Power_Before_IQK_A 0xea0 +#define rRx_Power_Before_IQK_A_2 0xea4 +#define rRx_Power_After_IQK_A 0xea8 +#define rRx_Power_After_IQK_A_2 0xeac + +#define rTx_Power_Before_IQK_B 0xeb4 +#define rTx_Power_After_IQK_B 0xebc + +#define rRx_Power_Before_IQK_B 0xec0 +#define rRx_Power_Before_IQK_B_2 0xec4 +#define rRx_Power_After_IQK_B 0xec8 +#define rRx_Power_After_IQK_B_2 0xecc + +#define rRx_OFDM 0xed0 +#define rRx_Wait_RIFS 0xed4 +#define rRx_TO_Rx 0xed8 +#define rStandby 0xedc +#define rSleep 0xee0 +#define rPMPD_ANAEN 0xeec + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +#define rZebra1_Channel 0x7 // RF channel switch + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // + +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_IPA_G 0x09 // +#define RF_TXBIAS_G 0x0A +#define RF_TXPA_AG 0x0B +#define RF_IPA_A 0x0C // +#define RF_TXBIAS_A 0x0D +#define RF_BS_PA_APSET_G9_G11 0x0E +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_TXBIAS 0x16 +#define RF_POW_ABILITY 0x17 // +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +//#if HARDWARE_TYPE_IS_RTL8192D == 1 +#define RF_T_METER_92D 0x42 // +//#else +#define RF_T_METER_88E 0x42 // +#define RF_T_METER 0x24 // + +//#endif + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control +#define RF_TX_BIAS_A 0x35 +#define RF_TX_BIAS_D 0x36 +#define RF_LOBF_9 0x38 +#define RF_RXRF_A3 0x3C // +#define RF_TRSW 0x3F + +#define RF_TXRF_A2 0x41 +#define RF_TXPA_G4 0x46 +#define RF_TXPA_A4 0x4B +#define RF_0x52 0x52 +#define RF_WE_LUT 0xEF + + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bAntennaSelect 0x0300 + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 + +#define bLSSIReadAddress 0x7f800000 // T65 RF + +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal + +#define bLSSIReadBackData 0xfffff // T65 RF + +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + +//for PutRFRegsetting & GetRFRegSetting BitMask +//#define bMask12Bits 0xfffff // RF Reg mask bits +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfffff + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/Hal8188EPwrSeq.h b/drivers/net/wireless/rtl8723as/include/Hal8188EPwrSeq.h index c0145f6244e3..915da60456f4 100755 --- a/drivers/net/wireless/rtl8723as/include/Hal8188EPwrSeq.h +++ b/drivers/net/wireless/rtl8723as/include/Hal8188EPwrSeq.h @@ -1,177 +1,177 @@ - -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __HAL8188EPWRSEQ_H__ -#define __HAL8188EPWRSEQ_H__ - -#include "HalPwrSeqCmd.h" - -/* - Check document WM-20110607-Paul-RTL8188E_Power_Architecture-R02.vsd - There are 6 HW Power States: - 0: POFF--Power Off - 1: PDN--Power Down - 2: CARDEMU--Card Emulation - 3: ACT--Active Mode - 4: LPS--Low Power State - 5: SUS--Suspend - - The transision from different states are defined below - TRANS_CARDEMU_TO_ACT - TRANS_ACT_TO_CARDEMU - TRANS_CARDEMU_TO_SUS - TRANS_SUS_TO_CARDEMU - TRANS_CARDEMU_TO_PDN - TRANS_ACT_TO_LPS - TRANS_LPS_TO_ACT - - TRANS_END - - PWR SEQ Version: rtl8188E_PwrSeq_V09.h -*/ -#define RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS 10 -#define RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 10 -#define RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS 10 -#define RTL8188E_TRANS_SUS_TO_CARDEMU_STEPS 10 -#define RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS 10 -#define RTL8188E_TRANS_PDN_TO_CARDEMU_STEPS 10 -#define RTL8188E_TRANS_ACT_TO_LPS_STEPS 15 -#define RTL8188E_TRANS_LPS_TO_ACT_STEPS 15 -#define RTL8188E_TRANS_END_STEPS 1 - - -#define RTL8188E_TRANS_CARDEMU_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0|BIT1, 0}, /* 0x02[1:0] = 0 reset BB*/ \ - {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7}, /*0x24[23] = 2b'01 schmit trigger */ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0}, /* 0x04[15] = 0 disable HWPDN (control by DRV)*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, 0}, /*0x04[12:11] = 2b'00 disable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x04[8] = 1 polling until return 0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0}, /*wait till 0x04[8] = 0*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*LDO normal mode*/ \ - {0x0074, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*SDIO Driving*/ \ - -#define RTL8188E_TRANS_ACT_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*LDO Sleep mode*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ - -#define RTL8188E_TRANS_CARDEMU_TO_SUS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01enable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11enable WL suspend for PCIe*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, BIT7}, /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */ \ - {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ - {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*Set USB suspend enable local register 0xfe10[4]=1 */ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8188E_TRANS_SUS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ - -#define RTL8188E_TRANS_CARDEMU_TO_CARDDIS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7}, /*0x24[23] = 2b'01 schmit trigger */ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */ \ - {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ - {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*Set USB suspend enable local register 0xfe10[4]=1 */ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8188E_TRANS_CARDDIS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ - -#define RTL8188E_TRANS_CARDEMU_TO_PDN \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ - -#define RTL8188E_TRANS_PDN_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ - -//This is used by driver for LPSRadioOff Procedure, not for FW LPS Step -#define RTL8188E_TRANS_ACT_TO_LPS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/ \ - {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/ \ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ - {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ - - -#define RTL8188E_TRANS_LPS_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ - {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ - {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ - {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ - {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ - -#define RTL8188E_TRANS_END \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // - - -extern WLAN_PWR_CFG rtl8188E_power_on_flow[RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_radio_off_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_card_disable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_card_enable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_suspend_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_resume_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_hwpdn_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_enter_lps_flow[RTL8188E_TRANS_ACT_TO_LPS_STEPS+RTL8188E_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8188E_leave_lps_flow[RTL8188E_TRANS_LPS_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS]; - -#endif //__HAL8188EPWRSEQ_H__ - + +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __HAL8188EPWRSEQ_H__ +#define __HAL8188EPWRSEQ_H__ + +#include "HalPwrSeqCmd.h" + +/* + Check document WM-20110607-Paul-RTL8188E_Power_Architecture-R02.vsd + There are 6 HW Power States: + 0: POFF--Power Off + 1: PDN--Power Down + 2: CARDEMU--Card Emulation + 3: ACT--Active Mode + 4: LPS--Low Power State + 5: SUS--Suspend + + The transision from different states are defined below + TRANS_CARDEMU_TO_ACT + TRANS_ACT_TO_CARDEMU + TRANS_CARDEMU_TO_SUS + TRANS_SUS_TO_CARDEMU + TRANS_CARDEMU_TO_PDN + TRANS_ACT_TO_LPS + TRANS_LPS_TO_ACT + + TRANS_END + + PWR SEQ Version: rtl8188E_PwrSeq_V09.h +*/ +#define RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS 10 +#define RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 10 +#define RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS 10 +#define RTL8188E_TRANS_SUS_TO_CARDEMU_STEPS 10 +#define RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS 10 +#define RTL8188E_TRANS_PDN_TO_CARDEMU_STEPS 10 +#define RTL8188E_TRANS_ACT_TO_LPS_STEPS 15 +#define RTL8188E_TRANS_LPS_TO_ACT_STEPS 15 +#define RTL8188E_TRANS_END_STEPS 1 + + +#define RTL8188E_TRANS_CARDEMU_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0|BIT1, 0}, /* 0x02[1:0] = 0 reset BB*/ \ + {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7}, /*0x24[23] = 2b'01 schmit trigger */ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0}, /* 0x04[15] = 0 disable HWPDN (control by DRV)*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, 0}, /*0x04[12:11] = 2b'00 disable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x04[8] = 1 polling until return 0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0}, /*wait till 0x04[8] = 0*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*LDO normal mode*/ \ + {0x0074, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*SDIO Driving*/ \ + +#define RTL8188E_TRANS_ACT_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*LDO Sleep mode*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ + +#define RTL8188E_TRANS_CARDEMU_TO_SUS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01enable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11enable WL suspend for PCIe*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, BIT7}, /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */ \ + {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ + {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*Set USB suspend enable local register 0xfe10[4]=1 */ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8188E_TRANS_SUS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8188E_TRANS_CARDEMU_TO_CARDDIS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7}, /*0x24[23] = 2b'01 schmit trigger */ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */ \ + {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ + {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*Set USB suspend enable local register 0xfe10[4]=1 */ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8188E_TRANS_CARDDIS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8188E_TRANS_CARDEMU_TO_PDN \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ + +#define RTL8188E_TRANS_PDN_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ + +//This is used by driver for LPSRadioOff Procedure, not for FW LPS Step +#define RTL8188E_TRANS_ACT_TO_LPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/ \ + {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ + + +#define RTL8188E_TRANS_LPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ + {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ + {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ + {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + +#define RTL8188E_TRANS_END \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // + + +extern WLAN_PWR_CFG rtl8188E_power_on_flow[RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_radio_off_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_card_disable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_card_enable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_suspend_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_resume_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_hwpdn_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_enter_lps_flow[RTL8188E_TRANS_ACT_TO_LPS_STEPS+RTL8188E_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8188E_leave_lps_flow[RTL8188E_TRANS_LPS_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS]; + +#endif //__HAL8188EPWRSEQ_H__ + diff --git a/drivers/net/wireless/rtl8723as/include/Hal8192CPhyCfg.h b/drivers/net/wireless/rtl8723as/include/Hal8192CPhyCfg.h index d98119a13dab..b27642c7454a 100755 --- a/drivers/net/wireless/rtl8723as/include/Hal8192CPhyCfg.h +++ b/drivers/net/wireless/rtl8723as/include/Hal8192CPhyCfg.h @@ -390,6 +390,7 @@ extern void PHY_Reconfig_To_1T1R(_adapter *padapter); #define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8192c_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) #define PHY_SetMacReg PHY_SetBBReg +#define PHY_QueryMacReg PHY_QueryBBReg #endif // __INC_HAL8192CPHYCFG_H diff --git a/drivers/net/wireless/rtl8723as/include/Hal8192DPhyCfg.h b/drivers/net/wireless/rtl8723as/include/Hal8192DPhyCfg.h index cbf7d62de05b..f2e55df8beeb 100755 --- a/drivers/net/wireless/rtl8723as/include/Hal8192DPhyCfg.h +++ b/drivers/net/wireless/rtl8723as/include/Hal8192DPhyCfg.h @@ -481,6 +481,7 @@ PHY_InitPABias92D(IN PADAPTER Adapter); #define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8192d_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) #define PHY_SetMacReg PHY_SetBBReg +#define PHY_QueryMacReg PHY_QueryBBReg #endif // __INC_HAL8192SPHYCFG_H diff --git a/drivers/net/wireless/rtl8723as/include/Hal8192DPhyReg.h b/drivers/net/wireless/rtl8723as/include/Hal8192DPhyReg.h index fa58ffd5b024..de23a415d994 100755 --- a/drivers/net/wireless/rtl8723as/include/Hal8192DPhyReg.h +++ b/drivers/net/wireless/rtl8723as/include/Hal8192DPhyReg.h @@ -16,1157 +16,1157 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -/***************************************************************************** - * - * Module: __INC_HAL8192DPHYREG_H - * - * - * Note: 1. Define PMAC/BB register map - * 2. Define RF register map - * 3. PMAC/BB register bit mask. - * 4. RF reg bit mask. - * 5. Other BB/RF relative definition. - * - * - * Export: Constants, macro, functions(API), global variables(None). - * - * Abbrev: - * - * History: - * Data Who Remark - * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. - * 2. Reorganize code architecture. - * 09/25/2008 MH 1. Add RL6052 register definition - * - *****************************************************************************/ -#ifndef __INC_HAL8192DPHYREG_H -#define __INC_HAL8192DPHYREG_H - - -/*--------------------------Define Parameters-------------------------------*/ - -//============================================================ -// 8192S Regsiter offset definition -//============================================================ - -// -// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 -// 3. RF register 0x00-2E -// 4. Bit Mask for BB/RF register -// 5. Other defintion for BB/RF R/W -// - - -// -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 1. Page1(0x100) -// -#define rPMAC_Reset 0x100 -#define rPMAC_TxStart 0x104 -#define rPMAC_TxLegacySIG 0x108 -#define rPMAC_TxHTSIG1 0x10c -#define rPMAC_TxHTSIG2 0x110 -#define rPMAC_PHYDebug 0x114 -#define rPMAC_TxPacketNum 0x118 -#define rPMAC_TxIdle 0x11c -#define rPMAC_TxMACHeader0 0x120 -#define rPMAC_TxMACHeader1 0x124 -#define rPMAC_TxMACHeader2 0x128 -#define rPMAC_TxMACHeader3 0x12c -#define rPMAC_TxMACHeader4 0x130 -#define rPMAC_TxMACHeader5 0x134 -#define rPMAC_TxDataType 0x138 -#define rPMAC_TxRandomSeed 0x13c -#define rPMAC_CCKPLCPPreamble 0x140 -#define rPMAC_CCKPLCPHeader 0x144 -#define rPMAC_CCKCRC16 0x148 -#define rPMAC_OFDMRxCRC32OK 0x170 -#define rPMAC_OFDMRxCRC32Er 0x174 -#define rPMAC_OFDMRxParityEr 0x178 -#define rPMAC_OFDMRxCRC8Er 0x17c -#define rPMAC_CCKCRxRC16Er 0x180 -#define rPMAC_CCKCRxRC32Er 0x184 -#define rPMAC_CCKCRxRC32OK 0x188 -#define rPMAC_TxStatus 0x18c - -// -// 2. Page2(0x200) -// -// The following two definition are only used for USB interface. -#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. -#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. - -// -// 3. Page8(0x800) -// -#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? - -#define rFPGA0_TxInfo 0x804 // Status report?? -#define rFPGA0_PSDFunction 0x808 - -#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? - -#define rFPGA0_RFTiming1 0x810 // Useless now -#define rFPGA0_RFTiming2 0x814 - -#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register -#define rFPGA0_XA_HSSIParameter2 0x824 -#define rFPGA0_XB_HSSIParameter1 0x828 -#define rFPGA0_XB_HSSIParameter2 0x82c - -#define rFPGA0_XA_LSSIParameter 0x840 -#define rFPGA0_XB_LSSIParameter 0x844 - -#define rFPGA0_RFWakeUpParameter 0x850 // Useless now -#define rFPGA0_RFSleepUpParameter 0x854 - -#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch -#define rFPGA0_XCD_SwitchControl 0x85c - -#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch -#define rFPGA0_XB_RFInterfaceOE 0x864 - -#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control -#define rFPGA0_XCD_RFInterfaceSW 0x874 - -#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter -#define rFPGA0_XCD_RFParameter 0x87c - -#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? -#define rFPGA0_AnalogParameter2 0x884 -#define rFPGA0_AnalogParameter3 0x888 -#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy -#define rFPGA0_AnalogParameter4 0x88c - -#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback -#define rFPGA0_XB_LSSIReadBack 0x8a4 -#define rFPGA0_XC_LSSIReadBack 0x8a8 -#define rFPGA0_XD_LSSIReadBack 0x8ac - -#define rFPGA0_PSDReport 0x8b4 // Useless now -#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback -#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback -#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value -#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now - -// -// 4. Page9(0x900) -// -#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? - -#define rFPGA1_TxBlock 0x904 // Useless now -#define rFPGA1_DebugSelect 0x908 // Useless now -#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? - -// -// 5. PageA(0xA00) -// -// Set Control channel to upper or lower. These settings are required only for 40MHz -#define rCCK0_System 0xa00 - -#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI -#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain - -#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series -#define rCCK0_RxAGC2 0xa10 //AGC & DAGC - -#define rCCK0_RxHP 0xa14 - -#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold -#define rCCK0_DSPParameter2 0xa1c //SQ threshold - -#define rCCK0_TxFilter1 0xa20 -#define rCCK0_TxFilter2 0xa24 -#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 -#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report -#define rCCK0_TRSSIReport 0xa50 -#define rCCK0_RxReport 0xa54 //0xa57 -#define rCCK0_FACounterLower 0xa5c //0xa5b -#define rCCK0_FACounterUpper 0xa58 //0xa5c - -// -// PageB(0xB00) -// -#define rPdp_AntA 0xb00 -#define rPdp_AntA_4 0xb04 -#define rPdp_AntA_8 0xb08 -#define rPdp_AntA_C 0xb0c -#define rPdp_AntA_10 0xb10 -#define rPdp_AntA_14 0xb14 -#define rPdp_AntA_18 0xb18 -#define rPdp_AntA_1C 0xb1c -#define rPdp_AntA_20 0xb20 -#define rPdp_AntA_24 0xb24 - -#define rConfig_Pmpd_AntA 0xb28 -#define rConfig_ram64x16 0xb2c - -#define rBndA 0xb30 -#define rHssiPar 0xb34 - -#define rConfig_AntA 0xb68 -#define rConfig_AntB 0xb6c - -#define rPdp_AntB 0xb70 -#define rPdp_AntB_4 0xb74 -#define rPdp_AntB_8 0xb78 -#define rPdp_AntB_C 0xb7c -#define rPdp_AntB_10 0xb80 -#define rPdp_AntB_14 0xb84 -#define rPdp_AntB_18 0xb88 -#define rPdp_AntB_1C 0xb8c -#define rPdp_AntB_20 0xb90 -#define rPdp_AntB_24 0xb94 - -#define rConfig_Pmpd_AntB 0xb98 - -#define rBndB 0xba0 - -#define rAPK 0xbd8 -#define rPm_Rx0_AntA 0xbdc -#define rPm_Rx1_AntA 0xbe0 -#define rPm_Rx2_AntA 0xbe4 -#define rPm_Rx3_AntA 0xbe8 -#define rPm_Rx0_AntB 0xbec -#define rPm_Rx1_AntB 0xbf0 -#define rPm_Rx2_AntB 0xbf4 -#define rPm_Rx3_AntB 0xbf8 - -// -// 6. PageC(0xC00) -// -#define rOFDM0_LSTF 0xc00 - -#define rOFDM0_TRxPathEnable 0xc04 -#define rOFDM0_TRMuxPar 0xc08 -#define rOFDM0_TRSWIsolation 0xc0c - -#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter -#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix -#define rOFDM0_XBRxAFE 0xc18 -#define rOFDM0_XBRxIQImbalance 0xc1c -#define rOFDM0_XCRxAFE 0xc20 -#define rOFDM0_XCRxIQImbalance 0xc24 -#define rOFDM0_XDRxAFE 0xc28 -#define rOFDM0_XDRxIQImbalance 0xc2c - -#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain -#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. -#define rOFDM0_RxDetector3 0xc38 //Frame Sync. -#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI - -#define rOFDM0_RxDSP 0xc40 //Rx Sync Path -#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC -#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold -#define rOFDM0_ECCAThreshold 0xc4c // energy CCA - -#define rOFDM0_XAAGCCore1 0xc50 // DIG -#define rOFDM0_XAAGCCore2 0xc54 -#define rOFDM0_XBAGCCore1 0xc58 -#define rOFDM0_XBAGCCore2 0xc5c -#define rOFDM0_XCAGCCore1 0xc60 -#define rOFDM0_XCAGCCore2 0xc64 -#define rOFDM0_XDAGCCore1 0xc68 -#define rOFDM0_XDAGCCore2 0xc6c - -#define rOFDM0_AGCParameter1 0xc70 -#define rOFDM0_AGCParameter2 0xc74 -#define rOFDM0_AGCRSSITable 0xc78 -#define rOFDM0_HTSTFAGC 0xc7c - -#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG -#define rOFDM0_XATxAFE 0xc84 -#define rOFDM0_XBTxIQImbalance 0xc88 -#define rOFDM0_XBTxAFE 0xc8c -#define rOFDM0_XCTxIQImbalance 0xc90 -#define rOFDM0_XCTxAFE 0xc94 -#define rOFDM0_XDTxIQImbalance 0xc98 -#define rOFDM0_XDTxAFE 0xc9c - -#define rOFDM0_RxIQExtAnta 0xca0 -#define rOFDM0_TxCoeff1 0xca4 -#define rOFDM0_TxCoeff2 0xca8 -#define rOFDM0_TxCoeff3 0xcac -#define rOFDM0_TxCoeff4 0xcb0 -#define rOFDM0_TxCoeff5 0xcb4 -#define rOFDM0_TxCoeff6 0xcb8 -#define rOFDM0_RxHPParameter 0xce0 -#define rOFDM0_TxPseudoNoiseWgt 0xce4 -#define rOFDM0_FrameSync 0xcf0 -#define rOFDM0_DFSReport 0xcf4 - -// -// 7. PageD(0xD00) -// -#define rOFDM1_LSTF 0xd00 -#define rOFDM1_TRxPathEnable 0xd04 - -#define rOFDM1_CFO 0xd08 // No setting now -#define rOFDM1_CSI1 0xd10 -#define rOFDM1_SBD 0xd14 -#define rOFDM1_CSI2 0xd18 -#define rOFDM1_CFOTracking 0xd2c -#define rOFDM1_TRxMesaure1 0xd34 -#define rOFDM1_IntfDet 0xd3c -#define rOFDM1_PseudoNoiseStateAB 0xd50 -#define rOFDM1_PseudoNoiseStateCD 0xd54 -#define rOFDM1_RxPseudoNoiseWgt 0xd58 - -#define rOFDM_PHYCounter1 0xda0 //cca, parity fail -#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail -#define rOFDM_PHYCounter3 0xda8 //MCS not support - -#define rOFDM_ShortCFOAB 0xdac // No setting now -#define rOFDM_ShortCFOCD 0xdb0 -#define rOFDM_LongCFOAB 0xdb4 -#define rOFDM_LongCFOCD 0xdb8 -#define rOFDM_TailCFOAB 0xdbc -#define rOFDM_TailCFOCD 0xdc0 -#define rOFDM_PWMeasure1 0xdc4 -#define rOFDM_PWMeasure2 0xdc8 -#define rOFDM_BWReport 0xdcc -#define rOFDM_AGCReport 0xdd0 -#define rOFDM_RxSNR 0xdd4 -#define rOFDM_RxEVMCSI 0xdd8 -#define rOFDM_SIGReport 0xddc - - -// -// 8. PageE(0xE00) -// -#define rTxAGC_A_Rate18_06 0xe00 -#define rTxAGC_A_Rate54_24 0xe04 -#define rTxAGC_A_CCK1_Mcs32 0xe08 -#define rTxAGC_A_Mcs03_Mcs00 0xe10 -#define rTxAGC_A_Mcs07_Mcs04 0xe14 -#define rTxAGC_A_Mcs11_Mcs08 0xe18 -#define rTxAGC_A_Mcs15_Mcs12 0xe1c - -#define rTxAGC_B_Rate18_06 0x830 -#define rTxAGC_B_Rate54_24 0x834 -#define rTxAGC_B_CCK1_55_Mcs32 0x838 -#define rTxAGC_B_Mcs03_Mcs00 0x83c -#define rTxAGC_B_Mcs07_Mcs04 0x848 -#define rTxAGC_B_Mcs11_Mcs08 0x84c -#define rTxAGC_B_Mcs15_Mcs12 0x868 -#define rTxAGC_B_CCK11_A_CCK2_11 0x86c - -#define rFPGA0_IQK 0xe28 -#define rTx_IQK_Tone_A 0xe30 -#define rRx_IQK_Tone_A 0xe34 -#define rTx_IQK_PI_A 0xe38 -#define rRx_IQK_PI_A 0xe3c - -#define rTx_IQK 0xe40 -#define rRx_IQK 0xe44 -#define rIQK_AGC_Pts 0xe48 -#define rIQK_AGC_Rsp 0xe4c -#define rTx_IQK_Tone_B 0xe50 -#define rRx_IQK_Tone_B 0xe54 -#define rTx_IQK_PI_B 0xe58 -#define rRx_IQK_PI_B 0xe5c -#define rIQK_AGC_Cont 0xe60 - -#define rBlue_Tooth 0xe6c -#define rRx_Wait_CCA 0xe70 -#define rTx_CCK_RFON 0xe74 -#define rTx_CCK_BBON 0xe78 -#define rTx_OFDM_RFON 0xe7c -#define rTx_OFDM_BBON 0xe80 -#define rTx_To_Rx 0xe84 -#define rTx_To_Tx 0xe88 -#define rRx_CCK 0xe8c - -#define rTx_Power_Before_IQK_A 0xe94 -#define rTx_Power_After_IQK_A 0xe9c - -#define rRx_Power_Before_IQK_A 0xea0 -#define rRx_Power_Before_IQK_A_2 0xea4 -#define rRx_Power_After_IQK_A 0xea8 -#define rRx_Power_After_IQK_A_2 0xeac - -#define rTx_Power_Before_IQK_B 0xeb4 -#define rTx_Power_After_IQK_B 0xebc - -#define rRx_Power_Before_IQK_B 0xec0 -#define rRx_Power_Before_IQK_B_2 0xec4 -#define rRx_Power_After_IQK_B 0xec8 -#define rRx_Power_After_IQK_B_2 0xecc - -#define rRx_OFDM 0xed0 -#define rRx_Wait_RIFS 0xed4 -#define rRx_TO_Rx 0xed8 -#define rStandby 0xedc -#define rSleep 0xee0 -#define rPMPD_ANAEN 0xeec - -// -// 7. RF Register 0x00-0x2E (RF 8256) -// RF-0222D 0x00-3F -// -//Zebra1 -#define rZebra1_HSSIEnable 0x0 // Useless now -#define rZebra1_TRxEnable1 0x1 -#define rZebra1_TRxEnable2 0x2 -#define rZebra1_AGC 0x4 -#define rZebra1_ChargePump 0x5 -#define rZebra1_Channel 0x7 // RF channel switch - -//#endif -#define rZebra1_TxGain 0x8 // Useless now -#define rZebra1_TxLPF 0x9 -#define rZebra1_RxLPF 0xb -#define rZebra1_RxHPFCorner 0xc - -//Zebra4 -#define rGlobalCtrl 0 // Useless now -#define rRTL8256_TxLPF 19 -#define rRTL8256_RxLPF 11 - -//RTL8258 -#define rRTL8258_TxLPF 0x11 // Useless now -#define rRTL8258_RxLPF 0x13 -#define rRTL8258_RSSILPF 0xa - -// -// RL6052 Register definition -// -#define RF_AC 0x00 // - -#define RF_IQADJ_G1 0x01 // -#define RF_IQADJ_G2 0x02 // -#define RF_BS_PA_APSET_G1_G4 0x03 -#define RF_BS_PA_APSET_G5_G8 0x04 -#define RF_POW_TRSW 0x05 // - -#define RF_GAIN_RX 0x06 // -#define RF_GAIN_TX 0x07 // - -#define RF_TXM_IDAC 0x08 // -#define RF_IPA_G 0x09 // -#define RF_TXBIAS_G 0x0A -#define RF_TXPA_AG 0x0B -#define RF_IPA_A 0x0C // -#define RF_TXBIAS_A 0x0D -#define RF_BS_PA_APSET_G9_G11 0x0E -#define RF_BS_IQGEN 0x0F // - -#define RF_MODE1 0x10 // -#define RF_MODE2 0x11 // - -#define RF_RX_AGC_HP 0x12 // -#define RF_TX_AGC 0x13 // -#define RF_BIAS 0x14 // -#define RF_IPA 0x15 // -#define RF_TXBIAS 0x16 // -#define RF_POW_ABILITY 0x17 // -#define RF_MODE_AG 0x18 // -#define rRfChannel 0x18 // RF channel and BW switch -#define RF_CHNLBW 0x18 // RF channel and BW switch -#define RF_TOP 0x19 // - -#define RF_RX_G1 0x1A // -#define RF_RX_G2 0x1B // - -#define RF_RX_BB2 0x1C // -#define RF_RX_BB1 0x1D // - -#define RF_RCK1 0x1E // -#define RF_RCK2 0x1F // - -#define RF_TX_G1 0x20 // -#define RF_TX_G2 0x21 // -#define RF_TX_G3 0x22 // - -#define RF_TX_BB1 0x23 // - -#define RF_T_METER 0x42 // - -#define RF_SYN_G1 0x25 // RF TX Power control -#define RF_SYN_G2 0x26 // RF TX Power control -#define RF_SYN_G3 0x27 // RF TX Power control -#define RF_SYN_G4 0x28 // RF TX Power control -#define RF_SYN_G5 0x29 // RF TX Power control -#define RF_SYN_G6 0x2A // RF TX Power control -#define RF_SYN_G7 0x2B // RF TX Power control -#define RF_SYN_G8 0x2C // RF TX Power control - -#define RF_RCK_OS 0x30 // RF TX PA control - -#define RF_TXPA_G1 0x31 // RF TX PA control -#define RF_TXPA_G2 0x32 // RF TX PA control -#define RF_TXPA_G3 0x33 // RF TX PA control -#define RF_LOBF_9 0x38 -#define RF_RXRF_A3 0x3C // -#define RF_TRSW 0x3F - -#define RF_TXRF_A2 0x41 -#define RF_TXPA_G4 0x46 -#define RF_TXPA_A4 0x4B - -// -//Bit Mask -// -// 1. Page1(0x100) -#define bBBResetB 0x100 // Useless now? -#define bGlobalResetB 0x200 -#define bOFDMTxStart 0x4 -#define bCCKTxStart 0x8 -#define bCRC32Debug 0x100 -#define bPMACLoopback 0x10 -#define bTxLSIG 0xffffff -#define bOFDMTxRate 0xf -#define bOFDMTxReserved 0x10 -#define bOFDMTxLength 0x1ffe0 -#define bOFDMTxParity 0x20000 -#define bTxHTSIG1 0xffffff -#define bTxHTMCSRate 0x7f -#define bTxHTBW 0x80 -#define bTxHTLength 0xffff00 -#define bTxHTSIG2 0xffffff -#define bTxHTSmoothing 0x1 -#define bTxHTSounding 0x2 -#define bTxHTReserved 0x4 -#define bTxHTAggreation 0x8 -#define bTxHTSTBC 0x30 -#define bTxHTAdvanceCoding 0x40 -#define bTxHTShortGI 0x80 -#define bTxHTNumberHT_LTF 0x300 -#define bTxHTCRC8 0x3fc00 -#define bCounterReset 0x10000 -#define bNumOfOFDMTx 0xffff -#define bNumOfCCKTx 0xffff0000 -#define bTxIdleInterval 0xffff -#define bOFDMService 0xffff0000 -#define bTxMACHeader 0xffffffff -#define bTxDataInit 0xff -#define bTxHTMode 0x100 -#define bTxDataType 0x30000 -#define bTxRandomSeed 0xffffffff -#define bCCKTxPreamble 0x1 -#define bCCKTxSFD 0xffff0000 -#define bCCKTxSIG 0xff -#define bCCKTxService 0xff00 -#define bCCKLengthExt 0x8000 -#define bCCKTxLength 0xffff0000 -#define bCCKTxCRC16 0xffff -#define bCCKTxStatus 0x1 -#define bOFDMTxStatus 0x2 - -#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) - -// 2. Page8(0x800) -#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD -#define bJapanMode 0x2 -#define bCCKTxSC 0x30 -#define bCCKEn 0x1000000 -#define bOFDMEn 0x2000000 - -#define bOFDMRxADCPhase 0x10000 // Useless now -#define bOFDMTxDACPhase 0x40000 -#define bXATxAGC 0x3f - -#define bAntennaSelect 0x0300 - -#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage -#define bXCTxAGC 0xf000 -#define bXDTxAGC 0xf0000 - -#define bPAStart 0xf0000000 // Useless now -#define bTRStart 0x00f00000 -#define bRFStart 0x0000f000 -#define bBBStart 0x000000f0 -#define bBBCCKStart 0x0000000f -#define bPAEnd 0xf //Reg0x814 -#define bTREnd 0x0f000000 -#define bRFEnd 0x000f0000 -#define bCCAMask 0x000000f0 //T2R -#define bR2RCCAMask 0x00000f00 -#define bHSSI_R2TDelay 0xf8000000 -#define bHSSI_T2RDelay 0xf80000 -#define bContTxHSSI 0x400 //chane gain at continue Tx -#define bIGFromCCK 0x200 -#define bAGCAddress 0x3f -#define bRxHPTx 0x7000 -#define bRxHPT2R 0x38000 -#define bRxHPCCKIni 0xc0000 -#define bAGCTxCode 0xc00000 -#define bAGCRxCode 0x300000 - -#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 -#define b3WireAddressLength 0x400 - -#define b3WireRFPowerDown 0x1 // Useless now -//#define bHWSISelect 0x8 -#define b5GPAPEPolarity 0x40000000 -#define b2GPAPEPolarity 0x80000000 -#define bRFSW_TxDefaultAnt 0x3 -#define bRFSW_TxOptionAnt 0x30 -#define bRFSW_RxDefaultAnt 0x300 -#define bRFSW_RxOptionAnt 0x3000 -#define bRFSI_3WireData 0x1 -#define bRFSI_3WireClock 0x2 -#define bRFSI_3WireLoad 0x4 -#define bRFSI_3WireRW 0x8 -#define bRFSI_3Wire 0xf - -#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW - -#define bRFSI_TRSW 0x20 // Useless now -#define bRFSI_TRSWB 0x40 -#define bRFSI_ANTSW 0x100 -#define bRFSI_ANTSWB 0x200 -#define bRFSI_PAPE 0x400 -#define bRFSI_PAPE5G 0x800 -#define bBandSelect 0x1 -#define bHTSIG2_GI 0x80 -#define bHTSIG2_Smoothing 0x01 -#define bHTSIG2_Sounding 0x02 -#define bHTSIG2_Aggreaton 0x08 -#define bHTSIG2_STBC 0x30 -#define bHTSIG2_AdvCoding 0x40 -#define bHTSIG2_NumOfHTLTF 0x300 -#define bHTSIG2_CRC8 0x3fc -#define bHTSIG1_MCS 0x7f -#define bHTSIG1_BandWidth 0x80 -#define bHTSIG1_HTLength 0xffff -#define bLSIG_Rate 0xf -#define bLSIG_Reserved 0x10 -#define bLSIG_Length 0x1fffe -#define bLSIG_Parity 0x20 -#define bCCKRxPhase 0x4 - -#define bLSSIReadAddress 0x7f800000 // T65 RF - -#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal - -#define bLSSIReadBackData 0xfffff // T65 RF - -#define bLSSIReadOKFlag 0x1000 // Useless now -#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz -#define bRegulator0Standby 0x1 -#define bRegulatorPLLStandby 0x2 -#define bRegulator1Standby 0x4 -#define bPLLPowerUp 0x8 -#define bDPLLPowerUp 0x10 -#define bDA10PowerUp 0x20 -#define bAD7PowerUp 0x200 -#define bDA6PowerUp 0x2000 -#define bXtalPowerUp 0x4000 -#define b40MDClkPowerUP 0x8000 -#define bDA6DebugMode 0x20000 -#define bDA6Swing 0x380000 - -#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ - -#define b80MClkDelay 0x18000000 // Useless -#define bAFEWatchDogEnable 0x20000000 - -#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap -#define bXtalCap23 0x3 -#define bXtalCap92x 0x0f000000 -#define bXtalCap 0x0f000000 - -#define bIntDifClkEnable 0x400 // Useless -#define bExtSigClkEnable 0x800 -#define bBandgapMbiasPowerUp 0x10000 -#define bAD11SHGain 0xc0000 -#define bAD11InputRange 0x700000 -#define bAD11OPCurrent 0x3800000 -#define bIPathLoopback 0x4000000 -#define bQPathLoopback 0x8000000 -#define bAFELoopback 0x10000000 -#define bDA10Swing 0x7e0 -#define bDA10Reverse 0x800 -#define bDAClkSource 0x1000 -#define bAD7InputRange 0x6000 -#define bAD7Gain 0x38000 -#define bAD7OutputCMMode 0x40000 -#define bAD7InputCMMode 0x380000 -#define bAD7Current 0xc00000 -#define bRegulatorAdjust 0x7000000 -#define bAD11PowerUpAtTx 0x1 -#define bDA10PSAtTx 0x10 -#define bAD11PowerUpAtRx 0x100 -#define bDA10PSAtRx 0x1000 -#define bCCKRxAGCFormat 0x200 -#define bPSDFFTSamplepPoint 0xc000 -#define bPSDAverageNum 0x3000 -#define bIQPathControl 0xc00 -#define bPSDFreq 0x3ff -#define bPSDAntennaPath 0x30 -#define bPSDIQSwitch 0x40 -#define bPSDRxTrigger 0x400000 -#define bPSDTxTrigger 0x80000000 -#define bPSDSineToneScale 0x7f000000 -#define bPSDReport 0xffff - -// 3. Page9(0x900) -#define bOFDMTxSC 0x30000000 // Useless -#define bCCKTxOn 0x1 -#define bOFDMTxOn 0x2 -#define bDebugPage 0xfff //reset debug page and also HWord, LWord -#define bDebugItem 0xff //reset debug page and LWord -#define bAntL 0x10 -#define bAntNonHT 0x100 -#define bAntHT1 0x1000 -#define bAntHT2 0x10000 -#define bAntHT1S1 0x100000 -#define bAntNonHTS1 0x1000000 - -// 4. PageA(0xA00) -#define bCCKBBMode 0x3 // Useless -#define bCCKTxPowerSaving 0x80 -#define bCCKRxPowerSaving 0x40 - -#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch - -#define bCCKScramble 0x8 // Useless -#define bCCKAntDiversity 0x8000 -#define bCCKCarrierRecovery 0x4000 -#define bCCKTxRate 0x3000 -#define bCCKDCCancel 0x0800 -#define bCCKISICancel 0x0400 -#define bCCKMatchFilter 0x0200 -#define bCCKEqualizer 0x0100 -#define bCCKPreambleDetect 0x800000 -#define bCCKFastFalseCCA 0x400000 -#define bCCKChEstStart 0x300000 -#define bCCKCCACount 0x080000 -#define bCCKcs_lim 0x070000 -#define bCCKBistMode 0x80000000 -#define bCCKCCAMask 0x40000000 -#define bCCKTxDACPhase 0x4 -#define bCCKRxADCPhase 0x20000000 //r_rx_clk -#define bCCKr_cp_mode0 0x0100 -#define bCCKTxDCOffset 0xf0 -#define bCCKRxDCOffset 0xf -#define bCCKCCAMode 0xc000 -#define bCCKFalseCS_lim 0x3f00 -#define bCCKCS_ratio 0xc00000 -#define bCCKCorgBit_sel 0x300000 -#define bCCKPD_lim 0x0f0000 -#define bCCKNewCCA 0x80000000 -#define bCCKRxHPofIG 0x8000 -#define bCCKRxIG 0x7f00 -#define bCCKLNAPolarity 0x800000 -#define bCCKRx1stGain 0x7f0000 -#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity -#define bCCKRxAGCSatLevel 0x1f000000 -#define bCCKRxAGCSatCount 0xe0 -#define bCCKRxRFSettle 0x1f //AGCsamp_dly -#define bCCKFixedRxAGC 0x8000 -//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 -#define bCCKAntennaPolarity 0x2000 -#define bCCKTxFilterType 0x0c00 -#define bCCKRxAGCReportType 0x0300 -#define bCCKRxDAGCEn 0x80000000 -#define bCCKRxDAGCPeriod 0x20000000 -#define bCCKRxDAGCSatLevel 0x1f000000 -#define bCCKTimingRecovery 0x800000 -#define bCCKTxC0 0x3f0000 -#define bCCKTxC1 0x3f000000 -#define bCCKTxC2 0x3f -#define bCCKTxC3 0x3f00 -#define bCCKTxC4 0x3f0000 -#define bCCKTxC5 0x3f000000 -#define bCCKTxC6 0x3f -#define bCCKTxC7 0x3f00 -#define bCCKDebugPort 0xff0000 -#define bCCKDACDebug 0x0f000000 -#define bCCKFalseAlarmEnable 0x8000 -#define bCCKFalseAlarmRead 0x4000 -#define bCCKTRSSI 0x7f -#define bCCKRxAGCReport 0xfe -#define bCCKRxReport_AntSel 0x80000000 -#define bCCKRxReport_MFOff 0x40000000 -#define bCCKRxRxReport_SQLoss 0x20000000 -#define bCCKRxReport_Pktloss 0x10000000 -#define bCCKRxReport_Lockedbit 0x08000000 -#define bCCKRxReport_RateError 0x04000000 -#define bCCKRxReport_RxRate 0x03000000 -#define bCCKRxFACounterLower 0xff -#define bCCKRxFACounterUpper 0xff000000 -#define bCCKRxHPAGCStart 0xe000 -#define bCCKRxHPAGCFinal 0x1c00 -#define bCCKRxFalseAlarmEnable 0x8000 -#define bCCKFACounterFreeze 0x4000 -#define bCCKTxPathSel 0x10000000 -#define bCCKDefaultRxPath 0xc000000 -#define bCCKOptionRxPath 0x3000000 - -// 5. PageC(0xC00) -#define bNumOfSTF 0x3 // Useless -#define bShift_L 0xc0 -#define bGI_TH 0xc -#define bRxPathA 0x1 -#define bRxPathB 0x2 -#define bRxPathC 0x4 -#define bRxPathD 0x8 -#define bTxPathA 0x1 -#define bTxPathB 0x2 -#define bTxPathC 0x4 -#define bTxPathD 0x8 -#define bTRSSIFreq 0x200 -#define bADCBackoff 0x3000 -#define bDFIRBackoff 0xc000 -#define bTRSSILatchPhase 0x10000 -#define bRxIDCOffset 0xff -#define bRxQDCOffset 0xff00 -#define bRxDFIRMode 0x1800000 -#define bRxDCNFType 0xe000000 -#define bRXIQImb_A 0x3ff -#define bRXIQImb_B 0xfc00 -#define bRXIQImb_C 0x3f0000 -#define bRXIQImb_D 0xffc00000 -#define bDC_dc_Notch 0x60000 -#define bRxNBINotch 0x1f000000 -#define bPD_TH 0xf -#define bPD_TH_Opt2 0xc000 -#define bPWED_TH 0x700 -#define bIfMF_Win_L 0x800 -#define bPD_Option 0x1000 -#define bMF_Win_L 0xe000 -#define bBW_Search_L 0x30000 -#define bwin_enh_L 0xc0000 -#define bBW_TH 0x700000 -#define bED_TH2 0x3800000 -#define bBW_option 0x4000000 -#define bRatio_TH 0x18000000 -#define bWindow_L 0xe0000000 -#define bSBD_Option 0x1 -#define bFrame_TH 0x1c -#define bFS_Option 0x60 -#define bDC_Slope_check 0x80 -#define bFGuard_Counter_DC_L 0xe00 -#define bFrame_Weight_Short 0x7000 -#define bSub_Tune 0xe00000 -#define bFrame_DC_Length 0xe000000 -#define bSBD_start_offset 0x30000000 -#define bFrame_TH_2 0x7 -#define bFrame_GI2_TH 0x38 -#define bGI2_Sync_en 0x40 -#define bSarch_Short_Early 0x300 -#define bSarch_Short_Late 0xc00 -#define bSarch_GI2_Late 0x70000 -#define bCFOAntSum 0x1 -#define bCFOAcc 0x2 -#define bCFOStartOffset 0xc -#define bCFOLookBack 0x70 -#define bCFOSumWeight 0x80 -#define bDAGCEnable 0x10000 -#define bTXIQImb_A 0x3ff -#define bTXIQImb_B 0xfc00 -#define bTXIQImb_C 0x3f0000 -#define bTXIQImb_D 0xffc00000 -#define bTxIDCOffset 0xff -#define bTxQDCOffset 0xff00 -#define bTxDFIRMode 0x10000 -#define bTxPesudoNoiseOn 0x4000000 -#define bTxPesudoNoise_A 0xff -#define bTxPesudoNoise_B 0xff00 -#define bTxPesudoNoise_C 0xff0000 -#define bTxPesudoNoise_D 0xff000000 -#define bCCADropOption 0x20000 -#define bCCADropThres 0xfff00000 -#define bEDCCA_H 0xf -#define bEDCCA_L 0xf0 -#define bLambda_ED 0x300 -#define bRxInitialGain 0x7f -#define bRxAntDivEn 0x80 -#define bRxAGCAddressForLNA 0x7f00 -#define bRxHighPowerFlow 0x8000 -#define bRxAGCFreezeThres 0xc0000 -#define bRxFreezeStep_AGC1 0x300000 -#define bRxFreezeStep_AGC2 0xc00000 -#define bRxFreezeStep_AGC3 0x3000000 -#define bRxFreezeStep_AGC0 0xc000000 -#define bRxRssi_Cmp_En 0x10000000 -#define bRxQuickAGCEn 0x20000000 -#define bRxAGCFreezeThresMode 0x40000000 -#define bRxOverFlowCheckType 0x80000000 -#define bRxAGCShift 0x7f -#define bTRSW_Tri_Only 0x80 -#define bPowerThres 0x300 -#define bRxAGCEn 0x1 -#define bRxAGCTogetherEn 0x2 -#define bRxAGCMin 0x4 -#define bRxHP_Ini 0x7 -#define bRxHP_TRLNA 0x70 -#define bRxHP_RSSI 0x700 -#define bRxHP_BBP1 0x7000 -#define bRxHP_BBP2 0x70000 -#define bRxHP_BBP3 0x700000 -#define bRSSI_H 0x7f0000 //the threshold for high power -#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity -#define bRxSettle_TRSW 0x7 -#define bRxSettle_LNA 0x38 -#define bRxSettle_RSSI 0x1c0 -#define bRxSettle_BBP 0xe00 -#define bRxSettle_RxHP 0x7000 -#define bRxSettle_AntSW_RSSI 0x38000 -#define bRxSettle_AntSW 0xc0000 -#define bRxProcessTime_DAGC 0x300000 -#define bRxSettle_HSSI 0x400000 -#define bRxProcessTime_BBPPW 0x800000 -#define bRxAntennaPowerShift 0x3000000 -#define bRSSITableSelect 0xc000000 -#define bRxHP_Final 0x7000000 -#define bRxHTSettle_BBP 0x7 -#define bRxHTSettle_HSSI 0x8 -#define bRxHTSettle_RxHP 0x70 -#define bRxHTSettle_BBPPW 0x80 -#define bRxHTSettle_Idle 0x300 -#define bRxHTSettle_Reserved 0x1c00 -#define bRxHTRxHPEn 0x8000 -#define bRxHTAGCFreezeThres 0x30000 -#define bRxHTAGCTogetherEn 0x40000 -#define bRxHTAGCMin 0x80000 -#define bRxHTAGCEn 0x100000 -#define bRxHTDAGCEn 0x200000 -#define bRxHTRxHP_BBP 0x1c00000 -#define bRxHTRxHP_Final 0xe0000000 -#define bRxPWRatioTH 0x3 -#define bRxPWRatioEn 0x4 -#define bRxMFHold 0x3800 -#define bRxPD_Delay_TH1 0x38 -#define bRxPD_Delay_TH2 0x1c0 -#define bRxPD_DC_COUNT_MAX 0x600 -//#define bRxMF_Hold 0x3800 -#define bRxPD_Delay_TH 0x8000 -#define bRxProcess_Delay 0xf0000 -#define bRxSearchrange_GI2_Early 0x700000 -#define bRxFrame_Guard_Counter_L 0x3800000 -#define bRxSGI_Guard_L 0xc000000 -#define bRxSGI_Search_L 0x30000000 -#define bRxSGI_TH 0xc0000000 -#define bDFSCnt0 0xff -#define bDFSCnt1 0xff00 -#define bDFSFlag 0xf0000 -#define bMFWeightSum 0x300000 -#define bMinIdxTH 0x7f000000 -#define bDAFormat 0x40000 -#define bTxChEmuEnable 0x01000000 -#define bTRSWIsolation_A 0x7f -#define bTRSWIsolation_B 0x7f00 -#define bTRSWIsolation_C 0x7f0000 -#define bTRSWIsolation_D 0x7f000000 -#define bExtLNAGain 0x7c00 - -// 6. PageE(0xE00) -#define bSTBCEn 0x4 // Useless -#define bAntennaMapping 0x10 -#define bNss 0x20 -#define bCFOAntSumD 0x200 -#define bPHYCounterReset 0x8000000 -#define bCFOReportGet 0x4000000 -#define bOFDMContinueTx 0x10000000 -#define bOFDMSingleCarrier 0x20000000 -#define bOFDMSingleTone 0x40000000 -//#define bRxPath1 0x01 -//#define bRxPath2 0x02 -//#define bRxPath3 0x04 -//#define bRxPath4 0x08 -//#define bTxPath1 0x10 -//#define bTxPath2 0x20 -#define bHTDetect 0x100 -#define bCFOEn 0x10000 -#define bCFOValue 0xfff00000 -#define bSigTone_Re 0x3f -#define bSigTone_Im 0x7f00 -#define bCounter_CCA 0xffff -#define bCounter_ParityFail 0xffff0000 -#define bCounter_RateIllegal 0xffff -#define bCounter_CRC8Fail 0xffff0000 -#define bCounter_MCSNoSupport 0xffff -#define bCounter_FastSync 0xffff -#define bShortCFO 0xfff -#define bShortCFOTLength 12 //total -#define bShortCFOFLength 11 //fraction -#define bLongCFO 0x7ff -#define bLongCFOTLength 11 -#define bLongCFOFLength 11 -#define bTailCFO 0x1fff -#define bTailCFOTLength 13 -#define bTailCFOFLength 12 -#define bmax_en_pwdB 0xffff -#define bCC_power_dB 0xffff0000 -#define bnoise_pwdB 0xffff -#define bPowerMeasTLength 10 -#define bPowerMeasFLength 3 -#define bRx_HT_BW 0x1 -#define bRxSC 0x6 -#define bRx_HT 0x8 -#define bNB_intf_det_on 0x1 -#define bIntf_win_len_cfg 0x30 -#define bNB_Intf_TH_cfg 0x1c0 -#define bRFGain 0x3f -#define bTableSel 0x40 -#define bTRSW 0x80 -#define bRxSNR_A 0xff -#define bRxSNR_B 0xff00 -#define bRxSNR_C 0xff0000 -#define bRxSNR_D 0xff000000 -#define bSNREVMTLength 8 -#define bSNREVMFLength 1 -#define bCSI1st 0xff -#define bCSI2nd 0xff00 -#define bRxEVM1st 0xff0000 -#define bRxEVM2nd 0xff000000 -#define bSIGEVM 0xff -#define bPWDB 0xff00 -#define bSGIEN 0x10000 - -#define bSFactorQAM1 0xf // Useless -#define bSFactorQAM2 0xf0 -#define bSFactorQAM3 0xf00 -#define bSFactorQAM4 0xf000 -#define bSFactorQAM5 0xf0000 -#define bSFactorQAM6 0xf0000 -#define bSFactorQAM7 0xf00000 -#define bSFactorQAM8 0xf000000 -#define bSFactorQAM9 0xf0000000 -#define bCSIScheme 0x100000 - -#define bNoiseLvlTopSet 0x3 // Useless -#define bChSmooth 0x4 -#define bChSmoothCfg1 0x38 -#define bChSmoothCfg2 0x1c0 -#define bChSmoothCfg3 0xe00 -#define bChSmoothCfg4 0x7000 -#define bMRCMode 0x800000 -#define bTHEVMCfg 0x7000000 - -#define bLoopFitType 0x1 // Useless -#define bUpdCFO 0x40 -#define bUpdCFOOffData 0x80 -#define bAdvUpdCFO 0x100 -#define bAdvTimeCtrl 0x800 -#define bUpdClko 0x1000 -#define bFC 0x6000 -#define bTrackingMode 0x8000 -#define bPhCmpEnable 0x10000 -#define bUpdClkoLTF 0x20000 -#define bComChCFO 0x40000 -#define bCSIEstiMode 0x80000 -#define bAdvUpdEqz 0x100000 -#define bUChCfg 0x7000000 -#define bUpdEqz 0x8000000 - -//Rx Pseduo noise -#define bRxPesudoNoiseOn 0x20000000 // Useless -#define bRxPesudoNoise_A 0xff -#define bRxPesudoNoise_B 0xff00 -#define bRxPesudoNoise_C 0xff0000 -#define bRxPesudoNoise_D 0xff000000 -#define bPesudoNoiseState_A 0xffff -#define bPesudoNoiseState_B 0xffff0000 -#define bPesudoNoiseState_C 0xffff -#define bPesudoNoiseState_D 0xffff0000 - -//7. RF Register -//Zebra1 -#define bZebra1_HSSIEnable 0x8 // Useless -#define bZebra1_TRxControl 0xc00 -#define bZebra1_TRxGainSetting 0x07f -#define bZebra1_RxCorner 0xc00 -#define bZebra1_TxChargePump 0x38 -#define bZebra1_RxChargePump 0x7 -#define bZebra1_ChannelNum 0xf80 -#define bZebra1_TxLPFBW 0x400 -#define bZebra1_RxLPFBW 0x600 - -//Zebra4 -#define bRTL8256RegModeCtrl1 0x100 // Useless -#define bRTL8256RegModeCtrl0 0x40 -#define bRTL8256_TxLPFBW 0x18 -#define bRTL8256_RxLPFBW 0x600 - -//RTL8258 -#define bRTL8258_TxLPFBW 0xc // Useless -#define bRTL8258_RxLPFBW 0xc00 -#define bRTL8258_RSSILPFBW 0xc0 - - -// -// Other Definition -// - -//byte endable for sb_write -#define bByte0 0x1 // Useless -#define bByte1 0x2 -#define bByte2 0x4 -#define bByte3 0x8 -#define bWord0 0x3 -#define bWord1 0xc -#define bDWord 0xf - -//for PutRegsetting & GetRegSetting BitMask -#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f -#define bMaskByte1 0xff00 -#define bMaskByte2 0xff0000 -#define bMaskByte3 0xff000000 -#define bMaskHWord 0xffff0000 -#define bMaskLWord 0x0000ffff -#define bMaskDWord 0xffffffff -#define bMask12Bits 0xfff -#define bMaskH4Bits 0xf0000000 -#define bMaskOFDM_D 0xffc00000 -#define bMaskCCK 0x3f3f3f3f - -//for PutRFRegsetting & GetRFRegSetting BitMask -//#define bMask12Bits 0xfffff // RF Reg mask bits -//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF -#define bRFRegOffsetMask 0xfffff -//#define bRFRegOffsetMask 0xfff - -//MAC0 will wirte PHY1 -#define MAC0_ACCESS_PHY1 0x4000 -//MAC1 will wirte PHY0 -#define MAC1_ACCESS_PHY0 0x2000 - -#define bEnable 0x1 // Useless -#define bDisable 0x0 - -#define LeftAntenna 0x0 // Useless -#define RightAntenna 0x1 - -#define tCheckTxStatus 500 //500ms // Useless -#define tUpdateRxCounter 100 //100ms - -#define rateCCK 0 // Useless -#define rateOFDM 1 -#define rateHT 2 - -//define Register-End -#define bPMAC_End 0x1ff // Useless -#define bFPGAPHY0_End 0x8ff -#define bFPGAPHY1_End 0x9ff -#define bCCKPHY0_End 0xaff -#define bOFDMPHY0_End 0xcff -#define bOFDMPHY1_End 0xdff - -//define max debug item in each debug page -//#define bMaxItem_FPGA_PHY0 0x9 -//#define bMaxItem_FPGA_PHY1 0x3 -//#define bMaxItem_PHY_11B 0x16 -//#define bMaxItem_OFDM_PHY0 0x29 -//#define bMaxItem_OFDM_PHY1 0x0 - -#define bPMACControl 0x0 // Useless -#define bWMACControl 0x1 -#define bWNICControl 0x2 - -#define PathA 0x0 // Useless -#define PathB 0x1 -#define PathC 0x2 -#define PathD 0x3 - -/*--------------------------Define Parameters-------------------------------*/ - - -#endif //__INC_HAL8192SPHYREG_H - + ******************************************************************************/ +/***************************************************************************** + * + * Module: __INC_HAL8192DPHYREG_H + * + * + * Note: 1. Define PMAC/BB register map + * 2. Define RF register map + * 3. PMAC/BB register bit mask. + * 4. RF reg bit mask. + * 5. Other BB/RF relative definition. + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * 09/25/2008 MH 1. Add RL6052 register definition + * + *****************************************************************************/ +#ifndef __INC_HAL8192DPHYREG_H +#define __INC_HAL8192DPHYREG_H + + +/*--------------------------Define Parameters-------------------------------*/ + +//============================================================ +// 8192S Regsiter offset definition +//============================================================ + +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c + +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 +#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c + +// +// PageB(0xB00) +// +#define rPdp_AntA 0xb00 +#define rPdp_AntA_4 0xb04 +#define rPdp_AntA_8 0xb08 +#define rPdp_AntA_C 0xb0c +#define rPdp_AntA_10 0xb10 +#define rPdp_AntA_14 0xb14 +#define rPdp_AntA_18 0xb18 +#define rPdp_AntA_1C 0xb1c +#define rPdp_AntA_20 0xb20 +#define rPdp_AntA_24 0xb24 + +#define rConfig_Pmpd_AntA 0xb28 +#define rConfig_ram64x16 0xb2c + +#define rBndA 0xb30 +#define rHssiPar 0xb34 + +#define rConfig_AntA 0xb68 +#define rConfig_AntB 0xb6c + +#define rPdp_AntB 0xb70 +#define rPdp_AntB_4 0xb74 +#define rPdp_AntB_8 0xb78 +#define rPdp_AntB_C 0xb7c +#define rPdp_AntB_10 0xb80 +#define rPdp_AntB_14 0xb84 +#define rPdp_AntB_18 0xb88 +#define rPdp_AntB_1C 0xb8c +#define rPdp_AntB_20 0xb90 +#define rPdp_AntB_24 0xb94 + +#define rConfig_Pmpd_AntB 0xb98 + +#define rBndB 0xba0 + +#define rAPK 0xbd8 +#define rPm_Rx0_AntA 0xbdc +#define rPm_Rx1_AntA 0xbe0 +#define rPm_Rx2_AntA 0xbe4 +#define rPm_Rx3_AntA 0xbe8 +#define rPm_Rx0_AntB 0xbec +#define rPm_Rx1_AntB 0xbf0 +#define rPm_Rx2_AntB 0xbf4 +#define rPm_Rx3_AntB 0xbf8 + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxIQExtAnta 0xca0 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +#define rFPGA0_IQK 0xe28 +#define rTx_IQK_Tone_A 0xe30 +#define rRx_IQK_Tone_A 0xe34 +#define rTx_IQK_PI_A 0xe38 +#define rRx_IQK_PI_A 0xe3c + +#define rTx_IQK 0xe40 +#define rRx_IQK 0xe44 +#define rIQK_AGC_Pts 0xe48 +#define rIQK_AGC_Rsp 0xe4c +#define rTx_IQK_Tone_B 0xe50 +#define rRx_IQK_Tone_B 0xe54 +#define rTx_IQK_PI_B 0xe58 +#define rRx_IQK_PI_B 0xe5c +#define rIQK_AGC_Cont 0xe60 + +#define rBlue_Tooth 0xe6c +#define rRx_Wait_CCA 0xe70 +#define rTx_CCK_RFON 0xe74 +#define rTx_CCK_BBON 0xe78 +#define rTx_OFDM_RFON 0xe7c +#define rTx_OFDM_BBON 0xe80 +#define rTx_To_Rx 0xe84 +#define rTx_To_Tx 0xe88 +#define rRx_CCK 0xe8c + +#define rTx_Power_Before_IQK_A 0xe94 +#define rTx_Power_After_IQK_A 0xe9c + +#define rRx_Power_Before_IQK_A 0xea0 +#define rRx_Power_Before_IQK_A_2 0xea4 +#define rRx_Power_After_IQK_A 0xea8 +#define rRx_Power_After_IQK_A_2 0xeac + +#define rTx_Power_Before_IQK_B 0xeb4 +#define rTx_Power_After_IQK_B 0xebc + +#define rRx_Power_Before_IQK_B 0xec0 +#define rRx_Power_Before_IQK_B_2 0xec4 +#define rRx_Power_After_IQK_B 0xec8 +#define rRx_Power_After_IQK_B_2 0xecc + +#define rRx_OFDM 0xed0 +#define rRx_Wait_RIFS 0xed4 +#define rRx_TO_Rx 0xed8 +#define rStandby 0xedc +#define rSleep 0xee0 +#define rPMPD_ANAEN 0xeec + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +#define rZebra1_Channel 0x7 // RF channel switch + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // +#define RF_BS_PA_APSET_G1_G4 0x03 +#define RF_BS_PA_APSET_G5_G8 0x04 +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_IPA_G 0x09 // +#define RF_TXBIAS_G 0x0A +#define RF_TXPA_AG 0x0B +#define RF_IPA_A 0x0C // +#define RF_TXBIAS_A 0x0D +#define RF_BS_PA_APSET_G9_G11 0x0E +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_TXBIAS 0x16 // +#define RF_POW_ABILITY 0x17 // +#define RF_MODE_AG 0x18 // +#define rRfChannel 0x18 // RF channel and BW switch +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +#define RF_T_METER 0x42 // + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control + +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control +#define RF_LOBF_9 0x38 +#define RF_RXRF_A3 0x3C // +#define RF_TRSW 0x3F + +#define RF_TXRF_A2 0x41 +#define RF_TXPA_G4 0x46 +#define RF_TXPA_A4 0x4B + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bAntennaSelect 0x0300 + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 + +#define bLSSIReadAddress 0x7f800000 // T65 RF + +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal + +#define bLSSIReadBackData 0xfffff // T65 RF + +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + +//for PutRFRegsetting & GetRFRegSetting BitMask +//#define bMask12Bits 0xfffff // RF Reg mask bits +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfffff +//#define bRFRegOffsetMask 0xfff + +//MAC0 will wirte PHY1 +#define MAC0_ACCESS_PHY1 0x4000 +//MAC1 will wirte PHY0 +#define MAC1_ACCESS_PHY0 0x2000 + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif //__INC_HAL8192SPHYREG_H + diff --git a/drivers/net/wireless/rtl8723as/include/Hal8723APhyCfg.h b/drivers/net/wireless/rtl8723as/include/Hal8723APhyCfg.h index 3dade7e81614..3ec897258dc4 100755 --- a/drivers/net/wireless/rtl8723as/include/Hal8723APhyCfg.h +++ b/drivers/net/wireless/rtl8723as/include/Hal8723APhyCfg.h @@ -1,30 +1,30 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8723PHYCFG_H__ -#define __INC_HAL8723PHYCFG_H__ - -#include -/* MAC/BB/RF HAL config */ -int PHY_BBConfig8723A( IN PADAPTER Adapter ); -int PHY_RFConfig8723A( IN PADAPTER Adapter ); -s32 PHY_MACConfig8723A(PADAPTER padapter); - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8723PHYCFG_H__ +#define __INC_HAL8723PHYCFG_H__ + +#include +/* MAC/BB/RF HAL config */ +int PHY_BBConfig8723A( IN PADAPTER Adapter ); +int PHY_RFConfig8723A( IN PADAPTER Adapter ); +s32 PHY_MACConfig8723A(PADAPTER padapter); + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/Hal8723APhyReg.h b/drivers/net/wireless/rtl8723as/include/Hal8723APhyReg.h index fdd3422cf2d2..7b244b4d03a0 100755 --- a/drivers/net/wireless/rtl8723as/include/Hal8723APhyReg.h +++ b/drivers/net/wireless/rtl8723as/include/Hal8723APhyReg.h @@ -1,74 +1,74 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8723APHYREG_H__ -#define __INC_HAL8723APHYREG_H__ - -#include - -// -// PageB(0xB00) -// -#define rPdp_AntA 0xb00 -#define rPdp_AntA_4 0xb04 -#define rPdp_AntA_8 0xb08 -#define rPdp_AntA_C 0xb0c -#define rPdp_AntA_10 0xb10 -#define rPdp_AntA_14 0xb14 -#define rPdp_AntA_18 0xb18 -#define rPdp_AntA_1C 0xb1c -#define rPdp_AntA_20 0xb20 -#define rPdp_AntA_24 0xb24 - -#define rConfig_Pmpd_AntA 0xb28 -#define rConfig_ram64x16 0xb2c - -#define rBndA 0xb30 -#define rHssiPar 0xb34 - -#define rConfig_AntA 0xb68 -#define rConfig_AntB 0xb6c - -#define rPdp_AntB 0xb70 -#define rPdp_AntB_4 0xb74 -#define rPdp_AntB_8 0xb78 -#define rPdp_AntB_C 0xb7c -#define rPdp_AntB_10 0xb80 -#define rPdp_AntB_14 0xb84 -#define rPdp_AntB_18 0xb88 -#define rPdp_AntB_1C 0xb8c -#define rPdp_AntB_20 0xb90 -#define rPdp_AntB_24 0xb94 - -#define rConfig_Pmpd_AntB 0xb98 - -#define rBndB 0xba0 - -#define rAPK 0xbd8 -#define rPm_Rx0_AntA 0xbdc -#define rPm_Rx1_AntA 0xbe0 -#define rPm_Rx2_AntA 0xbe4 -#define rPm_Rx3_AntA 0xbe8 -#define rPm_Rx0_AntB 0xbec -#define rPm_Rx1_AntB 0xbf0 -#define rPm_Rx2_AntB 0xbf4 -#define rPm_Rx3_AntB 0xbf8 - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8723APHYREG_H__ +#define __INC_HAL8723APHYREG_H__ + +#include + +// +// PageB(0xB00) +// +#define rPdp_AntA 0xb00 +#define rPdp_AntA_4 0xb04 +#define rPdp_AntA_8 0xb08 +#define rPdp_AntA_C 0xb0c +#define rPdp_AntA_10 0xb10 +#define rPdp_AntA_14 0xb14 +#define rPdp_AntA_18 0xb18 +#define rPdp_AntA_1C 0xb1c +#define rPdp_AntA_20 0xb20 +#define rPdp_AntA_24 0xb24 + +#define rConfig_Pmpd_AntA 0xb28 +#define rConfig_ram64x16 0xb2c + +#define rBndA 0xb30 +#define rHssiPar 0xb34 + +#define rConfig_AntA 0xb68 +#define rConfig_AntB 0xb6c + +#define rPdp_AntB 0xb70 +#define rPdp_AntB_4 0xb74 +#define rPdp_AntB_8 0xb78 +#define rPdp_AntB_C 0xb7c +#define rPdp_AntB_10 0xb80 +#define rPdp_AntB_14 0xb84 +#define rPdp_AntB_18 0xb88 +#define rPdp_AntB_1C 0xb8c +#define rPdp_AntB_20 0xb90 +#define rPdp_AntB_24 0xb94 + +#define rConfig_Pmpd_AntB 0xb98 + +#define rBndB 0xba0 + +#define rAPK 0xbd8 +#define rPm_Rx0_AntA 0xbdc +#define rPm_Rx1_AntA 0xbe0 +#define rPm_Rx2_AntA 0xbe4 +#define rPm_Rx3_AntA 0xbe8 +#define rPm_Rx0_AntB 0xbec +#define rPm_Rx1_AntB 0xbf0 +#define rPm_Rx2_AntB 0xbf4 +#define rPm_Rx3_AntB 0xbf8 + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/Hal8723PwrSeq.h b/drivers/net/wireless/rtl8723as/include/Hal8723PwrSeq.h index daa540209429..ab1c32a014a0 100755 --- a/drivers/net/wireless/rtl8723as/include/Hal8723PwrSeq.h +++ b/drivers/net/wireless/rtl8723as/include/Hal8723PwrSeq.h @@ -1,171 +1,171 @@ -#ifndef __HAL8723PWRSEQ_H__ -#define __HAL8723PWRSEQ_H__ -/* - Check document WM-20110607-Paul-RTL8723A_Power_Architecture-R02.vsd - There are 6 HW Power States: - 0: POFF--Power Off - 1: PDN--Power Down - 2: CARDEMU--Card Emulation - 3: ACT--Active Mode - 4: LPS--Low Power State - 5: SUS--Suspend - - The transision from different states are defined below - TRANS_CARDEMU_TO_ACT - TRANS_ACT_TO_CARDEMU - TRANS_CARDEMU_TO_SUS - TRANS_SUS_TO_CARDEMU - TRANS_CARDEMU_TO_PDN - TRANS_ACT_TO_LPS - TRANS_LPS_TO_ACT - - TRANS_END -*/ -#include "HalPwrSeqCmd.h" -#include "rtl8723a_spec.h" - -#define RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS 15 -#define RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS 15 -#define RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS 15 -#define RTL8723A_TRANS_SUS_TO_CARDEMU_STEPS 15 -#define RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS 15 -#define RTL8723A_TRANS_PDN_TO_CARDEMU_STEPS 15 -#define RTL8723A_TRANS_ACT_TO_LPS_STEPS 15 -#define RTL8723A_TRANS_LPS_TO_ACT_STEPS 15 -#define RTL8723A_TRANS_END_STEPS 1 - - -#define RTL8723A_TRANS_CARDEMU_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/ \ - {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/ \ - {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/ \ - {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ - {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 1},/*0x4C[23] = 0x4E[7] = 1, switch DPDT_SEL_P output from WL BB */\ - -#define RTL8723A_TRANS_ACT_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ - {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ - {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/ \ - {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/ \ - - -#define RTL8723A_TRANS_CARDEMU_TO_SUS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8723A_TRANS_SUS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ - -#define RTL8723A_TRANS_CARDEMU_TO_CARDDIS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ - {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ - -#define RTL8723A_TRANS_CARDDIS_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ - {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ - {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ - - -#define RTL8723A_TRANS_CARDEMU_TO_PDN \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ - {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \ - {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ - -#define RTL8723A_TRANS_PDN_TO_CARDEMU \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ - -#define RTL8723A_TRANS_ACT_TO_LPS \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ - {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ - {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ - {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ - - -#define RTL8723A_TRANS_LPS_TO_ACT \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ - {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ - {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ - {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ - {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ - {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ - {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ - {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ - {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ - {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ - -#define RTL8723A_TRANS_END \ - /* format */ \ - /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ - {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // - - -extern WLAN_PWR_CFG rtl8723A_power_on_flow[RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_radio_off_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_card_disable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_card_enable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_suspend_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_resume_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_hwpdn_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_enter_lps_flow[RTL8723A_TRANS_ACT_TO_LPS_STEPS+RTL8723A_TRANS_END_STEPS]; -extern WLAN_PWR_CFG rtl8723A_leave_lps_flow[RTL8723A_TRANS_LPS_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]; - -#endif - +#ifndef __HAL8723PWRSEQ_H__ +#define __HAL8723PWRSEQ_H__ +/* + Check document WM-20110607-Paul-RTL8723A_Power_Architecture-R02.vsd + There are 6 HW Power States: + 0: POFF--Power Off + 1: PDN--Power Down + 2: CARDEMU--Card Emulation + 3: ACT--Active Mode + 4: LPS--Low Power State + 5: SUS--Suspend + + The transision from different states are defined below + TRANS_CARDEMU_TO_ACT + TRANS_ACT_TO_CARDEMU + TRANS_CARDEMU_TO_SUS + TRANS_SUS_TO_CARDEMU + TRANS_CARDEMU_TO_PDN + TRANS_ACT_TO_LPS + TRANS_LPS_TO_ACT + + TRANS_END +*/ +#include "HalPwrSeqCmd.h" +#include "rtl8723a_spec.h" + +#define RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS 15 +#define RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS 15 +#define RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS 15 +#define RTL8723A_TRANS_SUS_TO_CARDEMU_STEPS 15 +#define RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS 15 +#define RTL8723A_TRANS_PDN_TO_CARDEMU_STEPS 15 +#define RTL8723A_TRANS_ACT_TO_LPS_STEPS 15 +#define RTL8723A_TRANS_LPS_TO_ACT_STEPS 15 +#define RTL8723A_TRANS_END_STEPS 1 + + +#define RTL8723A_TRANS_CARDEMU_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/ \ + {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/ \ + {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1 power ready*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset 0x04[16]=1*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/ \ + {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 1},/*0x4C[23] = 0x4E[7] = 1, switch DPDT_SEL_P output from WL BB */\ + +#define RTL8723A_TRANS_ACT_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/ \ + {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ + {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/ \ + {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/ \ + + +#define RTL8723A_TRANS_CARDEMU_TO_SUS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8723A_TRANS_SUS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/ + +#define RTL8723A_TRANS_CARDEMU_TO_CARDDIS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/ \ + {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ + +#define RTL8723A_TRANS_CARDDIS_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/ \ + {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\ + {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/ + + +#define RTL8723A_TRANS_CARDEMU_TO_PDN \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \ + {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \ + {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/ + +#define RTL8723A_TRANS_PDN_TO_CARDEMU \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/ + +#define RTL8723A_TRANS_ACT_TO_LPS \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/ \ + {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/ \ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/ \ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/ \ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/ \ + {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/ \ + {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/ \ + + +#define RTL8723A_TRANS_LPS_TO_ACT \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\ + {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\ + {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\ + {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*. 0x08[4] = 0 switch TSF to 40M*/\ + {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0 TSF in 40M*/\ + {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*. 0x29[7:6] = 2b'00 enable BB clock*/\ + {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*. 0x101[1] = 1*/\ + {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ + {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*. 0x02[1:0] = 2b'11 enable BB macro*/\ + {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ + +#define RTL8723A_TRANS_END \ + /* format */ \ + /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/ \ + {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, // + + +extern WLAN_PWR_CFG rtl8723A_power_on_flow[RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_radio_off_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_card_disable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_card_enable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_suspend_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_resume_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_hwpdn_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_enter_lps_flow[RTL8723A_TRANS_ACT_TO_LPS_STEPS+RTL8723A_TRANS_END_STEPS]; +extern WLAN_PWR_CFG rtl8723A_leave_lps_flow[RTL8723A_TRANS_LPS_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS]; + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/HalPwrSeqCmd.h b/drivers/net/wireless/rtl8723as/include/HalPwrSeqCmd.h index 24e4a54b4af4..5cf122fb2b5f 100755 --- a/drivers/net/wireless/rtl8723as/include/HalPwrSeqCmd.h +++ b/drivers/net/wireless/rtl8723as/include/HalPwrSeqCmd.h @@ -1,138 +1,138 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __HALPWRSEQCMD_H__ -#define __HALPWRSEQCMD_H__ - -#include - -/*---------------------------------------------*/ -//3 The value of cmd: 4 bits -/*---------------------------------------------*/ -#define PWR_CMD_READ 0x00 - // offset: the read register offset - // msk: the mask of the read value - // value: N/A, left by 0 - // note: dirver shall implement this function by read & msk - -#define PWR_CMD_WRITE 0x01 - // offset: the read register offset - // msk: the mask of the write bits - // value: write value - // note: driver shall implement this cmd by read & msk after write - -#define PWR_CMD_POLLING 0x02 - // offset: the read register offset - // msk: the mask of the polled value - // value: the value to be polled, masked by the msd field. - // note: driver shall implement this cmd by - // do{ - // if( (Read(offset) & msk) == (value & msk) ) - // break; - // } while(not timeout); - -#define PWR_CMD_DELAY 0x03 - // offset: the value to delay - // msk: N/A - // value: the unit of delay, 0: us, 1: ms - -#define PWR_CMD_END 0x04 - // offset: N/A - // msk: N/A - // value: N/A - -/*---------------------------------------------*/ -//3 The value of base: 4 bits -/*---------------------------------------------*/ - // define the base address of each block -#define PWR_BASEADDR_MAC 0x00 -#define PWR_BASEADDR_USB 0x01 -#define PWR_BASEADDR_PCIE 0x02 -#define PWR_BASEADDR_SDIO 0x03 - -/*---------------------------------------------*/ -//3 The value of interface_msk: 4 bits -/*---------------------------------------------*/ -#define PWR_INTF_SDIO_MSK BIT(0) -#define PWR_INTF_USB_MSK BIT(1) -#define PWR_INTF_PCI_MSK BIT(2) -#define PWR_INTF_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) - -/*---------------------------------------------*/ -//3 The value of fab_msk: 4 bits -/*---------------------------------------------*/ -#define PWR_FAB_TSMC_MSK BIT(0) -#define PWR_FAB_UMC_MSK BIT(1) -#define PWR_FAB_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) - -/*---------------------------------------------*/ -//3 The value of cut_msk: 8 bits -/*---------------------------------------------*/ -#define PWR_CUT_TESTCHIP_MSK BIT(0) -#define PWR_CUT_A_MSK BIT(1) -#define PWR_CUT_B_MSK BIT(2) -#define PWR_CUT_C_MSK BIT(3) -#define PWR_CUT_D_MSK BIT(4) -#define PWR_CUT_E_MSK BIT(5) -#define PWR_CUT_F_MSK BIT(6) -#define PWR_CUT_G_MSK BIT(7) -#define PWR_CUT_ALL_MSK 0xFF - - -typedef enum _PWRSEQ_CMD_DELAY_UNIT_ -{ - PWRSEQ_DELAY_US, - PWRSEQ_DELAY_MS, -} PWRSEQ_DELAY_UNIT; - -typedef struct _WL_PWR_CFG_ -{ - u16 offset; - u8 cut_msk; - u8 fab_msk:4; - u8 interface_msk:4; - u8 base:4; - u8 cmd:4; - u8 msk; - u8 value; -} WLAN_PWR_CFG, *PWLAN_PWR_CFG; - - -#define GET_PWR_CFG_OFFSET(__PWR_CMD) __PWR_CMD.offset -#define GET_PWR_CFG_CUT_MASK(__PWR_CMD) __PWR_CMD.cut_msk -#define GET_PWR_CFG_FAB_MASK(__PWR_CMD) __PWR_CMD.fab_msk -#define GET_PWR_CFG_INTF_MASK(__PWR_CMD) __PWR_CMD.interface_msk -#define GET_PWR_CFG_BASE(__PWR_CMD) __PWR_CMD.base -#define GET_PWR_CFG_CMD(__PWR_CMD) __PWR_CMD.cmd -#define GET_PWR_CFG_MASK(__PWR_CMD) __PWR_CMD.msk -#define GET_PWR_CFG_VALUE(__PWR_CMD) __PWR_CMD.value - - -//================================================================================ -// Prototype of protected function. -//================================================================================ -u8 HalPwrSeqCmdParsing( - PADAPTER padapter, - u8 CutVersion, - u8 FabVersion, - u8 InterfaceType, - WLAN_PWR_CFG PwrCfgCmd[]); - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HALPWRSEQCMD_H__ +#define __HALPWRSEQCMD_H__ + +#include + +/*---------------------------------------------*/ +//3 The value of cmd: 4 bits +/*---------------------------------------------*/ +#define PWR_CMD_READ 0x00 + // offset: the read register offset + // msk: the mask of the read value + // value: N/A, left by 0 + // note: dirver shall implement this function by read & msk + +#define PWR_CMD_WRITE 0x01 + // offset: the read register offset + // msk: the mask of the write bits + // value: write value + // note: driver shall implement this cmd by read & msk after write + +#define PWR_CMD_POLLING 0x02 + // offset: the read register offset + // msk: the mask of the polled value + // value: the value to be polled, masked by the msd field. + // note: driver shall implement this cmd by + // do{ + // if( (Read(offset) & msk) == (value & msk) ) + // break; + // } while(not timeout); + +#define PWR_CMD_DELAY 0x03 + // offset: the value to delay + // msk: N/A + // value: the unit of delay, 0: us, 1: ms + +#define PWR_CMD_END 0x04 + // offset: N/A + // msk: N/A + // value: N/A + +/*---------------------------------------------*/ +//3 The value of base: 4 bits +/*---------------------------------------------*/ + // define the base address of each block +#define PWR_BASEADDR_MAC 0x00 +#define PWR_BASEADDR_USB 0x01 +#define PWR_BASEADDR_PCIE 0x02 +#define PWR_BASEADDR_SDIO 0x03 + +/*---------------------------------------------*/ +//3 The value of interface_msk: 4 bits +/*---------------------------------------------*/ +#define PWR_INTF_SDIO_MSK BIT(0) +#define PWR_INTF_USB_MSK BIT(1) +#define PWR_INTF_PCI_MSK BIT(2) +#define PWR_INTF_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) + +/*---------------------------------------------*/ +//3 The value of fab_msk: 4 bits +/*---------------------------------------------*/ +#define PWR_FAB_TSMC_MSK BIT(0) +#define PWR_FAB_UMC_MSK BIT(1) +#define PWR_FAB_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3)) + +/*---------------------------------------------*/ +//3 The value of cut_msk: 8 bits +/*---------------------------------------------*/ +#define PWR_CUT_TESTCHIP_MSK BIT(0) +#define PWR_CUT_A_MSK BIT(1) +#define PWR_CUT_B_MSK BIT(2) +#define PWR_CUT_C_MSK BIT(3) +#define PWR_CUT_D_MSK BIT(4) +#define PWR_CUT_E_MSK BIT(5) +#define PWR_CUT_F_MSK BIT(6) +#define PWR_CUT_G_MSK BIT(7) +#define PWR_CUT_ALL_MSK 0xFF + + +typedef enum _PWRSEQ_CMD_DELAY_UNIT_ +{ + PWRSEQ_DELAY_US, + PWRSEQ_DELAY_MS, +} PWRSEQ_DELAY_UNIT; + +typedef struct _WL_PWR_CFG_ +{ + u16 offset; + u8 cut_msk; + u8 fab_msk:4; + u8 interface_msk:4; + u8 base:4; + u8 cmd:4; + u8 msk; + u8 value; +} WLAN_PWR_CFG, *PWLAN_PWR_CFG; + + +#define GET_PWR_CFG_OFFSET(__PWR_CMD) __PWR_CMD.offset +#define GET_PWR_CFG_CUT_MASK(__PWR_CMD) __PWR_CMD.cut_msk +#define GET_PWR_CFG_FAB_MASK(__PWR_CMD) __PWR_CMD.fab_msk +#define GET_PWR_CFG_INTF_MASK(__PWR_CMD) __PWR_CMD.interface_msk +#define GET_PWR_CFG_BASE(__PWR_CMD) __PWR_CMD.base +#define GET_PWR_CFG_CMD(__PWR_CMD) __PWR_CMD.cmd +#define GET_PWR_CFG_MASK(__PWR_CMD) __PWR_CMD.msk +#define GET_PWR_CFG_VALUE(__PWR_CMD) __PWR_CMD.value + + +//================================================================================ +// Prototype of protected function. +//================================================================================ +u8 HalPwrSeqCmdParsing( + PADAPTER padapter, + u8 CutVersion, + u8 FabVersion, + u8 InterfaceType, + WLAN_PWR_CFG PwrCfgCmd[]); + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/HalVerDef.h b/drivers/net/wireless/rtl8723as/include/HalVerDef.h index 06c6a99bb0a9..9de5d7a161f5 100755 --- a/drivers/net/wireless/rtl8723as/include/HalVerDef.h +++ b/drivers/net/wireless/rtl8723as/include/HalVerDef.h @@ -57,6 +57,10 @@ typedef enum tag_HAL_Cut_Version_Definition E_CUT_VERSION = 4, F_CUT_VERSION = 5, G_CUT_VERSION = 6, + H_CUT_VERSION = 7, + I_CUT_VERSION = 8, + J_CUT_VERSION = 9, + K_CUT_VERSION = 10, }HAL_CUT_VERSION_E; // HAL_Manufacturer @@ -120,6 +124,9 @@ typedef struct tag_HAL_VERSION #define IS_C_CUT(version) ((GET_CVID_CUT_VERSION(version) == C_CUT_VERSION) ? TRUE : FALSE) #define IS_D_CUT(version) ((GET_CVID_CUT_VERSION(version) == D_CUT_VERSION) ? TRUE : FALSE) #define IS_E_CUT(version) ((GET_CVID_CUT_VERSION(version) == E_CUT_VERSION) ? TRUE : FALSE) +#define IS_I_CUT(version) ((GET_CVID_CUT_VERSION(version) == I_CUT_VERSION) ? TRUE : FALSE) +#define IS_J_CUT(version) ((GET_CVID_CUT_VERSION(version) == J_CUT_VERSION) ? TRUE : FALSE) +#define IS_K_CUT(version) ((GET_CVID_CUT_VERSION(version) == K_CUT_VERSION) ? TRUE : FALSE) //HAL_VENDOR_E diff --git a/drivers/net/wireless/rtl8723as/include/autoconf.h b/drivers/net/wireless/rtl8723as/include/autoconf.h index 2165c253ebd7..d34be3689d89 100755 --- a/drivers/net/wireless/rtl8723as/include/autoconf.h +++ b/drivers/net/wireless/rtl8723as/include/autoconf.h @@ -47,9 +47,9 @@ #define CONFIG_80211N_HT #define CONFIG_RECV_REORDERING_CTRL -#define CONFIG_IOCTL_CFG80211 +//#define CONFIG_IOCTL_CFG80211 #ifdef CONFIG_IOCTL_CFG80211 - #define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */ + //#define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */ #define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER //#define CONFIG_DEBUG_CFG80211 #define CONFIG_SET_SCAN_DENY_TIMER @@ -76,8 +76,9 @@ #endif //#define CONFIG_DBG_P2P - //#define CONFIG_P2P_PS + #define CONFIG_P2P_PS //#define CONFIG_P2P_IPS + #define P2P_OP_CHECK_SOCIAL_CH #endif // Added by Kurt 20110511 @@ -119,6 +120,7 @@ #define CONFIG_LONG_DELAY_ISSUE #define CONFIG_NEW_SIGNAL_STAT_PROCESS #define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */ +#define CONFIG_DEAUTH_BEFORE_CONNECT //#define CONFIG_PATCH_JOIN_WRONG_CHANNEL @@ -141,10 +143,11 @@ #endif -#define CONFIG_CONCURRENT_MODE +//#define CONFIG_CONCURRENT_MODE #ifdef CONFIG_CONCURRENT_MODE #define CONFIG_TSF_RESET_OFFLOAD // For 2 PORT TSF SYNC. //#define CONFIG_HWPORT_SWAP //Port0->Sec , Port1 -> Pri + //#define CONFIG_STA_MODE_SCAN_UNDER_AP_MODE #endif // CONFIG_CONCURRENT_MODE @@ -183,6 +186,7 @@ #ifndef CONFIG_LPS #define CONFIG_LPS // download reserved page to FW #endif + #define CONFIG_CHECK_BT_HANG #endif @@ -191,6 +195,8 @@ //#define CONFIG_HW_ANTENNA_DIVERSITY #endif +//#define CONFIG_RF_GAIN_OFFSET + #ifndef DISABLE_BB_RF #define DISABLE_BB_RF 0 #endif diff --git a/drivers/net/wireless/rtl8723as/include/byteorder/swab.h b/drivers/net/wireless/rtl8723as/include/byteorder/swab.h index 1bd067de24eb..067c8e434a1f 100755 --- a/drivers/net/wireless/rtl8723as/include/byteorder/swab.h +++ b/drivers/net/wireless/rtl8723as/include/byteorder/swab.h @@ -20,7 +20,7 @@ #ifndef _LINUX_BYTEORDER_SWAB_H #define _LINUX_BYTEORDER_SWAB_H -#if !defined(CONFIG_PLATFORM_MSTAR_TITANIA12) +#if !defined(CONFIG_PLATFORM_MSTAR) #ifndef __u16 typedef unsigned short __u16; #endif @@ -73,7 +73,7 @@ __inline static __u64 ___swab64(__u64 x) (__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \ (__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); \ } -#endif // CONFIG_PLATFORM_MSTAR_TITANIA12 +#endif // CONFIG_PLATFORM_MSTAR #ifndef __arch__swab16 __inline static __u16 __arch__swab16(__u16 x) diff --git a/drivers/net/wireless/rtl8723as/include/drv_conf.h b/drivers/net/wireless/rtl8723as/include/drv_conf.h index bc7c692a8ac0..13176879f666 100755 --- a/drivers/net/wireless/rtl8723as/include/drv_conf.h +++ b/drivers/net/wireless/rtl8723as/include/drv_conf.h @@ -39,11 +39,6 @@ //for Android here. If you are sure there is no risk on your system about this, //mask this macro define to support non-printable ascii ssid. //#define CONFIG_VALIDATE_SSID -#ifdef CONFIG_PLATFORM_ARM_SUNxI - #ifdef CONFIG_VALIDATE_SSID - #undef CONFIG_VALIDATE_SSID - #endif -#endif //Android expect dbm as the rx signal strength unit #define CONFIG_SIGNAL_DISPLAY_DBM diff --git a/drivers/net/wireless/rtl8723as/include/drv_types.h b/drivers/net/wireless/rtl8723as/include/drv_types.h index cf4c3e177cb9..57bd51728a9a 100755 --- a/drivers/net/wireless/rtl8723as/include/drv_types.h +++ b/drivers/net/wireless/rtl8723as/include/drv_types.h @@ -81,6 +81,7 @@ typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER; #include #include #include +#include #ifdef CONFIG_WAPI_SUPPORT #include @@ -224,7 +225,7 @@ struct registry_priv u8 force_igi;//0 normal #endif u8 regulatory_tid; - + u8 qos_opt_enable; }; @@ -234,7 +235,7 @@ struct registry_priv #define BSSID_OFT(field) ((ULONG)FIELD_OFFSET(WLAN_BSSID_EX,field)) #define BSSID_SZ(field) sizeof(((PWLAN_BSSID_EX) 0)->field) -#define MAX_CONTINUAL_URB_ERR 4 + #ifdef CONFIG_SDIO_HCI #include @@ -244,6 +245,11 @@ struct registry_priv #define INTF_DATA GSPI_DATA #endif +#ifdef CONFIG_CONCURRENT_MODE +#define is_primary_adapter(adapter) (adapter->adapter_type == PRIMARY_ADAPTER) +#else +#define is_primary_adapter(adapter) (1) +#endif #define GET_PRIMARY_ADAPTER(padapter) (((_adapter *)padapter)->dvobj->if1) #define GET_IFACE_NUMS(padapter) (((_adapter *)padapter)->dvobj->iface_nums) @@ -261,6 +267,8 @@ struct dvobj_priv { _adapter *if1; //PRIMARY_ADAPTER _adapter *if2; //SECONDARY_ADAPTER + + s32 processing_dev_remove; //for local/global synchronization _mutex hw_init_mutex; @@ -271,6 +279,7 @@ struct dvobj_priv unsigned char oper_channel; //saved channel info when call set_channel_bw unsigned char oper_bwmode; unsigned char oper_ch_offset;//PRIME_CHNL_OFFSET + u32 on_oper_ch_time; _adapter *padapters[IFACE_ID_MAX]; u8 iface_nums; // total number of ifaces used runtime @@ -285,6 +294,9 @@ struct dvobj_priv u8 Queue2Pipe[HW_QUEUE_ENTRY];//for out pipe mapping u8 irq_alloc; + ATOMIC_T continual_io_error; + + struct pwrctrl_priv pwrctl_priv; /*-------- below is for SDIO INTERFACE --------*/ @@ -349,7 +361,7 @@ struct dvobj_priv struct usb_interface *pusbintf; struct usb_device *pusbdev; #endif//PLATFORM_FREEBSD - ATOMIC_T continual_urb_error; + #endif//CONFIG_USB_HCI /*-------- below is for PCIE INTERFACE --------*/ @@ -391,6 +403,9 @@ struct dvobj_priv #endif//CONFIG_PCI_HCI }; +#define dvobj_to_pwrctl(dvobj) (&(dvobj->pwrctl_priv)) +#define pwrctl_to_dvobj(pwrctl) container_of(pwrctl, struct dvobj_priv, pwrctl_priv) + #ifdef PLATFORM_LINUX static struct device *dvobj_to_dev(struct dvobj_priv *dvobj) { @@ -479,8 +494,8 @@ struct _ADAPTER{ struct recv_priv recvpriv; struct sta_priv stapriv; struct security_priv securitypriv; + _lock security_key_mutex; // add for CONFIG_IEEE80211W, none 11w also can use struct registry_priv registrypriv; - struct pwrctrl_priv pwrctrlpriv; struct eeprom_priv eeprompriv; struct led_priv ledpriv; #if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) @@ -580,6 +595,7 @@ struct _ADAPTER{ struct net_device_stats stats; struct iw_statistics iwstats; struct proc_dir_entry *dir_dev;// for proc directory + struct proc_dir_entry *dir_odm; #ifdef CONFIG_IOCTL_CFG80211 struct wireless_dev *rtw_wdev; @@ -665,6 +681,7 @@ struct _ADAPTER{ }; #define adapter_to_dvobj(adapter) (adapter->dvobj) +#define adapter_to_pwrctl(adapter) (&(adapter->dvobj->pwrctl_priv)) int rtw_handle_dualmac(_adapter *adapter, bool init); diff --git a/drivers/net/wireless/rtl8723as/include/drv_types_gspi.h b/drivers/net/wireless/rtl8723as/include/drv_types_gspi.h index fafd0dfd78e9..4d42c9cc837c 100755 --- a/drivers/net/wireless/rtl8723as/include/drv_types_gspi.h +++ b/drivers/net/wireless/rtl8723as/include/drv_types_gspi.h @@ -1,49 +1,49 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __DRV_TYPES_GSPI_H__ -#define __DRV_TYPES_GSPI_H__ - -#include -#include - -// SPI Header Files -#ifdef PLATFORM_LINUX -#include -#endif - - -typedef struct gspi_data -{ - u8 func_number; - - u8 tx_block_mode; - u8 rx_block_mode; - u32 block_transfer_len; - -#ifdef PLATFORM_LINUX - struct spi_device *func; - - struct workqueue_struct *priv_wq; - struct delayed_work irq_work; -#endif -} GSPI_DATA, *PGSPI_DATA; - -#endif // #ifndef __DRV_TYPES_GSPI_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_GSPI_H__ +#define __DRV_TYPES_GSPI_H__ + +#include +#include + +// SPI Header Files +#ifdef PLATFORM_LINUX +#include +#endif + + +typedef struct gspi_data +{ + u8 func_number; + + u8 tx_block_mode; + u8 rx_block_mode; + u32 block_transfer_len; + +#ifdef PLATFORM_LINUX + struct spi_device *func; + + struct workqueue_struct *priv_wq; + struct delayed_work irq_work; +#endif +} GSPI_DATA, *PGSPI_DATA; + +#endif // #ifndef __DRV_TYPES_GSPI_H__ + diff --git a/drivers/net/wireless/rtl8723as/include/drv_types_sdio.h b/drivers/net/wireless/rtl8723as/include/drv_types_sdio.h index 3e7dfcc2eefe..7e2b9ed2f71c 100755 --- a/drivers/net/wireless/rtl8723as/include/drv_types_sdio.h +++ b/drivers/net/wireless/rtl8723as/include/drv_types_sdio.h @@ -1,71 +1,71 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __DRV_TYPES_SDIO_H__ -#define __DRV_TYPES_SDIO_H__ - -#include -#include - -// SDIO Header Files -#ifdef PLATFORM_LINUX -#include -#endif -#ifdef PLATFORM_OS_XP -#include -#include -#endif -#ifdef PLATFORM_OS_CE -#include -#endif - - -typedef struct sdio_data -{ - u8 func_number; - - u8 tx_block_mode; - u8 rx_block_mode; - u32 block_transfer_len; - -#ifdef PLATFORM_LINUX - struct sdio_func *func; - _thread_hdl_ sys_sdio_irq_thd; -#endif - -#ifdef PLATFORM_OS_XP - PDEVICE_OBJECT pphysdevobj; - PDEVICE_OBJECT pfuncdevobj; - PDEVICE_OBJECT pnextdevobj; - SDBUS_INTERFACE_STANDARD sdbusinft; - u8 nextdevstacksz; -#endif - -#ifdef PLATFORM_OS_CE - SD_DEVICE_HANDLE hDevice; - SD_CARD_RCA sd_rca; - SD_CARD_INTERFACE card_intf; - BOOLEAN enableIsarWithStatus; - WCHAR active_path[MAX_ACTIVE_REG_PATH]; - SD_HOST_BLOCK_CAPABILITY sd_host_blk_cap; -#endif -} SDIO_DATA, *PSDIO_DATA; - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_SDIO_H__ +#define __DRV_TYPES_SDIO_H__ + +#include +#include + +// SDIO Header Files +#ifdef PLATFORM_LINUX +#include +#endif +#ifdef PLATFORM_OS_XP +#include +#include +#endif +#ifdef PLATFORM_OS_CE +#include +#endif + + +typedef struct sdio_data +{ + u8 func_number; + + u8 tx_block_mode; + u8 rx_block_mode; + u32 block_transfer_len; + +#ifdef PLATFORM_LINUX + struct sdio_func *func; + _thread_hdl_ sys_sdio_irq_thd; +#endif + +#ifdef PLATFORM_OS_XP + PDEVICE_OBJECT pphysdevobj; + PDEVICE_OBJECT pfuncdevobj; + PDEVICE_OBJECT pnextdevobj; + SDBUS_INTERFACE_STANDARD sdbusinft; + u8 nextdevstacksz; +#endif + +#ifdef PLATFORM_OS_CE + SD_DEVICE_HANDLE hDevice; + SD_CARD_RCA sd_rca; + SD_CARD_INTERFACE card_intf; + BOOLEAN enableIsarWithStatus; + WCHAR active_path[MAX_ACTIVE_REG_PATH]; + SD_HOST_BLOCK_CAPABILITY sd_host_blk_cap; +#endif +} SDIO_DATA, *PSDIO_DATA; + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/hal_com.h b/drivers/net/wireless/rtl8723as/include/hal_com.h index 13f50d67d3b8..e1542783ae28 100755 --- a/drivers/net/wireless/rtl8723as/include/hal_com.h +++ b/drivers/net/wireless/rtl8723as/include/hal_com.h @@ -178,5 +178,8 @@ void hal_init_macaddr(_adapter *adapter); void c2h_evt_clear(_adapter *adapter); s32 c2h_evt_read(_adapter *adapter, u8 *buf); +u8 SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value); +u8 GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value); + #endif //__HAL_COMMON_H__ diff --git a/drivers/net/wireless/rtl8723as/include/hal_intf.h b/drivers/net/wireless/rtl8723as/include/hal_intf.h index 63737c76fa2d..da9d42b4c723 100755 --- a/drivers/net/wireless/rtl8723as/include/hal_intf.h +++ b/drivers/net/wireless/rtl8723as/include/hal_intf.h @@ -89,6 +89,7 @@ typedef enum _HW_VARIABLES{ HW_VAR_AMPDU_FACTOR, HW_VAR_RXDMA_AGG_PG_TH, HW_VAR_SET_RPWM, + HW_VAR_GET_CPWM, HW_VAR_H2C_FW_PWRMODE, HW_VAR_H2C_FW_JOINBSSRPT, HW_VAR_FWLPS_RF_ON, @@ -123,6 +124,8 @@ typedef enum _HW_VARIABLES{ HW_VAR_H2C_MEDIA_STATUS_RPT, HW_VAR_CHK_HI_QUEUE_EMPTY, HW_VAR_READ_LLT_TAB, + HW_VAR_C2HEVT_CLEAR, + HW_VAR_C2HEVT_MSG_NORMAL, }HW_VARIABLES; typedef enum _HAL_DEF_VARIABLE{ @@ -142,6 +145,7 @@ typedef enum _HAL_DEF_VARIABLE{ HAL_DEF_DBG_DUMP_TXPKT, HW_DEF_FA_CNT_DUMP, HW_DEF_ODM_DBG_FLAG, + HW_DEF_ODM_DBG_LEVEL, }HAL_DEF_VARIABLE; typedef enum _HAL_ODM_VARIABLE{ @@ -210,9 +214,7 @@ struct hal_ops { void (*SetBeaconRelatedRegistersHandler)(_adapter *padapter); void (*Add_RateATid)(_adapter *padapter, u32 bitmap, u8 arg, u8 rssi_level); -#ifdef CONFIG_CONCURRENT_MODE - void (*clone_haldata)(_adapter *dst_padapter, _adapter *src_padapter); -#endif + void (*run_thread)(_adapter *padapter); void (*cancel_thread)(_adapter *padapter); @@ -428,7 +430,7 @@ void rtw_hal_free_recv_priv(_adapter *padapter); void rtw_hal_update_ra_mask(struct sta_info *psta, u8 rssi_level); void rtw_hal_add_ra_tid(_adapter *padapter, u32 bitmap, u8 arg, u8 rssi_level); -void rtw_hal_clone_data(_adapter *dst_padapter, _adapter *src_padapter); + void rtw_hal_start_thread(_adapter *padapter); void rtw_hal_stop_thread(_adapter *padapter); diff --git a/drivers/net/wireless/rtl8723as/include/ieee80211.h b/drivers/net/wireless/rtl8723as/include/ieee80211.h index c8219783e89e..422c47aba5e6 100755 --- a/drivers/net/wireless/rtl8723as/include/ieee80211.h +++ b/drivers/net/wireless/rtl8723as/include/ieee80211.h @@ -821,7 +821,10 @@ struct ieee80211_softmac_stats{ #define WEP_KEYS 4 #define WEP_KEY_LEN 13 - +#ifdef CONFIG_IEEE80211W +#define BIP_MAX_KEYID 5 +#define BIP_AAD_SIZE 20 +#endif //CONFIG_IEEE80211W #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) @@ -1184,6 +1187,8 @@ enum ieee80211_state { #define DEFAULT_FTS 2346 #define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" #define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] +#define IP_FMT "%d.%d.%d.%d" +#define IP_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3] #ifdef PLATFORM_FREEBSD //Baron change func to macro #define is_multicast_mac_addr(Addr) ((((Addr[0]) & 0x01) == 0x01) && ((Addr[0]) != 0xff)) @@ -1201,6 +1206,12 @@ extern __inline int is_broadcast_mac_addr(const u8 *addr) return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); } + +extern __inline int is_zero_mac_addr(const u8 *addr) +{ + return ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && \ + (addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00)); +} #endif //PLATFORM_FREEBSD #define CFG_IEEE80211_RESERVE_FCS (1<<0) @@ -1248,7 +1259,9 @@ enum rtw_ieee80211_category { RTW_WLAN_CATEGORY_FT = 6, RTW_WLAN_CATEGORY_HT = 7, RTW_WLAN_CATEGORY_SA_QUERY = 8, + RTW_WLAN_CATEGORY_UNPROTECTED_WNM = 11, // add for CONFIG_IEEE80211W, none 11w also can use RTW_WLAN_CATEGORY_TDLS = 12, + RTW_WLAN_CATEGORY_SELF_PROTECTED = 15, // add for CONFIG_IEEE80211W, none 11w also can use RTW_WLAN_CATEGORY_WMM = 17, RTW_WLAN_CATEGORY_P2P = 0x7f,//P2P action frames }; @@ -1513,6 +1526,7 @@ int rtw_parse_wpa2_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwi int rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len); u8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen); +u8 *rtw_get_wps_ie_from_scan_queue(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen, u8 frame_type); u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen); u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_attr, u32 *len_attr); u8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_content, uint *len_content); @@ -1530,8 +1544,11 @@ void dump_ies(u8 *buf, u32 buf_len); void dump_wps_ie(u8 *ie, u32 ie_len); #ifdef CONFIG_P2P +u32 rtw_get_p2p_merged_ies_len(u8 *in_ie, u32 in_len); +int rtw_p2p_merge_ies(u8 *in_ie, u32 in_len, u8 *merge_ie); void dump_p2p_ie(u8 *ie, u32 ie_len); u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen); +u8 *rtw_get_p2p_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen, u8 frame_type); u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr, u32 *len_attr); u8 *rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_content, uint *len_content); u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr); @@ -1539,7 +1556,9 @@ void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id); #endif #ifdef CONFIG_WFD +void dump_wfd_ie(u8 *ie, u32 ie_len); int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen); +int rtw_get_wfd_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen, u8 frame_type); int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen); #endif // CONFIG_WFD diff --git a/drivers/net/wireless/rtl8723as/include/ieee80211_ext.h b/drivers/net/wireless/rtl8723as/include/ieee80211_ext.h index 3e55305e1d98..14f1b239c72f 100755 --- a/drivers/net/wireless/rtl8723as/include/ieee80211_ext.h +++ b/drivers/net/wireless/rtl8723as/include/ieee80211_ext.h @@ -16,462 +16,462 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -#ifndef __IEEE80211_EXT_H -#define __IEEE80211_EXT_H - -#include -#include -#include - -#define WMM_OUI_TYPE 2 -#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0 -#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1 -#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2 -#define WMM_VERSION 1 - -#define WPA_PROTO_WPA BIT(0) -#define WPA_PROTO_RSN BIT(1) - -#define WPA_KEY_MGMT_IEEE8021X BIT(0) -#define WPA_KEY_MGMT_PSK BIT(1) -#define WPA_KEY_MGMT_NONE BIT(2) -#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3) -#define WPA_KEY_MGMT_WPA_NONE BIT(4) - - -#define WPA_CAPABILITY_PREAUTH BIT(0) -#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6) -#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9) - - -#define PMKID_LEN 16 - - -#ifdef PLATFORM_LINUX -struct wpa_ie_hdr { - u8 elem_id; - u8 len; - u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ - u8 version[2]; /* little endian */ -}__attribute__ ((packed)); - -struct rsn_ie_hdr { - u8 elem_id; /* WLAN_EID_RSN */ - u8 len; - u8 version[2]; /* little endian */ -}__attribute__ ((packed)); - -struct wme_ac_parameter { -#if defined(CONFIG_LITTLE_ENDIAN) - /* byte 1 */ - u8 aifsn:4, - acm:1, - aci:2, - reserved:1; - - /* byte 2 */ - u8 eCWmin:4, - eCWmax:4; -#elif defined(CONFIG_BIG_ENDIAN) - /* byte 1 */ - u8 reserved:1, - aci:2, - acm:1, - aifsn:4; - - /* byte 2 */ - u8 eCWmax:4, - eCWmin:4; -#else -#error "Please fix " -#endif - - /* bytes 3 & 4 */ - u16 txopLimit; -} __attribute__ ((packed)); - -struct wme_parameter_element { - /* required fields for WME version 1 */ - u8 oui[3]; - u8 oui_type; - u8 oui_subtype; - u8 version; - u8 acInfo; - u8 reserved; - struct wme_ac_parameter ac[4]; - -} __attribute__ ((packed)); - -#endif - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) - -struct wpa_ie_hdr { - u8 elem_id; - u8 len; - u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ - u8 version[2]; /* little endian */ -}; - -struct rsn_ie_hdr { - u8 elem_id; /* WLAN_EID_RSN */ - u8 len; - u8 version[2]; /* little endian */ -}; - -#pragma pack() - -#endif - -#define WPA_PUT_LE16(a, val) \ - do { \ - (a)[1] = ((u16) (val)) >> 8; \ - (a)[0] = ((u16) (val)) & 0xff; \ - } while (0) - -#define WPA_PUT_BE32(a, val) \ - do { \ - (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ - (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ - (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ - (a)[3] = (u8) (((u32) (val)) & 0xff); \ - } while (0) - -#define WPA_PUT_LE32(a, val) \ - do { \ - (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ - (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ - (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ - (a)[0] = (u8) (((u32) (val)) & 0xff); \ - } while (0) - -#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val)) -//#define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val)) - - - -/* Action category code */ -enum ieee80211_category { - WLAN_CATEGORY_SPECTRUM_MGMT = 0, - WLAN_CATEGORY_QOS = 1, - WLAN_CATEGORY_DLS = 2, - WLAN_CATEGORY_BACK = 3, - WLAN_CATEGORY_HT = 7, - WLAN_CATEGORY_WMM = 17, -}; - -/* SPECTRUM_MGMT action code */ -enum ieee80211_spectrum_mgmt_actioncode { - WLAN_ACTION_SPCT_MSR_REQ = 0, - WLAN_ACTION_SPCT_MSR_RPRT = 1, - WLAN_ACTION_SPCT_TPC_REQ = 2, - WLAN_ACTION_SPCT_TPC_RPRT = 3, - WLAN_ACTION_SPCT_CHL_SWITCH = 4, - WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, -}; - -/* BACK action code */ -enum ieee80211_back_actioncode { - WLAN_ACTION_ADDBA_REQ = 0, - WLAN_ACTION_ADDBA_RESP = 1, - WLAN_ACTION_DELBA = 2, -}; - -/* HT features action code */ -enum ieee80211_ht_actioncode { - WLAN_ACTION_NOTIFY_CH_WIDTH = 0, - WLAN_ACTION_SM_PS = 1, - WLAN_ACTION_PSPM = 2, - WLAN_ACTION_PCO_PHASE = 3, - WLAN_ACTION_MIMO_CSI_MX = 4, - WLAN_ACTION_MIMO_NONCP_BF = 5, - WLAN_ACTION_MIMP_CP_BF = 6, - WLAN_ACTION_ASEL_INDICATES_FB = 7, - WLAN_ACTION_HI_INFO_EXCHG = 8, -}; - -/* BACK (block-ack) parties */ -enum ieee80211_back_parties { - WLAN_BACK_RECIPIENT = 0, - WLAN_BACK_INITIATOR = 1, - WLAN_BACK_TIMER = 2, -}; - -#ifdef PLATFORM_LINUX - -struct ieee80211_mgmt { - u16 frame_control; - u16 duration; - u8 da[6]; - u8 sa[6]; - u8 bssid[6]; - u16 seq_ctrl; - union { - struct { - u16 auth_alg; - u16 auth_transaction; - u16 status_code; - /* possibly followed by Challenge text */ - u8 variable[0]; - } __attribute__ ((packed)) auth; - struct { - u16 reason_code; - } __attribute__ ((packed)) deauth; - struct { - u16 capab_info; - u16 listen_interval; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) assoc_req; - struct { - u16 capab_info; - u16 status_code; - u16 aid; - /* followed by Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) assoc_resp, reassoc_resp; - struct { - u16 capab_info; - u16 listen_interval; - u8 current_ap[6]; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) reassoc_req; - struct { - u16 reason_code; - } __attribute__ ((packed)) disassoc; - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params, TIM */ - u8 variable[0]; - } __attribute__ ((packed)) beacon; - struct { - /* only variable items: SSID, Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) probe_req; - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params */ - u8 variable[0]; - } __attribute__ ((packed)) probe_resp; - struct { - u8 category; - union { - struct { - u8 action_code; - u8 dialog_token; - u8 status_code; - u8 variable[0]; - } __attribute__ ((packed)) wme_action; -#if 0 - struct{ - u8 action_code; - u8 element_id; - u8 length; - struct ieee80211_channel_sw_ie sw_elem; - } __attribute__ ((packed)) chan_switch; - struct{ - u8 action_code; - u8 dialog_token; - u8 element_id; - u8 length; - struct ieee80211_msrment_ie msr_elem; - } __attribute__ ((packed)) measurement; -#endif - struct{ - u8 action_code; - u8 dialog_token; - u16 capab; - u16 timeout; - u16 start_seq_num; - } __attribute__ ((packed)) addba_req; - struct{ - u8 action_code; - u8 dialog_token; - u16 status; - u16 capab; - u16 timeout; - } __attribute__ ((packed)) addba_resp; - struct{ - u8 action_code; - u16 params; - u16 reason_code; - } __attribute__ ((packed)) delba; - struct{ - u8 action_code; - /* capab_info for open and confirm, - * reason for close - */ - u16 aux; - /* Followed in plink_confirm by status - * code, AID and supported rates, - * and directly by supported rates in - * plink_open and plink_close - */ - u8 variable[0]; - } __attribute__ ((packed)) plink_action; - struct{ - u8 action_code; - u8 variable[0]; - } __attribute__ ((packed)) mesh_action; - } __attribute__ ((packed)) u; - } __attribute__ ((packed)) action; - } __attribute__ ((packed)) u; -}__attribute__ ((packed)); - -#endif - - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) - -struct ieee80211_mgmt { - u16 frame_control; - u16 duration; - u8 da[6]; - u8 sa[6]; - u8 bssid[6]; - u16 seq_ctrl; - union { - struct { - u16 auth_alg; - u16 auth_transaction; - u16 status_code; - /* possibly followed by Challenge text */ - u8 variable[0]; - } auth; - struct { - u16 reason_code; - } deauth; - struct { - u16 capab_info; - u16 listen_interval; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } assoc_req; - struct { - u16 capab_info; - u16 status_code; - u16 aid; - /* followed by Supported rates */ - u8 variable[0]; - } assoc_resp, reassoc_resp; - struct { - u16 capab_info; - u16 listen_interval; - u8 current_ap[6]; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } reassoc_req; - struct { - u16 reason_code; - } disassoc; -#if 0 - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params, TIM */ - u8 variable[0]; - } beacon; - struct { - /* only variable items: SSID, Supported rates */ - u8 variable[0]; - } probe_req; - - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params */ - u8 variable[0]; - } probe_resp; -#endif - struct { - u8 category; - union { - struct { - u8 action_code; - u8 dialog_token; - u8 status_code; - u8 variable[0]; - } wme_action; -/* - struct{ - u8 action_code; - u8 element_id; - u8 length; - struct ieee80211_channel_sw_ie sw_elem; - } chan_switch; - struct{ - u8 action_code; - u8 dialog_token; - u8 element_id; - u8 length; - struct ieee80211_msrment_ie msr_elem; - } measurement; -*/ - struct{ - u8 action_code; - u8 dialog_token; - u16 capab; - u16 timeout; - u16 start_seq_num; - } addba_req; - struct{ - u8 action_code; - u8 dialog_token; - u16 status; - u16 capab; - u16 timeout; - } addba_resp; - struct{ - u8 action_code; - u16 params; - u16 reason_code; - } delba; - struct{ - u8 action_code; - /* capab_info for open and confirm, - * reason for close - */ - u16 aux; - /* Followed in plink_confirm by status - * code, AID and supported rates, - * and directly by supported rates in - * plink_open and plink_close - */ - u8 variable[0]; - } plink_action; - struct{ - u8 action_code; - u8 variable[0]; - } mesh_action; - } u; - } action; - } u; -} ; - -#pragma pack() - -#endif - -/* mgmt header + 1 byte category code */ -#define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u) - - - -#endif - + ******************************************************************************/ +#ifndef __IEEE80211_EXT_H +#define __IEEE80211_EXT_H + +#include +#include +#include + +#define WMM_OUI_TYPE 2 +#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0 +#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1 +#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2 +#define WMM_VERSION 1 + +#define WPA_PROTO_WPA BIT(0) +#define WPA_PROTO_RSN BIT(1) + +#define WPA_KEY_MGMT_IEEE8021X BIT(0) +#define WPA_KEY_MGMT_PSK BIT(1) +#define WPA_KEY_MGMT_NONE BIT(2) +#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3) +#define WPA_KEY_MGMT_WPA_NONE BIT(4) + + +#define WPA_CAPABILITY_PREAUTH BIT(0) +#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6) +#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9) + + +#define PMKID_LEN 16 + + +#ifdef PLATFORM_LINUX +struct wpa_ie_hdr { + u8 elem_id; + u8 len; + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ + u8 version[2]; /* little endian */ +}__attribute__ ((packed)); + +struct rsn_ie_hdr { + u8 elem_id; /* WLAN_EID_RSN */ + u8 len; + u8 version[2]; /* little endian */ +}__attribute__ ((packed)); + +struct wme_ac_parameter { +#if defined(CONFIG_LITTLE_ENDIAN) + /* byte 1 */ + u8 aifsn:4, + acm:1, + aci:2, + reserved:1; + + /* byte 2 */ + u8 eCWmin:4, + eCWmax:4; +#elif defined(CONFIG_BIG_ENDIAN) + /* byte 1 */ + u8 reserved:1, + aci:2, + acm:1, + aifsn:4; + + /* byte 2 */ + u8 eCWmax:4, + eCWmin:4; +#else +#error "Please fix " +#endif + + /* bytes 3 & 4 */ + u16 txopLimit; +} __attribute__ ((packed)); + +struct wme_parameter_element { + /* required fields for WME version 1 */ + u8 oui[3]; + u8 oui_type; + u8 oui_subtype; + u8 version; + u8 acInfo; + u8 reserved; + struct wme_ac_parameter ac[4]; + +} __attribute__ ((packed)); + +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct wpa_ie_hdr { + u8 elem_id; + u8 len; + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ + u8 version[2]; /* little endian */ +}; + +struct rsn_ie_hdr { + u8 elem_id; /* WLAN_EID_RSN */ + u8 len; + u8 version[2]; /* little endian */ +}; + +#pragma pack() + +#endif + +#define WPA_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_PUT_LE32(a, val) \ + do { \ + (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[0] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val)) +//#define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val)) + + + +/* Action category code */ +enum ieee80211_category { + WLAN_CATEGORY_SPECTRUM_MGMT = 0, + WLAN_CATEGORY_QOS = 1, + WLAN_CATEGORY_DLS = 2, + WLAN_CATEGORY_BACK = 3, + WLAN_CATEGORY_HT = 7, + WLAN_CATEGORY_WMM = 17, +}; + +/* SPECTRUM_MGMT action code */ +enum ieee80211_spectrum_mgmt_actioncode { + WLAN_ACTION_SPCT_MSR_REQ = 0, + WLAN_ACTION_SPCT_MSR_RPRT = 1, + WLAN_ACTION_SPCT_TPC_REQ = 2, + WLAN_ACTION_SPCT_TPC_RPRT = 3, + WLAN_ACTION_SPCT_CHL_SWITCH = 4, + WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, +}; + +/* BACK action code */ +enum ieee80211_back_actioncode { + WLAN_ACTION_ADDBA_REQ = 0, + WLAN_ACTION_ADDBA_RESP = 1, + WLAN_ACTION_DELBA = 2, +}; + +/* HT features action code */ +enum ieee80211_ht_actioncode { + WLAN_ACTION_NOTIFY_CH_WIDTH = 0, + WLAN_ACTION_SM_PS = 1, + WLAN_ACTION_PSPM = 2, + WLAN_ACTION_PCO_PHASE = 3, + WLAN_ACTION_MIMO_CSI_MX = 4, + WLAN_ACTION_MIMO_NONCP_BF = 5, + WLAN_ACTION_MIMP_CP_BF = 6, + WLAN_ACTION_ASEL_INDICATES_FB = 7, + WLAN_ACTION_HI_INFO_EXCHG = 8, +}; + +/* BACK (block-ack) parties */ +enum ieee80211_back_parties { + WLAN_BACK_RECIPIENT = 0, + WLAN_BACK_INITIATOR = 1, + WLAN_BACK_TIMER = 2, +}; + +#ifdef PLATFORM_LINUX + +struct ieee80211_mgmt { + u16 frame_control; + u16 duration; + u8 da[6]; + u8 sa[6]; + u8 bssid[6]; + u16 seq_ctrl; + union { + struct { + u16 auth_alg; + u16 auth_transaction; + u16 status_code; + /* possibly followed by Challenge text */ + u8 variable[0]; + } __attribute__ ((packed)) auth; + struct { + u16 reason_code; + } __attribute__ ((packed)) deauth; + struct { + u16 capab_info; + u16 listen_interval; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) assoc_req; + struct { + u16 capab_info; + u16 status_code; + u16 aid; + /* followed by Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) assoc_resp, reassoc_resp; + struct { + u16 capab_info; + u16 listen_interval; + u8 current_ap[6]; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) reassoc_req; + struct { + u16 reason_code; + } __attribute__ ((packed)) disassoc; + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params, TIM */ + u8 variable[0]; + } __attribute__ ((packed)) beacon; + struct { + /* only variable items: SSID, Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) probe_req; + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params */ + u8 variable[0]; + } __attribute__ ((packed)) probe_resp; + struct { + u8 category; + union { + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } __attribute__ ((packed)) wme_action; +#if 0 + struct{ + u8 action_code; + u8 element_id; + u8 length; + struct ieee80211_channel_sw_ie sw_elem; + } __attribute__ ((packed)) chan_switch; + struct{ + u8 action_code; + u8 dialog_token; + u8 element_id; + u8 length; + struct ieee80211_msrment_ie msr_elem; + } __attribute__ ((packed)) measurement; +#endif + struct{ + u8 action_code; + u8 dialog_token; + u16 capab; + u16 timeout; + u16 start_seq_num; + } __attribute__ ((packed)) addba_req; + struct{ + u8 action_code; + u8 dialog_token; + u16 status; + u16 capab; + u16 timeout; + } __attribute__ ((packed)) addba_resp; + struct{ + u8 action_code; + u16 params; + u16 reason_code; + } __attribute__ ((packed)) delba; + struct{ + u8 action_code; + /* capab_info for open and confirm, + * reason for close + */ + u16 aux; + /* Followed in plink_confirm by status + * code, AID and supported rates, + * and directly by supported rates in + * plink_open and plink_close + */ + u8 variable[0]; + } __attribute__ ((packed)) plink_action; + struct{ + u8 action_code; + u8 variable[0]; + } __attribute__ ((packed)) mesh_action; + } __attribute__ ((packed)) u; + } __attribute__ ((packed)) action; + } __attribute__ ((packed)) u; +}__attribute__ ((packed)); + +#endif + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct ieee80211_mgmt { + u16 frame_control; + u16 duration; + u8 da[6]; + u8 sa[6]; + u8 bssid[6]; + u16 seq_ctrl; + union { + struct { + u16 auth_alg; + u16 auth_transaction; + u16 status_code; + /* possibly followed by Challenge text */ + u8 variable[0]; + } auth; + struct { + u16 reason_code; + } deauth; + struct { + u16 capab_info; + u16 listen_interval; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } assoc_req; + struct { + u16 capab_info; + u16 status_code; + u16 aid; + /* followed by Supported rates */ + u8 variable[0]; + } assoc_resp, reassoc_resp; + struct { + u16 capab_info; + u16 listen_interval; + u8 current_ap[6]; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } reassoc_req; + struct { + u16 reason_code; + } disassoc; +#if 0 + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params, TIM */ + u8 variable[0]; + } beacon; + struct { + /* only variable items: SSID, Supported rates */ + u8 variable[0]; + } probe_req; + + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params */ + u8 variable[0]; + } probe_resp; +#endif + struct { + u8 category; + union { + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } wme_action; +/* + struct{ + u8 action_code; + u8 element_id; + u8 length; + struct ieee80211_channel_sw_ie sw_elem; + } chan_switch; + struct{ + u8 action_code; + u8 dialog_token; + u8 element_id; + u8 length; + struct ieee80211_msrment_ie msr_elem; + } measurement; +*/ + struct{ + u8 action_code; + u8 dialog_token; + u16 capab; + u16 timeout; + u16 start_seq_num; + } addba_req; + struct{ + u8 action_code; + u8 dialog_token; + u16 status; + u16 capab; + u16 timeout; + } addba_resp; + struct{ + u8 action_code; + u16 params; + u16 reason_code; + } delba; + struct{ + u8 action_code; + /* capab_info for open and confirm, + * reason for close + */ + u16 aux; + /* Followed in plink_confirm by status + * code, AID and supported rates, + * and directly by supported rates in + * plink_open and plink_close + */ + u8 variable[0]; + } plink_action; + struct{ + u8 action_code; + u8 variable[0]; + } mesh_action; + } u; + } action; + } u; +} ; + +#pragma pack() + +#endif + +/* mgmt header + 1 byte category code */ +#define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u) + + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/ioctl_cfg80211.h b/drivers/net/wireless/rtl8723as/include/ioctl_cfg80211.h index 6f5ad15b071b..b529b538dcd7 100755 --- a/drivers/net/wireless/rtl8723as/include/ioctl_cfg80211.h +++ b/drivers/net/wireless/rtl8723as/include/ioctl_cfg80211.h @@ -1,138 +1,175 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __IOCTL_CFG80211_H__ -#define __IOCTL_CFG80211_H__ - - -#if defined(RTW_USE_CFG80211_STA_EVENT) - #undef CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER -#endif - -struct rtw_wdev_invit_info { - u8 token; - u8 flags; - u8 status; - u8 req_op_ch; - u8 rsp_op_ch; -}; - -#define rtw_wdev_invit_info_init(invit_info) \ - do { \ - (invit_info)->token = 0; \ - (invit_info)->flags = 0x00; \ - (invit_info)->status = 0xff; \ - (invit_info)->req_op_ch = 0; \ - (invit_info)->rsp_op_ch = 0; \ - } while (0) - -struct rtw_wdev_priv -{ - struct wireless_dev *rtw_wdev; - - _adapter *padapter; - - struct cfg80211_scan_request *scan_request; - _lock scan_req_lock; - - struct net_device *pmon_ndev;//for monitor interface - char ifname_mon[IFNAMSIZ + 1]; //interface name for monitor interface - - u8 p2p_enabled; - - u8 provdisc_req_issued; - - struct rtw_wdev_invit_info invit_info; - - u8 bandroid_scan; - bool block; - bool power_mgmt; - -#ifdef CONFIG_CONCURRENT_MODE - ATOMIC_T ro_ch_to; - ATOMIC_T switch_ch_to; -#endif - -}; - -#define wdev_to_priv(w) ((struct rtw_wdev_priv *)(wdev_priv(w))) - -#define wiphy_to_adapter(x) (_adapter *)(((struct rtw_wdev_priv*)wiphy_priv(x))->padapter) - -#define wiphy_to_wdev(x) (struct wireless_dev *)(((struct rtw_wdev_priv*)wiphy_priv(x))->rtw_wdev) - -int rtw_wdev_alloc(_adapter *padapter, struct device *dev); -void rtw_wdev_free(struct wireless_dev *wdev); -void rtw_wdev_unregister(struct wireless_dev *wdev); - -void rtw_cfg80211_init_wiphy(_adapter *padapter); - -void rtw_cfg80211_surveydone_event_callback(_adapter *padapter); - -void rtw_cfg80211_indicate_connect(_adapter *padapter); -void rtw_cfg80211_indicate_disconnect(_adapter *padapter); -void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted); - -#ifdef CONFIG_AP_MODE -void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); -void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason); -#endif //CONFIG_AP_MODE - -void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len); -void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); -void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); -void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg); - -int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, int type); - -bool rtw_cfg80211_pwr_mgmt(_adapter *adapter); - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) -#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, buf, len, gfp) -#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) -#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, sig_dbm, buf, len, gfp) -#else -#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp) -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) -#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, buf, len) -#else -#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, bss, buf, len) -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) -#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->pnetdev, cookie, buf, len, ack, gfp) -#else -#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->rtw_wdev, cookie, buf, len, ack, gfp) -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) -#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->pnetdev, cookie, chan, channel_type, duration, gfp) -#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->pnetdev, cookie, chan, chan_type, gfp) -#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) -#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, channel_type, duration, gfp) -#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, chan_type, gfp) -#else -#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, duration, gfp) -#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, gfp) -#endif - -#endif //__IOCTL_CFG80211_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __IOCTL_CFG80211_H__ +#define __IOCTL_CFG80211_H__ + + +#if defined(RTW_USE_CFG80211_STA_EVENT) + #undef CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER +#endif + +struct rtw_wdev_invit_info { + u8 state; /* 0: req, 1:rep */ + u8 peer_mac[ETH_ALEN]; + u8 active; + u8 token; + u8 flags; + u8 status; + u8 req_op_ch; + u8 rsp_op_ch; +}; + +#define rtw_wdev_invit_info_init(invit_info) \ + do { \ + (invit_info)->state = 0xff; \ + _rtw_memset((invit_info)->peer_mac, 0, ETH_ALEN); \ + (invit_info)->active = 0xff; \ + (invit_info)->token = 0; \ + (invit_info)->flags = 0x00; \ + (invit_info)->status = 0xff; \ + (invit_info)->req_op_ch = 0; \ + (invit_info)->rsp_op_ch = 0; \ + } while (0) + +struct rtw_wdev_nego_info { + u8 state; /* 0: req, 1:rep, 3:conf */ + u8 peer_mac[ETH_ALEN]; + u8 active; + u8 token; + u8 status; + u8 req_intent; + u8 req_op_ch; + u8 req_listen_ch; + u8 rsp_intent; + u8 rsp_op_ch; + u8 conf_op_ch; +}; + +#define rtw_wdev_nego_info_init(nego_info) \ + do { \ + (nego_info)->state = 0xff; \ + _rtw_memset((nego_info)->peer_mac, 0, ETH_ALEN); \ + (nego_info)->active = 0xff; \ + (nego_info)->token = 0; \ + (nego_info)->status = 0xff; \ + (nego_info)->req_intent = 0xff; \ + (nego_info)->req_op_ch = 0; \ + (nego_info)->req_listen_ch = 0; \ + (nego_info)->rsp_intent = 0xff; \ + (nego_info)->rsp_op_ch = 0; \ + (nego_info)->conf_op_ch = 0; \ + } while (0) + +struct rtw_wdev_priv +{ + struct wireless_dev *rtw_wdev; + + _adapter *padapter; + + struct cfg80211_scan_request *scan_request; + _lock scan_req_lock; + + struct net_device *pmon_ndev;//for monitor interface + char ifname_mon[IFNAMSIZ + 1]; //interface name for monitor interface + + u8 p2p_enabled; + + u8 provdisc_req_issued; + + struct rtw_wdev_invit_info invit_info; + struct rtw_wdev_nego_info nego_info; + + u8 bandroid_scan; + bool block; + bool power_mgmt; + +#ifdef CONFIG_CONCURRENT_MODE + ATOMIC_T ro_ch_to; + ATOMIC_T switch_ch_to; +#endif + +}; + +#define wdev_to_priv(w) ((struct rtw_wdev_priv *)(wdev_priv(w))) + +#define wiphy_to_adapter(x) (_adapter *)(((struct rtw_wdev_priv*)wiphy_priv(x))->padapter) + +#define wiphy_to_wdev(x) (struct wireless_dev *)(((struct rtw_wdev_priv*)wiphy_priv(x))->rtw_wdev) + +int rtw_wdev_alloc(_adapter *padapter, struct device *dev); +void rtw_wdev_free(struct wireless_dev *wdev); +void rtw_wdev_unregister(struct wireless_dev *wdev); + +void rtw_cfg80211_init_wiphy(_adapter *padapter); + +void rtw_cfg80211_surveydone_event_callback(_adapter *padapter); +struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork); +int rtw_cfg80211_check_bss(_adapter *padapter); +void rtw_cfg80211_indicate_connect(_adapter *padapter); +void rtw_cfg80211_indicate_disconnect(_adapter *padapter); +void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted); + +#ifdef CONFIG_AP_MODE +void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); +void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason); +#endif //CONFIG_AP_MODE + +void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len); +void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); +void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len); +void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg); + +int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, int type); + +bool rtw_cfg80211_pwr_mgmt(_adapter *adapter); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) +#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, buf, len, gfp) +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) +#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, sig_dbm, buf, len, gfp) +#else +#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp) +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) +#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, buf, len) +#else +#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, bss, buf, len) +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) +#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->pnetdev, cookie, buf, len, ack, gfp) +#else +#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->rtw_wdev, cookie, buf, len, ack, gfp) +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)) +#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->pnetdev, cookie, chan, channel_type, duration, gfp) +#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->pnetdev, cookie, chan, chan_type, gfp) +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) +#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, channel_type, duration, gfp) +#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, chan_type, gfp) +#else +#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp) cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, duration, gfp) +#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, gfp) +#endif + +#endif //__IOCTL_CFG80211_H__ + diff --git a/drivers/net/wireless/rtl8723as/include/osdep_ce_service.h b/drivers/net/wireless/rtl8723as/include/osdep_ce_service.h index e374077fdb34..6d2cc48f958f 100755 --- a/drivers/net/wireless/rtl8723as/include/osdep_ce_service.h +++ b/drivers/net/wireless/rtl8723as/include/osdep_ce_service.h @@ -16,156 +16,156 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ - -#ifndef __OSDEP_CE_SERVICE_H_ -#define __OSDEP_CE_SERVICE_H_ - - -#include -#include - -#ifdef CONFIG_SDIO_HCI -#include "SDCardDDK.h" -#endif - -#ifdef CONFIG_USB_HCI -#include -#endif - -typedef HANDLE _sema; -typedef LIST_ENTRY _list; -typedef NDIS_STATUS _OS_STATUS; - -typedef NDIS_SPIN_LOCK _lock; - -typedef HANDLE _rwlock; //Mutex - -typedef u32 _irqL; - -typedef NDIS_HANDLE _nic_hdl; - - -typedef NDIS_MINIPORT_TIMER _timer; - -struct __queue { - LIST_ENTRY queue; - _lock lock; -}; - -typedef NDIS_PACKET _pkt; -typedef NDIS_BUFFER _buffer; -typedef struct __queue _queue; - -typedef HANDLE _thread_hdl_; -typedef DWORD thread_return; -typedef void* thread_context; -typedef NDIS_WORK_ITEM _workitem; - -#define thread_exit() ExitThread(STATUS_SUCCESS); return 0; - - -#define SEMA_UPBND (0x7FFFFFFF) //8192 - -__inline static _list *get_prev(_list *list) -{ - return list->Blink; -} - -__inline static _list *get_next(_list *list) -{ - return list->Flink; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - -#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) - -__inline static void _enter_critical(_lock *plock, _irqL *pirqL) -{ - NdisAcquireSpinLock(plock); -} - -__inline static void _exit_critical(_lock *plock, _irqL *pirqL) -{ - NdisReleaseSpinLock(plock); -} - -__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprAcquireSpinLock(plock); -} - -__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprReleaseSpinLock(plock); -} - - -__inline static void _enter_hwio_critical(_rwlock *prwlock, _irqL *pirqL) -{ - WaitForSingleObject(*prwlock, INFINITE ); - -} - -__inline static void _exit_hwio_critical(_rwlock *prwlock, _irqL *pirqL) -{ - ReleaseMutex(*prwlock); -} - -__inline static void rtw_list_delete(_list *plist) -{ - RemoveEntryList(plist); - InitializeListHead(plist); -} - -__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) -{ - NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - NdisMSetTimer(ptimer,delay_time); -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - NdisMCancelTimer(ptimer,bcancelled); -} - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ - - NdisInitializeWorkItem(pwork, pfunc, cntx); -} - -__inline static void _set_workitem(_workitem *pwork) -{ - NdisScheduleWorkItem(pwork); -} - -#define ATOMIC_INIT(i) { (i) } - -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ - { \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ - NdisMSleep(10000); \ - } \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ -} -#endif - + ******************************************************************************/ + +#ifndef __OSDEP_CE_SERVICE_H_ +#define __OSDEP_CE_SERVICE_H_ + + +#include +#include + +#ifdef CONFIG_SDIO_HCI +#include "SDCardDDK.h" +#endif + +#ifdef CONFIG_USB_HCI +#include +#endif + +typedef HANDLE _sema; +typedef LIST_ENTRY _list; +typedef NDIS_STATUS _OS_STATUS; + +typedef NDIS_SPIN_LOCK _lock; + +typedef HANDLE _rwlock; //Mutex + +typedef u32 _irqL; + +typedef NDIS_HANDLE _nic_hdl; + + +typedef NDIS_MINIPORT_TIMER _timer; + +struct __queue { + LIST_ENTRY queue; + _lock lock; +}; + +typedef NDIS_PACKET _pkt; +typedef NDIS_BUFFER _buffer; +typedef struct __queue _queue; + +typedef HANDLE _thread_hdl_; +typedef DWORD thread_return; +typedef void* thread_context; +typedef NDIS_WORK_ITEM _workitem; + +#define thread_exit() ExitThread(STATUS_SUCCESS); return 0; + + +#define SEMA_UPBND (0x7FFFFFFF) //8192 + +__inline static _list *get_prev(_list *list) +{ + return list->Blink; +} + +__inline static _list *get_next(_list *list) +{ + return list->Flink; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + +#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) + +__inline static void _enter_critical(_lock *plock, _irqL *pirqL) +{ + NdisAcquireSpinLock(plock); +} + +__inline static void _exit_critical(_lock *plock, _irqL *pirqL) +{ + NdisReleaseSpinLock(plock); +} + +__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprAcquireSpinLock(plock); +} + +__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprReleaseSpinLock(plock); +} + + +__inline static void _enter_hwio_critical(_rwlock *prwlock, _irqL *pirqL) +{ + WaitForSingleObject(*prwlock, INFINITE ); + +} + +__inline static void _exit_hwio_critical(_rwlock *prwlock, _irqL *pirqL) +{ + ReleaseMutex(*prwlock); +} + +__inline static void rtw_list_delete(_list *plist) +{ + RemoveEntryList(plist); + InitializeListHead(plist); +} + +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) +{ + NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + NdisMSetTimer(ptimer,delay_time); +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + NdisMCancelTimer(ptimer,bcancelled); +} + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ + + NdisInitializeWorkItem(pwork, pfunc, cntx); +} + +__inline static void _set_workitem(_workitem *pwork) +{ + NdisScheduleWorkItem(pwork); +} + +#define ATOMIC_INIT(i) { (i) } + +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ + { \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ + NdisMSleep(10000); \ + } \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ +} +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/osdep_intf.h b/drivers/net/wireless/rtl8723as/include/osdep_intf.h index b98ea90ce5e6..6a4f1cde7c68 100755 --- a/drivers/net/wireless/rtl8723as/include/osdep_intf.h +++ b/drivers/net/wireless/rtl8723as/include/osdep_intf.h @@ -149,5 +149,12 @@ void rtw_drv_if2_stop(_adapter *if2); int rtw_drv_register_netdev(_adapter *padapter); void rtw_ndev_destructor(_nic_hdl ndev); +int rtw_suspend_common(_adapter *padapter); +int rtw_resume_common(_adapter *padapter); + +#ifdef CONFIG_ARP_KEEP_ALIVE +int rtw_gw_addr_query(_adapter *padapter); +#endif + #endif //_OSDEP_INTF_H_ diff --git a/drivers/net/wireless/rtl8723as/include/osdep_service.h b/drivers/net/wireless/rtl8723as/include/osdep_service.h index 658373e0dfbc..36e8abe456fc 100755 --- a/drivers/net/wireless/rtl8723as/include/osdep_service.h +++ b/drivers/net/wireless/rtl8723as/include/osdep_service.h @@ -780,7 +780,10 @@ __inline static void _set_workitem(_workitem *pwork) #include // for struct tasklet_struct #include #include - + #include + #include + #include + #include #ifdef CONFIG_IOCTL_CFG80211 // #include @@ -1275,66 +1278,157 @@ extern int RTW_STATUS_CODE(int error_code); #define CONFIG_USE_VMALLOC -//flags used for rtw_update_mem_stat() -enum { - MEM_STAT_VIR_ALLOC_SUCCESS, - MEM_STAT_VIR_ALLOC_FAIL, - MEM_STAT_VIR_FREE, - MEM_STAT_PHY_ALLOC_SUCCESS, - MEM_STAT_PHY_ALLOC_FAIL, - MEM_STAT_PHY_FREE, - MEM_STAT_TX, //used to distinguish TX/RX, asigned from caller - MEM_STAT_TX_ALLOC_SUCCESS, - MEM_STAT_TX_ALLOC_FAIL, - MEM_STAT_TX_FREE, - MEM_STAT_RX, //used to distinguish TX/RX, asigned from caller - MEM_STAT_RX_ALLOC_SUCCESS, - MEM_STAT_RX_ALLOC_FAIL, - MEM_STAT_RX_FREE +/* flags used for rtw_mstat_update() */ +enum mstat_f { + /* type: 0x00ff */ + MSTAT_TYPE_VIR = 0x00, + MSTAT_TYPE_PHY= 0x01, + MSTAT_TYPE_SKB = 0x02, + MSTAT_TYPE_USB = 0x03, + MSTAT_TYPE_MAX = 0x04, + + /* func: 0xff00 */ + MSTAT_FUNC_UNSPECIFIED = 0x00<<8, + MSTAT_FUNC_IO = 0x01<<8, + MSTAT_FUNC_TX_IO = 0x02<<8, + MSTAT_FUNC_RX_IO = 0x03<<8, + MSTAT_FUNC_TX = 0x04<<8, + MSTAT_FUNC_RX = 0x05<<8, + MSTAT_FUNC_MAX = 0x06<<8, }; +#define mstat_tf_idx(flags) ((flags)&0xff) +#define mstat_ff_idx(flags) (((flags)&0xff00) >> 8) + +typedef enum mstat_status{ + MSTAT_ALLOC_SUCCESS = 0, + MSTAT_ALLOC_FAIL, + MSTAT_FREE +} MSTAT_STATUS; + #ifdef DBG_MEM_ALLOC -void rtw_update_mem_stat(u8 flag, u32 sz); -void rtw_dump_mem_stat (void); -extern u8* dbg_rtw_vmalloc(u32 sz, const char *func, int line); -extern u8* dbg_rtw_zvmalloc(u32 sz, const char *func, int line); -extern void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const char *func, int line); -extern u8* dbg_rtw_malloc(u32 sz, const char *func, int line); -extern u8* dbg_rtw_zmalloc(u32 sz, const char *func, int line); -extern void dbg_rtw_mfree(u8 *pbuf, u32 sz, const char *func, int line); +void rtw_mstat_update(const enum mstat_f flags, const MSTAT_STATUS status, u32 sz); +int _rtw_mstat_dump(char *buf, int len); +void rtw_mstat_dump (void); +u8* dbg_rtw_vmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line); +u8* dbg_rtw_zvmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line); +void dbg_rtw_vmfree(u8 *pbuf, const enum mstat_f flags, u32 sz, const char *func, const int line); +u8* dbg_rtw_malloc(u32 sz, const enum mstat_f flags, const char *func, const int line); +u8* dbg_rtw_zmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line); +void dbg_rtw_mfree(u8 *pbuf, const enum mstat_f flags, u32 sz, const char *func, const int line); + +struct sk_buff * dbg_rtw_skb_alloc(unsigned int size, const enum mstat_f flags, const char *func, const int line); +void dbg_rtw_skb_free(struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line); +struct sk_buff *dbg_rtw_skb_copy(const struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line); +struct sk_buff *dbg_rtw_skb_clone(struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line); +int dbg_rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb, const enum mstat_f flags, const char *func, int line); +void dbg_rtw_skb_queue_purge(struct sk_buff_head *list, enum mstat_f flags, const char *func, int line); + +#ifdef CONFIG_USB_HCI +void *dbg_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma, const enum mstat_f flags, const char *func, const int line); +void dbg_rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma, const enum mstat_f flags, const char *func, const int line); +#endif /* CONFIG_USB_HCI */ + #ifdef CONFIG_USE_VMALLOC -#define rtw_vmalloc(sz) dbg_rtw_vmalloc((sz), __FUNCTION__, __LINE__) -#define rtw_zvmalloc(sz) dbg_rtw_zvmalloc((sz), __FUNCTION__, __LINE__) -#define rtw_vmfree(pbuf, sz) dbg_rtw_vmfree((pbuf), (sz), __FUNCTION__, __LINE__) -#else //CONFIG_USE_VMALLOC -#define rtw_vmalloc(sz) dbg_rtw_malloc((sz), __FUNCTION__, __LINE__) -#define rtw_zvmalloc(sz) dbg_rtw_zmalloc((sz), __FUNCTION__, __LINE__) -#define rtw_vmfree(pbuf, sz) dbg_rtw_mfree((pbuf), (sz), __FUNCTION__, __LINE__) -#endif //CONFIG_USE_VMALLOC -#define rtw_malloc(sz) dbg_rtw_malloc((sz), __FUNCTION__, __LINE__) -#define rtw_zmalloc(sz) dbg_rtw_zmalloc((sz), __FUNCTION__, __LINE__) -#define rtw_mfree(pbuf, sz) dbg_rtw_mfree((pbuf), (sz), __FUNCTION__, __LINE__) -#else -#define rtw_update_mem_stat(flag, sz) do {} while(0) -extern u8* _rtw_vmalloc(u32 sz); -extern u8* _rtw_zvmalloc(u32 sz); -extern void _rtw_vmfree(u8 *pbuf, u32 sz); -extern u8* _rtw_zmalloc(u32 sz); -extern u8* _rtw_malloc(u32 sz); -extern void _rtw_mfree(u8 *pbuf, u32 sz); +#define rtw_vmalloc(sz) dbg_rtw_vmalloc((sz), MSTAT_TYPE_VIR, __FUNCTION__, __LINE__) +#define rtw_zvmalloc(sz) dbg_rtw_zvmalloc((sz), MSTAT_TYPE_VIR, __FUNCTION__, __LINE__) +#define rtw_vmfree(pbuf, sz) dbg_rtw_vmfree((pbuf), (sz), MSTAT_TYPE_VIR, __FUNCTION__, __LINE__) +#define rtw_vmalloc_f(sz, mstat_f) dbg_rtw_vmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_VIR, __FUNCTION__, __LINE__) +#define rtw_zvmalloc_f(sz, mstat_f) dbg_rtw_zvmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_VIR, __FUNCTION__, __LINE__) +#define rtw_vmfree_f(pbuf, sz, mstat_f) dbg_rtw_vmfree((pbuf), (sz), ((mstat_f)&0xff00)|MSTAT_TYPE_VIR, __FUNCTION__, __LINE__) +#else /* CONFIG_USE_VMALLOC */ +#define rtw_vmalloc(sz) dbg_rtw_malloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#define rtw_zvmalloc(sz) dbg_rtw_zmalloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#define rtw_vmfree(pbuf, sz) dbg_rtw_mfree((pbuf), (sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#define rtw_vmalloc_f(sz, mstat_f) dbg_rtw_malloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#define rtw_zvmalloc_f(sz, mstat_f) dbg_rtw_zmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#define rtw_vmfree_f(pbuf, sz, mstat_f) dbg_rtw_mfree((pbuf), (sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#endif /* CONFIG_USE_VMALLOC */ +#define rtw_malloc(sz) dbg_rtw_malloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#define rtw_zmalloc(sz) dbg_rtw_zmalloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#define rtw_mfree(pbuf, sz) dbg_rtw_mfree((pbuf), (sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#define rtw_malloc_f(sz, mstat_f) dbg_rtw_malloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#define rtw_zmalloc_f(sz, mstat_f) dbg_rtw_zmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) +#define rtw_mfree_f(pbuf, sz, mstat_f) dbg_rtw_mfree((pbuf), (sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__) + +#define rtw_skb_alloc(size) dbg_rtw_skb_alloc((size), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__) +#define rtw_skb_free(skb) dbg_rtw_skb_free((skb), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__) +#define rtw_skb_alloc_f(size, mstat_f) dbg_rtw_skb_alloc((size), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__) +#define rtw_skb_free_f(skb, mstat_f) dbg_rtw_skb_free((skb), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__) +#define rtw_skb_copy(skb) dbg_rtw_skb_copy((skb), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__) +#define rtw_skb_clone(skb) dbg_rtw_skb_clone((skb), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__) +#define rtw_skb_copy_f(skb, mstat_f) dbg_rtw_skb_copy((skb), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__) +#define rtw_skb_clone_f(skb, mstat_f) dbg_rtw_skb_clone((skb), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__) +#define rtw_netif_rx(ndev, skb) dbg_rtw_netif_rx(ndev, skb, MSTAT_TYPE_SKB, __FUNCTION__, __LINE__) +#define rtw_skb_queue_purge(sk_buff_head) dbg_rtw_skb_queue_purge(sk_buff_head, MSTAT_TYPE_SKB, __FUNCTION__, __LINE__) +#ifdef CONFIG_USB_HCI +#define rtw_usb_buffer_alloc(dev, size, dma) dbg_rtw_usb_buffer_alloc((dev), (size), (dma), MSTAT_TYPE_USB, __FUNCTION__, __LINE__) +#define rtw_usb_buffer_free(dev, size, addr, dma) dbg_rtw_usb_buffer_free((dev), (size), (addr), (dma), MSTAT_TYPE_USB, __FUNCTION__, __LINE__) +#define rtw_usb_buffer_alloc_f(dev, size, dma, mstat_f) dbg_rtw_usb_buffer_alloc((dev), (size), (dma), ((mstat_f)&0xff00)|MSTAT_TYPE_USB, __FUNCTION__, __LINE__) +#define rtw_usb_buffer_free_f(dev, size, addr, dma, mstat_f) dbg_rtw_usb_buffer_free((dev), (size), (addr), (dma), ((mstat_f)&0xff00)|MSTAT_TYPE_USB, __FUNCTION__, __LINE__) +#endif /* CONFIG_USB_HCI */ + +#else /* DBG_MEM_ALLOC */ +#define rtw_mstat_update(flag, status, sz) do {} while(0) +#define rtw_mstat_dump() do {} while(0) +u8* _rtw_vmalloc(u32 sz); +u8* _rtw_zvmalloc(u32 sz); +void _rtw_vmfree(u8 *pbuf, u32 sz); +u8* _rtw_zmalloc(u32 sz); +u8* _rtw_malloc(u32 sz); +void _rtw_mfree(u8 *pbuf, u32 sz); + +struct sk_buff *_rtw_skb_alloc(u32 sz); +void _rtw_skb_free(struct sk_buff *skb); +struct sk_buff *_rtw_skb_copy(const struct sk_buff *skb); +struct sk_buff *_rtw_skb_clone(struct sk_buff *skb); +int _rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb); +void _rtw_skb_queue_purge(struct sk_buff_head *list); + +#ifdef CONFIG_USB_HCI +void *_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma); +void _rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma); +#endif /* CONFIG_USB_HCI */ + #ifdef CONFIG_USE_VMALLOC #define rtw_vmalloc(sz) _rtw_vmalloc((sz)) #define rtw_zvmalloc(sz) _rtw_zvmalloc((sz)) #define rtw_vmfree(pbuf, sz) _rtw_vmfree((pbuf), (sz)) -#else //CONFIG_USE_VMALLOC +#define rtw_vmalloc_f(sz, mstat_f) _rtw_vmalloc((sz)) +#define rtw_zvmalloc_f(sz, mstat_f) _rtw_zvmalloc((sz)) +#define rtw_vmfree_f(pbuf, sz, mstat_f) _rtw_vmfree((pbuf), (sz)) +#else /* CONFIG_USE_VMALLOC */ #define rtw_vmalloc(sz) _rtw_malloc((sz)) #define rtw_zvmalloc(sz) _rtw_zmalloc((sz)) #define rtw_vmfree(pbuf, sz) _rtw_mfree((pbuf), (sz)) -#endif //CONFIG_USE_VMALLOC +#define rtw_vmalloc_f(sz, mstat_f) _rtw_malloc((sz)) +#define rtw_zvmalloc_f(sz, mstat_f) _rtw_zmalloc((sz)) +#define rtw_vmfree_f(pbuf, sz, mstat_f) _rtw_mfree((pbuf), (sz)) +#endif /* CONFIG_USE_VMALLOC */ #define rtw_malloc(sz) _rtw_malloc((sz)) #define rtw_zmalloc(sz) _rtw_zmalloc((sz)) #define rtw_mfree(pbuf, sz) _rtw_mfree((pbuf), (sz)) -#endif +#define rtw_malloc_f(sz, mstat_f) _rtw_malloc((sz)) +#define rtw_zmalloc_f(sz, mstat_f) _rtw_zmalloc((sz)) +#define rtw_mfree_f(pbuf, sz, mstat_f) _rtw_mfree((pbuf), (sz)) + +#define rtw_skb_alloc(size) _rtw_skb_alloc((size)) +#define rtw_skb_free(skb) _rtw_skb_free((skb)) +#define rtw_skb_alloc_f(size, mstat_f) _rtw_skb_alloc((size)) +#define rtw_skb_free_f(skb, mstat_f) _rtw_skb_free((skb)) +#define rtw_skb_copy(skb) _rtw_skb_copy((skb)) +#define rtw_skb_clone(skb) _rtw_skb_clone((skb)) +#define rtw_skb_copy_f(skb, mstat_f) _rtw_skb_copy((skb)) +#define rtw_skb_clone_f(skb, mstat_f) _rtw_skb_clone((skb)) +#define rtw_netif_rx(ndev, skb) _rtw_netif_rx(ndev, skb) +#define rtw_skb_queue_purge(sk_buff_head) _rtw_skb_queue_purge(sk_buff_head) +#ifdef CONFIG_USB_HCI +#define rtw_usb_buffer_alloc(dev, size, dma) _rtw_usb_buffer_alloc((dev), (size), (dma)) +#define rtw_usb_buffer_free(dev, size, addr, dma) _rtw_usb_buffer_free((dev), (size), (addr), (dma)) +#define rtw_usb_buffer_alloc_f(dev, size, dma, mstat_f) _rtw_usb_buffer_alloc((dev), (size), (dma)) +#define rtw_usb_buffer_free_f(dev, size, addr, dma, mstat_f) _rtw_usb_buffer_free((dev), (size), (addr), (dma)) +#endif /* CONFIG_USB_HCI */ +#endif /* DBG_MEM_ALLOC */ extern void* rtw_malloc2d(int h, int w, int size); extern void rtw_mfree2d(void *pbuf, int h, int w, int size); @@ -1462,6 +1556,19 @@ __inline static _OS_STATUS res_to_status(sint res) } +__inline static void rtw_dump_stack(void) +{ +#ifdef PLATFORM_LINUX + dump_stack(); +#endif +} + +#ifdef PLATFORM_LINUX +#define rtw_warn_on(condition) WARN_ON(condition) +#else +#define rtw_warn_on(condition) do {} while (0) +#endif + #define _RND(sz, r) ((((sz)+((r)-1))/(r))*(r)) #define RND4(x) (((x >> 2) + (((x & 3) == 0) ? 0: 1)) << 2) @@ -1564,9 +1671,9 @@ extern void rtw_suspend_lock_init(void); extern void rtw_suspend_lock_uninit(void); extern void rtw_lock_suspend(void); extern void rtw_unlock_suspend(void); -#ifdef CONFIG_WOWLAN -extern void rtw_lock_suspend_timeout(long timeout); -#endif //CONFIG_WOWLAN +extern void rtw_lock_suspend_timeout(u32 timeout_ms); +extern void rtw_lock_ext_suspend_timeout(u32 timeout_ms); + //Atomic integer operations #ifdef PLATFORM_LINUX diff --git a/drivers/net/wireless/rtl8723as/include/rtl8188e_cmd.h b/drivers/net/wireless/rtl8723as/include/rtl8188e_cmd.h index 891a5de17e52..9899f67b84b7 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8188e_cmd.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8188e_cmd.h @@ -77,6 +77,7 @@ typedef enum _RTL8188E_H2C_CMD_ID H2C_COM_WWLAN =0x80, H2C_COM_REMOTE_WAKE_CTRL =0x81, H2C_COM_AOAC_GLOBAL_INFO =0x82, + H2C_COM_AOAC_RSVD_PAGE =0x83, #endif //Class @@ -124,6 +125,15 @@ typedef struct _RSVDPAGE_LOC { u8 LocNullData; u8 LocQosNull; u8 LocBTQosNull; +#ifdef CONFIG_WOWLAN + u8 LocRemoteCtrlInfo; + u8 LocArpRsp; + u8 LocNbrAdv; + u8 LocGTKRsp; + u8 LocGTKInfo; + u8 LocProbeReq; + u8 LocNetList; +#endif //CONFIG_WOWLAN } RSVDPAGE_LOC, *PRSVDPAGE_LOC; struct P2P_PS_Offload_t { @@ -163,6 +173,9 @@ void rtl8188e_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt ); int reset_tsf(PADAPTER Adapter, u8 reset_port ); #endif // CONFIG_TSF_RESET_OFFLOAD +#define H2C_8188E_RSVDPAGE_LOC_LEN 5 +#define H2C_8188E_AOAC_RSVDPAGE_LOC_LEN 7 + #ifdef CONFIG_WOWLAN typedef struct _SETWOWLAN_PARM{ u8 mode; @@ -177,6 +190,31 @@ typedef struct _SETAOAC_GLOBAL_INFO{ u8 groupEncAlg; }SETAOAC_GLOBAL_INFO, *PSETAOAC_GLOBAL_INFO; +#define eqMacAddr(a,b) ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 ) +#define cpMacAddr(des,src) ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3],(des)[4]=(src)[4],(des)[5]=(src)[5]) +#define cpIpAddr(des,src) ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3]) + +// +// ARP packet +// +// LLC Header +#define GET_ARP_PKT_LLC_TYPE(__pHeader) ReadEF2Byte( ((u8*)(__pHeader)) + 6) + +//ARP element +#define GET_ARP_PKT_OPERATION(__pHeader) ReadEF2Byte( ((u8*)(__pHeader)) + 6) +#define GET_ARP_PKT_SENDER_MAC_ADDR(__pHeader, _val) cpMacAddr((u8*)(_val), ((u8*)(__pHeader))+8) +#define GET_ARP_PKT_SENDER_IP_ADDR(__pHeader, _val) cpIpAddr((u8*)(_val), ((u8*)(__pHeader))+14) +#define GET_ARP_PKT_TARGET_MAC_ADDR(__pHeader, _val) cpMacAddr((u8*)(_val), ((u8*)(__pHeader))+18) +#define SET_ARP_PKT_HW(__pHeader, __Value) WriteEF2Byte( ((u8*)(__pHeader)) + 0, __Value) +#define SET_ARP_PKT_PROTOCOL(__pHeader, __Value) WriteEF2Byte( ((u8*)(__pHeader)) + 2, __Value) +#define SET_ARP_PKT_HW_ADDR_LEN(__pHeader, __Value) WriteEF1Byte( ((u8*)(__pHeader)) + 4, __Value) +#define SET_ARP_PKT_PROTOCOL_ADDR_LEN(__pHeader, __Value) WriteEF1Byte( ((u8*)(__pHeader)) + 5, __Value) +#define SET_ARP_PKT_OPERATION(__pHeader, __Value) WriteEF2Byte( ((u8*)(__pHeader)) + 6, __Value) +#define SET_ARP_PKT_SENDER_MAC_ADDR(__pHeader, _val) cpMacAddr(((u8*)(__pHeader))+8, (u8*)(_val)) +#define SET_ARP_PKT_SENDER_IP_ADDR(__pHeader, _val) cpIpAddr(((u8*)(__pHeader))+14, (u8*)(_val)) +#define SET_ARP_PKT_TARGET_MAC_ADDR(__pHeader, _val) cpMacAddr(((u8*)(__pHeader))+18, (u8*)(_val)) +#define SET_ARP_PKT_TARGET_IP_ADDR(__pHeader, _val) cpIpAddr(((u8*)(__pHeader))+24, (u8*)(_val)) + #define FW_WOWLAN_FUN_EN BIT(0) #define FW_WOWLAN_PATTERN_MATCH BIT(1) #define FW_WOWLAN_MAGIC_PKT BIT(2) @@ -189,11 +227,32 @@ typedef struct _SETAOAC_GLOBAL_INFO{ #define FW_WOWLAN_GPIO_WAKEUP_EN BIT(0) #define FW_FW_PARSE_MAGIC_PKT BIT(1) +#define FW_WOWLAN_KEEP_ALIVE_EN BIT(0) +#define FW_WOWLAN_KEEP_ALIVE_PKT_TYPE BIT(2) + #define FW_REMOTE_WAKE_CTRL_EN BIT(0) +#define FW_ARP_EN BIT(1) #define FW_REALWOWLAN_EN BIT(5) +#define FW_WOW_FW_UNICAST_EN BIT(7) + +#define FW_ADOPT_USER BIT(1) void rtl8188es_set_wowlan_cmd(_adapter* padapter, u8 enable); void SetFwRelatedForWoWLAN8188ES(_adapter* padapter, u8 bHostIsGoingtoSleep); #endif//CONFIG_WOWLAN + +//---------------------------------------------------------------------------------------------------------// +//---------------------------------- H2C CMD CONTENT --------------------------------------------------// +//---------------------------------------------------------------------------------------------------------// +//_RSVDPAGE_LOC_CMD_0x00 +#define SET_8188E_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_8188E_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) +#define SET_8188E_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) +#define SET_8188E_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) + +// AOAC_RSVDPAGE_LOC_0x83 +#define SET_8188E_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd), 0, 8, __Value) +#define SET_8188E_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) + #endif//__RTL8188E_CMD_H__ diff --git a/drivers/net/wireless/rtl8723as/include/rtl8188e_hal.h b/drivers/net/wireless/rtl8723as/include/rtl8188e_hal.h index 2663303ac2ab..3bac83b737d9 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8188e_hal.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8188e_hal.h @@ -1,720 +1,714 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8188E_HAL_H__ -#define __RTL8188E_HAL_H__ - - -//include HAL Related header after HAL Related compiling flags -#include "rtl8188e_spec.h" -#include "Hal8188EPhyReg.h" -#include "Hal8188EPhyCfg.h" -#include "rtl8188e_rf.h" -#include "rtl8188e_dm.h" -#include "rtl8188e_recv.h" -#include "rtl8188e_xmit.h" -#include "rtl8188e_cmd.h" -#include "Hal8188EPwrSeq.h" -#ifdef DBG_CONFIG_ERROR_DETECT -#include "rtl8188e_sreset.h" -#endif -#include "rtw_efuse.h" - -#include "../hal/OUTSRC/odm_precomp.h" - - // Fw Array - #define Rtl8188E_FwImageArray Rtl8188EFwImgArray - #define Rtl8188E_FWImgArrayLength Rtl8188EFWImgArrayLength -#ifdef CONFIG_WOWLAN - #define Rtl8188E_FwWoWImageArray Array_8188E_FW_WoWLAN - #define Rtl8188E_FwWoWImgArrayLength ArrayLength_8188E_FW_WoWLAN -#endif //CONFIG_WOWLAN - - -#ifdef CONFIG_SDIO_HCI - - //TODO: We should define 8188ES firmware related macro settings here!! - //TODO: The following need to check!! - #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" - #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" - #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" - #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" - #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" - #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" - #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" - #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" - -//--------------------------------------------------------------------- -// RTL8188E From header -//--------------------------------------------------------------------- -#if 0 - #define Rtl8188E_PHY_REG_Array_PG Rtl8188ESPHY_REG_Array_PG - #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188ESPHY_REG_Array_PGLength - -#endif - - //--------------------------------------------------------------------- - // RTL8188E Power Configuration CMDs for USB/SDIO interfaces - //--------------------------------------------------------------------- - #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow - #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow - #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow - #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow - #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow - #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow - #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow - #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow - #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow - -#elif defined(CONFIG_USB_HCI) - #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" - #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" - #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" - #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" - #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" - #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" - #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" - #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" - -#if 0 - #define Rtl8188E_PHY_REG_Array_PG Rtl8188EUPHY_REG_Array_PG - #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188EUPHY_REG_Array_PGLength - -#endif - - //--------------------------------------------------------------------- - // RTL8188E Power Configuration CMDs for USB/SDIO interfaces - //--------------------------------------------------------------------- - #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow - #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow - #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow - #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow - #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow - #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow - #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow - #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow - #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow - -#elif defined(CONFIG_PCI_HCI) - #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" - #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" - #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" - #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" - #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" - #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" - #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" - #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" - - #define Rtl8188E_PHY_REG_Array_PG Rtl8188EEPHY_REG_Array_PG - #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188EEPHY_REG_Array_PGLength - - - #ifndef CONFIG_PHY_SETTING_WITH_ODM - #if MP_DRIVER == 1 - #define Rtl8188ES_PHY_REG_Array_MP Rtl8188ESPHY_REG_Array_MP - #endif - #endif - - //--------------------------------------------------------------------- - // RTL8188E Power Configuration CMDs for USB/SDIO/PCIE interfaces - //--------------------------------------------------------------------- - #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow - #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow - #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow - #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow - #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow - #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow - #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow - #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow - #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow -#endif //CONFIG_***_HCI - - -#define DRVINFO_SZ 4 // unit is 8bytes -#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) - - -#if 1 // download firmware related data structure -#define FW_8188E_SIZE 0x4000 //16384,16k -#define FW_8188E_START_ADDRESS 0x1000 -#define FW_8188E_END_ADDRESS 0x1FFF //0x5FFF - -#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes - -#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88E0) - -typedef enum _FIRMWARE_SOURCE { - FW_SOURCE_IMG_FILE = 0, - FW_SOURCE_HEADER_FILE = 1, //from header file -} FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; - -typedef struct _RT_FIRMWARE { - FIRMWARE_SOURCE eFWSource; -#ifdef CONFIG_EMBEDDED_FWIMG - u8* szFwBuffer; -#else - u8 szFwBuffer[FW_8188E_SIZE]; -#endif - u32 ulFwLength; - -#ifdef CONFIG_WOWLAN - u8* szWoWLANFwBuffer; - u32 ulWoWLANFwLength; -#endif //CONFIG_WOWLAN -} RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_8188E, *PRT_FIRMWARE_8188E; - -// -// This structure must be cared byte-ordering -// - -typedef struct _RT_8188E_FIRMWARE_HDR -{ - // 8-byte alinment required - - //--- LONG WORD 0 ---- - u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut - u8 Category; // AP/NIC and USB/PCI - u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions - u16 Version; // FW Version - u8 Subversion; // FW Subversion, default 0x00 - u16 Rsvd1; - - - //--- LONG WORD 1 ---- - u8 Month; // Release time Month field - u8 Date; // Release time Date field - u8 Hour; // Release time Hour field - u8 Minute; // Release time Minute field - u16 RamCodeSize; // The size of RAM code - u8 Foundry; - u8 Rsvd2; - - //--- LONG WORD 2 ---- - u32 SvnIdx; // The SVN entry index - u32 Rsvd3; - - //--- LONG WORD 3 ---- - u32 Rsvd4; - u32 Rsvd5; -}RT_8188E_FIRMWARE_HDR, *PRT_8188E_FIRMWARE_HDR; -#endif // download firmware related data structure - - -#define DRIVER_EARLY_INT_TIME 0x05 -#define BCN_DMA_ATIME_INT_TIME 0x02 - -#ifdef CONFIG_USB_RX_AGGREGATION - -typedef enum _USB_RX_AGG_MODE{ - USB_RX_AGG_DISABLE, - USB_RX_AGG_DMA, - USB_RX_AGG_USB, - USB_RX_AGG_MIX -}USB_RX_AGG_MODE; - -//#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer - -#endif - - -#define MAX_RX_DMA_BUFFER_SIZE_88E 0x2400 //9k for 88E nornal chip , //MaxRxBuff=10k-max(TxReportSize(64*8), WOLPattern(16*24)) - -#define MAX_TX_REPORT_BUFFER_SIZE 0x0400 // 1k - - -// BK, BE, VI, VO, HCCA, MANAGEMENT, COMMAND, HIGH, BEACON. -#define MAX_TX_QUEUE 9 - -#define TX_SELE_HQ BIT(0) // High Queue -#define TX_SELE_LQ BIT(1) // Low Queue -#define TX_SELE_NQ BIT(2) // Normal Queue - -// Note: We will divide number of page equally for each queue other than public queue! -// 22k = 22528 bytes = 176 pages (@page = 128 bytes) -// must reserved about 7 pages for LPS => 176-7 = 169 (0xA9) -// 2*BCN / 1*ps-poll / 1*null-data /1*prob_rsp /1*QOS null-data /1*BT QOS null-data - -#define TX_TOTAL_PAGE_NUMBER_88E 0xA9// 169 (21632=> 21k) - -#ifdef RTL8188ES_MAC_LOOPBACK -#define TX_PAGE_BOUNDARY_88E 0x48 //72 -#else //TX_PAGE_BOUNDARY_LOOPBACK_MODE -#define TX_PAGE_BOUNDARY_88E (TX_TOTAL_PAGE_NUMBER_88E + 1) -#endif - - -//Note: For Normal Chip Setting ,modify later -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER TX_TOTAL_PAGE_NUMBER_88E //0xA9 , 0xb0=>176=>22k -#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER + 1) //0xA9 - - - -//------------------------------------------------------------------------- -// Chip specific -//------------------------------------------------------------------------- -#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) -#define CHIP_BONDING_92C_1T2R 0x1 -#define CHIP_BONDING_88C_USB_MCARD 0x2 -#define CHIP_BONDING_88C_USB_HP 0x1 -#include "HalVerDef.h" -#include "hal_com.h" - -//------------------------------------------------------------------------- -// Channel Plan -//------------------------------------------------------------------------- -enum ChannelPlan -{ - CHPL_FCC = 0, - CHPL_IC = 1, - CHPL_ETSI = 2, - CHPL_SPAIN = 3, - CHPL_FRANCE = 4, - CHPL_MKK = 5, - CHPL_MKK1 = 6, - CHPL_ISRAEL = 7, - CHPL_TELEC = 8, - CHPL_GLOBAL = 9, - CHPL_WORLD = 10, -}; - -typedef struct _TxPowerInfo -{ - u8 CCKIndex[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; - u8 HT40_1SIndex[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; - u8 HT40_2SIndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; - u8 HT20IndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; - u8 OFDMIndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; - u8 HT40MaxOffset[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; - u8 HT20MaxOffset[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; - u8 TSSI_A[3]; - u8 TSSI_B[3]; - u8 TSSI_A_5G[3]; //5GL/5GM/5GH - u8 TSSI_B_5G[3]; -} TxPowerInfo, *PTxPowerInfo; - -typedef struct _TxPowerInfo24G{ - u1Byte IndexCCK_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G]; - u1Byte IndexBW40_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G-1]; - //If only one tx, only BW20 and OFDM are used. - s1Byte CCK_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s1Byte OFDM_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s1Byte BW20_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s1Byte BW40_Diff[MAX_RF_PATH][MAX_TX_COUNT]; -}TxPowerInfo24G, *PTxPowerInfo24G; - -#define EFUSE_REAL_CONTENT_LEN 512 -#define EFUSE_MAP_LEN 128 -#define EFUSE_MAX_SECTION 16 -#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. -#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) -// -// -// To prevent out of boundary programming case, -// leave 1byte and program full section -// 9bytes + 1byt + 5bytes and pre 1byte. -// For worst case: -// | 1byte|----8bytes----|1byte|--5bytes--| -// | | Reserved(14bytes) | -// -#define EFUSE_OOB_PROTECT_BYTES 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. - -#define HWSET_MAX_SIZE_88E 512 - -#define EFUSE_REAL_CONTENT_LEN_88E 256 -#define EFUSE_MAP_LEN_88E 512 -#define EFUSE_MAX_SECTION_88E 64 -#define EFUSE_MAX_WORD_UNIT_88E 4 -#define EFUSE_IC_ID_OFFSET_88E 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. -#define AVAILABLE_EFUSE_ADDR_88E(addr) (addr < EFUSE_REAL_CONTENT_LEN_88E) -// To prevent out of boundary programming case, leave 1byte and program full section -// 9bytes + 1byt + 5bytes and pre 1byte. -// For worst case: -// | 2byte|----8bytes----|1byte|--7bytes--| //92D -#define EFUSE_OOB_PROTECT_BYTES_88E 18 // PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte. -#define EFUSE_PROTECT_BYTES_BANK_88E 16 - - -//======================================================== -// EFUSE for BT definition -//======================================================== -#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 -#define EFUSE_BT_MAP_LEN 1024 // 1k bytes -#define EFUSE_BT_MAX_SECTION 128 // 1024/8 - -#define EFUSE_PROTECT_BYTES_BANK 16 - -// -// For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06. -// -typedef enum _RT_MULTI_FUNC { - RT_MULTI_FUNC_NONE = 0x00, - RT_MULTI_FUNC_WIFI = 0x01, - RT_MULTI_FUNC_BT = 0x02, - RT_MULTI_FUNC_GPS = 0x04, -} RT_MULTI_FUNC, *PRT_MULTI_FUNC; - -// -// For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08. -// -typedef enum _RT_POLARITY_CTL { - RT_POLARITY_LOW_ACT = 0, - RT_POLARITY_HIGH_ACT = 1, -} RT_POLARITY_CTL, *PRT_POLARITY_CTL; - -// For RTL8723 regulator mode. by tynli. 2011.01.14. -typedef enum _RT_REGULATOR_MODE { - RT_SWITCHING_REGULATOR = 0, - RT_LDO_REGULATOR = 1, -} RT_REGULATOR_MODE, *PRT_REGULATOR_MODE; - - -typedef struct hal_data_8188e -{ - HAL_VERSION VersionID; - RT_MULTI_FUNC MultiFunc; // For multi-function consideration. - RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. - RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO - u16 CustomerID; - - u16 FirmwareVersion; - u16 FirmwareVersionRev; - u16 FirmwareSubVersion; - u16 FirmwareSignature; - u8 PGMaxGroup; - //current WIFI_PHY values - u32 ReceiveConfig; - WIRELESS_MODE CurrentWirelessMode; - HT_CHANNEL_WIDTH CurrentChannelBW; - u8 CurrentChannel; - u8 nCur40MhzPrimeSC;// Control channel sub-carrier - - u16 BasicRateSet; - - //rf_ctrl - u8 rf_chip; - u8 rf_type; - u8 NumTotalRFPath; - - u8 BoardType; - - // - // EEPROM setting. - // - u16 EEPROMVID; - u16 EEPROMPID; - u16 EEPROMSVID; - u16 EEPROMSDID; - u8 EEPROMCustomerID; - u8 EEPROMSubCustomerID; - u8 EEPROMVersion; - u8 EEPROMRegulatory; - - u8 bTXPowerDataReadFromEEPORM; - u8 EEPROMThermalMeter; - u8 bAPKThermalMeterIgnore; - - BOOLEAN EepromOrEfuse; - u8 EfuseMap[2][HWSET_MAX_SIZE_512]; //92C:256bytes, 88E:512bytes, we use union set (512bytes) - u8 EfuseUsedPercentage; - EFUSE_HAL EfuseHal; - - //u8 bIQKInitialized; - - - u8 Index24G_CCK_Base[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; - u8 Index24G_BW40_Base[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; - //If only one tx, only BW20 and OFDM are used. - s8 CCK_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 OFDM_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW20_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW40_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - - u8 TxPwrLevelCck[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; - u8 TxPwrLevelHT40_1S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrLevelHT40_2S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrHt20Diff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff - u8 TxPwrLegacyHtDiff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff - // For power group - u8 PwrGroupHT20[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; - u8 PwrGroupHT40[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; - - u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff - // The current Tx Power Level - u8 CurrentCckTxPwrIdx; - u8 CurrentOfdm24GTxPwrIdx; - u8 CurrentBW2024GTxPwrIdx; - u8 CurrentBW4024GTxPwrIdx; - - - // Read/write are allow for following hardware information variables - u8 framesync; - u32 framesyncC34; - u8 framesyncMonitor; - u8 DefaultInitialGain[4]; - u8 pwrGroupCnt; - u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16]; - u32 CCKTxPowerLevelOriginalOffset; - - u8 CrystalCap; - u32 AntennaTxPath; // Antenna path Tx - u32 AntennaRxPath; // Antenna path Rx - u8 BluetoothCoexist; - u8 ExternalPA; - - u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. - - //u32 LedControlNum; - //u32 LedControlMode; - //u32 TxPowerTrackControl; - u8 b1x1RecvCombine; // for 1T1R receive combining - - //u8 bCurrentTurboEDCA; - u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. - - BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D - - u32 RfRegChnlVal[2]; - - //RDG enable - BOOLEAN bRDGEnable; - - //for host message to fw - u8 LastHMEBoxNum; - - u8 fw_ractrl; - u8 RegTxPause; - // Beacon function related global variable. - u32 RegBcnCtrlVal; - u8 RegFwHwTxQCtrl; - u8 RegReg542; - u8 RegCR_1; - - struct dm_priv dmpriv; - DM_ODM_T odmpriv; - //_lock odm_stainfo_lock; -#ifdef DBG_CONFIG_ERROR_DETECT - struct sreset_priv srestpriv; -#endif - -#ifdef CONFIG_BT_COEXIST - struct btcoexist_priv bt_coexist; -#endif - - u8 CurAntenna; - u8 AntDivCfg; - u8 TRxAntDivType; - - - u8 bDumpRxPkt;//for debug - u8 bDumpTxPkt;//for debug - u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. - - // 2010/08/09 MH Add CU power down mode. - BOOLEAN pwrdown; - - // Add for dual MAC 0--Mac0 1--Mac1 - u32 interfaceIndex; - - u8 OutEpQueueSel; - u8 OutEpNumber; - - // 2010/12/10 MH Add for USB aggreation mode dynamic shceme. - BOOLEAN UsbRxHighSpeedMode; - - // 2010/11/22 MH Add for slim combo debug mode selective. - // This is used for fix the drawback of CU TSMC-A/UMC-A cut. HW auto suspend ability. Close BT clock. - BOOLEAN SlimComboDbg; - - u16 EfuseUsedBytes; - -#ifdef CONFIG_P2P - struct P2P_PS_Offload_t p2p_ps_offload; -#endif - - // Auto FSM to Turn On, include clock, isolation, power control for MAC only - u8 bMacPwrCtrlOn; - -#ifdef CONFIG_SDIO_HCI - // - // For SDIO Interface HAL related - // - - // - // SDIO ISR Related - // -// u32 IntrMask[1]; -// u32 IntrMaskToSet[1]; -// LOG_INTERRUPT InterruptLog; - u32 sdio_himr; - u32 sdio_hisr; - - // - // SDIO Tx FIFO related. - // - // HIQ, MID, LOW, PUB free pages; padapter->xmitpriv.free_txpg - u8 SdioTxFIFOFreePage[SDIO_TX_FREE_PG_QUEUE]; - _lock SdioTxFIFOFreePageLock; -#ifndef CONFIG_SDIO_TX_TASKLET - _thread_hdl_ SdioXmitThread; - _sema SdioXmitSema; - _sema SdioXmitTerminateSema; -#endif - - // - // SDIO Rx FIFO related. - // - u8 SdioRxFIFOCnt; - u16 SdioRxFIFOSize; -#endif //CONFIG_SDIO_HCI - -#ifdef CONFIG_USB_HCI - u32 UsbBulkOutSize; - - // Interrupt relatd register information. - u32 IntArray[3];//HISR0,HISR1,HSISR - u32 IntrMask[3]; - u8 C2hArray[16]; -#ifdef CONFIG_USB_TX_AGGREGATION - u8 UsbTxAggMode; - u8 UsbTxAggDescNum; -#endif -#ifdef CONFIG_USB_RX_AGGREGATION - u16 HwRxPageSize; // Hardware setting - u32 MaxUsbRxAggBlock; - - USB_RX_AGG_MODE UsbRxAggMode; - u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed - u8 UsbRxAggBlockTimeout; - u8 UsbRxAggPageCount; // 8192C DMA page count - u8 UsbRxAggPageTimeout; -#endif -#endif //CONFIG_USB_HCI - - -#ifdef CONFIG_PCI_HCI - - // - // EEPROM setting. - // - - u16 EEPROMDID; - u16 EEPROMSMID; - u16 EEPROMChannelPlan; - - u8 EEPROMTSSI[2]; - u8 EEPROMBoardType; - u32 TransmitConfig; - - u32 IntrMask[2]; - u32 IntrMaskToSet[2]; - - u8 bDefaultAntenna; - u8 bIQKInitialized; - - u8 bInterruptMigration; - u8 bDisableTxInt; - u8 bGpioHwWpsPbc; -#endif //CONFIG_PCI_HCI - - -#ifdef CONFIG_TX_EARLY_MODE - u8 bEarlyModeEnable; -#endif -} HAL_DATA_8188E, *PHAL_DATA_8188E; - -typedef struct hal_data_8188e HAL_DATA_TYPE, *PHAL_DATA_TYPE; - - -#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) -#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) - -#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) -#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) - -//#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) - -//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) - -#ifdef CONFIG_PCI_HCI -void InterruptRecognized8188EE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent); -void UpdateInterruptMask8188EE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1); -#endif //CONFIG_PCI_HCI - -// rtl8188e_hal_init.c -#ifdef CONFIG_WOWLAN -s32 rtl8188e_FirmwareDownload(PADAPTER padapter, BOOLEAN bUsedWoWLANFw); -#else -s32 rtl8188e_FirmwareDownload(PADAPTER padapter); -#endif -void _8051Reset88E(PADAPTER padapter); -void rtl8188e_InitializeFirmwareVars(PADAPTER padapter); - - -s32 InitLLTTable(PADAPTER padapter, u8 txpktbuf_bndy); -void Read_LLT_Tab(PADAPTER padapter); - -// EFuse -u8 GetEEPROMSize8188E(PADAPTER padapter); -void Hal_InitPGData88E(PADAPTER padapter); -void Hal_EfuseParseIDCode88E(PADAPTER padapter, u8 *hwinfo); -void Hal_ReadTxPowerInfo88E(PADAPTER padapter,u8* hwinfo,BOOLEAN AutoLoadFail); - -void Hal_EfuseParseEEPROMVer88E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void rtl8188e_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseCustomerID88E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_ReadAntennaDiversity88E (PADAPTER pAdapter,u8*PROMContent,BOOLEAN AutoLoadFail); -void Hal_ReadThermalMeter_88E(PADAPTER Adapter,u8* PROMContent,BOOLEAN AutoloadFail); -void Hal_EfuseParseXtal_8188E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); -void Hal_EfuseParseBoardType88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); -void Hal_ReadPowerSavingMode88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); - -BOOLEAN HalDetectPwrDownMode88E(PADAPTER Adapter); - -#ifdef CONFIG_WOWLAN -void Hal_DetectWoWMode(PADAPTER pAdapter); -#endif //CONFIG_WOWLAN - -#ifdef CONFIG_RF_GAIN_OFFSET -void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); -#endif //CONFIG_RF_GAIN_OFFSET - -//RT_CHANNEL_DOMAIN rtl8723a_HalMapChannelPlan(PADAPTER padapter, u8 HalChannelPlan); -//VERSION_8192C rtl8723a_ReadChipVersion(PADAPTER padapter); -//void rtl8723a_ReadBluetoothCoexistInfo(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoloadFail); -void Hal_InitChannelPlan(PADAPTER padapter); - -void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc); - -// register -void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); - -void rtl8188e_clone_haldata(_adapter *dst_adapter, _adapter *src_adapter); -void rtl8188e_start_thread(_adapter *padapter); -void rtl8188e_stop_thread(_adapter *padapter); - -void rtw_IOL_cmd_tx_pkt_buf_dump(ADAPTER *Adapter,int data_len); -#ifdef CONFIG_IOL_EFUSE_PATCH -s32 rtl8188e_iol_efuse_patch(PADAPTER padapter); -#endif//CONFIG_IOL_EFUSE_PATCH - -#endif //__RTL8188E_HAL_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8188E_HAL_H__ +#define __RTL8188E_HAL_H__ + + +//include HAL Related header after HAL Related compiling flags +#include "rtl8188e_spec.h" +#include "Hal8188EPhyReg.h" +#include "Hal8188EPhyCfg.h" +#include "rtl8188e_rf.h" +#include "rtl8188e_dm.h" +#include "rtl8188e_recv.h" +#include "rtl8188e_xmit.h" +#include "rtl8188e_cmd.h" +#include "Hal8188EPwrSeq.h" +#ifdef DBG_CONFIG_ERROR_DETECT +#include "rtl8188e_sreset.h" +#endif +#include "rtw_efuse.h" + +#include "../hal/OUTSRC/odm_precomp.h" + + // Fw Array + #define Rtl8188E_FwImageArray Rtl8188EFwImgArray + #define Rtl8188E_FWImgArrayLength Rtl8188EFWImgArrayLength +#ifdef CONFIG_WOWLAN + #define Rtl8188E_FwWoWImageArray Array_8188E_FW_WoWLAN + #define Rtl8188E_FwWoWImgArrayLength ArrayLength_8188E_FW_WoWLAN +#endif //CONFIG_WOWLAN + + +#ifdef CONFIG_SDIO_HCI + + //TODO: We should define 8188ES firmware related macro settings here!! + //TODO: The following need to check!! + #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" + #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" + #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" + #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" + #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" + #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" + #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" + #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" + +//--------------------------------------------------------------------- +// RTL8188E From header +//--------------------------------------------------------------------- +#if 0 + #define Rtl8188E_PHY_REG_Array_PG Rtl8188ESPHY_REG_Array_PG + #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188ESPHY_REG_Array_PGLength + +#endif + + //--------------------------------------------------------------------- + // RTL8188E Power Configuration CMDs for USB/SDIO interfaces + //--------------------------------------------------------------------- + #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow + #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow + #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow + #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow + #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow + #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow + #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow + #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow + #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow + +#elif defined(CONFIG_USB_HCI) + #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" + #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" + #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" + #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" + #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" + #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" + #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" + #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" + +#if 0 + #define Rtl8188E_PHY_REG_Array_PG Rtl8188EUPHY_REG_Array_PG + #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188EUPHY_REG_Array_PGLength + +#endif + + //--------------------------------------------------------------------- + // RTL8188E Power Configuration CMDs for USB/SDIO interfaces + //--------------------------------------------------------------------- + #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow + #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow + #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow + #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow + #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow + #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow + #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow + #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow + #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow + +#elif defined(CONFIG_PCI_HCI) + #define RTL8188E_FW_UMC_IMG "rtl8188E\\rtl8188efw.bin" + #define RTL8188E_PHY_REG "rtl8188E\\PHY_REG_1T.txt" + #define RTL8188E_PHY_RADIO_A "rtl8188E\\radio_a_1T.txt" + #define RTL8188E_PHY_RADIO_B "rtl8188E\\radio_b_1T.txt" + #define RTL8188E_AGC_TAB "rtl8188E\\AGC_TAB_1T.txt" + #define RTL8188E_PHY_MACREG "rtl8188E\\MAC_REG.txt" + #define RTL8188E_PHY_REG_PG "rtl8188E\\PHY_REG_PG.txt" + #define RTL8188E_PHY_REG_MP "rtl8188E\\PHY_REG_MP.txt" + + #define Rtl8188E_PHY_REG_Array_PG Rtl8188EEPHY_REG_Array_PG + #define Rtl8188E_PHY_REG_Array_PGLength Rtl8188EEPHY_REG_Array_PGLength + + + #ifndef CONFIG_PHY_SETTING_WITH_ODM + #if MP_DRIVER == 1 + #define Rtl8188ES_PHY_REG_Array_MP Rtl8188ESPHY_REG_Array_MP + #endif + #endif + + //--------------------------------------------------------------------- + // RTL8188E Power Configuration CMDs for USB/SDIO/PCIE interfaces + //--------------------------------------------------------------------- + #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow + #define Rtl8188E_NIC_RF_OFF_FLOW rtl8188E_radio_off_flow + #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow + #define Rtl8188E_NIC_ENABLE_FLOW rtl8188E_card_enable_flow + #define Rtl8188E_NIC_SUSPEND_FLOW rtl8188E_suspend_flow + #define Rtl8188E_NIC_RESUME_FLOW rtl8188E_resume_flow + #define Rtl8188E_NIC_PDN_FLOW rtl8188E_hwpdn_flow + #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow + #define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188E_leave_lps_flow +#endif //CONFIG_***_HCI + + +#define DRVINFO_SZ 4 // unit is 8bytes +#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) + + +#if 1 // download firmware related data structure +#define FW_8188E_SIZE 0x4000 //16384,16k +#define FW_8188E_START_ADDRESS 0x1000 +#define FW_8188E_END_ADDRESS 0x1FFF //0x5FFF + +#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes + +#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88E0) + +typedef enum _FIRMWARE_SOURCE { + FW_SOURCE_IMG_FILE = 0, + FW_SOURCE_HEADER_FILE = 1, //from header file +} FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; + +typedef struct _RT_FIRMWARE { + FIRMWARE_SOURCE eFWSource; +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; +#else + u8 szFwBuffer[FW_8188E_SIZE]; +#endif + u32 ulFwLength; + +#ifdef CONFIG_WOWLAN + u8* szWoWLANFwBuffer; + u32 ulWoWLANFwLength; +#endif //CONFIG_WOWLAN +} RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_8188E, *PRT_FIRMWARE_8188E; + +// +// This structure must be cared byte-ordering +// + +typedef struct _RT_8188E_FIRMWARE_HDR +{ + // 8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u16 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u8 Foundry; + u8 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; +}RT_8188E_FIRMWARE_HDR, *PRT_8188E_FIRMWARE_HDR; +#endif // download firmware related data structure + + +#define DRIVER_EARLY_INT_TIME 0x05 +#define BCN_DMA_ATIME_INT_TIME 0x02 + +#ifdef CONFIG_USB_RX_AGGREGATION + +typedef enum _USB_RX_AGG_MODE{ + USB_RX_AGG_DISABLE, + USB_RX_AGG_DMA, + USB_RX_AGG_USB, + USB_RX_AGG_MIX +}USB_RX_AGG_MODE; + +//#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer + +#endif + + +#define MAX_RX_DMA_BUFFER_SIZE_88E 0x2400 //9k for 88E nornal chip , //MaxRxBuff=10k-max(TxReportSize(64*8), WOLPattern(16*24)) + +#define MAX_TX_REPORT_BUFFER_SIZE 0x0400 // 1k + + +// BK, BE, VI, VO, HCCA, MANAGEMENT, COMMAND, HIGH, BEACON. +#define MAX_TX_QUEUE 9 + +#define TX_SELE_HQ BIT(0) // High Queue +#define TX_SELE_LQ BIT(1) // Low Queue +#define TX_SELE_NQ BIT(2) // Normal Queue + +// Note: We will divide number of page equally for each queue other than public queue! +// 22k = 22528 bytes = 176 pages (@page = 128 bytes) +// must reserved about 7 pages for LPS => 176-7 = 169 (0xA9) +// 2*BCN / 1*ps-poll / 1*null-data /1*prob_rsp /1*QOS null-data /1*BT QOS null-data + +#define TX_TOTAL_PAGE_NUMBER_88E 0xA9// 169 (21632=> 21k) + +#ifdef RTL8188ES_MAC_LOOPBACK +#define TX_PAGE_BOUNDARY_88E 0x48 //72 +#else //TX_PAGE_BOUNDARY_LOOPBACK_MODE +#define TX_PAGE_BOUNDARY_88E (TX_TOTAL_PAGE_NUMBER_88E + 1) +#endif + + +//Note: For Normal Chip Setting ,modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER TX_TOTAL_PAGE_NUMBER_88E //0xA9 , 0xb0=>176=>22k +#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER + 1) //0xA9 + + + +//------------------------------------------------------------------------- +// Chip specific +//------------------------------------------------------------------------- +#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) +#define CHIP_BONDING_92C_1T2R 0x1 +#define CHIP_BONDING_88C_USB_MCARD 0x2 +#define CHIP_BONDING_88C_USB_HP 0x1 +#include "HalVerDef.h" +#include "hal_com.h" + +//------------------------------------------------------------------------- +// Channel Plan +//------------------------------------------------------------------------- +enum ChannelPlan +{ + CHPL_FCC = 0, + CHPL_IC = 1, + CHPL_ETSI = 2, + CHPL_SPAIN = 3, + CHPL_FRANCE = 4, + CHPL_MKK = 5, + CHPL_MKK1 = 6, + CHPL_ISRAEL = 7, + CHPL_TELEC = 8, + CHPL_GLOBAL = 9, + CHPL_WORLD = 10, +}; + +typedef struct _TxPowerInfo +{ + u8 CCKIndex[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; + u8 HT40_1SIndex[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; + u8 HT40_2SIndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; + u8 HT20IndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; + u8 OFDMIndexDiff[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; + u8 HT40MaxOffset[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; + u8 HT20MaxOffset[RF_PATH_MAX][CHANNEL_GROUP_MAX_88E]; + u8 TSSI_A[3]; + u8 TSSI_B[3]; + u8 TSSI_A_5G[3]; //5GL/5GM/5GH + u8 TSSI_B_5G[3]; +} TxPowerInfo, *PTxPowerInfo; + +typedef struct _TxPowerInfo24G{ + u1Byte IndexCCK_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G]; + u1Byte IndexBW40_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G-1]; + //If only one tx, only BW20 and OFDM are used. + s1Byte CCK_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s1Byte OFDM_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s1Byte BW20_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s1Byte BW40_Diff[MAX_RF_PATH][MAX_TX_COUNT]; +}TxPowerInfo24G, *PTxPowerInfo24G; + +#define EFUSE_REAL_CONTENT_LEN 512 +#define EFUSE_MAP_LEN 128 +#define EFUSE_MAX_SECTION 16 +#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) +// +// +// To prevent out of boundary programming case, +// leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 1byte|----8bytes----|1byte|--5bytes--| +// | | Reserved(14bytes) | +// +#define EFUSE_OOB_PROTECT_BYTES 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. + +#define HWSET_MAX_SIZE_88E 512 + +#define EFUSE_REAL_CONTENT_LEN_88E 256 +#define EFUSE_MAP_LEN_88E 512 +#define EFUSE_MAX_SECTION_88E 64 +#define EFUSE_MAX_WORD_UNIT_88E 4 +#define EFUSE_IC_ID_OFFSET_88E 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR_88E(addr) (addr < EFUSE_REAL_CONTENT_LEN_88E) +// To prevent out of boundary programming case, leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 2byte|----8bytes----|1byte|--7bytes--| //92D +#define EFUSE_OOB_PROTECT_BYTES_88E 18 // PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte. +#define EFUSE_PROTECT_BYTES_BANK_88E 16 + + +//======================================================== +// EFUSE for BT definition +//======================================================== +#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 +#define EFUSE_BT_MAP_LEN 1024 // 1k bytes +#define EFUSE_BT_MAX_SECTION 128 // 1024/8 + +#define EFUSE_PROTECT_BYTES_BANK 16 + +// +// For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06. +// +typedef enum _RT_MULTI_FUNC { + RT_MULTI_FUNC_NONE = 0x00, + RT_MULTI_FUNC_WIFI = 0x01, + RT_MULTI_FUNC_BT = 0x02, + RT_MULTI_FUNC_GPS = 0x04, +} RT_MULTI_FUNC, *PRT_MULTI_FUNC; + +// +// For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08. +// +typedef enum _RT_POLARITY_CTL { + RT_POLARITY_LOW_ACT = 0, + RT_POLARITY_HIGH_ACT = 1, +} RT_POLARITY_CTL, *PRT_POLARITY_CTL; + +// For RTL8723 regulator mode. by tynli. 2011.01.14. +typedef enum _RT_REGULATOR_MODE { + RT_SWITCHING_REGULATOR = 0, + RT_LDO_REGULATOR = 1, +} RT_REGULATOR_MODE, *PRT_REGULATOR_MODE; + + +typedef struct hal_data_8188e +{ + HAL_VERSION VersionID; + RT_MULTI_FUNC MultiFunc; // For multi-function consideration. + RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. + RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO + u16 CustomerID; + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + u16 FirmwareSignature; + u8 PGMaxGroup; + //current WIFI_PHY values + u32 ReceiveConfig; + WIRELESS_MODE CurrentWirelessMode; + HT_CHANNEL_WIDTH CurrentChannelBW; + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + + u16 BasicRateSet; + + //rf_ctrl + u8 rf_chip; + u8 rf_type; + u8 NumTotalRFPath; + + u8 BoardType; + + // + // EEPROM setting. + // + u16 EEPROMVID; + u16 EEPROMPID; + u16 EEPROMSVID; + u16 EEPROMSDID; + u8 EEPROMCustomerID; + u8 EEPROMSubCustomerID; + u8 EEPROMVersion; + u8 EEPROMRegulatory; + + u8 bTXPowerDataReadFromEEPORM; + u8 EEPROMThermalMeter; + u8 bAPKThermalMeterIgnore; + + BOOLEAN EepromOrEfuse; + u8 EfuseMap[2][HWSET_MAX_SIZE_512]; //92C:256bytes, 88E:512bytes, we use union set (512bytes) + u8 EfuseUsedPercentage; + EFUSE_HAL EfuseHal; + + //u8 bIQKInitialized; + + + u8 Index24G_CCK_Base[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; + u8 Index24G_BW40_Base[MAX_RF_PATH][CHANNEL_MAX_NUMBER]; + //If only one tx, only BW20 and OFDM are used. + s8 CCK_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 OFDM_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW20_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + s8 BW40_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; + + u8 TxPwrLevelCck[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 TxPwrLevelHT40_1S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff + // For power group + u8 PwrGroupHT20[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 PwrGroupHT40[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; + + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + u8 CurrentBW2024GTxPwrIdx; + u8 CurrentBW4024GTxPwrIdx; + + + // Read/write are allow for following hardware information variables + u8 framesync; + u32 framesyncC34; + u8 framesyncMonitor; + u8 DefaultInitialGain[4]; + u8 pwrGroupCnt; + u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16]; + u32 CCKTxPowerLevelOriginalOffset; + + u8 CrystalCap; + u32 AntennaTxPath; // Antenna path Tx + u32 AntennaRxPath; // Antenna path Rx + u8 BluetoothCoexist; + u8 ExternalPA; + + u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. + + //u32 LedControlNum; + //u32 LedControlMode; + //u32 TxPowerTrackControl; + u8 b1x1RecvCombine; // for 1T1R receive combining + + //u8 bCurrentTurboEDCA; + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + + u32 RfRegChnlVal[2]; + + //RDG enable + BOOLEAN bRDGEnable; + + //for host message to fw + u8 LastHMEBoxNum; + + u8 fw_ractrl; + u8 RegTxPause; + // Beacon function related global variable. + u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; + u8 RegCR_1; + + struct dm_priv dmpriv; + DM_ODM_T odmpriv; + //_lock odm_stainfo_lock; +#ifdef DBG_CONFIG_ERROR_DETECT + struct sreset_priv srestpriv; +#endif + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv bt_coexist; +#endif + + u8 CurAntenna; + u8 AntDivCfg; + u8 TRxAntDivType; + + + u8 bDumpRxPkt;//for debug + u8 bDumpTxPkt;//for debug + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + // 2010/08/09 MH Add CU power down mode. + BOOLEAN pwrdown; + + // Add for dual MAC 0--Mac0 1--Mac1 + u32 interfaceIndex; + + u8 OutEpQueueSel; + u8 OutEpNumber; + + // 2010/12/10 MH Add for USB aggreation mode dynamic shceme. + BOOLEAN UsbRxHighSpeedMode; + + // 2010/11/22 MH Add for slim combo debug mode selective. + // This is used for fix the drawback of CU TSMC-A/UMC-A cut. HW auto suspend ability. Close BT clock. + BOOLEAN SlimComboDbg; + + u16 EfuseUsedBytes; + +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif + + // Auto FSM to Turn On, include clock, isolation, power control for MAC only + u8 bMacPwrCtrlOn; + +#ifdef CONFIG_SDIO_HCI + // + // For SDIO Interface HAL related + // + + // + // SDIO ISR Related + // +// u32 IntrMask[1]; +// u32 IntrMaskToSet[1]; +// LOG_INTERRUPT InterruptLog; + u32 sdio_himr; + u32 sdio_hisr; + + // + // SDIO Tx FIFO related. + // + // HIQ, MID, LOW, PUB free pages; padapter->xmitpriv.free_txpg + u8 SdioTxFIFOFreePage[SDIO_TX_FREE_PG_QUEUE]; + _lock SdioTxFIFOFreePageLock; + + // + // SDIO Rx FIFO related. + // + u8 SdioRxFIFOCnt; + u16 SdioRxFIFOSize; +#endif //CONFIG_SDIO_HCI + +#ifdef CONFIG_USB_HCI + u32 UsbBulkOutSize; + + // Interrupt relatd register information. + u32 IntArray[3];//HISR0,HISR1,HSISR + u32 IntrMask[3]; + u8 C2hArray[16]; +#ifdef CONFIG_USB_TX_AGGREGATION + u8 UsbTxAggMode; + u8 UsbTxAggDescNum; +#endif +#ifdef CONFIG_USB_RX_AGGREGATION + u16 HwRxPageSize; // Hardware setting + u32 MaxUsbRxAggBlock; + + USB_RX_AGG_MODE UsbRxAggMode; + u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed + u8 UsbRxAggBlockTimeout; + u8 UsbRxAggPageCount; // 8192C DMA page count + u8 UsbRxAggPageTimeout; +#endif +#endif //CONFIG_USB_HCI + + +#ifdef CONFIG_PCI_HCI + + // + // EEPROM setting. + // + + u16 EEPROMDID; + u16 EEPROMSMID; + u16 EEPROMChannelPlan; + + u8 EEPROMTSSI[2]; + u8 EEPROMBoardType; + u32 TransmitConfig; + + u32 IntrMask[2]; + u32 IntrMaskToSet[2]; + + u8 bDefaultAntenna; + u8 bIQKInitialized; + + u8 bInterruptMigration; + u8 bDisableTxInt; + u8 bGpioHwWpsPbc; +#endif //CONFIG_PCI_HCI + + +#ifdef CONFIG_TX_EARLY_MODE + u8 bEarlyModeEnable; +#endif +} HAL_DATA_8188E, *PHAL_DATA_8188E; + +typedef struct hal_data_8188e HAL_DATA_TYPE, *PHAL_DATA_TYPE; + + +#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +//#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) + +//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) + +#ifdef CONFIG_PCI_HCI +void InterruptRecognized8188EE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent); +void UpdateInterruptMask8188EE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1); +#endif //CONFIG_PCI_HCI + +// rtl8188e_hal_init.c +#ifdef CONFIG_WOWLAN +s32 rtl8188e_FirmwareDownload(PADAPTER padapter, BOOLEAN bUsedWoWLANFw); +#else +s32 rtl8188e_FirmwareDownload(PADAPTER padapter); +#endif +void _8051Reset88E(PADAPTER padapter); +void rtl8188e_InitializeFirmwareVars(PADAPTER padapter); + + +s32 InitLLTTable(PADAPTER padapter, u8 txpktbuf_bndy); +void Read_LLT_Tab(PADAPTER padapter); + +// EFuse +u8 GetEEPROMSize8188E(PADAPTER padapter); +void Hal_InitPGData88E(PADAPTER padapter); +void Hal_EfuseParseIDCode88E(PADAPTER padapter, u8 *hwinfo); +void Hal_ReadTxPowerInfo88E(PADAPTER padapter,u8* hwinfo,BOOLEAN AutoLoadFail); + +void Hal_EfuseParseEEPROMVer88E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void rtl8188e_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseCustomerID88E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_ReadAntennaDiversity88E (PADAPTER pAdapter,u8*PROMContent,BOOLEAN AutoLoadFail); +void Hal_ReadThermalMeter_88E(PADAPTER Adapter,u8* PROMContent,BOOLEAN AutoloadFail); +void Hal_EfuseParseXtal_8188E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +void Hal_EfuseParseBoardType88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +void Hal_ReadPowerSavingMode88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); + +BOOLEAN HalDetectPwrDownMode88E(PADAPTER Adapter); + +#ifdef CONFIG_WOWLAN +void Hal_DetectWoWMode(PADAPTER pAdapter); +#endif //CONFIG_WOWLAN + +#ifdef CONFIG_RF_GAIN_OFFSET +void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +#endif //CONFIG_RF_GAIN_OFFSET + +//RT_CHANNEL_DOMAIN rtl8723a_HalMapChannelPlan(PADAPTER padapter, u8 HalChannelPlan); +//VERSION_8192C rtl8723a_ReadChipVersion(PADAPTER padapter); +//void rtl8723a_ReadBluetoothCoexistInfo(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoloadFail); +void Hal_InitChannelPlan(PADAPTER padapter); + +void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc); + +// register +void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); + +void rtl8188e_start_thread(_adapter *padapter); +void rtl8188e_stop_thread(_adapter *padapter); + +void rtw_IOL_cmd_tx_pkt_buf_dump(ADAPTER *Adapter,int data_len); +#ifdef CONFIG_IOL_EFUSE_PATCH +s32 rtl8188e_iol_efuse_patch(PADAPTER padapter); +#endif//CONFIG_IOL_EFUSE_PATCH + +#endif //__RTL8188E_HAL_H__ + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8188e_led.h b/drivers/net/wireless/rtl8723as/include/rtl8188e_led.h index c461410c9d1b..2bafb83fddb8 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8188e_led.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8188e_led.h @@ -1,46 +1,46 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8188E_LED_H__ -#define __RTL8188E_LED_H__ - -#include -#include -#include - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8188eu_InitSwLeds(PADAPTER padapter); -void rtl8188eu_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_PCI_HCI -void rtl8188ee_gen_RefreshLedState(PADAPTER Adapter); -void rtl8188ee_InitSwLeds(PADAPTER padapter); -void rtl8188ee_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_SDIO_HCI -void rtl8188es_InitSwLeds(PADAPTER padapter); -void rtl8188es_DeInitSwLeds(PADAPTER padapter); -#endif - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8188E_LED_H__ +#define __RTL8188E_LED_H__ + +#include +#include +#include + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8188eu_InitSwLeds(PADAPTER padapter); +void rtl8188eu_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_PCI_HCI +void rtl8188ee_gen_RefreshLedState(PADAPTER Adapter); +void rtl8188ee_InitSwLeds(PADAPTER padapter); +void rtl8188ee_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_SDIO_HCI +void rtl8188es_InitSwLeds(PADAPTER padapter); +void rtl8188es_DeInitSwLeds(PADAPTER padapter); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8188e_recv.h b/drivers/net/wireless/rtl8723as/include/rtl8188e_recv.h index 664a7fca3b71..2c190d054626 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8188e_recv.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8188e_recv.h @@ -1,146 +1,146 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8188E_RECV_H__ -#define __RTL8188E_RECV_H__ - -#include - -#define TX_RPT1_PKT_LEN 8 - -typedef enum _RX_PACKET_TYPE{ - NORMAL_RX,//Normal rx packet - TX_REPORT1,//CCX - TX_REPORT2,//TX RPT - HIS_REPORT,// USB HISR RPT -}RX_PACKET_TYPE, *PRX_PACKET_TYPE; - -typedef struct rxreport_8188e -{ - //Offset 0 - u32 pktlen:14; - u32 crc32:1; - u32 icverr:1; - u32 drvinfosize:4; - u32 security:3; - u32 qos:1; - u32 shift:2; - u32 physt:1; - u32 swdec:1; - u32 ls:1; - u32 fs:1; - u32 eor:1; - u32 own:1; - - //Offset 4 - u32 macid:5; - u32 tid:4; - u32 hwrsvd:4; - u32 amsdu:1; - u32 paggr:1; - u32 faggr:1; - u32 a1fit:4; - u32 a2fit:4; - u32 pam:1; - u32 pwr:1; - u32 md:1; - u32 mf:1; - u32 type:2; - u32 mc:1; - u32 bc:1; - - //Offset 8 - u32 seq:12; - u32 frag:4; - u32 nextpktlen:14; - u32 nextind:1; - u32 rsvd0831:1; - - //Offset 12 - u32 rxmcs:6; - u32 rxht:1; - u32 gf:1; - u32 splcp:1; - u32 bw:1; - u32 htc:1; - u32 eosp:1; - u32 bssidfit:2; - u32 rpt_sel:2; - u32 rsvd1216:13; - u32 pattern_match:1; - u32 unicastwake:1; - u32 magicwake:1; - - //Offset 16 - /* - u32 pattern0match:1; - u32 pattern1match:1; - u32 pattern2match:1; - u32 pattern3match:1; - u32 pattern4match:1; - u32 pattern5match:1; - u32 pattern6match:1; - u32 pattern7match:1; - u32 pattern8match:1; - u32 pattern9match:1; - u32 patternamatch:1; - u32 patternbmatch:1; - u32 patterncmatch:1; - u32 rsvd1613:19; - */ - u32 rsvd16; - - //Offset 20 - u32 tsfl; - - //Offset 24 - u32 bassn:12; - u32 bavld:1; - u32 rsvd2413:19; -} RXREPORT, *PRXREPORT; - - -#ifdef CONFIG_SDIO_HCI -s32 rtl8188es_init_recv_priv(PADAPTER padapter); -void rtl8188es_free_recv_priv(PADAPTER padapter); -void rtl8188es_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); -#endif - -#ifdef CONFIG_USB_HCI -#define INTERRUPT_MSG_FORMAT_LEN 60 -void rtl8188eu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); -s32 rtl8188eu_init_recv_priv(PADAPTER padapter); -void rtl8188eu_free_recv_priv(PADAPTER padapter); -void rtl8188eu_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); -void rtl8188eu_recv_tasklet(void *priv); - -#endif - -#ifdef CONFIG_PCI_HCI -s32 rtl8188ee_init_recv_priv(PADAPTER padapter); -void rtl8188ee_free_recv_priv(PADAPTER padapter); -#endif - -void rtl8188e_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); -void rtl8188e_process_phy_info(PADAPTER padapter, void *prframe); -void update_recvframe_phyinfo_88e(union recv_frame *precvframe,struct phy_stat *pphy_status); -void update_recvframe_attrib_88e( union recv_frame *precvframe, struct recv_stat *prxstat); - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8188E_RECV_H__ +#define __RTL8188E_RECV_H__ + +#include + +#define TX_RPT1_PKT_LEN 8 + +typedef enum _RX_PACKET_TYPE{ + NORMAL_RX,//Normal rx packet + TX_REPORT1,//CCX + TX_REPORT2,//TX RPT + HIS_REPORT,// USB HISR RPT +}RX_PACKET_TYPE, *PRX_PACKET_TYPE; + +typedef struct rxreport_8188e +{ + //Offset 0 + u32 pktlen:14; + u32 crc32:1; + u32 icverr:1; + u32 drvinfosize:4; + u32 security:3; + u32 qos:1; + u32 shift:2; + u32 physt:1; + u32 swdec:1; + u32 ls:1; + u32 fs:1; + u32 eor:1; + u32 own:1; + + //Offset 4 + u32 macid:5; + u32 tid:4; + u32 hwrsvd:4; + u32 amsdu:1; + u32 paggr:1; + u32 faggr:1; + u32 a1fit:4; + u32 a2fit:4; + u32 pam:1; + u32 pwr:1; + u32 md:1; + u32 mf:1; + u32 type:2; + u32 mc:1; + u32 bc:1; + + //Offset 8 + u32 seq:12; + u32 frag:4; + u32 nextpktlen:14; + u32 nextind:1; + u32 rsvd0831:1; + + //Offset 12 + u32 rxmcs:6; + u32 rxht:1; + u32 gf:1; + u32 splcp:1; + u32 bw:1; + u32 htc:1; + u32 eosp:1; + u32 bssidfit:2; + u32 rpt_sel:2; + u32 rsvd1216:13; + u32 pattern_match:1; + u32 unicastwake:1; + u32 magicwake:1; + + //Offset 16 + /* + u32 pattern0match:1; + u32 pattern1match:1; + u32 pattern2match:1; + u32 pattern3match:1; + u32 pattern4match:1; + u32 pattern5match:1; + u32 pattern6match:1; + u32 pattern7match:1; + u32 pattern8match:1; + u32 pattern9match:1; + u32 patternamatch:1; + u32 patternbmatch:1; + u32 patterncmatch:1; + u32 rsvd1613:19; + */ + u32 rsvd16; + + //Offset 20 + u32 tsfl; + + //Offset 24 + u32 bassn:12; + u32 bavld:1; + u32 rsvd2413:19; +} RXREPORT, *PRXREPORT; + + +#ifdef CONFIG_SDIO_HCI +s32 rtl8188es_init_recv_priv(PADAPTER padapter); +void rtl8188es_free_recv_priv(PADAPTER padapter); +void rtl8188es_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); +#endif + +#ifdef CONFIG_USB_HCI +#define INTERRUPT_MSG_FORMAT_LEN 60 +void rtl8188eu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); +s32 rtl8188eu_init_recv_priv(PADAPTER padapter); +void rtl8188eu_free_recv_priv(PADAPTER padapter); +void rtl8188eu_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf); +void rtl8188eu_recv_tasklet(void *priv); + +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8188ee_init_recv_priv(PADAPTER padapter); +void rtl8188ee_free_recv_priv(PADAPTER padapter); +#endif + +void rtl8188e_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); +void rtl8188e_process_phy_info(PADAPTER padapter, void *prframe); +void update_recvframe_phyinfo_88e(union recv_frame *precvframe,struct phy_stat *pphy_status); +void update_recvframe_attrib_88e( union recv_frame *precvframe, struct recv_stat *prxstat); + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8188e_spec.h b/drivers/net/wireless/rtl8723as/include/rtl8188e_spec.h index 9633252ba9e6..0421da900700 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8188e_spec.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8188e_spec.h @@ -1,1732 +1,1741 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - *******************************************************************************/ -#ifndef __RTL8188E_SPEC_H__ -#define __RTL8188E_SPEC_H__ - -#include - -#ifndef BIT -#define BIT(x) (1 << (x)) -#endif - -#define BIT0 0x00000001 -#define BIT1 0x00000002 -#define BIT2 0x00000004 -#define BIT3 0x00000008 -#define BIT4 0x00000010 -#define BIT5 0x00000020 -#define BIT6 0x00000040 -#define BIT7 0x00000080 -#define BIT8 0x00000100 -#define BIT9 0x00000200 -#define BIT10 0x00000400 -#define BIT11 0x00000800 -#define BIT12 0x00001000 -#define BIT13 0x00002000 -#define BIT14 0x00004000 -#define BIT15 0x00008000 -#define BIT16 0x00010000 -#define BIT17 0x00020000 -#define BIT18 0x00040000 -#define BIT19 0x00080000 -#define BIT20 0x00100000 -#define BIT21 0x00200000 -#define BIT22 0x00400000 -#define BIT23 0x00800000 -#define BIT24 0x01000000 -#define BIT25 0x02000000 -#define BIT26 0x04000000 -#define BIT27 0x08000000 -#define BIT28 0x10000000 -#define BIT29 0x20000000 -#define BIT30 0x40000000 -#define BIT31 0x80000000 - -//============================================================ -// 8192C Regsiter offset definition -//============================================================ - -#define HAL_PS_TIMER_INT_DELAY 50 // 50 microseconds -#define HAL_92C_NAV_UPPER_UNIT 128 // micro-second - -#define MAC_ADDR_LEN 6 -// 8188E PKT_BUFF_ACCESS_CTRL value -#define TXPKT_BUF_SELECT 0x69 -#define RXPKT_BUF_SELECT 0xA5 -#define DISABLE_TRXPKT_BUF_ACCESS 0x0 - -//============================================================ -// -//============================================================ - -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- -#define REG_SYS_ISO_CTRL 0x0000 -#define REG_SYS_FUNC_EN 0x0002 -#define REG_APS_FSMCO 0x0004 -#define REG_SYS_CLKR 0x0008 -#define REG_9346CR 0x000A -#define REG_EE_VPD 0x000C -#define REG_AFE_MISC 0x0010 -#define REG_SPS0_CTRL 0x0011 -#define REG_SPS_OCP_CFG 0x0018 -#define REG_RSV_CTRL 0x001C -#define REG_RF_CTRL 0x001F -#define REG_LDOA15_CTRL 0x0020 -#define REG_LDOV12D_CTRL 0x0021 -#define REG_LDOHCI12_CTRL 0x0022 -#define REG_LPLDO_CTRL 0x0023 -#define REG_AFE_XTAL_CTRL 0x0024 -#define REG_AFE_PLL_CTRL 0x0028 -#define REG_APE_PLL_CTRL_EXT 0x002c -#define REG_EFUSE_CTRL 0x0030 -#define REG_EFUSE_TEST 0x0034 -#define REG_GPIO_MUXCFG 0x0040 -#define REG_GPIO_IO_SEL 0x0042 -#define REG_MAC_PINMUX_CFG 0x0043 -#define REG_GPIO_PIN_CTRL 0x0044 -#define REG_GPIO_INTM 0x0048 -#define REG_LEDCFG0 0x004C -#define REG_LEDCFG1 0x004D -#define REG_LEDCFG2 0x004E -#define REG_LEDCFG3 0x004F -#define REG_FSIMR 0x0050 -#define REG_FSISR 0x0054 -#define REG_HSIMR 0x0058 -#define REG_HSISR 0x005c -#define REG_GPIO_PIN_CTRL_2 0x0060 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Pin Control. -#define REG_GPIO_IO_SEL_2 0x0062 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Select. -#define REG_BB_PAD_CTRL 0x0064 -#define REG_MULTI_FUNC_CTRL 0x0068 // RTL8723 WIFI/BT/GPS Multi-Function control source. -#define REG_GPIO_OUTPUT 0x006c -#define REG_AFE_XTAL_CTRL_EXT 0x0078 //RTL8188E -#define REG_XCK_OUT_CTRL 0x007c //RTL8188E -#define REG_MCUFWDL 0x0080 -#define REG_WOL_EVENT 0x0081 //RTL8188E -#define REG_MCUTSTCFG 0x0084 -#define REG_HMEBOX_E0 0x0088 -#define REG_HMEBOX_E1 0x008A -#define REG_HMEBOX_E2 0x008C -#define REG_HMEBOX_E3 0x008E -#define REG_HMEBOX_EXT_0 0x01F0 -#define REG_HMEBOX_EXT_1 0x01F4 -#define REG_HMEBOX_EXT_2 0x01F8 -#define REG_HMEBOX_EXT_3 0x01FC -#define REG_HIMR_88E 0x00B0 -#define REG_HISR_88E 0x00B4 -#define REG_HIMRE_88E 0x00B8 -#define REG_HISRE_88E 0x00BC -#define REG_EFUSE_ACCESS 0x00CF // Efuse access protection for RTL8723 -#define REG_BIST_SCAN 0x00D0 -#define REG_BIST_RPT 0x00D4 -#define REG_BIST_ROM_RPT 0x00D8 -#define REG_USB_SIE_INTF 0x00E0 -#define REG_PCIE_MIO_INTF 0x00E4 -#define REG_PCIE_MIO_INTD 0x00E8 -#define REG_HPON_FSM 0x00EC -#define REG_SYS_CFG 0x00F0 -#define REG_GPIO_OUTSTS 0x00F4 // For RTL8723 only. -#define REG_TYPE_ID 0x00FC - -#define REG_MAC_PHY_CTRL_NORMAL 0x00f8 - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- -#define REG_CR 0x0100 -#define REG_PBP 0x0104 -#define REG_PKT_BUFF_ACCESS_CTRL 0x0106 -#define REG_TRXDMA_CTRL 0x010C -#define REG_TRXFF_BNDY 0x0114 -#define REG_TRXFF_STATUS 0x0118 -#define REG_RXFF_PTR 0x011C -//#define REG_HIMR 0x0120 -//#define REG_HISR 0x0124 -#define REG_HIMRE 0x0128 -#define REG_HISRE 0x012C -#define REG_CPWM 0x012F -#define REG_FWIMR 0x0130 -#define REG_FTIMR 0x0138 -#define REG_FWISR 0x0134 -#define REG_PKTBUF_DBG_CTRL 0x0140 -#define REG_PKTBUF_DBG_ADDR (REG_PKTBUF_DBG_CTRL) -#define REG_RXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+2) -#define REG_TXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+3) -#define REG_RXPKTBUF_CTRL (REG_PKTBUF_DBG_CTRL+2) -#define REG_PKTBUF_DBG_DATA_L 0x0144 -#define REG_PKTBUF_DBG_DATA_H 0x0148 - -#define REG_TC0_CTRL 0x0150 -#define REG_TC1_CTRL 0x0154 -#define REG_TC2_CTRL 0x0158 -#define REG_TC3_CTRL 0x015C -#define REG_TC4_CTRL 0x0160 -#define REG_TCUNIT_BASE 0x0164 -#define REG_MBIST_START 0x0174 -#define REG_MBIST_DONE 0x0178 -#define REG_MBIST_FAIL 0x017C -#define REG_32K_CTRL 0x0194 //RTL8188E -#define REG_C2HEVT_MSG_NORMAL 0x01A0 -#define REG_C2HEVT_CLEAR 0x01AF -#define REG_MCUTST_1 0x01c0 -#ifdef CONFIG_WOWLAN -#define REG_WOWLAN_WAKE_REASON 0x01c7 -#endif -#define REG_FMETHR 0x01C8 -#define REG_HMETFR 0x01CC -#define REG_HMEBOX_0 0x01D0 -#define REG_HMEBOX_1 0x01D4 -#define REG_HMEBOX_2 0x01D8 -#define REG_HMEBOX_3 0x01DC - -#define REG_LLT_INIT 0x01E0 - - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- -#define REG_RQPN 0x0200 -#define REG_FIFOPAGE 0x0204 -#define REG_TDECTRL 0x0208 -#define REG_TXDMA_OFFSET_CHK 0x020C -#define REG_TXDMA_STATUS 0x0210 -#define REG_RQPN_NPQ 0x0214 - -//----------------------------------------------------- -// -// 0x0280h ~ 0x02FFh RXDMA Configuration -// -//----------------------------------------------------- -#define REG_RXDMA_AGG_PG_TH 0x0280 -#define REG_RXPKT_NUM 0x0284 -#define REG_RXDMA_STATUS 0x0288 - -//----------------------------------------------------- -// -// 0x0300h ~ 0x03FFh PCIe -// -//----------------------------------------------------- -#define REG_PCIE_CTRL_REG 0x0300 -#define REG_INT_MIG 0x0304 // Interrupt Migration -#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address -#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address -#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address -#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address -#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address -#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address -#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address -#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address -#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY -#define REG_DBG_SEL 0x0360 // Debug Selection Register -#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM -#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM -#define REG_WATCH_DOG 0x0368 - -// RTL8723 series ------------------------------- -#define REG_PCIE_HISR 0x03A0 - -// spec version 11 -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- -#define REG_VOQ_INFORMATION 0x0400 -#define REG_VIQ_INFORMATION 0x0404 -#define REG_BEQ_INFORMATION 0x0408 -#define REG_BKQ_INFORMATION 0x040C -#define REG_MGQ_INFORMATION 0x0410 -#define REG_HGQ_INFORMATION 0x0414 -#define REG_BCNQ_INFORMATION 0x0418 -#define REG_TXPKT_EMPTY 0x041A - -#define REG_CPU_MGQ_INFORMATION 0x041C -#define REG_FWHW_TXQ_CTRL 0x0420 -#define REG_HWSEQ_CTRL 0x0423 -#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 -#define REG_TXPKTBUF_MGQ_BDNY 0x0425 -#define REG_LIFETIME_EN 0x0426 -#define REG_MULTI_BCNQ_OFFSET 0x0427 -#define REG_SPEC_SIFS 0x0428 -#define REG_RL 0x042A -#define REG_DARFRC 0x0430 -#define REG_RARFRC 0x0438 -#define REG_RRSR 0x0440 -#define REG_ARFR0 0x0444 -#define REG_ARFR1 0x0448 -#define REG_ARFR2 0x044C -#define REG_ARFR3 0x0450 -#define REG_AGGLEN_LMT 0x0458 -#define REG_AMPDU_MIN_SPACE 0x045C -#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D -#define REG_FAST_EDCA_CTRL 0x0460 -#define REG_RD_RESP_PKT_TH 0x0463 -#define REG_INIRTS_RATE_SEL 0x0480 -//#define REG_INIDATA_RATE_SEL 0x0484 -#define REG_POWER_STATUS 0x04A4 -#define REG_POWER_STAGE1 0x04B4 -#define REG_POWER_STAGE2 0x04B8 -#define REG_PKT_VO_VI_LIFE_TIME 0x04C0 -#define REG_PKT_BE_BK_LIFE_TIME 0x04C2 -#define REG_STBC_SETTING 0x04C4 -#define REG_PROT_MODE_CTRL 0x04C8 -#define REG_MAX_AGGR_NUM 0x04CA -#define REG_RTS_MAX_AGGR_NUM 0x04CB -#define REG_BAR_MODE_CTRL 0x04CC -#define REG_RA_TRY_RATE_AGG_LMT 0x04CF -#define REG_EARLY_MODE_CONTROL 0x4D0 -#define REG_NQOS_SEQ 0x04DC -#define REG_QOS_SEQ 0x04DE -#define REG_NEED_CPU_HANDLE 0x04E0 -#define REG_PKT_LOSE_RPT 0x04E1 -#define REG_PTCL_ERR_STATUS 0x04E2 -#define REG_TX_RPT_CTRL 0x04EC -#define REG_TX_RPT_TIME 0x04F0 // 2 byte -#define REG_DUMMY 0x04FC - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- -#define REG_EDCA_VO_PARAM 0x0500 -#define REG_EDCA_VI_PARAM 0x0504 -#define REG_EDCA_BE_PARAM 0x0508 -#define REG_EDCA_BK_PARAM 0x050C -#define REG_BCNTCFG 0x0510 -#define REG_PIFS 0x0512 -#define REG_RDG_PIFS 0x0513 -#define REG_SIFS_CTX 0x0514 -#define REG_SIFS_TRX 0x0516 -#define REG_TSFTR_SYN_OFFSET 0x0518 -#define REG_AGGR_BREAK_TIME 0x051A -#define REG_SLOT 0x051B -#define REG_TX_PTCL_CTRL 0x0520 -#define REG_TXPAUSE 0x0522 -#define REG_DIS_TXREQ_CLR 0x0523 -#define REG_RD_CTRL 0x0524 -// -// Format for offset 540h-542h: -// [3:0]: TBTT prohibit setup in unit of 32us. The time for HW getting beacon content before TBTT. -// [7:4]: Reserved. -// [19:8]: TBTT prohibit hold in unit of 32us. The time for HW holding to send the beacon packet. -// [23:20]: Reserved -// Description: -// | -// |<--Setup--|--Hold------------>| -// --------------|---------------------- -// | -// TBTT -// Note: We cannot update beacon content to HW or send any AC packets during the time between Setup and Hold. -// Described by Designer Tim and Bruce, 2011-01-14. -// -#define REG_TBTT_PROHIBIT 0x0540 -#define REG_RD_NAV_NXT 0x0544 -#define REG_NAV_PROT_LEN 0x0546 -#define REG_BCN_CTRL 0x0550 -#define REG_BCN_CTRL_1 0x0551 -#define REG_MBID_NUM 0x0552 -#define REG_DUAL_TSF_RST 0x0553 -#define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE -#define REG_DRVERLYINT 0x0558 -#define REG_BCNDMATIM 0x0559 -#define REG_ATIMWND 0x055A -#define REG_BCN_MAX_ERR 0x055D -#define REG_RXTSF_OFFSET_CCK 0x055E -#define REG_RXTSF_OFFSET_OFDM 0x055F -#define REG_TSFTR 0x0560 -#define REG_TSFTR1 0x0568 -#define REG_ATIMWND_1 0x0570 -#define REG_PSTIMER 0x0580 -#define REG_TIMER0 0x0584 -#define REG_TIMER1 0x0588 -#define REG_ACMHWCTRL 0x05C0 - -//#define REG_FW_TSF_SYNC_CNT 0x04A0 -#define REG_FW_RESET_TSF_CNT_1 0x05FC -#define REG_FW_RESET_TSF_CNT_0 0x05FD -#define REG_FW_BCN_DIS_CNT 0x05FE - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- -#define REG_APSD_CTRL 0x0600 -#define REG_BWOPMODE 0x0603 -#define REG_TCR 0x0604 -#define REG_RCR 0x0608 -#define REG_RX_PKT_LIMIT 0x060C -#define REG_RX_DLK_TIME 0x060D -#define REG_RX_DRVINFO_SZ 0x060F - -#define REG_MACID 0x0610 -#define REG_BSSID 0x0618 -#define REG_MAR 0x0620 -#define REG_MBIDCAMCFG 0x0628 - -#define REG_USTIME_EDCA 0x0638 -#define REG_MAC_SPEC_SIFS 0x063A - -// 20100719 Joseph: Hardware register definition change. (HW datasheet v54) -#define REG_R2T_SIFS 0x063C // [15:8]SIFS_R2T_OFDM, [7:0]SIFS_R2T_CCK -#define REG_T2T_SIFS 0x063E // [15:8]SIFS_T2T_OFDM, [7:0]SIFS_T2T_CCK -#define REG_ACKTO 0x0640 -#define REG_CTS2TO 0x0641 -#define REG_EIFS 0x0642 - - -//RXERR_RPT -#define RXERR_TYPE_OFDM_PPDU 0 -#define RXERR_TYPE_OFDM_FALSE_ALARM 1 -#define RXERR_TYPE_OFDM_MPDU_OK 2 -#define RXERR_TYPE_OFDM_MPDU_FAIL 3 -#define RXERR_TYPE_CCK_PPDU 4 -#define RXERR_TYPE_CCK_FALSE_ALARM 5 -#define RXERR_TYPE_CCK_MPDU_OK 6 -#define RXERR_TYPE_CCK_MPDU_FAIL 7 -#define RXERR_TYPE_HT_PPDU 8 -#define RXERR_TYPE_HT_FALSE_ALARM 9 -#define RXERR_TYPE_HT_MPDU_TOTAL 10 -#define RXERR_TYPE_HT_MPDU_OK 11 -#define RXERR_TYPE_HT_MPDU_FAIL 12 -#define RXERR_TYPE_RX_FULL_DROP 15 - -#define RXERR_COUNTER_MASK 0xFFFFF -#define RXERR_RPT_RST BIT(27) -#define _RXERR_RPT_SEL(type) ((type) << 28) - - -// -// Note: -// The NAV upper value is very important to WiFi 11n 5.2.3 NAV test. The default value is -// always too small, but the WiFi TestPlan test by 25,000 microseconds of NAV through sending -// CTS in the air. We must update this value greater than 25,000 microseconds to pass the item. -// The offset of NAV_UPPER in 8192C Spec is incorrect, and the offset should be 0x0652. Commented -// by SD1 Scott. -// By Bruce, 2011-07-18. -// -#define REG_NAV_UPPER 0x0652 // unit of 128 - -//WMA, BA, CCX -//#define REG_NAV_CTRL 0x0650 -#define REG_BACAMCMD 0x0654 -#define REG_BACAMCONTENT 0x0658 -#define REG_LBDLY 0x0660 -#define REG_FWDLY 0x0661 -#define REG_RXERR_RPT 0x0664 -#define REG_WMAC_TRXPTCL_CTL 0x0668 - -// Security -#define REG_CAMCMD 0x0670 -#define REG_CAMWRITE 0x0674 -#define REG_CAMREAD 0x0678 -#define REG_CAMDBG 0x067C -#define REG_SECCFG 0x0680 - -// Power -#define REG_WOW_CTRL 0x0690 -#define REG_PS_RX_INFO 0x0692 -#define REG_UAPSD_TID 0x0693 -#define REG_WKFMCAM_CMD 0x0698 -#define REG_WKFMCAM_NUM_88E 0x698 -#define REG_RXFLTMAP0 0x06A0 -#define REG_RXFLTMAP1 0x06A2 -#define REG_RXFLTMAP2 0x06A4 -#define REG_BCN_PSR_RPT 0x06A8 -#define REG_BT_COEX_TABLE 0x06C0 - - -// Hardware Port 2 -#define REG_MACID1 0x0700 -#define REG_BSSID1 0x0708 - - -//----------------------------------------------------- -// -// 0xFE00h ~ 0xFE55h USB Configuration -// -//----------------------------------------------------- -#define REG_USB_INFO 0xFE17 -#define REG_USB_SPECIAL_OPTION 0xFE55 -#define REG_USB_DMA_AGG_TO 0xFE5B -#define REG_USB_AGG_TO 0xFE5C -#define REG_USB_AGG_TH 0xFE5D - - -// For normal chip -#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61 -#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63 -#define REG_NORMAL_SIE_OPTIONAL 0xFE64 -#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67 -#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B -#define REG_NORMAL_SIE_OPTIONAL2 0xFE6C -#define REG_NORMAL_SIE_GPS_EP 0xFE6D // 0xFE6D, for RTL8723 only. -#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 -#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF - - -//----------------------------------------------------- -// -// Redifine 8192C register definition for compatibility -// -//----------------------------------------------------- - -// TODO: use these definition when using REG_xxx naming rule. -// NOTE: DO NOT Remove these definition. Use later. - -#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. -#define EFUSE_TEST REG_EFUSE_TEST // E-Fuse Test. -#define MSR (REG_CR + 2) // Media Status register -#define ISR REG_HISR_88E -#define TSFR REG_TSFTR // Timing Sync Function Timer Register. - -#define PBP REG_PBP - -// Redifine MACID register, to compatible prior ICs. -#define IDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053 -#define IDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055 - - -// -// 9. Security Control Registers (Offset: ) -// -#define RWCAM REG_CAMCMD //IN 8190 Data Sheet is called CAMcmd -#define WCAMI REG_CAMWRITE // Software write CAM input content -#define RCAMO REG_CAMREAD // Software read/write CAM config -#define CAMDBG REG_CAMDBG -#define SECR REG_SECCFG //Security Configuration Register - -// Unused register -#define UnusedRegister 0x1BF -#define DCAM UnusedRegister -#define PSR UnusedRegister -#define BBAddr UnusedRegister -#define PhyDataR UnusedRegister - -// Min Spacing related settings. -#define MAX_MSS_DENSITY_2T 0x13 -#define MAX_MSS_DENSITY_1T 0x0A - -//---------------------------------------------------------------------------- -// 8192C Cmd9346CR bits (Offset 0xA, 16bit) -//---------------------------------------------------------------------------- -#define CmdEEPROM_En BIT5 // EEPROM enable when set 1 -#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 -#define Cmd9346CR_9356SEL BIT4 - -//---------------------------------------------------------------------------- -// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) -//---------------------------------------------------------------------------- -#define GPIOSEL_GPIO 0 -#define GPIOSEL_ENBT BIT5 - -//---------------------------------------------------------------------------- -// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) -//---------------------------------------------------------------------------- -#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value -#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value -#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. -#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) - -//---------------------------------------------------------------------------- -// 8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte) -//---------------------------------------------------------------------------- -#define HSIMR_GPIO12_0_INT_EN BIT0 -#define HSIMR_SPS_OCP_INT_EN BIT5 -#define HSIMR_RON_INT_EN BIT6 -#define HSIMR_PDN_INT_EN BIT7 -#define HSIMR_GPIO9_INT_EN BIT25 - - -//---------------------------------------------------------------------------- -// 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) -//---------------------------------------------------------------------------- -#define HSISR_GPIO12_0_INT BIT0 -#define HSISR_SPS_OCP_INT BIT5 -#define HSISR_RON_INT_EN BIT6 -#define HSISR_PDNINT BIT7 -#define HSISR_GPIO9_INT BIT25 - -//---------------------------------------------------------------------------- -// 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) -//---------------------------------------------------------------------------- -/* -Network Type -00: No link -01: Link in ad hoc network -10: Link in infrastructure network -11: AP mode -Default: 00b. -*/ -#define MSR_NOLINK 0x00 -#define MSR_ADHOC 0x01 -#define MSR_INFRA 0x02 -#define MSR_AP 0x03 - -//---------------------------------------------------------------------------- -// 88EU (MSR) Media Status Register (Offset 0x4C, 8 bits) -//---------------------------------------------------------------------------- -#define USB_INTR_CONTENT_C2H_OFFSET 0 -#define USB_INTR_CONTENT_CPWM1_OFFSET 16 -#define USB_INTR_CONTENT_CPWM2_OFFSET 20 -#define USB_INTR_CONTENT_HISR_OFFSET 48 -#define USB_INTR_CONTENT_HISRE_OFFSET 52 - - -//---------------------------------------------------------------------------- -// 88E Driver Initialization Offload REG_FDHM0(Offset 0x88, 8 bits) -//---------------------------------------------------------------------------- -//IOL config for REG_FDHM0(Reg0x88) -#define CMD_INIT_LLT BIT0 -#define CMD_READ_EFUSE_MAP BIT1 -#define CMD_EFUSE_PATCH BIT2 -#define CMD_IOCONFIG BIT3 -#define CMD_INIT_LLT_ERR BIT4 -#define CMD_READ_EFUSE_MAP_ERR BIT5 -#define CMD_EFUSE_PATCH_ERR BIT6 -#define CMD_IOCONFIG_ERR BIT7 - -// -// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF) -// -//---------------------------------------------------------------------------- -// 8192C Response Rate Set Register (offset 0x181, 24bits) -//---------------------------------------------------------------------------- -#define RRSR_1M BIT0 -#define RRSR_2M BIT1 -#define RRSR_5_5M BIT2 -#define RRSR_11M BIT3 -#define RRSR_6M BIT4 -#define RRSR_9M BIT5 -#define RRSR_12M BIT6 -#define RRSR_18M BIT7 -#define RRSR_24M BIT8 -#define RRSR_36M BIT9 -#define RRSR_48M BIT10 -#define RRSR_54M BIT11 -#define RRSR_MCS0 BIT12 -#define RRSR_MCS1 BIT13 -#define RRSR_MCS2 BIT14 -#define RRSR_MCS3 BIT15 -#define RRSR_MCS4 BIT16 -#define RRSR_MCS5 BIT17 -#define RRSR_MCS6 BIT18 -#define RRSR_MCS7 BIT19 - -//---------------------------------------------------------------------------- -// 8192C Response Rate Set Register (offset 0x1BF, 8bits) -//---------------------------------------------------------------------------- -// WOL bit information -#define HAL92C_WOL_PTK_UPDATE_EVENT BIT0 -#define HAL92C_WOL_GTK_UPDATE_EVENT BIT1 - -//---------------------------------------------------------------------------- -// 8192C BW_OPMODE bits (Offset 0x203, 8bit) -//---------------------------------------------------------------------------- -#define BW_OPMODE_20MHZ BIT2 -#define BW_OPMODE_5G BIT1 - - -//---------------------------------------------------------------------------- -// 8192C CAM Config Setting (offset 0x250, 1 byte) -//---------------------------------------------------------------------------- -#define CAM_VALID BIT15 -#define CAM_NOTVALID 0x0000 -#define CAM_USEDK BIT5 - -#define CAM_CONTENT_COUNT 8 - -#define CAM_NONE 0x0 -#define CAM_WEP40 0x01 -#define CAM_TKIP 0x02 -#define CAM_AES 0x04 -#define CAM_WEP104 0x05 -#define CAM_SMS4 0x6 - -#define TOTAL_CAM_ENTRY 32 -#define HALF_CAM_ENTRY 16 - -#define CAM_CONFIG_USEDK _TRUE -#define CAM_CONFIG_NO_USEDK _FALSE - -#define CAM_WRITE BIT16 -#define CAM_READ 0x00000000 -#define CAM_POLLINIG BIT31 - -#define SCR_UseDK 0x01 -#define SCR_TxSecEnable 0x02 -#define SCR_RxSecEnable 0x04 - -// -// 10. Power Save Control Registers (Offset: 0x0260 - 0x02DF) -// -#define WOW_PMEN BIT0 // Power management Enable. -#define WOW_WOMEN BIT1 // WoW function on or off. -#define WOW_MAGIC BIT2 // Magic packet -#define WOW_UWF BIT3 // Unicast Wakeup frame. - -// -// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F) -// -//---------------------------------------------------------------------------- -//---------------------------------------------------------------------------- -// 8188 IMR/ISR bits -//---------------------------------------------------------------------------- -#define IMR_DISABLED_88E 0x0 -// IMR DW0(0x0060-0063) Bit 0-31 -#define IMR_TXCCK_88E BIT30 // TXRPT interrupt when CCX bit of the packet is set -#define IMR_PSTIMEOUT_88E BIT29 // Power Save Time Out Interrupt -#define IMR_GTINT4_88E BIT28 // When GTIMER4 expires, this bit is set to 1 -#define IMR_GTINT3_88E BIT27 // When GTIMER3 expires, this bit is set to 1 -#define IMR_TBDER_88E BIT26 // Transmit Beacon0 Error -#define IMR_TBDOK_88E BIT25 // Transmit Beacon0 OK -#define IMR_TSF_BIT32_TOGGLE_88E BIT24 // TSF Timer BIT32 toggle indication interrupt -#define IMR_BCNDMAINT0_88E BIT20 // Beacon DMA Interrupt 0 -#define IMR_BCNDERR0_88E BIT16 // Beacon Queue DMA Error 0 -#define IMR_HSISR_IND_ON_INT_88E BIT15 // HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) -#define IMR_BCNDMAINT_E_88E BIT14 // Beacon DMA Interrupt Extension for Win7 -#define IMR_ATIMEND_88E BIT12 // CTWidnow End or ATIM Window End -#define IMR_HISR1_IND_INT_88E BIT11 // HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1) -#define IMR_C2HCMD_88E BIT10 // CPU to Host Command INT Status, Write 1 clear -#define IMR_CPWM2_88E BIT9 // CPU power Mode exchange INT Status, Write 1 clear -#define IMR_CPWM_88E BIT8 // CPU power Mode exchange INT Status, Write 1 clear -#define IMR_HIGHDOK_88E BIT7 // High Queue DMA OK -#define IMR_MGNTDOK_88E BIT6 // Management Queue DMA OK -#define IMR_BKDOK_88E BIT5 // AC_BK DMA OK -#define IMR_BEDOK_88E BIT4 // AC_BE DMA OK -#define IMR_VIDOK_88E BIT3 // AC_VI DMA OK -#define IMR_VODOK_88E BIT2 // AC_VO DMA OK -#define IMR_RDU_88E BIT1 // Rx Descriptor Unavailable -#define IMR_ROK_88E BIT0 // Receive DMA OK - -// IMR DW1(0x00B4-00B7) Bit 0-31 -#define IMR_BCNDMAINT7_88E BIT27 // Beacon DMA Interrupt 7 -#define IMR_BCNDMAINT6_88E BIT26 // Beacon DMA Interrupt 6 -#define IMR_BCNDMAINT5_88E BIT25 // Beacon DMA Interrupt 5 -#define IMR_BCNDMAINT4_88E BIT24 // Beacon DMA Interrupt 4 -#define IMR_BCNDMAINT3_88E BIT23 // Beacon DMA Interrupt 3 -#define IMR_BCNDMAINT2_88E BIT22 // Beacon DMA Interrupt 2 -#define IMR_BCNDMAINT1_88E BIT21 // Beacon DMA Interrupt 1 -#define IMR_BCNDERR7_88E BIT20 // Beacon Queue DMA Error Interrup 7 -#define IMR_BCNDERR6_88E BIT19 // Beacon Queue DMA Error Interrup 6 -#define IMR_BCNDERR5_88E BIT18 // Beacon Queue DMA Error Interrup 5 -#define IMR_BCNDERR4_88E BIT17 // Beacon Queue DMA Error Interrup 4 -#define IMR_BCNDERR3_88E BIT16 // Beacon Queue DMA Error Interrup 3 -#define IMR_BCNDERR2_88E BIT15 // Beacon Queue DMA Error Interrup 2 -#define IMR_BCNDERR1_88E BIT14 // Beacon Queue DMA Error Interrup 1 -#define IMR_ATIMEND_E_88E BIT13 // ATIM Window End Extension for Win7 -#define IMR_TXERR_88E BIT11 // Tx Error Flag Interrupt Status, write 1 clear. -#define IMR_RXERR_88E BIT10 // Rx Error Flag INT Status, Write 1 clear -#define IMR_TXFOVW_88E BIT9 // Transmit FIFO Overflow -#define IMR_RXFOVW_88E BIT8 // Receive FIFO Overflow - -#define HAL_NIC_UNPLUG_ISR 0xFFFFFFFF // The value when the NIC is unplugged for PCI. - - -#ifdef CONFIG_PCI_HCI -//#define IMR_RX_MASK (IMR_ROK_88E|IMR_RDU_88E|IMR_RXFOVW_88E) -#define IMR_TX_MASK (IMR_VODOK_88E|IMR_VIDOK_88E|IMR_BEDOK_88E|IMR_BKDOK_88E|IMR_MGNTDOK_88E|IMR_HIGHDOK_88E|IMR_BCNDERR0_88E) - -#ifdef CONFIG_CONCURRENT_MODE -#define RT_IBSS_INT_MASKS (IMR_BCNDMAINT0_88E | IMR_TBDOK_88E | IMR_TBDER_88E | IMR_BCNDMAINT_E_88E) -#else -#define RT_IBSS_INT_MASKS (IMR_BCNDMAINT0_88E | IMR_TBDOK_88E | IMR_TBDER_88E) -#endif - -#define RT_AC_INT_MASKS (IMR_VIDOK_88E | IMR_VODOK_88E | IMR_BEDOK_88E|IMR_BKDOK_88E) -#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS) -#endif - - -// 8192C EFUSE -//---------------------------------------------------------------------------- -#define HWSET_MAX_SIZE 256 -#define HWSET_MAX_SIZE_88E 512 - - - -/*=================================================================== -===================================================================== -Here the register defines are for 92C. When the define is as same with 92C, -we will use the 92C's define for the consistency -So the following defines for 92C is not entire!!!!!! -===================================================================== -=====================================================================*/ -/* -Based on Datasheet V33---090401 -Register Summary -Current IOREG MAP -0x0000h ~ 0x00FFh System Configuration (256 Bytes) -0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) -0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) -0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) -0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) -0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) -0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) -0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) -0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) -*/ - //---------------------------------------------------------------------------- - // 8192C (TXPAUSE) transmission pause (Offset 0x522, 8 bits) - //---------------------------------------------------------------------------- -// Note: -// The the bits of stoping AC(VO/VI/BE/BK) queue in datasheet RTL8192S/RTL8192C are wrong, -// the correct arragement is VO - Bit0, VI - Bit1, BE - Bit2, and BK - Bit3. -// 8723 and 88E may be not correct either in the eralier version. Confirmed with DD Tim. -// By Bruce, 2011-09-22. -#define StopBecon BIT6 -#define StopHigh BIT5 -#define StopMgt BIT4 -#define StopBK BIT3 -#define StopBE BIT2 -#define StopVI BIT1 -#define StopVO BIT0 - -//---------------------------------------------------------------------------- -// 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits) -//---------------------------------------------------------------------------- -#define RCR_APPFCS BIT31 //WMAC append FCS after pauload -#define RCR_APP_MIC BIT30 // -#define RCR_APP_PHYSTS BIT28// -#define RCR_APP_ICV BIT29 // -#define RCR_APP_PHYST_RXFF BIT28 // -#define RCR_APP_BA_SSN BIT27 //Accept BA SSN -#define RCR_ENMBID BIT24 //Enable Multiple BssId. -#define RCR_LSIGEN BIT23 -#define RCR_MFBEN BIT22 -#define RCR_HTC_LOC_CTRL BIT14 //MFC<--HTC=1 MFC-->HTC=0 -#define RCR_AMF BIT13 //Accept management type frame -#define RCR_ACF BIT12 //Accept control type frame -#define RCR_ADF BIT11 //Accept data type frame -#define RCR_AICV BIT9 //Accept ICV error packet -#define RCR_ACRC32 BIT8 //Accept CRC32 error packet -#define RCR_CBSSID_BCN BIT7 //Accept BSSID match packet (Rx beacon, probe rsp) -#define RCR_CBSSID_DATA BIT6 //Accept BSSID match packet (Data) -#define RCR_CBSSID RCR_CBSSID_DATA //Accept BSSID match packet -#define RCR_APWRMGT BIT5 //Accept power management packet -#define RCR_ADD3 BIT4 //Accept address 3 match packet -#define RCR_AB BIT3 //Accept broadcast packet -#define RCR_AM BIT2 //Accept multicast packet -#define RCR_APM BIT1 //Accept physical match packet -#define RCR_AAP BIT0 //Accept all unicast packet -#define RCR_MXDMA_OFFSET 8 -#define RCR_FIFO_OFFSET 13 - -//----------------------------------------------------- -// -// 0xFE00h ~ 0xFE55h USB Configuration -// -//----------------------------------------------------- -#define REG_USB_INFO 0xFE17 -#define REG_USB_SPECIAL_OPTION 0xFE55 -#define REG_USB_DMA_AGG_TO 0xFE5B -#define REG_USB_AGG_TO 0xFE5C -#define REG_USB_AGG_TH 0xFE5D - -#define REG_USB_HRPWM 0xFE58 -#define REG_USB_HCPWM 0xFE57 - -//============================================================================ -// 8192C Regsiter Bit and Content definition -//============================================================================ -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- - -//2 SYS_ISO_CTRL -#define ISO_MD2PP BIT(0) -#define ISO_UA2USB BIT(1) -#define ISO_UD2CORE BIT(2) -#define ISO_PA2PCIE BIT(3) -#define ISO_PD2CORE BIT(4) -#define ISO_IP2MAC BIT(5) -#define ISO_DIOP BIT(6) -#define ISO_DIOE BIT(7) -#define ISO_EB2CORE BIT(8) -#define ISO_DIOR BIT(9) -#define PWC_EV12V BIT(15) - - -//2 SYS_FUNC_EN -#define FEN_BBRSTB BIT(0) -#define FEN_BB_GLB_RSTn BIT(1) -#define FEN_USBA BIT(2) -#define FEN_UPLL BIT(3) -#define FEN_USBD BIT(4) -#define FEN_DIO_PCIE BIT(5) -#define FEN_PCIEA BIT(6) -#define FEN_PPLL BIT(7) -#define FEN_PCIED BIT(8) -#define FEN_DIOE BIT(9) -#define FEN_CPUEN BIT(10) -#define FEN_DCORE BIT(11) -#define FEN_ELDR BIT(12) -#define FEN_DIO_RF BIT(13) -#define FEN_HWPDN BIT(14) -#define FEN_MREGEN BIT(15) - -//2 APS_FSMCO -#define PFM_LDALL BIT(0) -#define PFM_ALDN BIT(1) -#define PFM_LDKP BIT(2) -#define PFM_WOWL BIT(3) -#define EnPDN BIT(4) -#define PDN_PL BIT(5) -#define APFM_ONMAC BIT(8) -#define APFM_OFF BIT(9) -#define APFM_RSM BIT(10) -#define AFSM_HSUS BIT(11) -#define AFSM_PCIE BIT(12) -#define APDM_MAC BIT(13) -#define APDM_HOST BIT(14) -#define APDM_HPDN BIT(15) -#define RDY_MACON BIT(16) -#define SUS_HOST BIT(17) -#define ROP_ALD BIT(20) -#define ROP_PWR BIT(21) -#define ROP_SPS BIT(22) -#define SOP_MRST BIT(25) -#define SOP_FUSE BIT(26) -#define SOP_ABG BIT(27) -#define SOP_AMB BIT(28) -#define SOP_RCK BIT(29) -#define SOP_A8M BIT(30) -#define XOP_BTCK BIT(31) - -//2 SYS_CLKR -#define ANAD16V_EN BIT(0) -#define ANA8M BIT(1) -#define MACSLP BIT(4) -#define LOADER_CLK_EN BIT(5) - - -//2 9346CR - -#define BOOT_FROM_EEPROM BIT(4) -#define EEPROM_EN BIT(5) - - -//2 SPS0_CTRL - - -//2 SPS_OCP_CFG - - -//2 RF_CTRL -#define RF_EN BIT(0) -#define RF_RSTB BIT(1) -#define RF_SDMRSTB BIT(2) - - - -//2 LDOV12D_CTRL -#define LDV12_EN BIT(0) -#define LDV12_SDBY BIT(1) -#define LPLDO_HSM BIT(2) -#define LPLDO_LSM_DIS BIT(3) -#define _LDV12_VADJ(x) (((x) & 0xF) << 4) - - -//2EFUSE_CTRL -#define ALD_EN BIT(18) -#define EF_PD BIT(19) -#define EF_FLAG BIT(31) - -//2 EFUSE_TEST (For RTL8723 partially) -#define EF_TRPT BIT(7) -#define EF_CELL_SEL (BIT(8)|BIT(9)) // 00: Wifi Efuse, 01: BT Efuse0, 10: BT Efuse1, 11: BT Efuse2 -#define LDOE25_EN BIT(31) -#define EFUSE_SEL(x) (((x) & 0x3) << 8) -#define EFUSE_SEL_MASK 0x300 -#define EFUSE_WIFI_SEL_0 0x0 -#define EFUSE_BT_SEL_0 0x1 -#define EFUSE_BT_SEL_1 0x2 -#define EFUSE_BT_SEL_2 0x3 - -#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only. -#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only. - - -//2 8051FWDL -//2 MCUFWDL -#define MCUFWDL_EN BIT(0) -#define MCUFWDL_RDY BIT(1) -#define FWDL_ChkSum_rpt BIT(2) -#define MACINI_RDY BIT(3) -#define BBINI_RDY BIT(4) -#define RFINI_RDY BIT(5) -#define WINTINI_RDY BIT(6) -#define RAM_DL_SEL BIT(7) // 1:RAM, 0:ROM -#define ROM_DLEN BIT(19) -#define CPRST BIT(23) - - - -//2 REG_SYS_CFG -#define XCLK_VLD BIT(0) -#define ACLK_VLD BIT(1) -#define UCLK_VLD BIT(2) -#define PCLK_VLD BIT(3) -#define PCIRSTB BIT(4) -#define V15_VLD BIT(5) -#define SW_OFFLOAD_EN BIT(7) -#define SIC_IDLE BIT(8) -#define BD_MAC2 BIT(9) -#define BD_MAC1 BIT(10) -#define IC_MACPHY_MODE BIT(11) -#define CHIP_VER (BIT(12)|BIT(13)|BIT(14)|BIT(15)) -#define BT_FUNC BIT(16) -#define VENDOR_ID BIT(19) -#define PAD_HWPD_IDN BIT(22) -#define TRP_VAUX_EN BIT(23) // RTL ID -#define TRP_BT_EN BIT(24) -#define BD_PKG_SEL BIT(25) -#define BD_HCI_SEL BIT(26) -#define TYPE_ID BIT(27) - -#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15 -#define CHIP_VER_RTL_SHIFT 12 - - -//2REG_GPIO_OUTSTS (For RTL8723 only) -#define EFS_HCI_SEL (BIT(0)|BIT(1)) -#define PAD_HCI_SEL (BIT(2)|BIT(3)) -#define HCI_SEL (BIT(4)|BIT(5)) -#define PKG_SEL_HCI BIT(6) -#define FEN_GPS BIT(7) -#define FEN_BT BIT(8) -#define FEN_WL BIT(9) -#define FEN_PCI BIT(10) -#define FEN_USB BIT(11) -#define BTRF_HWPDN_N BIT(12) -#define WLRF_HWPDN_N BIT(13) -#define PDN_BT_N BIT(14) -#define PDN_GPS_N BIT(15) -#define BT_CTL_HWPDN BIT(16) -#define GPS_CTL_HWPDN BIT(17) -#define PPHY_SUSB BIT(20) -#define UPHY_SUSB BIT(21) -#define PCI_SUSEN BIT(22) -#define USB_SUSEN BIT(23) -#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28)) - - -//2SYS_CFG -#define RTL_ID BIT(23) // TestChip ID, 1:Test(RLE); 0:MP(RL) - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- - - -//2 Function Enable Registers -//2 CR - - - -#define HCI_TXDMA_EN BIT(0) -#define HCI_RXDMA_EN BIT(1) -#define TXDMA_EN BIT(2) -#define RXDMA_EN BIT(3) -#define PROTOCOL_EN BIT(4) -#define SCHEDULE_EN BIT(5) -#define MACTXEN BIT(6) -#define MACRXEN BIT(7) -#define ENSWBCN BIT(8) -#define ENSEC BIT(9) -#define CALTMR_EN BIT(10) // 32k CAL TMR enable - -// Network type -#define _NETTYPE(x) (((x) & 0x3) << 16) -#define MASK_NETTYPE 0x30000 -#define NT_NO_LINK 0x0 -#define NT_LINK_AD_HOC 0x1 -#define NT_LINK_AP 0x2 -#define NT_AS_AP 0x3 - - - -//2 PBP - Page Size Register -#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) -#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) -#define _PSRX_MASK 0xF -#define _PSTX_MASK 0xF0 -#define _PSRX(x) (x) -#define _PSTX(x) ((x) << 4) - -#define PBP_64 0x0 -#define PBP_128 0x1 -#define PBP_256 0x2 -#define PBP_512 0x3 -#define PBP_1024 0x4 - - -//2 TX/RXDMA -#define RXDMA_ARBBW_EN BIT(0) -#define RXSHFT_EN BIT(1) -#define RXDMA_AGG_EN BIT(2) -#define QS_VO_QUEUE BIT(8) -#define QS_VI_QUEUE BIT(9) -#define QS_BE_QUEUE BIT(10) -#define QS_BK_QUEUE BIT(11) -#define QS_MANAGER_QUEUE BIT(12) -#define QS_HIGH_QUEUE BIT(13) - -#define HQSEL_VOQ BIT(0) -#define HQSEL_VIQ BIT(1) -#define HQSEL_BEQ BIT(2) -#define HQSEL_BKQ BIT(3) -#define HQSEL_MGTQ BIT(4) -#define HQSEL_HIQ BIT(5) - -// For normal driver, 0x10C -#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) -#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) -#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10) -#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 ) -#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 ) -#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 ) - -#define QUEUE_LOW 1 -#define QUEUE_NORMAL 2 -#define QUEUE_HIGH 3 - - - -//2 TRXFF_BNDY - - -//2 LLT_INIT -#define _LLT_NO_ACTIVE 0x0 -#define _LLT_WRITE_ACCESS 0x1 -#define _LLT_READ_ACCESS 0x2 - -#define _LLT_INIT_DATA(x) ((x) & 0xFF) -#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) -#define _LLT_OP(x) (((x) & 0x3) << 30) -#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) - - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- -//2RQPN -#define _HPQ(x) ((x) & 0xFF) -#define _LPQ(x) (((x) & 0xFF) << 8) -#define _PUBQ(x) (((x) & 0xFF) << 16) -#define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register - - -#define HPQ_PUBLIC_DIS BIT(24) -#define LPQ_PUBLIC_DIS BIT(25) -#define LD_RQPN BIT(31) - - -//2TDECTRL -#define BCN_VALID BIT(16) -#define BCN_HEAD(x) (((x) & 0xFF) << 8) -#define BCN_HEAD_MASK 0xFF00 - - -//2 TDECTL -#define BLK_DESC_NUM_SHIFT 4 -#define BLK_DESC_NUM_MASK 0xF - - -//2 TXDMA_OFFSET_CHK -#define DROP_DATA_EN BIT(9) - - - - -//----------------------------------------------------- -// -// 0x0280h ~ 0x028Bh RX DMA Configuration -// -//----------------------------------------------------- - -// REG_RXDMA_CONTROL, 0x0286h -// Write only. When this bit is set, RXDMA will decrease RX PKT counter by one. Before -// this bit is polled, FW shall update RXFF_RD_PTR first. This register is write pulse and auto clear. -//#define RXPKT_RELEASE_POLL BIT(0) -// Read only. When RXMA finishes on-going DMA operation, RXMDA will report idle state in -// this bit. FW can start releasing packets after RXDMA entering idle mode. -//#define RXDMA_IDLE BIT(1) -// When this bit is set, RXDMA will enter this mode after on-going RXDMA packet to host -// completed, and stop DMA packet to host. RXDMA will then report Default: 0; -//#define RW_RELEASE_EN BIT(2) - -//2 REG_RXPKT_NUM, 0x0284 -#define RXPKT_RELEASE_POLL BIT(16) -#define RXDMA_IDLE BIT(17) -#define RW_RELEASE_EN BIT(18) - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- -//2 FWHW_TXQ_CTRL -#define EN_AMPDU_RTY_NEW BIT(7) - - -//2 SPEC SIFS -#define _SPEC_SIFS_CCK(x) ((x) & 0xFF) -#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) - -//2 RL -#define RETRY_LIMIT_SHORT_SHIFT 8 -#define RETRY_LIMIT_LONG_SHIFT 0 - - - - - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- - - - -//2 EDCA setting -#define AC_PARAM_TXOP_LIMIT_OFFSET 16 -#define AC_PARAM_ECW_MAX_OFFSET 12 -#define AC_PARAM_ECW_MIN_OFFSET 8 -#define AC_PARAM_AIFS_OFFSET 0 - - - -#define _LRL(x) ((x) & 0x3F) -#define _SRL(x) (((x) & 0x3F) << 8) - - -//2 BCN_CTRL -#define EN_MBSSID BIT(1) -#define EN_TXBCN_RPT BIT(2) -#define EN_BCN_FUNCTION BIT(3) -#define DIS_TSF_UPDATE BIT(3) - -// The same function but different bit field. -#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) -#define DIS_TSF_UDT0_TEST_CHIP BIT(5) -#define STOP_BCNQ BIT(6) - - -//2 ACMHWCTRL -#define AcmHw_HwEn BIT(0) -#define AcmHw_BeqEn BIT(1) -#define AcmHw_ViqEn BIT(2) -#define AcmHw_VoqEn BIT(3) -#define AcmHw_BeqStatus BIT(4) -#define AcmHw_ViqStatus BIT(5) -#define AcmHw_VoqStatus BIT(6) - - - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- -//2APSD_CTRL -#define APSDOFF BIT(6) -#define APSDOFF_STATUS BIT(7) - - -#define RATE_BITMAP_ALL 0xFFFFF - -// Only use CCK 1M rate for ACK -#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 - -//2 TCR -#define TSFRST BIT(0) -#define DIS_GCLK BIT(1) -#define PAD_SEL BIT(2) -#define PWR_ST BIT(6) -#define PWRBIT_OW_EN BIT(7) -#define ACRC BIT(8) -#define CFENDFORM BIT(9) -#define ICV BIT(10) - - - -//2 RCR -#define AAP BIT(0) -#define APM BIT(1) -#define AM BIT(2) -#define AB BIT(3) -#define ADD3 BIT(4) -#define APWRMGT BIT(5) -#define CBSSID BIT(6) -#define CBSSID_DATA BIT(6) -#define CBSSID_BCN BIT(7) -#define ACRC32 BIT(8) -#define AICV BIT(9) -#define ADF BIT(11) -#define ACF BIT(12) -#define AMF BIT(13) -#define HTC_LOC_CTRL BIT(14) -#define UC_DATA_EN BIT(16) -#define BM_DATA_EN BIT(17) -#define MFBEN BIT(22) -#define LSIGEN BIT(23) -#define EnMBID BIT(24) -#define APP_BASSN BIT(27) -#define APP_PHYSTS BIT(28) -#define APP_ICV BIT(29) -#define APP_MIC BIT(30) -#define APP_FCS BIT(31) - - -//2 SECCFG -#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key -#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key -#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption -#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption -#define SCR_SKByA2 BIT(4) //Search kEY BY A2 -#define SCR_NoSKMC BIT(5) //No Key Search Multicast -#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key -#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key - - -//----------------------------------------------------- -// -// RTL8188E SDIO Configuration -// -//----------------------------------------------------- - -// I/O bus domain address mapping -#define SDIO_LOCAL_BASE 0x10250000 -#define WLAN_IOREG_BASE 0x10260000 -#define FIRMWARE_FIFO_BASE 0x10270000 -#define TX_HIQ_BASE 0x10310000 -#define TX_MIQ_BASE 0x10320000 -#define TX_LOQ_BASE 0x10330000 -#define RX_RX0FF_BASE 0x10340000 - -// SDIO host local register space mapping. -#define SDIO_LOCAL_MSK 0x0FFF -#define WLAN_IOREG_MSK 0x7FFF -#define WLAN_FIFO_MSK 0x1FFF // Aggregation Length[12:0] -#define WLAN_RX0FF_MSK 0x0003 - -#define SDIO_WITHOUT_REF_DEVICE_ID 0 // Without reference to the SDIO Device ID -#define SDIO_LOCAL_DEVICE_ID 0 // 0b[16], 000b[15:13] -#define WLAN_TX_HIQ_DEVICE_ID 4 // 0b[16], 100b[15:13] -#define WLAN_TX_MIQ_DEVICE_ID 5 // 0b[16], 101b[15:13] -#define WLAN_TX_LOQ_DEVICE_ID 6 // 0b[16], 110b[15:13] -#define WLAN_RX0FF_DEVICE_ID 7 // 0b[16], 111b[15:13] -#define WLAN_IOREG_DEVICE_ID 8 // 1b[16] - -// SDIO Tx Free Page Index -#define HI_QUEUE_IDX 0 -#define MID_QUEUE_IDX 1 -#define LOW_QUEUE_IDX 2 -#define PUBLIC_QUEUE_IDX 3 - -#define SDIO_MAX_TX_QUEUE 3 // HIQ, MIQ and LOQ -#define SDIO_MAX_RX_QUEUE 1 - -#define SDIO_REG_TX_CTRL 0x0000 // SDIO Tx Control -#define SDIO_REG_HIMR 0x0014 // SDIO Host Interrupt Mask -#define SDIO_REG_HISR 0x0018 // SDIO Host Interrupt Service Routine -#define SDIO_REG_HCPWM 0x0019 // HCI Current Power Mode -#define SDIO_REG_RX0_REQ_LEN 0x001C // RXDMA Request Length -#define SDIO_REG_FREE_TXPG 0x0020 // Free Tx Buffer Page -#define SDIO_REG_HCPWM1 0x0024 // HCI Current Power Mode 1 -#define SDIO_REG_HCPWM2 0x0026 // HCI Current Power Mode 2 -#define SDIO_REG_HTSFR_INFO 0x0030 // HTSF Informaion -#define SDIO_REG_HRPWM1 0x0080 // HCI Request Power Mode 1 -#define SDIO_REG_HRPWM2 0x0082 // HCI Request Power Mode 2 -#define SDIO_REG_HPS_CLKR 0x0084 // HCI Power Save Clock -#define SDIO_REG_HSUS_CTRL 0x0086 // SDIO HCI Suspend Control -#define SDIO_REG_HIMR_ON 0x0090 // SDIO Host Extension Interrupt Mask Always -#define SDIO_REG_HISR_ON 0x0091 // SDIO Host Extension Interrupt Status Always - -#define SDIO_HIMR_DISABLED 0 - -// RTL8188E SDIO Host Interrupt Mask Register -#define SDIO_HIMR_RX_REQUEST_MSK BIT0 -#define SDIO_HIMR_AVAL_MSK BIT1 -#define SDIO_HIMR_TXERR_MSK BIT2 -#define SDIO_HIMR_RXERR_MSK BIT3 -#define SDIO_HIMR_TXFOVW_MSK BIT4 -#define SDIO_HIMR_RXFOVW_MSK BIT5 -#define SDIO_HIMR_TXBCNOK_MSK BIT6 -#define SDIO_HIMR_TXBCNERR_MSK BIT7 -#define SDIO_HIMR_BCNERLY_INT_MSK BIT16 -#define SDIO_HIMR_C2HCMD_MSK BIT17 -#define SDIO_HIMR_CPWM1_MSK BIT18 -#define SDIO_HIMR_CPWM2_MSK BIT19 -#define SDIO_HIMR_HSISR_IND_MSK BIT20 -#define SDIO_HIMR_GTINT3_IND_MSK BIT21 -#define SDIO_HIMR_GTINT4_IND_MSK BIT22 -#define SDIO_HIMR_PSTIMEOUT_MSK BIT23 -#define SDIO_HIMR_OCPINT_MSK BIT24 -#define SDIO_HIMR_ATIMEND_MSK BIT25 -#define SDIO_HIMR_ATIMEND_E_MSK BIT26 -#define SDIO_HIMR_CTWEND_MSK BIT27 - -//RTL8188E SDIO Specific -#define SDIO_HIMR_MCU_ERR_MSK BIT28 -#define SDIO_HIMR_TSF_BIT32_TOGGLE_MSK BIT29 - -// SDIO Host Interrupt Service Routine -#define SDIO_HISR_RX_REQUEST BIT0 -#define SDIO_HISR_AVAL BIT1 -#define SDIO_HISR_TXERR BIT2 -#define SDIO_HISR_RXERR BIT3 -#define SDIO_HISR_TXFOVW BIT4 -#define SDIO_HISR_RXFOVW BIT5 -#define SDIO_HISR_TXBCNOK BIT6 -#define SDIO_HISR_TXBCNERR BIT7 -#define SDIO_HISR_BCNERLY_INT BIT16 -#define SDIO_HISR_C2HCMD BIT17 -#define SDIO_HISR_CPWM1 BIT18 -#define SDIO_HISR_CPWM2 BIT19 -#define SDIO_HISR_HSISR_IND BIT20 -#define SDIO_HISR_GTINT3_IND BIT21 -#define SDIO_HISR_GTINT4_IND BIT22 -#define SDIO_HISR_PSTIMEOUT BIT23 -#define SDIO_HISR_OCPINT BIT24 -#define SDIO_HISR_ATIMEND BIT25 -#define SDIO_HISR_ATIMEND_E BIT26 -#define SDIO_HISR_CTWEND BIT27 - -//RTL8188E SDIO Specific -#define SDIO_HISR_MCU_ERR BIT28 -#define SDIO_HISR_TSF_BIT32_TOGGLE BIT29 - -#define MASK_SDIO_HISR_CLEAR (SDIO_HISR_TXERR |\ - SDIO_HISR_RXERR |\ - SDIO_HISR_TXFOVW |\ - SDIO_HISR_RXFOVW |\ - SDIO_HISR_TXBCNOK |\ - SDIO_HISR_TXBCNERR |\ - SDIO_HISR_C2HCMD |\ - SDIO_HISR_CPWM1 |\ - SDIO_HISR_CPWM2 |\ - SDIO_HISR_HSISR_IND |\ - SDIO_HISR_GTINT3_IND |\ - SDIO_HISR_GTINT4_IND |\ - SDIO_HISR_PSTIMEOUT |\ - SDIO_HISR_OCPINT) - -// SDIO HCI Suspend Control Register -#define HCI_RESUME_PWR_RDY BIT1 -#define HCI_SUS_CTRL BIT0 - -// SDIO Tx FIFO related -#define SDIO_TX_FREE_PG_QUEUE 4 // The number of Tx FIFO free page -#define SDIO_TX_FIFO_PAGE_SZ 128 - -/* move to rtl8188e_xmit.h -#if DEV_BUS_TYPE == RT_SDIO_INTERFACE - #define MAX_TX_AGG_PACKET_NUMBER 0x8 -#else - #define MAX_TX_AGG_PACKET_NUMBER 0xFF -#endif -*/ - -// vivi added for new cam search flow, 20091028 -//#define SCR_TxUseBroadcastDK BIT6 // Force Tx Use Broadcast Default Key -//#define SCR_RxUseBroadcastDK BIT7 // Force Rx Use Broadcast Default Key - -//----------------------------------------------------- -// -// 0xFE00h ~ 0xFE55h USB Configuration -// -//----------------------------------------------------- - -//2 USB Information (0xFE17) -#define USB_IS_HIGH_SPEED 0 -#define USB_IS_FULL_SPEED 1 -#define USB_SPEED_MASK BIT(5) - -#define USB_NORMAL_SIE_EP_MASK 0xF -#define USB_NORMAL_SIE_EP_SHIFT 4 - - -//2 Special Option -#define USB_AGG_EN BIT(3) - -// 0; Use interrupt endpoint to upload interrupt pkt -// 1; Use bulk endpoint to upload interrupt pkt, -#define INT_BULK_SEL BIT(4) - - - -//2REG_C2HEVT_CLEAR -#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message -#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver. - - -//2REG_MULTI_FUNC_CTRL(For RTL8723 Only) -#define WL_HWPDN_EN BIT0 // Enable GPIO[9] as WiFi HW PDn source -#define WL_HWPDN_SL BIT1 // WiFi HW PDn polarity control -#define WL_FUNC_EN BIT2 // WiFi function enable -#define WL_HWROF_EN BIT3 // Enable GPIO[9] as WiFi RF HW PDn source -#define BT_HWPDN_EN BIT16 // Enable GPIO[11] as BT HW PDn source -#define BT_HWPDN_SL BIT17 // BT HW PDn polarity control -#define BT_FUNC_EN BIT18 // BT function enable -#define BT_HWROF_EN BIT19 // Enable GPIO[11] as BT/GPS RF HW PDn source -#define GPS_HWPDN_EN BIT20 // Enable GPIO[10] as GPS HW PDn source -#define GPS_HWPDN_SL BIT21 // GPS HW PDn polarity control -#define GPS_FUNC_EN BIT22 // GPS function enable - - -//3 REG_LIFECTRL_CTRL -#define HAL92C_EN_PKT_LIFE_TIME_BK BIT3 -#define HAL92C_EN_PKT_LIFE_TIME_BE BIT2 -#define HAL92C_EN_PKT_LIFE_TIME_VI BIT1 -#define HAL92C_EN_PKT_LIFE_TIME_VO BIT0 - -#define HAL92C_MSDU_LIFE_TIME_UNIT 128 // in us, said by Tim. - -//======================================================== -// General definitions -//======================================================== -//#if (HAL_8195A_USB == 1) -//#define LAST_ENTRY_OF_TX_PKT_BUFFER 255 -//#else -#define LAST_ENTRY_OF_TX_PKT_BUFFER 176 // 22k 22528 bytes -//#endif - -#define POLLING_LLT_THRESHOLD 20 -//#if RTL8188E_FOR_MP_TEST == 1 -//#define POLLING_READY_TIMEOUT_COUNT 3000 -//#else -#define POLLING_READY_TIMEOUT_COUNT 1000 -//#endif -// GPIO BIT -#define HAL_8192C_HW_GPIO_WPS_BIT BIT2 - -#if 0//(RTL8188E_SUPPORT == 1) -////////////////////////////////ONLY for 88EE///////////////////////////////// -// -// Host Interrupt Status Registers (Offset: 0x00B4-00B7, 0x00BC-00BF) -// Host Interrupt Mask Registers (Offset: 0x00B0-00B3, 0x00B8-00BB) -// -//---------------------------------------------------------------------------- -// 8188 IMR/ISR bits -//---------------------------------------------------------------------------- -#define IMR_DISABLED_88E 0x0 -// IMR DW0(0x00B0-00B3) Bit 0-31 -#define IMR_TXCCK_88E BIT30 // TXRPT interrupt when CCX bit of the packet is set -#define IMR_PSTIMEOUT_88E BIT29 // Power Save Time Out Interrupt -#define IMR_GTINT4_88E BIT28 // When GTIMER4 expires, this bit is set to 1 -#define IMR_GTINT3_88E BIT27 // When GTIMER3 expires, this bit is set to 1 -#define IMR_TBDER_88E BIT26 // Transmit Beacon0 Error -#define IMR_TBDOK_88E BIT25 // Transmit Beacon0 OK -#define IMR_TSF_BIT32_TOGGLE_88E BIT24 // TSF Timer BIT32 toggle indication interrupt -#define IMR_BcnInt_88E BIT20 // Beacon DMA Interrupt 0 -#define IMR_BDOK_88E BIT16 // Beacon Queue DMA OK0 -#define IMR_HSISR_IND_ON_INT_88E BIT15 // HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) -#define IMR_BCNDMAINT_E_88E BIT14 // Beacon DMA Interrupt Extension for Win7 -#define IMR_ATIMEND_88E BIT12 // CTWidnow End or ATIM Window End -#define IMR_HISR1_IND_INT_88E BIT11 // HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1) -#define IMR_C2HCMD_88E BIT10 // CPU to Host Command INT Status, Write 1 clear -#define IMR_CPWM2_88E BIT9 // CPU power Mode exchange INT Status, Write 1 clear -#define IMR_CPWM_88E BIT8 // CPU power Mode exchange INT Status, Write 1 clear -#define IMR_HIGHDOK_88E BIT7 // High Queue DMA OK -#define IMR_MGNTDOK_88E BIT6 // Management Queue DMA OK -#define IMR_BKDOK_88E BIT5 // AC_BK DMA OK -#define IMR_BEDOK_88E BIT4 // AC_BE DMA OK -#define IMR_VIDOK_88E BIT3 // AC_VI DMA OK -#define IMR_VODOK_88E BIT2 // AC_VO DMA OK -#define IMR_RDU_88E BIT1 // Rx Descriptor Unavailable -#define IMR_ROK_88E BIT0 // Receive DMA OK - -// IMR DW1(0x00B8-00BB) Bit 0-31 -#define IMR_BCNDMAINT7_88E BIT27 // Beacon DMA Interrupt 7 -#define IMR_BCNDMAINT6_88E BIT26 // Beacon DMA Interrupt 6 -#define IMR_BCNDMAINT5_88E BIT25 // Beacon DMA Interrupt 5 -#define IMR_BCNDMAINT4_88E BIT24 // Beacon DMA Interrupt 4 -#define IMR_BCNDMAINT3_88E BIT23 // Beacon DMA Interrupt 3 -#define IMR_BCNDMAINT2_88E BIT22 // Beacon DMA Interrupt 2 -#define IMR_BCNDMAINT1_88E BIT21 // Beacon DMA Interrupt 1 -#define IMR_BCNDOK7_88E BIT20 // Beacon Queue DMA OK Interrup 7 -#define IMR_BCNDOK6_88E BIT19 // Beacon Queue DMA OK Interrup 6 -#define IMR_BCNDOK5_88E BIT18 // Beacon Queue DMA OK Interrup 5 -#define IMR_BCNDOK4_88E BIT17 // Beacon Queue DMA OK Interrup 4 -#define IMR_BCNDOK3_88E BIT16 // Beacon Queue DMA OK Interrup 3 -#define IMR_BCNDOK2_88E BIT15 // Beacon Queue DMA OK Interrup 2 -#define IMR_BCNDOK1_88E BIT14 // Beacon Queue DMA OK Interrup 1 -#define IMR_ATIMEND_E_88E BIT13 // ATIM Window End Extension for Win7 -#define IMR_TXERR_88E BIT11 // Tx Error Flag Interrupt Status, write 1 clear. -#define IMR_RXERR_88E BIT10 // Rx Error Flag INT Status, Write 1 clear -#define IMR_TXFOVW_88E BIT9 // Transmit FIFO Overflow -#define IMR_RXFOVW_88E BIT8 // Receive FIFO Overflow - - - -////////////////////////////////ONLY for 88EE///////////////////////////////// -#endif //(RTL8188E_SUPPORT == 1) - - -//---------------------------------------------------------------------------- -// 8192C EEPROM/EFUSE share register definition. -//---------------------------------------------------------------------------- - -//==================================================== -// EEPROM/Efuse PG Offset for 88EE/88EU/88ES -//==================================================== -#define EEPROM_TX_PWR_INX_88E 0x10 - -#define EEPROM_ChannelPlan_88E 0xB8 -#define EEPROM_XTAL_88E 0xB9 -#define EEPROM_THERMAL_METER_88E 0xBA -#define EEPROM_IQK_LCK_88E 0xBB - -#define EEPROM_RF_BOARD_OPTION_88E 0xC1 -#define EEPROM_RF_FEATURE_OPTION_88E 0xC2 -#define EEPROM_RF_BT_SETTING_88E 0xC3 -#define EEPROM_VERSION_88E 0xC4 -#define EEPROM_CUSTOMERID_88E 0xC5 -#define EEPROM_RF_ANTENNA_OPT_88E 0xC9 - -#ifdef CONFIG_RF_GAIN_OFFSET -#define EEPROM_RF_GAIN_OFFSET_88E 0xFD -#endif //CONFIG_RF_GAIN_OFFSET - -// RTL88EE -#define EEPROM_MAC_ADDR_88EE 0xD0 -#define EEPROM_VID_88EE 0xD6 -#define EEPROM_DID_88EE 0xD8 -#define EEPROM_SVID_88EE 0xDA -#define EEPROM_SMID_88EE 0xDC - -//RTL88EU -#define EEPROM_MAC_ADDR_88EU 0xD7 -#define EEPROM_VID_88EU 0xD0 -#define EEPROM_PID_88EU 0xD2 -#define EEPROM_USB_OPTIONAL_FUNCTION0 0xD4 - -// RTL88ES -#define EEPROM_MAC_ADDR_88ES 0x11A - - - - -//==================================================== -// EEPROM/Efuse Value Type -//==================================================== -#define EETYPE_TX_PWR 0x0 - -// -// Default Value for EEPROM or EFUSE!!! -// -#define EEPROM_Default_TSSI 0x0 -#define EEPROM_Default_TxPowerDiff 0x0 -#define EEPROM_Default_CrystalCap 0x5 -#define EEPROM_Default_BoardType 0x02 // Default: 2X2, RTL8192CE(QFPN68) -#define EEPROM_Default_TxPower 0x1010 -#define EEPROM_Default_HT2T_TxPwr 0x10 - -#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 -#define EEPROM_Default_ThermalMeter 0x12 - -#define EEPROM_Default_AntTxPowerDiff 0x0 -#define EEPROM_Default_TxPwDiff_CrystalCap 0x5 -#if (RTL8188ES_SUPPORT==1) //for SDIO -#define EEPROM_Default_TxPowerLevel 0x25 -#else //for USB/PCIE -#define EEPROM_Default_TxPowerLevel 0x2A -#endif - -#define EEPROM_Default_HT40_2SDiff 0x0 -#define EEPROM_Default_HT20_Diff 2 // HT20<->40 default Tx Power Index Difference -#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 -#define EEPROM_Default_HT40_PwrMaxOffset 0 -#define EEPROM_Default_HT20_PwrMaxOffset 0 - -#define EEPROM_Default_CrystalCap_88E 0x20 -#define EEPROM_Default_ThermalMeter_88E 0x18 - -#ifdef CONFIG_RF_GAIN_OFFSET -#define EEPROM_Default_RFGainOffset 0xff -#endif //CONFIG_RF_GAIN_OFFSET - -//New EFUSE deafult value -#define EEPROM_DEFAULT_24G_INDEX 0x2D -#define EEPROM_DEFAULT_24G_HT20_DIFF 0X02 -#define EEPROM_DEFAULT_24G_OFDM_DIFF 0X04 - -#define EEPROM_DEFAULT_5G_INDEX 0X2A -#define EEPROM_DEFAULT_5G_HT20_DIFF 0X00 -#define EEPROM_DEFAULT_5G_OFDM_DIFF 0X04 - -#define EEPROM_DEFAULT_DIFF 0XFE -#define EEPROM_DEFAULT_CHANNEL_PLAN 0x7F -#define EEPROM_DEFAULT_BOARD_OPTION 0x00 -#define EEPROM_DEFAULT_FEATURE_OPTION 0x00 -#define EEPROM_DEFAULT_BT_OPTION 0x10 - - -// For debug -#define EEPROM_Default_PID 0x1234 -#define EEPROM_Default_VID 0x5678 -#define EEPROM_Default_CustomerID 0xAB -#define EEPROM_Default_CustomerID_8188E 0x00 -#define EEPROM_Default_SubCustomerID 0xCD -#define EEPROM_Default_Version 0 - -#define EEPROM_CHANNEL_PLAN_FCC 0x0 -#define EEPROM_CHANNEL_PLAN_IC 0x1 -#define EEPROM_CHANNEL_PLAN_ETSI 0x2 -#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 -#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 -#define EEPROM_CHANNEL_PLAN_MKK 0x5 -#define EEPROM_CHANNEL_PLAN_MKK1 0x6 -#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 -#define EEPROM_CHANNEL_PLAN_TELEC 0x8 -#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 -#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA -#define EEPROM_CHANNEL_PLAN_NCC 0xB -#define EEPROM_USB_OPTIONAL1 0xE -#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 - - -#define EEPROM_CID_DEFAULT 0x0 -#define EEPROM_CID_TOSHIBA 0x4 -#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. -#define EEPROM_CID_QMI 0x0D -#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 - - -#define RTL_EEPROM_ID 0x8129 - -#endif //__RTL8188E_SPEC_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#ifndef __RTL8188E_SPEC_H__ +#define __RTL8188E_SPEC_H__ + +#include + +#ifndef BIT +#define BIT(x) (1 << (x)) +#endif + +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + +//============================================================ +// 8192C Regsiter offset definition +//============================================================ + +#define HAL_PS_TIMER_INT_DELAY 50 // 50 microseconds +#define HAL_92C_NAV_UPPER_UNIT 128 // micro-second + +#define MAC_ADDR_LEN 6 +// 8188E PKT_BUFF_ACCESS_CTRL value +#define TXPKT_BUF_SELECT 0x69 +#define RXPKT_BUF_SELECT 0xA5 +#define DISABLE_TRXPKT_BUF_ACCESS 0x0 + +//============================================================ +// +//============================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_SYS_ISO_CTRL 0x0000 +#define REG_SYS_FUNC_EN 0x0002 +#define REG_APS_FSMCO 0x0004 +#define REG_SYS_CLKR 0x0008 +#define REG_9346CR 0x000A +#define REG_EE_VPD 0x000C +#define REG_AFE_MISC 0x0010 +#define REG_SPS0_CTRL 0x0011 +#define REG_SPS_OCP_CFG 0x0018 +#define REG_RSV_CTRL 0x001C +#define REG_RF_CTRL 0x001F +#define REG_LDOA15_CTRL 0x0020 +#define REG_LDOV12D_CTRL 0x0021 +#define REG_LDOHCI12_CTRL 0x0022 +#define REG_LPLDO_CTRL 0x0023 +#define REG_AFE_XTAL_CTRL 0x0024 +#define REG_AFE_PLL_CTRL 0x0028 +#define REG_APE_PLL_CTRL_EXT 0x002c +#define REG_EFUSE_CTRL 0x0030 +#define REG_EFUSE_TEST 0x0034 +#define REG_GPIO_MUXCFG 0x0040 +#define REG_GPIO_IO_SEL 0x0042 +#define REG_MAC_PINMUX_CFG 0x0043 +#define REG_GPIO_PIN_CTRL 0x0044 +#define REG_GPIO_INTM 0x0048 +#define REG_LEDCFG0 0x004C +#define REG_LEDCFG1 0x004D +#define REG_LEDCFG2 0x004E +#define REG_LEDCFG3 0x004F +#define REG_FSIMR 0x0050 +#define REG_FSISR 0x0054 +#define REG_HSIMR 0x0058 +#define REG_HSISR 0x005c +#define REG_GPIO_PIN_CTRL_2 0x0060 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Pin Control. +#define REG_GPIO_IO_SEL_2 0x0062 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Select. +#define REG_BB_PAD_CTRL 0x0064 +#define REG_MULTI_FUNC_CTRL 0x0068 // RTL8723 WIFI/BT/GPS Multi-Function control source. +#define REG_GPIO_OUTPUT 0x006c +#define REG_AFE_XTAL_CTRL_EXT 0x0078 //RTL8188E +#define REG_XCK_OUT_CTRL 0x007c //RTL8188E +#define REG_MCUFWDL 0x0080 +#define REG_WOL_EVENT 0x0081 //RTL8188E +#define REG_MCUTSTCFG 0x0084 +#define REG_HMEBOX_E0 0x0088 +#define REG_HMEBOX_E1 0x008A +#define REG_HMEBOX_E2 0x008C +#define REG_HMEBOX_E3 0x008E +#define REG_HMEBOX_EXT_0 0x01F0 +#define REG_HMEBOX_EXT_1 0x01F4 +#define REG_HMEBOX_EXT_2 0x01F8 +#define REG_HMEBOX_EXT_3 0x01FC +#define REG_HIMR_88E 0x00B0 +#define REG_HISR_88E 0x00B4 +#define REG_HIMRE_88E 0x00B8 +#define REG_HISRE_88E 0x00BC +#define REG_EFUSE_ACCESS 0x00CF // Efuse access protection for RTL8723 +#define REG_BIST_SCAN 0x00D0 +#define REG_BIST_RPT 0x00D4 +#define REG_BIST_ROM_RPT 0x00D8 +#define REG_USB_SIE_INTF 0x00E0 +#define REG_PCIE_MIO_INTF 0x00E4 +#define REG_PCIE_MIO_INTD 0x00E8 +#define REG_HPON_FSM 0x00EC +#define REG_SYS_CFG 0x00F0 +#define REG_GPIO_OUTSTS 0x00F4 // For RTL8723 only. +#define REG_TYPE_ID 0x00FC + +#define REG_MAC_PHY_CTRL_NORMAL 0x00f8 + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_CR 0x0100 +#define REG_PBP 0x0104 +#define REG_PKT_BUFF_ACCESS_CTRL 0x0106 +#define REG_TRXDMA_CTRL 0x010C +#define REG_TRXFF_BNDY 0x0114 +#define REG_TRXFF_STATUS 0x0118 +#define REG_RXFF_PTR 0x011C +//#define REG_HIMR 0x0120 +//#define REG_HISR 0x0124 +#define REG_HIMRE 0x0128 +#define REG_HISRE 0x012C +#define REG_CPWM 0x012F +#define REG_FWIMR 0x0130 +#define REG_FTIMR 0x0138 +#define REG_FWISR 0x0134 +#define REG_PKTBUF_DBG_CTRL 0x0140 +#define REG_PKTBUF_DBG_ADDR (REG_PKTBUF_DBG_CTRL) +#define REG_RXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+2) +#define REG_TXPKTBUF_DBG (REG_PKTBUF_DBG_CTRL+3) +#define REG_RXPKTBUF_CTRL (REG_PKTBUF_DBG_CTRL+2) +#define REG_PKTBUF_DBG_DATA_L 0x0144 +#define REG_PKTBUF_DBG_DATA_H 0x0148 + +#define REG_TC0_CTRL 0x0150 +#define REG_TC1_CTRL 0x0154 +#define REG_TC2_CTRL 0x0158 +#define REG_TC3_CTRL 0x015C +#define REG_TC4_CTRL 0x0160 +#define REG_TCUNIT_BASE 0x0164 +#define REG_MBIST_START 0x0174 +#define REG_MBIST_DONE 0x0178 +#define REG_MBIST_FAIL 0x017C +#define REG_32K_CTRL 0x0194 //RTL8188E +#define REG_C2HEVT_MSG_NORMAL 0x01A0 +#define REG_C2HEVT_CLEAR 0x01AF +#define REG_MCUTST_1 0x01c0 +#ifdef CONFIG_WOWLAN +#define REG_WOWLAN_WAKE_REASON 0x01c7 +#endif +#define REG_FMETHR 0x01C8 +#define REG_HMETFR 0x01CC +#define REG_HMEBOX_0 0x01D0 +#define REG_HMEBOX_1 0x01D4 +#define REG_HMEBOX_2 0x01D8 +#define REG_HMEBOX_3 0x01DC + +#define REG_LLT_INIT 0x01E0 + + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +#define REG_RQPN 0x0200 +#define REG_FIFOPAGE 0x0204 +#define REG_TDECTRL 0x0208 +#define REG_TXDMA_OFFSET_CHK 0x020C +#define REG_TXDMA_STATUS 0x0210 +#define REG_RQPN_NPQ 0x0214 + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#define REG_RXDMA_AGG_PG_TH 0x0280 +#define REG_RXPKT_NUM 0x0284 +#define REG_RXDMA_STATUS 0x0288 + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- +#define REG_PCIE_CTRL_REG 0x0300 +#define REG_INT_MIG 0x0304 // Interrupt Migration +#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address +#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address +#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address +#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address +#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address +#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address +#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address +#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address +#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY +#define REG_DBG_SEL 0x0360 // Debug Selection Register +#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM +#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM +#define REG_WATCH_DOG 0x0368 + +// RTL8723 series ------------------------------- +#define REG_PCIE_HISR 0x03A0 + +// spec version 11 +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +#define REG_VOQ_INFORMATION 0x0400 +#define REG_VIQ_INFORMATION 0x0404 +#define REG_BEQ_INFORMATION 0x0408 +#define REG_BKQ_INFORMATION 0x040C +#define REG_MGQ_INFORMATION 0x0410 +#define REG_HGQ_INFORMATION 0x0414 +#define REG_BCNQ_INFORMATION 0x0418 +#define REG_TXPKT_EMPTY 0x041A + +#define REG_CPU_MGQ_INFORMATION 0x041C +#define REG_FWHW_TXQ_CTRL 0x0420 +#define REG_HWSEQ_CTRL 0x0423 +#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 +#define REG_TXPKTBUF_MGQ_BDNY 0x0425 +#define REG_LIFETIME_EN 0x0426 +#define REG_MULTI_BCNQ_OFFSET 0x0427 +#define REG_SPEC_SIFS 0x0428 +#define REG_RL 0x042A +#define REG_DARFRC 0x0430 +#define REG_RARFRC 0x0438 +#define REG_RRSR 0x0440 +#define REG_ARFR0 0x0444 +#define REG_ARFR1 0x0448 +#define REG_ARFR2 0x044C +#define REG_ARFR3 0x0450 +#define REG_AGGLEN_LMT 0x0458 +#define REG_AMPDU_MIN_SPACE 0x045C +#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D +#define REG_FAST_EDCA_CTRL 0x0460 +#define REG_RD_RESP_PKT_TH 0x0463 +#define REG_INIRTS_RATE_SEL 0x0480 +//#define REG_INIDATA_RATE_SEL 0x0484 +#define REG_MACID_NO_LINK_0 0x0484 +#define REG_MACID_NO_LINK_1 0x0488 + +#define REG_POWER_STATUS 0x04A4 +#define REG_POWER_STAGE1 0x04B4 +#define REG_POWER_STAGE2 0x04B8 +#define REG_PKT_VO_VI_LIFE_TIME 0x04C0 +#define REG_PKT_BE_BK_LIFE_TIME 0x04C2 +#define REG_STBC_SETTING 0x04C4 +#define REG_PROT_MODE_CTRL 0x04C8 +#define REG_MAX_AGGR_NUM 0x04CA +#define REG_RTS_MAX_AGGR_NUM 0x04CB +#define REG_BAR_MODE_CTRL 0x04CC +#define REG_RA_TRY_RATE_AGG_LMT 0x04CF +#define REG_EARLY_MODE_CONTROL 0x4D0 +#define REG_NQOS_SEQ 0x04DC +#define REG_QOS_SEQ 0x04DE +#define REG_NEED_CPU_HANDLE 0x04E0 +#define REG_PKT_LOSE_RPT 0x04E1 +#define REG_PTCL_ERR_STATUS 0x04E2 +#define REG_TX_RPT_CTRL 0x04EC +#define REG_TX_RPT_TIME 0x04F0 // 2 byte +#define REG_DUMMY 0x04FC + +#ifdef CONFIG_WOWLAN +#define REG_TXPKTBUF_IV_LOW 0x0484 +#define REG_TXPKTBUF_IV_HIGH 0x0488 +#endif + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +#define REG_EDCA_VO_PARAM 0x0500 +#define REG_EDCA_VI_PARAM 0x0504 +#define REG_EDCA_BE_PARAM 0x0508 +#define REG_EDCA_BK_PARAM 0x050C +#define REG_BCNTCFG 0x0510 +#define REG_PIFS 0x0512 +#define REG_RDG_PIFS 0x0513 +#define REG_SIFS_CTX 0x0514 +#define REG_SIFS_TRX 0x0516 +#define REG_TSFTR_SYN_OFFSET 0x0518 +#define REG_AGGR_BREAK_TIME 0x051A +#define REG_SLOT 0x051B +#define REG_TX_PTCL_CTRL 0x0520 +#define REG_TXPAUSE 0x0522 +#define REG_DIS_TXREQ_CLR 0x0523 +#define REG_RD_CTRL 0x0524 +// +// Format for offset 540h-542h: +// [3:0]: TBTT prohibit setup in unit of 32us. The time for HW getting beacon content before TBTT. +// [7:4]: Reserved. +// [19:8]: TBTT prohibit hold in unit of 32us. The time for HW holding to send the beacon packet. +// [23:20]: Reserved +// Description: +// | +// |<--Setup--|--Hold------------>| +// --------------|---------------------- +// | +// TBTT +// Note: We cannot update beacon content to HW or send any AC packets during the time between Setup and Hold. +// Described by Designer Tim and Bruce, 2011-01-14. +// +#define REG_TBTT_PROHIBIT 0x0540 +#define REG_RD_NAV_NXT 0x0544 +#define REG_NAV_PROT_LEN 0x0546 +#define REG_BCN_CTRL 0x0550 +#define REG_BCN_CTRL_1 0x0551 +#define REG_MBID_NUM 0x0552 +#define REG_DUAL_TSF_RST 0x0553 +#define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE +#define REG_DRVERLYINT 0x0558 +#define REG_BCNDMATIM 0x0559 +#define REG_ATIMWND 0x055A +#define REG_BCN_MAX_ERR 0x055D +#define REG_RXTSF_OFFSET_CCK 0x055E +#define REG_RXTSF_OFFSET_OFDM 0x055F +#define REG_TSFTR 0x0560 +#define REG_TSFTR1 0x0568 +#define REG_ATIMWND_1 0x0570 +#define REG_PSTIMER 0x0580 +#define REG_TIMER0 0x0584 +#define REG_TIMER1 0x0588 +#define REG_ACMHWCTRL 0x05C0 + +//#define REG_FW_TSF_SYNC_CNT 0x04A0 +#define REG_FW_RESET_TSF_CNT_1 0x05FC +#define REG_FW_RESET_TSF_CNT_0 0x05FD +#define REG_FW_BCN_DIS_CNT 0x05FE + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +#define REG_APSD_CTRL 0x0600 +#define REG_BWOPMODE 0x0603 +#define REG_TCR 0x0604 +#define REG_RCR 0x0608 +#define REG_RX_PKT_LIMIT 0x060C +#define REG_RX_DLK_TIME 0x060D +#define REG_RX_DRVINFO_SZ 0x060F + +#define REG_MACID 0x0610 +#define REG_BSSID 0x0618 +#define REG_MAR 0x0620 +#define REG_MBIDCAMCFG 0x0628 + +#define REG_USTIME_EDCA 0x0638 +#define REG_MAC_SPEC_SIFS 0x063A + +// 20100719 Joseph: Hardware register definition change. (HW datasheet v54) +#define REG_R2T_SIFS 0x063C // [15:8]SIFS_R2T_OFDM, [7:0]SIFS_R2T_CCK +#define REG_T2T_SIFS 0x063E // [15:8]SIFS_T2T_OFDM, [7:0]SIFS_T2T_CCK +#define REG_ACKTO 0x0640 +#define REG_CTS2TO 0x0641 +#define REG_EIFS 0x0642 + + +//RXERR_RPT +#define RXERR_TYPE_OFDM_PPDU 0 +#define RXERR_TYPE_OFDM_FALSE_ALARM 1 +#define RXERR_TYPE_OFDM_MPDU_OK 2 +#define RXERR_TYPE_OFDM_MPDU_FAIL 3 +#define RXERR_TYPE_CCK_PPDU 4 +#define RXERR_TYPE_CCK_FALSE_ALARM 5 +#define RXERR_TYPE_CCK_MPDU_OK 6 +#define RXERR_TYPE_CCK_MPDU_FAIL 7 +#define RXERR_TYPE_HT_PPDU 8 +#define RXERR_TYPE_HT_FALSE_ALARM 9 +#define RXERR_TYPE_HT_MPDU_TOTAL 10 +#define RXERR_TYPE_HT_MPDU_OK 11 +#define RXERR_TYPE_HT_MPDU_FAIL 12 +#define RXERR_TYPE_RX_FULL_DROP 15 + +#define RXERR_COUNTER_MASK 0xFFFFF +#define RXERR_RPT_RST BIT(27) +#define _RXERR_RPT_SEL(type) ((type) << 28) + + +// +// Note: +// The NAV upper value is very important to WiFi 11n 5.2.3 NAV test. The default value is +// always too small, but the WiFi TestPlan test by 25,000 microseconds of NAV through sending +// CTS in the air. We must update this value greater than 25,000 microseconds to pass the item. +// The offset of NAV_UPPER in 8192C Spec is incorrect, and the offset should be 0x0652. Commented +// by SD1 Scott. +// By Bruce, 2011-07-18. +// +#define REG_NAV_UPPER 0x0652 // unit of 128 + +//WMA, BA, CCX +//#define REG_NAV_CTRL 0x0650 +#define REG_BACAMCMD 0x0654 +#define REG_BACAMCONTENT 0x0658 +#define REG_LBDLY 0x0660 +#define REG_FWDLY 0x0661 +#define REG_RXERR_RPT 0x0664 +#define REG_WMAC_TRXPTCL_CTL 0x0668 + +// Security +#define REG_CAMCMD 0x0670 +#define REG_CAMWRITE 0x0674 +#define REG_CAMREAD 0x0678 +#define REG_CAMDBG 0x067C +#define REG_SECCFG 0x0680 + +// Power +#define REG_WOW_CTRL 0x0690 +#define REG_PS_RX_INFO 0x0692 +#define REG_UAPSD_TID 0x0693 +#define REG_WKFMCAM_CMD 0x0698 +#define REG_WKFMCAM_NUM_88E 0x698 +#define REG_RXFLTMAP0 0x06A0 +#define REG_RXFLTMAP1 0x06A2 +#define REG_RXFLTMAP2 0x06A4 +#define REG_BCN_PSR_RPT 0x06A8 +#define REG_BT_COEX_TABLE 0x06C0 + + +// Hardware Port 2 +#define REG_MACID1 0x0700 +#define REG_BSSID1 0x0708 + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + + +// For normal chip +#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61 +#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63 +#define REG_NORMAL_SIE_OPTIONAL 0xFE64 +#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67 +#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B +#define REG_NORMAL_SIE_OPTIONAL2 0xFE6C +#define REG_NORMAL_SIE_GPS_EP 0xFE6D // 0xFE6D, for RTL8723 only. +#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF + + +//----------------------------------------------------- +// +// Redifine 8192C register definition for compatibility +// +//----------------------------------------------------- + +// TODO: use these definition when using REG_xxx naming rule. +// NOTE: DO NOT Remove these definition. Use later. + +#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. +#define EFUSE_TEST REG_EFUSE_TEST // E-Fuse Test. +#define MSR (REG_CR + 2) // Media Status register +#define ISR REG_HISR_88E +#define TSFR REG_TSFTR // Timing Sync Function Timer Register. + +#define PBP REG_PBP + +// Redifine MACID register, to compatible prior ICs. +#define IDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053 +#define IDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055 + + +// +// 9. Security Control Registers (Offset: ) +// +#define RWCAM REG_CAMCMD //IN 8190 Data Sheet is called CAMcmd +#define WCAMI REG_CAMWRITE // Software write CAM input content +#define RCAMO REG_CAMREAD // Software read/write CAM config +#define CAMDBG REG_CAMDBG +#define SECR REG_SECCFG //Security Configuration Register + +// Unused register +#define UnusedRegister 0x1BF +#define DCAM UnusedRegister +#define PSR UnusedRegister +#define BBAddr UnusedRegister +#define PhyDataR UnusedRegister + +// Min Spacing related settings. +#define MAX_MSS_DENSITY_2T 0x13 +#define MAX_MSS_DENSITY_1T 0x0A + +//---------------------------------------------------------------------------- +// 8192C Cmd9346CR bits (Offset 0xA, 16bit) +//---------------------------------------------------------------------------- +#define CmdEEPROM_En BIT5 // EEPROM enable when set 1 +#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 +#define Cmd9346CR_9356SEL BIT4 + +//---------------------------------------------------------------------------- +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) +//---------------------------------------------------------------------------- +#define GPIOSEL_GPIO 0 +#define GPIOSEL_ENBT BIT5 + +//---------------------------------------------------------------------------- +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) +//---------------------------------------------------------------------------- +#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value +#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. +#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) + +//---------------------------------------------------------------------------- +// 8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte) +//---------------------------------------------------------------------------- +#define HSIMR_GPIO12_0_INT_EN BIT0 +#define HSIMR_SPS_OCP_INT_EN BIT5 +#define HSIMR_RON_INT_EN BIT6 +#define HSIMR_PDN_INT_EN BIT7 +#define HSIMR_GPIO9_INT_EN BIT25 + + +//---------------------------------------------------------------------------- +// 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) +//---------------------------------------------------------------------------- +#define HSISR_GPIO12_0_INT BIT0 +#define HSISR_SPS_OCP_INT BIT5 +#define HSISR_RON_INT_EN BIT6 +#define HSISR_PDNINT BIT7 +#define HSISR_GPIO9_INT BIT25 + +//---------------------------------------------------------------------------- +// 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) +//---------------------------------------------------------------------------- +/* +Network Type +00: No link +01: Link in ad hoc network +10: Link in infrastructure network +11: AP mode +Default: 00b. +*/ +#define MSR_NOLINK 0x00 +#define MSR_ADHOC 0x01 +#define MSR_INFRA 0x02 +#define MSR_AP 0x03 + +//---------------------------------------------------------------------------- +// 88EU (MSR) Media Status Register (Offset 0x4C, 8 bits) +//---------------------------------------------------------------------------- +#define USB_INTR_CONTENT_C2H_OFFSET 0 +#define USB_INTR_CONTENT_CPWM1_OFFSET 16 +#define USB_INTR_CONTENT_CPWM2_OFFSET 20 +#define USB_INTR_CONTENT_HISR_OFFSET 48 +#define USB_INTR_CONTENT_HISRE_OFFSET 52 + + +//---------------------------------------------------------------------------- +// 88E Driver Initialization Offload REG_FDHM0(Offset 0x88, 8 bits) +//---------------------------------------------------------------------------- +//IOL config for REG_FDHM0(Reg0x88) +#define CMD_INIT_LLT BIT0 +#define CMD_READ_EFUSE_MAP BIT1 +#define CMD_EFUSE_PATCH BIT2 +#define CMD_IOCONFIG BIT3 +#define CMD_INIT_LLT_ERR BIT4 +#define CMD_READ_EFUSE_MAP_ERR BIT5 +#define CMD_EFUSE_PATCH_ERR BIT6 +#define CMD_IOCONFIG_ERR BIT7 + +// +// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF) +// +//---------------------------------------------------------------------------- +// 8192C Response Rate Set Register (offset 0x181, 24bits) +//---------------------------------------------------------------------------- +#define RRSR_1M BIT0 +#define RRSR_2M BIT1 +#define RRSR_5_5M BIT2 +#define RRSR_11M BIT3 +#define RRSR_6M BIT4 +#define RRSR_9M BIT5 +#define RRSR_12M BIT6 +#define RRSR_18M BIT7 +#define RRSR_24M BIT8 +#define RRSR_36M BIT9 +#define RRSR_48M BIT10 +#define RRSR_54M BIT11 +#define RRSR_MCS0 BIT12 +#define RRSR_MCS1 BIT13 +#define RRSR_MCS2 BIT14 +#define RRSR_MCS3 BIT15 +#define RRSR_MCS4 BIT16 +#define RRSR_MCS5 BIT17 +#define RRSR_MCS6 BIT18 +#define RRSR_MCS7 BIT19 + +//---------------------------------------------------------------------------- +// 8192C Response Rate Set Register (offset 0x1BF, 8bits) +//---------------------------------------------------------------------------- +// WOL bit information +#define HAL92C_WOL_PTK_UPDATE_EVENT BIT0 +#define HAL92C_WOL_GTK_UPDATE_EVENT BIT1 + +//---------------------------------------------------------------------------- +// 8192C BW_OPMODE bits (Offset 0x203, 8bit) +//---------------------------------------------------------------------------- +#define BW_OPMODE_20MHZ BIT2 +#define BW_OPMODE_5G BIT1 + + +//---------------------------------------------------------------------------- +// 8192C CAM Config Setting (offset 0x250, 1 byte) +//---------------------------------------------------------------------------- +#define CAM_VALID BIT15 +#define CAM_NOTVALID 0x0000 +#define CAM_USEDK BIT5 + +#define CAM_CONTENT_COUNT 8 + +#define CAM_NONE 0x0 +#define CAM_WEP40 0x01 +#define CAM_TKIP 0x02 +#define CAM_AES 0x04 +#define CAM_WEP104 0x05 +#define CAM_SMS4 0x6 + +#define TOTAL_CAM_ENTRY 32 +#define HALF_CAM_ENTRY 16 + +#define CAM_CONFIG_USEDK _TRUE +#define CAM_CONFIG_NO_USEDK _FALSE + +#define CAM_WRITE BIT16 +#define CAM_READ 0x00000000 +#define CAM_POLLINIG BIT31 + +#define SCR_UseDK 0x01 +#define SCR_TxSecEnable 0x02 +#define SCR_RxSecEnable 0x04 + +// +// 10. Power Save Control Registers (Offset: 0x0260 - 0x02DF) +// +#define WOW_PMEN BIT0 // Power management Enable. +#define WOW_WOMEN BIT1 // WoW function on or off. +#define WOW_MAGIC BIT2 // Magic packet +#define WOW_UWF BIT3 // Unicast Wakeup frame. + +// +// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F) +// +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +// 8188 IMR/ISR bits +//---------------------------------------------------------------------------- +#define IMR_DISABLED_88E 0x0 +// IMR DW0(0x0060-0063) Bit 0-31 +#define IMR_TXCCK_88E BIT30 // TXRPT interrupt when CCX bit of the packet is set +#define IMR_PSTIMEOUT_88E BIT29 // Power Save Time Out Interrupt +#define IMR_GTINT4_88E BIT28 // When GTIMER4 expires, this bit is set to 1 +#define IMR_GTINT3_88E BIT27 // When GTIMER3 expires, this bit is set to 1 +#define IMR_TBDER_88E BIT26 // Transmit Beacon0 Error +#define IMR_TBDOK_88E BIT25 // Transmit Beacon0 OK +#define IMR_TSF_BIT32_TOGGLE_88E BIT24 // TSF Timer BIT32 toggle indication interrupt +#define IMR_BCNDMAINT0_88E BIT20 // Beacon DMA Interrupt 0 +#define IMR_BCNDERR0_88E BIT16 // Beacon Queue DMA Error 0 +#define IMR_HSISR_IND_ON_INT_88E BIT15 // HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) +#define IMR_BCNDMAINT_E_88E BIT14 // Beacon DMA Interrupt Extension for Win7 +#define IMR_ATIMEND_88E BIT12 // CTWidnow End or ATIM Window End +#define IMR_HISR1_IND_INT_88E BIT11 // HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1) +#define IMR_C2HCMD_88E BIT10 // CPU to Host Command INT Status, Write 1 clear +#define IMR_CPWM2_88E BIT9 // CPU power Mode exchange INT Status, Write 1 clear +#define IMR_CPWM_88E BIT8 // CPU power Mode exchange INT Status, Write 1 clear +#define IMR_HIGHDOK_88E BIT7 // High Queue DMA OK +#define IMR_MGNTDOK_88E BIT6 // Management Queue DMA OK +#define IMR_BKDOK_88E BIT5 // AC_BK DMA OK +#define IMR_BEDOK_88E BIT4 // AC_BE DMA OK +#define IMR_VIDOK_88E BIT3 // AC_VI DMA OK +#define IMR_VODOK_88E BIT2 // AC_VO DMA OK +#define IMR_RDU_88E BIT1 // Rx Descriptor Unavailable +#define IMR_ROK_88E BIT0 // Receive DMA OK + +// IMR DW1(0x00B4-00B7) Bit 0-31 +#define IMR_BCNDMAINT7_88E BIT27 // Beacon DMA Interrupt 7 +#define IMR_BCNDMAINT6_88E BIT26 // Beacon DMA Interrupt 6 +#define IMR_BCNDMAINT5_88E BIT25 // Beacon DMA Interrupt 5 +#define IMR_BCNDMAINT4_88E BIT24 // Beacon DMA Interrupt 4 +#define IMR_BCNDMAINT3_88E BIT23 // Beacon DMA Interrupt 3 +#define IMR_BCNDMAINT2_88E BIT22 // Beacon DMA Interrupt 2 +#define IMR_BCNDMAINT1_88E BIT21 // Beacon DMA Interrupt 1 +#define IMR_BCNDERR7_88E BIT20 // Beacon Queue DMA Error Interrup 7 +#define IMR_BCNDERR6_88E BIT19 // Beacon Queue DMA Error Interrup 6 +#define IMR_BCNDERR5_88E BIT18 // Beacon Queue DMA Error Interrup 5 +#define IMR_BCNDERR4_88E BIT17 // Beacon Queue DMA Error Interrup 4 +#define IMR_BCNDERR3_88E BIT16 // Beacon Queue DMA Error Interrup 3 +#define IMR_BCNDERR2_88E BIT15 // Beacon Queue DMA Error Interrup 2 +#define IMR_BCNDERR1_88E BIT14 // Beacon Queue DMA Error Interrup 1 +#define IMR_ATIMEND_E_88E BIT13 // ATIM Window End Extension for Win7 +#define IMR_TXERR_88E BIT11 // Tx Error Flag Interrupt Status, write 1 clear. +#define IMR_RXERR_88E BIT10 // Rx Error Flag INT Status, Write 1 clear +#define IMR_TXFOVW_88E BIT9 // Transmit FIFO Overflow +#define IMR_RXFOVW_88E BIT8 // Receive FIFO Overflow + +#define HAL_NIC_UNPLUG_ISR 0xFFFFFFFF // The value when the NIC is unplugged for PCI. + + +#ifdef CONFIG_PCI_HCI +//#define IMR_RX_MASK (IMR_ROK_88E|IMR_RDU_88E|IMR_RXFOVW_88E) +#define IMR_TX_MASK (IMR_VODOK_88E|IMR_VIDOK_88E|IMR_BEDOK_88E|IMR_BKDOK_88E|IMR_MGNTDOK_88E|IMR_HIGHDOK_88E|IMR_BCNDERR0_88E) + +#ifdef CONFIG_CONCURRENT_MODE +#define RT_IBSS_INT_MASKS (IMR_BCNDMAINT0_88E | IMR_TBDOK_88E | IMR_TBDER_88E | IMR_BCNDMAINT_E_88E) +#else +#define RT_IBSS_INT_MASKS (IMR_BCNDMAINT0_88E | IMR_TBDOK_88E | IMR_TBDER_88E) +#endif + +#define RT_AC_INT_MASKS (IMR_VIDOK_88E | IMR_VODOK_88E | IMR_BEDOK_88E|IMR_BKDOK_88E) +#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS) +#endif + + +// 8192C EFUSE +//---------------------------------------------------------------------------- +#define HWSET_MAX_SIZE 256 +#define HWSET_MAX_SIZE_88E 512 + + + +/*=================================================================== +===================================================================== +Here the register defines are for 92C. When the define is as same with 92C, +we will use the 92C's define for the consistency +So the following defines for 92C is not entire!!!!!! +===================================================================== +=====================================================================*/ +/* +Based on Datasheet V33---090401 +Register Summary +Current IOREG MAP +0x0000h ~ 0x00FFh System Configuration (256 Bytes) +0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) +0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) +0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) +0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) +0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) +0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) +0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) +0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) +*/ + //---------------------------------------------------------------------------- + // 8192C (TXPAUSE) transmission pause (Offset 0x522, 8 bits) + //---------------------------------------------------------------------------- +// Note: +// The the bits of stoping AC(VO/VI/BE/BK) queue in datasheet RTL8192S/RTL8192C are wrong, +// the correct arragement is VO - Bit0, VI - Bit1, BE - Bit2, and BK - Bit3. +// 8723 and 88E may be not correct either in the eralier version. Confirmed with DD Tim. +// By Bruce, 2011-09-22. +#define StopBecon BIT6 +#define StopHigh BIT5 +#define StopMgt BIT4 +#define StopBK BIT3 +#define StopBE BIT2 +#define StopVI BIT1 +#define StopVO BIT0 + +//---------------------------------------------------------------------------- +// 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits) +//---------------------------------------------------------------------------- +#define RCR_APPFCS BIT31 //WMAC append FCS after pauload +#define RCR_APP_MIC BIT30 // +#define RCR_APP_PHYSTS BIT28// +#define RCR_APP_ICV BIT29 // +#define RCR_APP_PHYST_RXFF BIT28 // +#define RCR_APP_BA_SSN BIT27 //Accept BA SSN +#define RCR_ENMBID BIT24 //Enable Multiple BssId. +#define RCR_LSIGEN BIT23 +#define RCR_MFBEN BIT22 +#define RCR_HTC_LOC_CTRL BIT14 //MFC<--HTC=1 MFC-->HTC=0 +#define RCR_AMF BIT13 //Accept management type frame +#define RCR_ACF BIT12 //Accept control type frame +#define RCR_ADF BIT11 //Accept data type frame +#define RCR_AICV BIT9 //Accept ICV error packet +#define RCR_ACRC32 BIT8 //Accept CRC32 error packet +#define RCR_CBSSID_BCN BIT7 //Accept BSSID match packet (Rx beacon, probe rsp) +#define RCR_CBSSID_DATA BIT6 //Accept BSSID match packet (Data) +#define RCR_CBSSID RCR_CBSSID_DATA //Accept BSSID match packet +#define RCR_APWRMGT BIT5 //Accept power management packet +#define RCR_ADD3 BIT4 //Accept address 3 match packet +#define RCR_AB BIT3 //Accept broadcast packet +#define RCR_AM BIT2 //Accept multicast packet +#define RCR_APM BIT1 //Accept physical match packet +#define RCR_AAP BIT0 //Accept all unicast packet +#define RCR_MXDMA_OFFSET 8 +#define RCR_FIFO_OFFSET 13 + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + +#define REG_USB_HRPWM 0xFE58 +#define REG_USB_HCPWM 0xFE57 + +//============================================================================ +// 8192C Regsiter Bit and Content definition +//============================================================================ +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- + +//2 SYS_ISO_CTRL +#define ISO_MD2PP BIT(0) +#define ISO_UA2USB BIT(1) +#define ISO_UD2CORE BIT(2) +#define ISO_PA2PCIE BIT(3) +#define ISO_PD2CORE BIT(4) +#define ISO_IP2MAC BIT(5) +#define ISO_DIOP BIT(6) +#define ISO_DIOE BIT(7) +#define ISO_EB2CORE BIT(8) +#define ISO_DIOR BIT(9) +#define PWC_EV12V BIT(15) + + +//2 SYS_FUNC_EN +#define FEN_BBRSTB BIT(0) +#define FEN_BB_GLB_RSTn BIT(1) +#define FEN_USBA BIT(2) +#define FEN_UPLL BIT(3) +#define FEN_USBD BIT(4) +#define FEN_DIO_PCIE BIT(5) +#define FEN_PCIEA BIT(6) +#define FEN_PPLL BIT(7) +#define FEN_PCIED BIT(8) +#define FEN_DIOE BIT(9) +#define FEN_CPUEN BIT(10) +#define FEN_DCORE BIT(11) +#define FEN_ELDR BIT(12) +#define FEN_DIO_RF BIT(13) +#define FEN_HWPDN BIT(14) +#define FEN_MREGEN BIT(15) + +//2 APS_FSMCO +#define PFM_LDALL BIT(0) +#define PFM_ALDN BIT(1) +#define PFM_LDKP BIT(2) +#define PFM_WOWL BIT(3) +#define EnPDN BIT(4) +#define PDN_PL BIT(5) +#define APFM_ONMAC BIT(8) +#define APFM_OFF BIT(9) +#define APFM_RSM BIT(10) +#define AFSM_HSUS BIT(11) +#define AFSM_PCIE BIT(12) +#define APDM_MAC BIT(13) +#define APDM_HOST BIT(14) +#define APDM_HPDN BIT(15) +#define RDY_MACON BIT(16) +#define SUS_HOST BIT(17) +#define ROP_ALD BIT(20) +#define ROP_PWR BIT(21) +#define ROP_SPS BIT(22) +#define SOP_MRST BIT(25) +#define SOP_FUSE BIT(26) +#define SOP_ABG BIT(27) +#define SOP_AMB BIT(28) +#define SOP_RCK BIT(29) +#define SOP_A8M BIT(30) +#define XOP_BTCK BIT(31) + +//2 SYS_CLKR +#define ANAD16V_EN BIT(0) +#define ANA8M BIT(1) +#define MACSLP BIT(4) +#define LOADER_CLK_EN BIT(5) + + +//2 9346CR + +#define BOOT_FROM_EEPROM BIT(4) +#define EEPROM_EN BIT(5) + + +//2 SPS0_CTRL + + +//2 SPS_OCP_CFG + + +//2 RF_CTRL +#define RF_EN BIT(0) +#define RF_RSTB BIT(1) +#define RF_SDMRSTB BIT(2) + + + +//2 LDOV12D_CTRL +#define LDV12_EN BIT(0) +#define LDV12_SDBY BIT(1) +#define LPLDO_HSM BIT(2) +#define LPLDO_LSM_DIS BIT(3) +#define _LDV12_VADJ(x) (((x) & 0xF) << 4) + + +//2EFUSE_CTRL +#define ALD_EN BIT(18) +#define EF_PD BIT(19) +#define EF_FLAG BIT(31) + +//2 EFUSE_TEST (For RTL8723 partially) +#define EF_TRPT BIT(7) +#define EF_CELL_SEL (BIT(8)|BIT(9)) // 00: Wifi Efuse, 01: BT Efuse0, 10: BT Efuse1, 11: BT Efuse2 +#define LDOE25_EN BIT(31) +#define EFUSE_SEL(x) (((x) & 0x3) << 8) +#define EFUSE_SEL_MASK 0x300 +#define EFUSE_WIFI_SEL_0 0x0 +#define EFUSE_BT_SEL_0 0x1 +#define EFUSE_BT_SEL_1 0x2 +#define EFUSE_BT_SEL_2 0x3 + +#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only. +#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only. + + +//2 8051FWDL +//2 MCUFWDL +#define MCUFWDL_EN BIT(0) +#define MCUFWDL_RDY BIT(1) +#define FWDL_ChkSum_rpt BIT(2) +#define MACINI_RDY BIT(3) +#define BBINI_RDY BIT(4) +#define RFINI_RDY BIT(5) +#define WINTINI_RDY BIT(6) +#define RAM_DL_SEL BIT(7) // 1:RAM, 0:ROM +#define ROM_DLEN BIT(19) +#define CPRST BIT(23) + + + +//2 REG_SYS_CFG +#define XCLK_VLD BIT(0) +#define ACLK_VLD BIT(1) +#define UCLK_VLD BIT(2) +#define PCLK_VLD BIT(3) +#define PCIRSTB BIT(4) +#define V15_VLD BIT(5) +#define SW_OFFLOAD_EN BIT(7) +#define SIC_IDLE BIT(8) +#define BD_MAC2 BIT(9) +#define BD_MAC1 BIT(10) +#define IC_MACPHY_MODE BIT(11) +#define CHIP_VER (BIT(12)|BIT(13)|BIT(14)|BIT(15)) +#define BT_FUNC BIT(16) +#define VENDOR_ID BIT(19) +#define PAD_HWPD_IDN BIT(22) +#define TRP_VAUX_EN BIT(23) // RTL ID +#define TRP_BT_EN BIT(24) +#define BD_PKG_SEL BIT(25) +#define BD_HCI_SEL BIT(26) +#define TYPE_ID BIT(27) + +#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15 +#define CHIP_VER_RTL_SHIFT 12 + + +//2REG_GPIO_OUTSTS (For RTL8723 only) +#define EFS_HCI_SEL (BIT(0)|BIT(1)) +#define PAD_HCI_SEL (BIT(2)|BIT(3)) +#define HCI_SEL (BIT(4)|BIT(5)) +#define PKG_SEL_HCI BIT(6) +#define FEN_GPS BIT(7) +#define FEN_BT BIT(8) +#define FEN_WL BIT(9) +#define FEN_PCI BIT(10) +#define FEN_USB BIT(11) +#define BTRF_HWPDN_N BIT(12) +#define WLRF_HWPDN_N BIT(13) +#define PDN_BT_N BIT(14) +#define PDN_GPS_N BIT(15) +#define BT_CTL_HWPDN BIT(16) +#define GPS_CTL_HWPDN BIT(17) +#define PPHY_SUSB BIT(20) +#define UPHY_SUSB BIT(21) +#define PCI_SUSEN BIT(22) +#define USB_SUSEN BIT(23) +#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28)) + + +//2SYS_CFG +#define RTL_ID BIT(23) // TestChip ID, 1:Test(RLE); 0:MP(RL) + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- + + +//2 Function Enable Registers +//2 CR + + + +#define HCI_TXDMA_EN BIT(0) +#define HCI_RXDMA_EN BIT(1) +#define TXDMA_EN BIT(2) +#define RXDMA_EN BIT(3) +#define PROTOCOL_EN BIT(4) +#define SCHEDULE_EN BIT(5) +#define MACTXEN BIT(6) +#define MACRXEN BIT(7) +#define ENSWBCN BIT(8) +#define ENSEC BIT(9) +#define CALTMR_EN BIT(10) // 32k CAL TMR enable + +// Network type +#define _NETTYPE(x) (((x) & 0x3) << 16) +#define MASK_NETTYPE 0x30000 +#define NT_NO_LINK 0x0 +#define NT_LINK_AD_HOC 0x1 +#define NT_LINK_AP 0x2 +#define NT_AS_AP 0x3 + + + +//2 PBP - Page Size Register +#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) +#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) +#define _PSRX_MASK 0xF +#define _PSTX_MASK 0xF0 +#define _PSRX(x) (x) +#define _PSTX(x) ((x) << 4) + +#define PBP_64 0x0 +#define PBP_128 0x1 +#define PBP_256 0x2 +#define PBP_512 0x3 +#define PBP_1024 0x4 + + +//2 TX/RXDMA +#define RXDMA_ARBBW_EN BIT(0) +#define RXSHFT_EN BIT(1) +#define RXDMA_AGG_EN BIT(2) +#define QS_VO_QUEUE BIT(8) +#define QS_VI_QUEUE BIT(9) +#define QS_BE_QUEUE BIT(10) +#define QS_BK_QUEUE BIT(11) +#define QS_MANAGER_QUEUE BIT(12) +#define QS_HIGH_QUEUE BIT(13) + +#define HQSEL_VOQ BIT(0) +#define HQSEL_VIQ BIT(1) +#define HQSEL_BEQ BIT(2) +#define HQSEL_BKQ BIT(3) +#define HQSEL_MGTQ BIT(4) +#define HQSEL_HIQ BIT(5) + +// For normal driver, 0x10C +#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) +#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) +#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10) +#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 ) +#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 ) +#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 ) + +#define QUEUE_LOW 1 +#define QUEUE_NORMAL 2 +#define QUEUE_HIGH 3 + + + +//2 TRXFF_BNDY + + +//2 LLT_INIT +#define _LLT_NO_ACTIVE 0x0 +#define _LLT_WRITE_ACCESS 0x1 +#define _LLT_READ_ACCESS 0x2 + +#define _LLT_INIT_DATA(x) ((x) & 0xFF) +#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) +#define _LLT_OP(x) (((x) & 0x3) << 30) +#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) + + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +//2RQPN +#define _HPQ(x) ((x) & 0xFF) +#define _LPQ(x) (((x) & 0xFF) << 8) +#define _PUBQ(x) (((x) & 0xFF) << 16) +#define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register + + +#define HPQ_PUBLIC_DIS BIT(24) +#define LPQ_PUBLIC_DIS BIT(25) +#define LD_RQPN BIT(31) + + +//2TDECTRL +#define BCN_VALID BIT(16) +#define BCN_HEAD(x) (((x) & 0xFF) << 8) +#define BCN_HEAD_MASK 0xFF00 + + +//2 TDECTL +#define BLK_DESC_NUM_SHIFT 4 +#define BLK_DESC_NUM_MASK 0xF + + +//2 TXDMA_OFFSET_CHK +#define DROP_DATA_EN BIT(9) + + + + +//----------------------------------------------------- +// +// 0x0280h ~ 0x028Bh RX DMA Configuration +// +//----------------------------------------------------- + +// REG_RXDMA_CONTROL, 0x0286h +// Write only. When this bit is set, RXDMA will decrease RX PKT counter by one. Before +// this bit is polled, FW shall update RXFF_RD_PTR first. This register is write pulse and auto clear. +//#define RXPKT_RELEASE_POLL BIT(0) +// Read only. When RXMA finishes on-going DMA operation, RXMDA will report idle state in +// this bit. FW can start releasing packets after RXDMA entering idle mode. +//#define RXDMA_IDLE BIT(1) +// When this bit is set, RXDMA will enter this mode after on-going RXDMA packet to host +// completed, and stop DMA packet to host. RXDMA will then report Default: 0; +//#define RW_RELEASE_EN BIT(2) + +//2 REG_RXPKT_NUM, 0x0284 +#define RXPKT_RELEASE_POLL BIT(16) +#define RXDMA_IDLE BIT(17) +#define RW_RELEASE_EN BIT(18) + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +//2 FWHW_TXQ_CTRL +#define EN_AMPDU_RTY_NEW BIT(7) + + +//2 SPEC SIFS +#define _SPEC_SIFS_CCK(x) ((x) & 0xFF) +#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) + +//2 RL +#define RETRY_LIMIT_SHORT_SHIFT 8 +#define RETRY_LIMIT_LONG_SHIFT 0 + + + + + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + + + +//2 EDCA setting +#define AC_PARAM_TXOP_LIMIT_OFFSET 16 +#define AC_PARAM_ECW_MAX_OFFSET 12 +#define AC_PARAM_ECW_MIN_OFFSET 8 +#define AC_PARAM_AIFS_OFFSET 0 + + + +#define _LRL(x) ((x) & 0x3F) +#define _SRL(x) (((x) & 0x3F) << 8) + + +//2 BCN_CTRL +#define EN_MBSSID BIT(1) +#define EN_TXBCN_RPT BIT(2) +#define EN_BCN_FUNCTION BIT(3) +#define DIS_TSF_UPDATE BIT(3) + +// The same function but different bit field. +#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) +#define DIS_TSF_UDT0_TEST_CHIP BIT(5) +#define STOP_BCNQ BIT(6) + + +//2 ACMHWCTRL +#define AcmHw_HwEn BIT(0) +#define AcmHw_BeqEn BIT(1) +#define AcmHw_ViqEn BIT(2) +#define AcmHw_VoqEn BIT(3) +#define AcmHw_BeqStatus BIT(4) +#define AcmHw_ViqStatus BIT(5) +#define AcmHw_VoqStatus BIT(6) + + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +//2APSD_CTRL +#define APSDOFF BIT(6) +#define APSDOFF_STATUS BIT(7) + + +#define RATE_BITMAP_ALL 0xFFFFF + +// Only use CCK 1M rate for ACK +#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 + +//2 TCR +#define TSFRST BIT(0) +#define DIS_GCLK BIT(1) +#define PAD_SEL BIT(2) +#define PWR_ST BIT(6) +#define PWRBIT_OW_EN BIT(7) +#define ACRC BIT(8) +#define CFENDFORM BIT(9) +#define ICV BIT(10) + + + +//2 RCR +#define AAP BIT(0) +#define APM BIT(1) +#define AM BIT(2) +#define AB BIT(3) +#define ADD3 BIT(4) +#define APWRMGT BIT(5) +#define CBSSID BIT(6) +#define CBSSID_DATA BIT(6) +#define CBSSID_BCN BIT(7) +#define ACRC32 BIT(8) +#define AICV BIT(9) +#define ADF BIT(11) +#define ACF BIT(12) +#define AMF BIT(13) +#define HTC_LOC_CTRL BIT(14) +#define UC_DATA_EN BIT(16) +#define BM_DATA_EN BIT(17) +#define MFBEN BIT(22) +#define LSIGEN BIT(23) +#define EnMBID BIT(24) +#define APP_BASSN BIT(27) +#define APP_PHYSTS BIT(28) +#define APP_ICV BIT(29) +#define APP_MIC BIT(30) +#define APP_FCS BIT(31) + + +//2 SECCFG +#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key +#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key +#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption +#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption +#define SCR_SKByA2 BIT(4) //Search kEY BY A2 +#define SCR_NoSKMC BIT(5) //No Key Search Multicast +#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key +#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key + + +//----------------------------------------------------- +// +// RTL8188E SDIO Configuration +// +//----------------------------------------------------- + +// I/O bus domain address mapping +#define SDIO_LOCAL_BASE 0x10250000 +#define WLAN_IOREG_BASE 0x10260000 +#define FIRMWARE_FIFO_BASE 0x10270000 +#define TX_HIQ_BASE 0x10310000 +#define TX_MIQ_BASE 0x10320000 +#define TX_LOQ_BASE 0x10330000 +#define RX_RX0FF_BASE 0x10340000 + +// SDIO host local register space mapping. +#define SDIO_LOCAL_MSK 0x0FFF +#define WLAN_IOREG_MSK 0x7FFF +#define WLAN_FIFO_MSK 0x1FFF // Aggregation Length[12:0] +#define WLAN_RX0FF_MSK 0x0003 + +#define SDIO_WITHOUT_REF_DEVICE_ID 0 // Without reference to the SDIO Device ID +#define SDIO_LOCAL_DEVICE_ID 0 // 0b[16], 000b[15:13] +#define WLAN_TX_HIQ_DEVICE_ID 4 // 0b[16], 100b[15:13] +#define WLAN_TX_MIQ_DEVICE_ID 5 // 0b[16], 101b[15:13] +#define WLAN_TX_LOQ_DEVICE_ID 6 // 0b[16], 110b[15:13] +#define WLAN_RX0FF_DEVICE_ID 7 // 0b[16], 111b[15:13] +#define WLAN_IOREG_DEVICE_ID 8 // 1b[16] + +// SDIO Tx Free Page Index +#define HI_QUEUE_IDX 0 +#define MID_QUEUE_IDX 1 +#define LOW_QUEUE_IDX 2 +#define PUBLIC_QUEUE_IDX 3 + +#define SDIO_MAX_TX_QUEUE 3 // HIQ, MIQ and LOQ +#define SDIO_MAX_RX_QUEUE 1 + +#define SDIO_REG_TX_CTRL 0x0000 // SDIO Tx Control +#define SDIO_REG_HIMR 0x0014 // SDIO Host Interrupt Mask +#define SDIO_REG_HISR 0x0018 // SDIO Host Interrupt Service Routine +#define SDIO_REG_HCPWM 0x0019 // HCI Current Power Mode +#define SDIO_REG_RX0_REQ_LEN 0x001C // RXDMA Request Length +#define SDIO_REG_FREE_TXPG 0x0020 // Free Tx Buffer Page +#define SDIO_REG_HCPWM1 0x0024 // HCI Current Power Mode 1 +#define SDIO_REG_HCPWM2 0x0026 // HCI Current Power Mode 2 +#define SDIO_REG_HTSFR_INFO 0x0030 // HTSF Informaion +#define SDIO_REG_HRPWM1 0x0080 // HCI Request Power Mode 1 +#define SDIO_REG_HRPWM2 0x0082 // HCI Request Power Mode 2 +#define SDIO_REG_HPS_CLKR 0x0084 // HCI Power Save Clock +#define SDIO_REG_HSUS_CTRL 0x0086 // SDIO HCI Suspend Control +#define SDIO_REG_HIMR_ON 0x0090 // SDIO Host Extension Interrupt Mask Always +#define SDIO_REG_HISR_ON 0x0091 // SDIO Host Extension Interrupt Status Always + +#define SDIO_HIMR_DISABLED 0 + +// RTL8188E SDIO Host Interrupt Mask Register +#define SDIO_HIMR_RX_REQUEST_MSK BIT0 +#define SDIO_HIMR_AVAL_MSK BIT1 +#define SDIO_HIMR_TXERR_MSK BIT2 +#define SDIO_HIMR_RXERR_MSK BIT3 +#define SDIO_HIMR_TXFOVW_MSK BIT4 +#define SDIO_HIMR_RXFOVW_MSK BIT5 +#define SDIO_HIMR_TXBCNOK_MSK BIT6 +#define SDIO_HIMR_TXBCNERR_MSK BIT7 +#define SDIO_HIMR_BCNERLY_INT_MSK BIT16 +#define SDIO_HIMR_C2HCMD_MSK BIT17 +#define SDIO_HIMR_CPWM1_MSK BIT18 +#define SDIO_HIMR_CPWM2_MSK BIT19 +#define SDIO_HIMR_HSISR_IND_MSK BIT20 +#define SDIO_HIMR_GTINT3_IND_MSK BIT21 +#define SDIO_HIMR_GTINT4_IND_MSK BIT22 +#define SDIO_HIMR_PSTIMEOUT_MSK BIT23 +#define SDIO_HIMR_OCPINT_MSK BIT24 +#define SDIO_HIMR_ATIMEND_MSK BIT25 +#define SDIO_HIMR_ATIMEND_E_MSK BIT26 +#define SDIO_HIMR_CTWEND_MSK BIT27 + +//RTL8188E SDIO Specific +#define SDIO_HIMR_MCU_ERR_MSK BIT28 +#define SDIO_HIMR_TSF_BIT32_TOGGLE_MSK BIT29 + +// SDIO Host Interrupt Service Routine +#define SDIO_HISR_RX_REQUEST BIT0 +#define SDIO_HISR_AVAL BIT1 +#define SDIO_HISR_TXERR BIT2 +#define SDIO_HISR_RXERR BIT3 +#define SDIO_HISR_TXFOVW BIT4 +#define SDIO_HISR_RXFOVW BIT5 +#define SDIO_HISR_TXBCNOK BIT6 +#define SDIO_HISR_TXBCNERR BIT7 +#define SDIO_HISR_BCNERLY_INT BIT16 +#define SDIO_HISR_C2HCMD BIT17 +#define SDIO_HISR_CPWM1 BIT18 +#define SDIO_HISR_CPWM2 BIT19 +#define SDIO_HISR_HSISR_IND BIT20 +#define SDIO_HISR_GTINT3_IND BIT21 +#define SDIO_HISR_GTINT4_IND BIT22 +#define SDIO_HISR_PSTIMEOUT BIT23 +#define SDIO_HISR_OCPINT BIT24 +#define SDIO_HISR_ATIMEND BIT25 +#define SDIO_HISR_ATIMEND_E BIT26 +#define SDIO_HISR_CTWEND BIT27 + +//RTL8188E SDIO Specific +#define SDIO_HISR_MCU_ERR BIT28 +#define SDIO_HISR_TSF_BIT32_TOGGLE BIT29 + +#define MASK_SDIO_HISR_CLEAR (SDIO_HISR_TXERR |\ + SDIO_HISR_RXERR |\ + SDIO_HISR_TXFOVW |\ + SDIO_HISR_RXFOVW |\ + SDIO_HISR_TXBCNOK |\ + SDIO_HISR_TXBCNERR |\ + SDIO_HISR_C2HCMD |\ + SDIO_HISR_CPWM1 |\ + SDIO_HISR_CPWM2 |\ + SDIO_HISR_HSISR_IND |\ + SDIO_HISR_GTINT3_IND |\ + SDIO_HISR_GTINT4_IND |\ + SDIO_HISR_PSTIMEOUT |\ + SDIO_HISR_OCPINT) + +// SDIO HCI Suspend Control Register +#define HCI_RESUME_PWR_RDY BIT1 +#define HCI_SUS_CTRL BIT0 + +// SDIO Tx FIFO related +#define SDIO_TX_FREE_PG_QUEUE 4 // The number of Tx FIFO free page +#define SDIO_TX_FIFO_PAGE_SZ 128 + +/* move to rtl8188e_xmit.h +#if DEV_BUS_TYPE == RT_SDIO_INTERFACE + #define MAX_TX_AGG_PACKET_NUMBER 0x8 +#else + #define MAX_TX_AGG_PACKET_NUMBER 0xFF +#endif +*/ + +// vivi added for new cam search flow, 20091028 +//#define SCR_TxUseBroadcastDK BIT6 // Force Tx Use Broadcast Default Key +//#define SCR_RxUseBroadcastDK BIT7 // Force Rx Use Broadcast Default Key + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- + +//2 USB Information (0xFE17) +#define USB_IS_HIGH_SPEED 0 +#define USB_IS_FULL_SPEED 1 +#define USB_SPEED_MASK BIT(5) + +#define USB_NORMAL_SIE_EP_MASK 0xF +#define USB_NORMAL_SIE_EP_SHIFT 4 + + +//2 Special Option +#define USB_AGG_EN BIT(3) + +// 0; Use interrupt endpoint to upload interrupt pkt +// 1; Use bulk endpoint to upload interrupt pkt, +#define INT_BULK_SEL BIT(4) + + + +//2REG_C2HEVT_CLEAR +#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message +#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver. + + +//2REG_MULTI_FUNC_CTRL(For RTL8723 Only) +#define WL_HWPDN_EN BIT0 // Enable GPIO[9] as WiFi HW PDn source +#define WL_HWPDN_SL BIT1 // WiFi HW PDn polarity control +#define WL_FUNC_EN BIT2 // WiFi function enable +#define WL_HWROF_EN BIT3 // Enable GPIO[9] as WiFi RF HW PDn source +#define BT_HWPDN_EN BIT16 // Enable GPIO[11] as BT HW PDn source +#define BT_HWPDN_SL BIT17 // BT HW PDn polarity control +#define BT_FUNC_EN BIT18 // BT function enable +#define BT_HWROF_EN BIT19 // Enable GPIO[11] as BT/GPS RF HW PDn source +#define GPS_HWPDN_EN BIT20 // Enable GPIO[10] as GPS HW PDn source +#define GPS_HWPDN_SL BIT21 // GPS HW PDn polarity control +#define GPS_FUNC_EN BIT22 // GPS function enable + + +//3 REG_LIFECTRL_CTRL +#define HAL92C_EN_PKT_LIFE_TIME_BK BIT3 +#define HAL92C_EN_PKT_LIFE_TIME_BE BIT2 +#define HAL92C_EN_PKT_LIFE_TIME_VI BIT1 +#define HAL92C_EN_PKT_LIFE_TIME_VO BIT0 + +#define HAL92C_MSDU_LIFE_TIME_UNIT 128 // in us, said by Tim. + +//======================================================== +// General definitions +//======================================================== +//#if (HAL_8195A_USB == 1) +//#define LAST_ENTRY_OF_TX_PKT_BUFFER 255 +//#else +#define LAST_ENTRY_OF_TX_PKT_BUFFER 176 // 22k 22528 bytes +//#endif + +#define POLLING_LLT_THRESHOLD 20 +//#if RTL8188E_FOR_MP_TEST == 1 +//#define POLLING_READY_TIMEOUT_COUNT 3000 +//#else +#define POLLING_READY_TIMEOUT_COUNT 1000 +//#endif +// GPIO BIT +#define HAL_8188E_HW_GPIO_WPS_BIT BIT7 + +#if 0//(RTL8188E_SUPPORT == 1) +////////////////////////////////ONLY for 88EE///////////////////////////////// +// +// Host Interrupt Status Registers (Offset: 0x00B4-00B7, 0x00BC-00BF) +// Host Interrupt Mask Registers (Offset: 0x00B0-00B3, 0x00B8-00BB) +// +//---------------------------------------------------------------------------- +// 8188 IMR/ISR bits +//---------------------------------------------------------------------------- +#define IMR_DISABLED_88E 0x0 +// IMR DW0(0x00B0-00B3) Bit 0-31 +#define IMR_TXCCK_88E BIT30 // TXRPT interrupt when CCX bit of the packet is set +#define IMR_PSTIMEOUT_88E BIT29 // Power Save Time Out Interrupt +#define IMR_GTINT4_88E BIT28 // When GTIMER4 expires, this bit is set to 1 +#define IMR_GTINT3_88E BIT27 // When GTIMER3 expires, this bit is set to 1 +#define IMR_TBDER_88E BIT26 // Transmit Beacon0 Error +#define IMR_TBDOK_88E BIT25 // Transmit Beacon0 OK +#define IMR_TSF_BIT32_TOGGLE_88E BIT24 // TSF Timer BIT32 toggle indication interrupt +#define IMR_BcnInt_88E BIT20 // Beacon DMA Interrupt 0 +#define IMR_BDOK_88E BIT16 // Beacon Queue DMA OK0 +#define IMR_HSISR_IND_ON_INT_88E BIT15 // HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) +#define IMR_BCNDMAINT_E_88E BIT14 // Beacon DMA Interrupt Extension for Win7 +#define IMR_ATIMEND_88E BIT12 // CTWidnow End or ATIM Window End +#define IMR_HISR1_IND_INT_88E BIT11 // HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1) +#define IMR_C2HCMD_88E BIT10 // CPU to Host Command INT Status, Write 1 clear +#define IMR_CPWM2_88E BIT9 // CPU power Mode exchange INT Status, Write 1 clear +#define IMR_CPWM_88E BIT8 // CPU power Mode exchange INT Status, Write 1 clear +#define IMR_HIGHDOK_88E BIT7 // High Queue DMA OK +#define IMR_MGNTDOK_88E BIT6 // Management Queue DMA OK +#define IMR_BKDOK_88E BIT5 // AC_BK DMA OK +#define IMR_BEDOK_88E BIT4 // AC_BE DMA OK +#define IMR_VIDOK_88E BIT3 // AC_VI DMA OK +#define IMR_VODOK_88E BIT2 // AC_VO DMA OK +#define IMR_RDU_88E BIT1 // Rx Descriptor Unavailable +#define IMR_ROK_88E BIT0 // Receive DMA OK + +// IMR DW1(0x00B8-00BB) Bit 0-31 +#define IMR_BCNDMAINT7_88E BIT27 // Beacon DMA Interrupt 7 +#define IMR_BCNDMAINT6_88E BIT26 // Beacon DMA Interrupt 6 +#define IMR_BCNDMAINT5_88E BIT25 // Beacon DMA Interrupt 5 +#define IMR_BCNDMAINT4_88E BIT24 // Beacon DMA Interrupt 4 +#define IMR_BCNDMAINT3_88E BIT23 // Beacon DMA Interrupt 3 +#define IMR_BCNDMAINT2_88E BIT22 // Beacon DMA Interrupt 2 +#define IMR_BCNDMAINT1_88E BIT21 // Beacon DMA Interrupt 1 +#define IMR_BCNDOK7_88E BIT20 // Beacon Queue DMA OK Interrup 7 +#define IMR_BCNDOK6_88E BIT19 // Beacon Queue DMA OK Interrup 6 +#define IMR_BCNDOK5_88E BIT18 // Beacon Queue DMA OK Interrup 5 +#define IMR_BCNDOK4_88E BIT17 // Beacon Queue DMA OK Interrup 4 +#define IMR_BCNDOK3_88E BIT16 // Beacon Queue DMA OK Interrup 3 +#define IMR_BCNDOK2_88E BIT15 // Beacon Queue DMA OK Interrup 2 +#define IMR_BCNDOK1_88E BIT14 // Beacon Queue DMA OK Interrup 1 +#define IMR_ATIMEND_E_88E BIT13 // ATIM Window End Extension for Win7 +#define IMR_TXERR_88E BIT11 // Tx Error Flag Interrupt Status, write 1 clear. +#define IMR_RXERR_88E BIT10 // Rx Error Flag INT Status, Write 1 clear +#define IMR_TXFOVW_88E BIT9 // Transmit FIFO Overflow +#define IMR_RXFOVW_88E BIT8 // Receive FIFO Overflow + + + +////////////////////////////////ONLY for 88EE///////////////////////////////// +#endif //(RTL8188E_SUPPORT == 1) + + +//---------------------------------------------------------------------------- +// 8192C EEPROM/EFUSE share register definition. +//---------------------------------------------------------------------------- + +//==================================================== +// EEPROM/Efuse PG Offset for 88EE/88EU/88ES +//==================================================== +#define EEPROM_TX_PWR_INX_88E 0x10 + +#define EEPROM_ChannelPlan_88E 0xB8 +#define EEPROM_XTAL_88E 0xB9 +#define EEPROM_THERMAL_METER_88E 0xBA +#define EEPROM_IQK_LCK_88E 0xBB + +#define EEPROM_RF_BOARD_OPTION_88E 0xC1 +#define EEPROM_RF_FEATURE_OPTION_88E 0xC2 +#define EEPROM_RF_BT_SETTING_88E 0xC3 +#define EEPROM_VERSION_88E 0xC4 +#define EEPROM_CUSTOMERID_88E 0xC5 +#define EEPROM_RF_ANTENNA_OPT_88E 0xC9 + +#ifdef CONFIG_RF_GAIN_OFFSET +#define EEPROM_RF_GAIN_OFFSET_88E 0xC1 +#define EEPROM_RF_GAIN_VAL_88E 0xF6 //Physical address which is the BB gain offset value +#endif //CONFIG_RF_GAIN_OFFSET + +// RTL88EE +#define EEPROM_MAC_ADDR_88EE 0xD0 +#define EEPROM_VID_88EE 0xD6 +#define EEPROM_DID_88EE 0xD8 +#define EEPROM_SVID_88EE 0xDA +#define EEPROM_SMID_88EE 0xDC + +//RTL88EU +#define EEPROM_MAC_ADDR_88EU 0xD7 +#define EEPROM_VID_88EU 0xD0 +#define EEPROM_PID_88EU 0xD2 +#define EEPROM_USB_OPTIONAL_FUNCTION0 0xD4 + +// RTL88ES +#define EEPROM_MAC_ADDR_88ES 0x11A + + + + +//==================================================== +// EEPROM/Efuse Value Type +//==================================================== +#define EETYPE_TX_PWR 0x0 + +// +// Default Value for EEPROM or EFUSE!!! +// +#define EEPROM_Default_TSSI 0x0 +#define EEPROM_Default_TxPowerDiff 0x0 +#define EEPROM_Default_CrystalCap 0x5 +#define EEPROM_Default_BoardType 0x02 // Default: 2X2, RTL8192CE(QFPN68) +#define EEPROM_Default_TxPower 0x1010 +#define EEPROM_Default_HT2T_TxPwr 0x10 + +#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 +#define EEPROM_Default_ThermalMeter 0x12 + +#define EEPROM_Default_AntTxPowerDiff 0x0 +#define EEPROM_Default_TxPwDiff_CrystalCap 0x5 +#if (RTL8188ES_SUPPORT==1) //for SDIO +#define EEPROM_Default_TxPowerLevel 0x25 +#else //for USB/PCIE +#define EEPROM_Default_TxPowerLevel 0x2A +#endif + +#define EEPROM_Default_HT40_2SDiff 0x0 +#define EEPROM_Default_HT20_Diff 2 // HT20<->40 default Tx Power Index Difference +#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 +#define EEPROM_Default_HT40_PwrMaxOffset 0 +#define EEPROM_Default_HT20_PwrMaxOffset 0 + +#define EEPROM_Default_CrystalCap_88E 0x20 +#define EEPROM_Default_ThermalMeter_88E 0x18 + +#ifdef CONFIG_RF_GAIN_OFFSET +#define EEPROM_Default_RFGainOffset 0xff +#endif //CONFIG_RF_GAIN_OFFSET + +//New EFUSE deafult value +#define EEPROM_DEFAULT_24G_INDEX 0x2D +#define EEPROM_DEFAULT_24G_HT20_DIFF 0X02 +#define EEPROM_DEFAULT_24G_OFDM_DIFF 0X04 + +#define EEPROM_DEFAULT_5G_INDEX 0X2A +#define EEPROM_DEFAULT_5G_HT20_DIFF 0X00 +#define EEPROM_DEFAULT_5G_OFDM_DIFF 0X04 + +#define EEPROM_DEFAULT_DIFF 0XFE +#define EEPROM_DEFAULT_CHANNEL_PLAN 0x7F +#define EEPROM_DEFAULT_BOARD_OPTION 0x00 +#define EEPROM_DEFAULT_FEATURE_OPTION 0x00 +#define EEPROM_DEFAULT_BT_OPTION 0x10 + + +// For debug +#define EEPROM_Default_PID 0x1234 +#define EEPROM_Default_VID 0x5678 +#define EEPROM_Default_CustomerID 0xAB +#define EEPROM_Default_CustomerID_8188E 0x00 +#define EEPROM_Default_SubCustomerID 0xCD +#define EEPROM_Default_Version 0 + +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_NCC 0xB +#define EEPROM_USB_OPTIONAL1 0xE +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + + +#define EEPROM_CID_DEFAULT 0x0 +#define EEPROM_CID_TOSHIBA 0x4 +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. +#define EEPROM_CID_QMI 0x0D +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + + +#define RTL_EEPROM_ID 0x8129 + +#endif //__RTL8188E_SPEC_H__ + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8188e_xmit.h b/drivers/net/wireless/rtl8723as/include/rtl8188e_xmit.h index b2b41eafbede..842afc1a9b2f 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8188e_xmit.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8188e_xmit.h @@ -1,311 +1,311 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8188E_XMIT_H__ -#define __RTL8188E_XMIT_H__ - -#define MAX_TX_AGG_PACKET_NUMBER 0xFF -// -// Queue Select Value in TxDesc -// -#define QSLT_BK 0x2//0x01 -#define QSLT_BE 0x0 -#define QSLT_VI 0x5//0x4 -#define QSLT_VO 0x7//0x6 -#define QSLT_BEACON 0x10 -#define QSLT_HIGH 0x11 -#define QSLT_MGNT 0x12 -#define QSLT_CMD 0x13 - -//For 88e early mode -#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) -#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) -#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) -#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) -#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) -#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) -#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) - -// -//defined for TX DESC Operation -// - -#define MAX_TID (15) - -//OFFSET 0 -#define OFFSET_SZ 0 -#define OFFSET_SHT 16 -#define BMC BIT(24) -#define LSG BIT(26) -#define FSG BIT(27) -#define OWN BIT(31) - - -//OFFSET 4 -#define PKT_OFFSET_SZ 0 -#define QSEL_SHT 8 -#define RATE_ID_SHT 16 -#define NAVUSEHDR BIT(20) -#define SEC_TYPE_SHT 22 -#define PKT_OFFSET_SHT 26 - -//OFFSET 8 -#define AGG_EN BIT(12) -#define AGG_BK BIT(16) -#define AMPDU_DENSITY_SHT 20 -#define ANTSEL_A BIT(24) -#define ANTSEL_B BIT(25) -#define TX_ANT_CCK_SHT 26 -#define TX_ANTL_SHT 28 -#define TX_ANT_HT_SHT 30 - -//OFFSET 12 -#define SEQ_SHT 16 -#define EN_HWSEQ BIT(31) - -//OFFSET 16 -#define QOS BIT(6) -#define HW_SSN BIT(7) -#define USERATE BIT(8) -#define DISDATAFB BIT(10) -#define CTS_2_SELF BIT(11) -#define RTS_EN BIT(12) -#define HW_RTS_EN BIT(13) -#define DATA_SHORT BIT(24) -#define PWR_STATUS_SHT 15 -#define DATA_SC_SHT 20 -#define DATA_BW BIT(25) - -//OFFSET 20 -#define RTY_LMT_EN BIT(17) - -enum TXDESC_SC{ - SC_DONT_CARE = 0x00, - SC_UPPER= 0x01, - SC_LOWER=0x02, - SC_DUPLICATE=0x03 -}; -//OFFSET 20 -#define SGI BIT(6) -#define USB_TXAGG_NUM_SHT 24 - -typedef struct txdesc_88e -{ - //Offset 0 - u32 pktlen:16; - u32 offset:8; - u32 bmc:1; - u32 htc:1; - u32 ls:1; - u32 fs:1; - u32 linip:1; - u32 noacm:1; - u32 gf:1; - u32 own:1; - - //Offset 4 - u32 macid:6; - u32 rsvd0406:2; - u32 qsel:5; - u32 rd_nav_ext:1; - u32 lsig_txop_en:1; - u32 pifs:1; - u32 rate_id:4; - u32 navusehdr:1; - u32 en_desc_id:1; - u32 sectype:2; - u32 rsvd0424:2; - u32 pkt_offset:5; // unit: 8 bytes - u32 rsvd0431:1; - - //Offset 8 - u32 rts_rc:6; - u32 data_rc:6; - u32 agg_en:1; - u32 rd_en:1; - u32 bar_rty_th:2; - u32 bk:1; - u32 morefrag:1; - u32 raw:1; - u32 ccx:1; - u32 ampdu_density:3; - u32 bt_null:1; - u32 ant_sel_a:1; - u32 ant_sel_b:1; - u32 tx_ant_cck:2; - u32 tx_antl:2; - u32 tx_ant_ht:2; - - //Offset 12 - u32 nextheadpage:8; - u32 tailpage:8; - u32 seq:12; - u32 cpu_handle:1; - u32 tag1:1; - u32 trigger_int:1; - u32 hwseq_en:1; - - //Offset 16 - u32 rtsrate:5; - u32 ap_dcfe:1; - u32 hwseq_sel:2; - u32 userate:1; - u32 disrtsfb:1; - u32 disdatafb:1; - u32 cts2self:1; - u32 rtsen:1; - u32 hw_rts_en:1; - u32 port_id:1; - u32 pwr_status:3; - u32 wait_dcts:1; - u32 cts2ap_en:1; - u32 data_sc:2; - u32 data_stbc:2; - u32 data_short:1; - u32 data_bw:1; - u32 rts_short:1; - u32 rts_bw:1; - u32 rts_sc:2; - u32 vcs_stbc:2; - - //Offset 20 - u32 datarate:6; - u32 sgi:1; - u32 try_rate:1; - u32 data_ratefb_lmt:5; - u32 rts_ratefb_lmt:4; - u32 rty_lmt_en:1; - u32 data_rt_lmt:6; - u32 usb_txagg_num:8; - - //Offset 24 - u32 txagg_a:5; - u32 txagg_b:5; - u32 use_max_len:1; - u32 max_agg_num:5; - u32 mcsg1_max_len:4; - u32 mcsg2_max_len:4; - u32 mcsg3_max_len:4; - u32 mcs7_sgi_max_len:4; - - //Offset 28 - u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) - u32 sw0:8; /* offset 30 */ - u32 sw1:4; - u32 mcs15_sgi_max_len:4; -}TXDESC, *PTXDESC; - -#define txdesc_set_ccx_sw_88e(txdesc, value) \ - do { \ - ((struct txdesc_88e *)(txdesc))->sw1 = (((value)>>8) & 0x0f); \ - ((struct txdesc_88e *)(txdesc))->sw0 = ((value) & 0xff); \ - } while (0) - -struct txrpt_ccx_88e { - /* offset 0 */ - u8 tag1:1; - u8 pkt_num:3; - u8 txdma_underflow:1; - u8 int_bt:1; - u8 int_tri:1; - u8 int_ccx:1; - - /* offset 1 */ - u8 mac_id:6; - u8 pkt_ok:1; - u8 bmc:1; - - /* offset 2 */ - u8 retry_cnt:6; - u8 lifetime_over:1; - u8 retry_over:1; - - /* offset 3 */ - u8 ccx_qtime0; - u8 ccx_qtime1; - - /* offset 5 */ - u8 final_data_rate; - - /* offset 6 */ - u8 sw1:4; - u8 qsel:4; - - /* offset 7 */ - u8 sw0; -}; - -#define txrpt_ccx_sw_88e(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8)) -#define txrpt_ccx_qtime_88e(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8)) - -void rtl8188e_fill_fake_txdesc(PADAPTER padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull); -#ifdef CONFIG_SDIO_HCI -s32 rtl8188es_init_xmit_priv(PADAPTER padapter); -void rtl8188es_free_xmit_priv(PADAPTER padapter); -s32 rtl8188es_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8188es_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 rtl8188es_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -thread_return rtl8188es_xmit_thread(thread_context context); -s32 rtl8188es_xmit_buf_handler(PADAPTER padapter); -#define hal_xmit_handler rtl8188es_xmit_buf_handler - -#ifdef CONFIG_SDIO_TX_TASKLET -void rtl8188es_xmit_tasklet(void *priv); -#endif -#endif - -#ifdef CONFIG_USB_HCI -s32 rtl8188eu_init_xmit_priv(PADAPTER padapter); -void rtl8188eu_free_xmit_priv(PADAPTER padapter); -s32 rtl8188eu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8188eu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 rtl8188eu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -s32 rtl8188eu_xmit_buf_handler(PADAPTER padapter); -#define hal_xmit_handler rtl8188eu_xmit_buf_handler -void rtl8188eu_xmit_tasklet(void *priv); -s32 rtl8188eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); -#endif - -#ifdef CONFIG_PCI_HCI -s32 rtl8188ee_init_xmit_priv(PADAPTER padapter); -void rtl8188ee_free_xmit_priv(PADAPTER padapter); -struct xmit_buf *rtl8188ee_dequeue_xmitbuf(struct rtw_tx_ring *ring); -void rtl8188ee_xmitframe_resume(_adapter *padapter); -s32 rtl8188ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8188ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -void rtl8188ee_xmit_tasklet(void *priv); -#endif - - - -#ifdef CONFIG_TX_EARLY_MODE -void UpdateEarlyModeInfo8188E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf ); -#endif - -#ifdef CONFIG_XMIT_ACK -void dump_txrpt_ccx_88e(void *buf); -void handle_txrpt_ccx_88e(_adapter *adapter, u8 *buf); -#else -#define dump_txrpt_ccx_88e(buf) do {} while(0) -#define handle_txrpt_ccx_88e(adapter, buf) do {} while(0) -#endif //CONFIG_XMIT_ACK - -void _dbg_dump_tx_info(_adapter *padapter,int frame_tag,struct tx_desc *ptxdesc); -#endif //__RTL8188E_XMIT_H__ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8188E_XMIT_H__ +#define __RTL8188E_XMIT_H__ + +#define MAX_TX_AGG_PACKET_NUMBER 0xFF +// +// Queue Select Value in TxDesc +// +#define QSLT_BK 0x2//0x01 +#define QSLT_BE 0x0 +#define QSLT_VI 0x5//0x4 +#define QSLT_VO 0x7//0x6 +#define QSLT_BEACON 0x10 +#define QSLT_HIGH 0x11 +#define QSLT_MGNT 0x12 +#define QSLT_CMD 0x13 + +//For 88e early mode +#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) +#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) +#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) +#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) +#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) +#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) +#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) + +// +//defined for TX DESC Operation +// + +#define MAX_TID (15) + +//OFFSET 0 +#define OFFSET_SZ 0 +#define OFFSET_SHT 16 +#define BMC BIT(24) +#define LSG BIT(26) +#define FSG BIT(27) +#define OWN BIT(31) + + +//OFFSET 4 +#define PKT_OFFSET_SZ 0 +#define QSEL_SHT 8 +#define RATE_ID_SHT 16 +#define NAVUSEHDR BIT(20) +#define SEC_TYPE_SHT 22 +#define PKT_OFFSET_SHT 26 + +//OFFSET 8 +#define AGG_EN BIT(12) +#define AGG_BK BIT(16) +#define AMPDU_DENSITY_SHT 20 +#define ANTSEL_A BIT(24) +#define ANTSEL_B BIT(25) +#define TX_ANT_CCK_SHT 26 +#define TX_ANTL_SHT 28 +#define TX_ANT_HT_SHT 30 + +//OFFSET 12 +#define SEQ_SHT 16 +#define EN_HWSEQ BIT(31) + +//OFFSET 16 +#define QOS BIT(6) +#define HW_SSN BIT(7) +#define USERATE BIT(8) +#define DISDATAFB BIT(10) +#define CTS_2_SELF BIT(11) +#define RTS_EN BIT(12) +#define HW_RTS_EN BIT(13) +#define DATA_SHORT BIT(24) +#define PWR_STATUS_SHT 15 +#define DATA_SC_SHT 20 +#define DATA_BW BIT(25) + +//OFFSET 20 +#define RTY_LMT_EN BIT(17) + +enum TXDESC_SC{ + SC_DONT_CARE = 0x00, + SC_UPPER= 0x01, + SC_LOWER=0x02, + SC_DUPLICATE=0x03 +}; +//OFFSET 20 +#define SGI BIT(6) +#define USB_TXAGG_NUM_SHT 24 + +typedef struct txdesc_88e +{ + //Offset 0 + u32 pktlen:16; + u32 offset:8; + u32 bmc:1; + u32 htc:1; + u32 ls:1; + u32 fs:1; + u32 linip:1; + u32 noacm:1; + u32 gf:1; + u32 own:1; + + //Offset 4 + u32 macid:6; + u32 rsvd0406:2; + u32 qsel:5; + u32 rd_nav_ext:1; + u32 lsig_txop_en:1; + u32 pifs:1; + u32 rate_id:4; + u32 navusehdr:1; + u32 en_desc_id:1; + u32 sectype:2; + u32 rsvd0424:2; + u32 pkt_offset:5; // unit: 8 bytes + u32 rsvd0431:1; + + //Offset 8 + u32 rts_rc:6; + u32 data_rc:6; + u32 agg_en:1; + u32 rd_en:1; + u32 bar_rty_th:2; + u32 bk:1; + u32 morefrag:1; + u32 raw:1; + u32 ccx:1; + u32 ampdu_density:3; + u32 bt_null:1; + u32 ant_sel_a:1; + u32 ant_sel_b:1; + u32 tx_ant_cck:2; + u32 tx_antl:2; + u32 tx_ant_ht:2; + + //Offset 12 + u32 nextheadpage:8; + u32 tailpage:8; + u32 seq:12; + u32 cpu_handle:1; + u32 tag1:1; + u32 trigger_int:1; + u32 hwseq_en:1; + + //Offset 16 + u32 rtsrate:5; + u32 ap_dcfe:1; + u32 hwseq_sel:2; + u32 userate:1; + u32 disrtsfb:1; + u32 disdatafb:1; + u32 cts2self:1; + u32 rtsen:1; + u32 hw_rts_en:1; + u32 port_id:1; + u32 pwr_status:3; + u32 wait_dcts:1; + u32 cts2ap_en:1; + u32 data_sc:2; + u32 data_stbc:2; + u32 data_short:1; + u32 data_bw:1; + u32 rts_short:1; + u32 rts_bw:1; + u32 rts_sc:2; + u32 vcs_stbc:2; + + //Offset 20 + u32 datarate:6; + u32 sgi:1; + u32 try_rate:1; + u32 data_ratefb_lmt:5; + u32 rts_ratefb_lmt:4; + u32 rty_lmt_en:1; + u32 data_rt_lmt:6; + u32 usb_txagg_num:8; + + //Offset 24 + u32 txagg_a:5; + u32 txagg_b:5; + u32 use_max_len:1; + u32 max_agg_num:5; + u32 mcsg1_max_len:4; + u32 mcsg2_max_len:4; + u32 mcsg3_max_len:4; + u32 mcs7_sgi_max_len:4; + + //Offset 28 + u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) + u32 sw0:8; /* offset 30 */ + u32 sw1:4; + u32 mcs15_sgi_max_len:4; +}TXDESC, *PTXDESC; + +#define txdesc_set_ccx_sw_88e(txdesc, value) \ + do { \ + ((struct txdesc_88e *)(txdesc))->sw1 = (((value)>>8) & 0x0f); \ + ((struct txdesc_88e *)(txdesc))->sw0 = ((value) & 0xff); \ + } while (0) + +struct txrpt_ccx_88e { + /* offset 0 */ + u8 tag1:1; + u8 pkt_num:3; + u8 txdma_underflow:1; + u8 int_bt:1; + u8 int_tri:1; + u8 int_ccx:1; + + /* offset 1 */ + u8 mac_id:6; + u8 pkt_ok:1; + u8 bmc:1; + + /* offset 2 */ + u8 retry_cnt:6; + u8 lifetime_over:1; + u8 retry_over:1; + + /* offset 3 */ + u8 ccx_qtime0; + u8 ccx_qtime1; + + /* offset 5 */ + u8 final_data_rate; + + /* offset 6 */ + u8 sw1:4; + u8 qsel:4; + + /* offset 7 */ + u8 sw0; +}; + +#define txrpt_ccx_sw_88e(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8)) +#define txrpt_ccx_qtime_88e(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8)) + +void rtl8188e_fill_fake_txdesc(PADAPTER padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull); +#ifdef CONFIG_SDIO_HCI +s32 rtl8188es_init_xmit_priv(PADAPTER padapter); +void rtl8188es_free_xmit_priv(PADAPTER padapter); +s32 rtl8188es_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8188es_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 rtl8188es_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +thread_return rtl8188es_xmit_thread(thread_context context); +s32 rtl8188es_xmit_buf_handler(PADAPTER padapter); +#define hal_xmit_handler rtl8188es_xmit_buf_handler + +#ifdef CONFIG_SDIO_TX_TASKLET +void rtl8188es_xmit_tasklet(void *priv); +#endif +#endif + +#ifdef CONFIG_USB_HCI +s32 rtl8188eu_init_xmit_priv(PADAPTER padapter); +void rtl8188eu_free_xmit_priv(PADAPTER padapter); +s32 rtl8188eu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8188eu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 rtl8188eu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtl8188eu_xmit_buf_handler(PADAPTER padapter); +#define hal_xmit_handler rtl8188eu_xmit_buf_handler +void rtl8188eu_xmit_tasklet(void *priv); +s32 rtl8188eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8188ee_init_xmit_priv(PADAPTER padapter); +void rtl8188ee_free_xmit_priv(PADAPTER padapter); +struct xmit_buf *rtl8188ee_dequeue_xmitbuf(struct rtw_tx_ring *ring); +void rtl8188ee_xmitframe_resume(_adapter *padapter); +s32 rtl8188ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8188ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +void rtl8188ee_xmit_tasklet(void *priv); +#endif + + + +#ifdef CONFIG_TX_EARLY_MODE +void UpdateEarlyModeInfo8188E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf ); +#endif + +#ifdef CONFIG_XMIT_ACK +void dump_txrpt_ccx_88e(void *buf); +void handle_txrpt_ccx_88e(_adapter *adapter, u8 *buf); +#else +#define dump_txrpt_ccx_88e(buf) do {} while(0) +#define handle_txrpt_ccx_88e(adapter, buf) do {} while(0) +#endif //CONFIG_XMIT_ACK + +void _dbg_dump_tx_info(_adapter *padapter,int frame_tag,struct tx_desc *ptxdesc); +#endif //__RTL8188E_XMIT_H__ + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8192c_event.h b/drivers/net/wireless/rtl8723as/include/rtl8192c_event.h index 1013f74a0be3..7596531fea0d 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8192c_event.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8192c_event.h @@ -16,13 +16,13 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -#ifndef _RTL8192C_EVENT_H_ -#define _RTL8192C_EVENT_H_ - - - - -#endif - - + ******************************************************************************/ +#ifndef _RTL8192C_EVENT_H_ +#define _RTL8192C_EVENT_H_ + + + + +#endif + + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8192c_hal.h b/drivers/net/wireless/rtl8723as/include/rtl8192c_hal.h index 7daf7575fa84..2d54a1982fbe 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8192c_hal.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8192c_hal.h @@ -843,7 +843,6 @@ void rtl8192c_ReadBluetoothCoexistInfo(PADAPTER Adapter, u8 *PROMContent, BOOLEA //void rtl8192c_free_hal_data(_adapter * padapter); VOID rtl8192c_EfuseParseIDCode(PADAPTER pAdapter, u8 *hwinfo); void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc); -void rtl8192c_clone_haldata(_adapter* dst_adapter, _adapter* src_adapter); s32 c2h_id_filter_ccx_8192c(u8 id); #endif diff --git a/drivers/net/wireless/rtl8723as/include/rtl8192c_led.h b/drivers/net/wireless/rtl8723as/include/rtl8192c_led.h index 1ccf93596896..df2a99988d9e 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8192c_led.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8192c_led.h @@ -16,27 +16,27 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -#ifndef __RTL8192C_LED_H_ -#define __RTL8192C_LED_H_ - -#include -#include -#include - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8192cu_InitSwLeds(_adapter *padapter); -void rtl8192cu_DeInitSwLeds(_adapter *padapter); -#endif -#ifdef CONFIG_PCI_HCI -void rtl8192ce_gen_RefreshLedState(PADAPTER Adapter); -void rtl8192ce_InitSwLeds(_adapter *padapter); -void rtl8192ce_DeInitSwLeds(_adapter *padapter); -#endif - -#endif - + ******************************************************************************/ +#ifndef __RTL8192C_LED_H_ +#define __RTL8192C_LED_H_ + +#include +#include +#include + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8192cu_InitSwLeds(_adapter *padapter); +void rtl8192cu_DeInitSwLeds(_adapter *padapter); +#endif +#ifdef CONFIG_PCI_HCI +void rtl8192ce_gen_RefreshLedState(PADAPTER Adapter); +void rtl8192ce_InitSwLeds(_adapter *padapter); +void rtl8192ce_DeInitSwLeds(_adapter *padapter); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8192c_recv.h b/drivers/net/wireless/rtl8723as/include/rtl8192c_recv.h index 1c26c8382eba..0a237dc18188 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8192c_recv.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8192c_recv.h @@ -60,7 +60,7 @@ //#define MAX_RECVBUF_SZ (32768) // 32k //#define MAX_RECVBUF_SZ (16384) //16K //#define MAX_RECVBUF_SZ (10240) //10K - #ifdef CONFIG_PLATFORM_MSTAR_TITANIA12 + #ifdef CONFIG_PLATFORM_MSTAR #define MAX_RECVBUF_SZ (8192) // 8K #else #define MAX_RECVBUF_SZ (15360) // 15k < 16k diff --git a/drivers/net/wireless/rtl8723as/include/rtl8192c_rf.h b/drivers/net/wireless/rtl8723as/include/rtl8192c_rf.h index 26c678a8da43..2d6bd8cf5f62 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8192c_rf.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8192c_rf.h @@ -16,77 +16,77 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -/****************************************************************************** - * - * - * Module: rtl8192c_rf.h ( Header File) - * - * Note: Collect every HAL RF type exter API or constant. - * - * Function: - * - * Export: - * - * Abbrev: - * - * History: - * Data Who Remark - * - * 09/25/2008 MHC Create initial version. - * - * -******************************************************************************/ -#ifndef _RTL8192C_RF_H_ -#define _RTL8192C_RF_H_ -/* Check to see if the file has been included already. */ - - -/*--------------------------Define Parameters-------------------------------*/ - -// -// For RF 6052 Series -// -#define RF6052_MAX_TX_PWR 0x3F -#define RF6052_MAX_REG 0x3F -#define RF6052_MAX_PATH 2 -/*--------------------------Define Parameters-------------------------------*/ - - -/*------------------------------Define structure----------------------------*/ - -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ - -/*------------------------Export Marco Definition---------------------------*/ - -/*------------------------Export Marco Definition---------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ - -// -// RF RL6052 Series API -// -void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, - IN u16 DataRate); -void rtl8192c_PHY_RF6052SetBandwidth( - IN PADAPTER Adapter, - IN HT_CHANNEL_WIDTH Bandwidth); -VOID rtl8192c_PHY_RF6052SetCckTxPower( - IN PADAPTER Adapter, - IN u8* pPowerlevel); -VOID rtl8192c_PHY_RF6052SetOFDMTxPower( - IN PADAPTER Adapter, - IN u8* pPowerLevel, - IN u8 Channel); -int PHY_RF6052_Config8192C( IN PADAPTER Adapter ); - -/*--------------------------Exported Function prototype---------------------*/ - - -#endif/* End of HalRf.h */ - + ******************************************************************************/ +/****************************************************************************** + * + * + * Module: rtl8192c_rf.h ( Header File) + * + * Note: Collect every HAL RF type exter API or constant. + * + * Function: + * + * Export: + * + * Abbrev: + * + * History: + * Data Who Remark + * + * 09/25/2008 MHC Create initial version. + * + * +******************************************************************************/ +#ifndef _RTL8192C_RF_H_ +#define _RTL8192C_RF_H_ +/* Check to see if the file has been included already. */ + + +/*--------------------------Define Parameters-------------------------------*/ + +// +// For RF 6052 Series +// +#define RF6052_MAX_TX_PWR 0x3F +#define RF6052_MAX_REG 0x3F +#define RF6052_MAX_PATH 2 +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ + +// +// RF RL6052 Series API +// +void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, + IN u16 DataRate); +void rtl8192c_PHY_RF6052SetBandwidth( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth); +VOID rtl8192c_PHY_RF6052SetCckTxPower( + IN PADAPTER Adapter, + IN u8* pPowerlevel); +VOID rtl8192c_PHY_RF6052SetOFDMTxPower( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel); +int PHY_RF6052_Config8192C( IN PADAPTER Adapter ); + +/*--------------------------Exported Function prototype---------------------*/ + + +#endif/* End of HalRf.h */ + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8192c_sreset.h b/drivers/net/wireless/rtl8723as/include/rtl8192c_sreset.h index 5b8302fc0235..93c36282b720 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8192c_sreset.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8192c_sreset.h @@ -16,18 +16,18 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -#ifndef _RTL8192C_SRESET_C_ -#define _RTL8192C_SRESET_C_ - -#include -#include -#include -#include - -#ifdef DBG_CONFIG_ERROR_DETECT -extern void rtl8192c_sreset_xmit_status_check(_adapter *padapter); -extern void rtl8192c_sreset_linked_status_check(_adapter *padapter); -#endif -#endif - + ******************************************************************************/ +#ifndef _RTL8192C_SRESET_C_ +#define _RTL8192C_SRESET_C_ + +#include +#include +#include +#include + +#ifdef DBG_CONFIG_ERROR_DETECT +extern void rtl8192c_sreset_xmit_status_check(_adapter *padapter); +extern void rtl8192c_sreset_linked_status_check(_adapter *padapter); +#endif +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8192d_hal.h b/drivers/net/wireless/rtl8723as/include/rtl8192d_hal.h index 954f6e749939..97083f0a134b 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8192d_hal.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8192d_hal.h @@ -850,6 +850,5 @@ VOID PHY_SetPowerOnFor8192D(PADAPTER Adapter); //void PHY_ConfigMacPhyMode92D(PADAPTER Adapter); void rtl8192d_free_hal_data(_adapter * padapter); void rtl8192d_set_hal_ops(struct hal_ops *pHalFunc); -void rtl8192d_clone_haldata(_adapter* dst_adapter, _adapter* src_adapter); #endif diff --git a/drivers/net/wireless/rtl8723as/include/rtl8192d_led.h b/drivers/net/wireless/rtl8723as/include/rtl8192d_led.h index d736bda4e935..c75df2efd807 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8192d_led.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8192d_led.h @@ -16,28 +16,28 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -#ifndef __RTL8192D_LED_H_ -#define __RTL8192D_LED_H_ - -#include -#include -#include - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8192du_InitSwLeds(_adapter *padapter); -void rtl8192du_DeInitSwLeds(_adapter *padapter); -#endif - -#ifdef CONFIG_PCI_HCI -void rtl8192de_gen_RefreshLedState(PADAPTER Adapter); -void rtl8192de_InitSwLeds(_adapter *padapter); -void rtl8192de_DeInitSwLeds(_adapter *padapter); -#endif - -#endif - + ******************************************************************************/ +#ifndef __RTL8192D_LED_H_ +#define __RTL8192D_LED_H_ + +#include +#include +#include + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8192du_InitSwLeds(_adapter *padapter); +void rtl8192du_DeInitSwLeds(_adapter *padapter); +#endif + +#ifdef CONFIG_PCI_HCI +void rtl8192de_gen_RefreshLedState(PADAPTER Adapter); +void rtl8192de_InitSwLeds(_adapter *padapter); +void rtl8192de_DeInitSwLeds(_adapter *padapter); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8192d_recv.h b/drivers/net/wireless/rtl8723as/include/rtl8192d_recv.h index c8ef028cbc59..5ffec3952ed3 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8192d_recv.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8192d_recv.h @@ -61,7 +61,7 @@ //#define MAX_RECVBUF_SZ (32768) // 32k //#define MAX_RECVBUF_SZ (16384) //16K //#define MAX_RECVBUF_SZ (10240) //10K - #ifdef CONFIG_PLATFORM_MSTAR_TITANIA12 + #ifdef CONFIG_PLATFORM_MSTAR #define MAX_RECVBUF_SZ (8192) // 8K #else #define MAX_RECVBUF_SZ (15360) // 15k < 16k diff --git a/drivers/net/wireless/rtl8723as/include/rtl8192d_rf.h b/drivers/net/wireless/rtl8723as/include/rtl8192d_rf.h index 0b439a3f0dd7..8fc17e256487 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8192d_rf.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8192d_rf.h @@ -16,82 +16,82 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -/****************************************************************************** - * - * - * Module: rtl8192d_rf.h ( Header File) - * - * Note: Collect every HAL RF type exter API or constant. - * - * Function: - * - * Export: - * - * Abbrev: - * - * History: - * Data Who Remark - * - * 09/25/2008 MHC Create initial version. - * - * -******************************************************************************/ -#ifndef _RTL8192D_RF_H_ -#define _RTL8192D_RF_H_ -/* Check to see if the file has been included already. */ - - -/*--------------------------Define Parameters-------------------------------*/ - -// -// For RF 6052 Series -// -#define RF6052_MAX_TX_PWR 0x3F -#define RF6052_MAX_REG 0x3F -#define RF6052_MAX_PATH 2 -/*--------------------------Define Parameters-------------------------------*/ - - -/*------------------------------Define structure----------------------------*/ - -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ - -/*------------------------Export Marco Definition---------------------------*/ - -/*------------------------Export Marco Definition---------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ - -// -// RF RL6052 Series API -// -void rtl8192d_RF_ChangeTxPath( IN PADAPTER Adapter, - IN u16 DataRate); -void rtl8192d_PHY_RF6052SetBandwidth( - IN PADAPTER Adapter, - IN HT_CHANNEL_WIDTH Bandwidth); -VOID rtl8192d_PHY_RF6052SetCckTxPower( - IN PADAPTER Adapter, - IN u8* pPowerlevel); -VOID rtl8192d_PHY_RF6052SetOFDMTxPower( - IN PADAPTER Adapter, - IN u8* pPowerLevel, - IN u8 Channel); -int PHY_RF6052_Config8192D( IN PADAPTER Adapter ); - -BOOLEAN rtl8192d_PHY_EnableAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0); - -void rtl8192d_PHY_PowerDownAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0); - - -/*--------------------------Exported Function prototype---------------------*/ - - -#endif/* End of HalRf.h */ - + ******************************************************************************/ +/****************************************************************************** + * + * + * Module: rtl8192d_rf.h ( Header File) + * + * Note: Collect every HAL RF type exter API or constant. + * + * Function: + * + * Export: + * + * Abbrev: + * + * History: + * Data Who Remark + * + * 09/25/2008 MHC Create initial version. + * + * +******************************************************************************/ +#ifndef _RTL8192D_RF_H_ +#define _RTL8192D_RF_H_ +/* Check to see if the file has been included already. */ + + +/*--------------------------Define Parameters-------------------------------*/ + +// +// For RF 6052 Series +// +#define RF6052_MAX_TX_PWR 0x3F +#define RF6052_MAX_REG 0x3F +#define RF6052_MAX_PATH 2 +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ + +// +// RF RL6052 Series API +// +void rtl8192d_RF_ChangeTxPath( IN PADAPTER Adapter, + IN u16 DataRate); +void rtl8192d_PHY_RF6052SetBandwidth( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth); +VOID rtl8192d_PHY_RF6052SetCckTxPower( + IN PADAPTER Adapter, + IN u8* pPowerlevel); +VOID rtl8192d_PHY_RF6052SetOFDMTxPower( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel); +int PHY_RF6052_Config8192D( IN PADAPTER Adapter ); + +BOOLEAN rtl8192d_PHY_EnableAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0); + +void rtl8192d_PHY_PowerDownAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0); + + +/*--------------------------Exported Function prototype---------------------*/ + + +#endif/* End of HalRf.h */ + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8723a_bt-coexist.h b/drivers/net/wireless/rtl8723as/include/rtl8723a_bt-coexist.h index e69a89179ed3..78d64b8d81b9 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8723a_bt-coexist.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8723a_bt-coexist.h @@ -1461,6 +1461,7 @@ typedef struct _BT_COEXIST_8723A u64 btInqPageStartTime; // for 2Ant u8 c2hBtProfile; // for 1Ant u8 btRetryCnt; + u16 AclTp; u8 btInfoExt; u8 bC2hBtInfoReqSent; u8 bForceFwBtInfo; @@ -1481,7 +1482,11 @@ void BTDM_SetFwDecBtPwr(PADAPTER padapter, u8 bDecBtPwr); u8 BTDM_BtProfileSupport(PADAPTER padapter); void BTDM_LpsLeave(PADAPTER padapter); u8 BTDM_1Ant8723A(PADAPTER padapter); +u8 BTDM_GetBtState8723A(PADAPTER padapter); +u8 BTDM_IsBtInquiryPage8723A(PADAPTER padapter); #define BT_1Ant BTDM_1Ant8723A +#define BT_GetBtState BTDM_GetBtState8723A +#define BT_IsBtInquiryPage BTDM_IsBtInquiryPage8723A // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc8723.h ===== #endif // __HALBTC8723_C__ @@ -1537,6 +1542,7 @@ void BTDM_DiminishWiFi(PADAPTER Adapter, u8 bDACOn, u8 bInterruptOn, u8 DACSwing // HEADER/TypeDef.h #define MAX_FW_SUPPORT_MACID_NUM 64 +#define WIFI_BUSY_TRAFFIC_TH 25 // ===== Below this line is sync from SD7 driver HAL/BTCoexist/HalBtCoexist.h ===== @@ -1770,6 +1776,7 @@ u8 BTDM_IsActionHIDPAN(PADAPTER padapter); u8 BTDM_IsActionPANA2DP(PADAPTER padapter); u8 BTDM_IsBtDisabled(PADAPTER padapter); #define BT_IsBtDisabled BTDM_IsBtDisabled +sint BTDM_CheckFWState(PADAPTER padapter, sint state); u32 BTDM_BtTxRxCounterH(PADAPTER padapter); u32 BTDM_BtTxRxCounterL(PADAPTER padapter); diff --git a/drivers/net/wireless/rtl8723as/include/rtl8723a_cmd.h b/drivers/net/wireless/rtl8723as/include/rtl8723a_cmd.h index 5839f932fe96..91202dc202dd 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8723a_cmd.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8723a_cmd.h @@ -219,6 +219,8 @@ void rtl8192c_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state); void CheckFwRsvdPageContent(PADAPTER padapter); +void rtl8723a_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt ); + #endif #ifdef CONFIG_TSF_RESET_OFFLOAD diff --git a/drivers/net/wireless/rtl8723as/include/rtl8723a_hal.h b/drivers/net/wireless/rtl8723as/include/rtl8723a_hal.h index b486a92ec6d1..2111999b82f4 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8723a_hal.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8723a_hal.h @@ -1,846 +1,849 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723A_HAL_H__ -#define __RTL8723A_HAL_H__ - -#include "rtl8723a_spec.h" -#include "rtl8723a_pg.h" -#include "Hal8723APhyReg.h" -#include "Hal8723APhyCfg.h" -#include "rtl8723a_rf.h" -#ifdef CONFIG_BT_COEXIST -#include "rtl8723a_bt-coexist.h" -#endif -#include "rtl8723a_dm.h" -#include "rtl8723a_recv.h" -#include "rtl8723a_xmit.h" -#include "rtl8723a_cmd.h" -#ifdef DBG_CONFIG_ERROR_DETECT -#include "rtl8723a_sreset.h" -#endif -#include "rtw_efuse.h" - -#include "../hal/OUTSRC/odm_precomp.h" - -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - - //2TODO: We should define 8192S firmware related macro settings here!! - #define RTL819X_DEFAULT_RF_TYPE RF_1T2R - #define RTL819X_TOTAL_RF_PATH 2 - -//--------------------------------------------------------------------- -// RTL8723S From file -//--------------------------------------------------------------------- - #define RTL8723_FW_UMC_IMG "rtl8723S\\rtl8723fw.bin" - #define RTL8723_FW_UMC_B_IMG "rtl8723S\\rtl8723fw_B.bin" - #define RTL8723_PHY_REG "rtl8723S\\PHY_REG_1T.txt" - #define RTL8723_PHY_RADIO_A "rtl8723S\\radio_a_1T.txt" - #define RTL8723_PHY_RADIO_B "rtl8723S\\radio_b_1T.txt" - #define RTL8723_AGC_TAB "rtl8723S\\AGC_TAB_1T.txt" - #define RTL8723_PHY_MACREG "rtl8723S\\MAC_REG.txt" - #define RTL8723_PHY_REG_PG "rtl8723S\\PHY_REG_PG.txt" - #define RTL8723_PHY_REG_MP "rtl8723S\\PHY_REG_MP.txt" - -//--------------------------------------------------------------------- -// RTL8723S From header -//--------------------------------------------------------------------- - - // Fw Array - #define Rtl8723_FwImageArray Rtl8723SFwImgArray - #define Rtl8723_FwUMCBCutImageArrayWithBT Rtl8723SFwUMCBCutImgArrayWithBT - #define Rtl8723_FwUMCBCutImageArrayWithoutBT Rtl8723SFwUMCBCutImgArrayWithoutBT - - #define Rtl8723_ImgArrayLength Rtl8723SImgArrayLength - #define Rtl8723_UMCBCutImgArrayWithBTLength Rtl8723SUMCBCutImgArrayWithBTLength - #define Rtl8723_UMCBCutImgArrayWithoutBTLength Rtl8723SUMCBCutImgArrayWithoutBTLength - - #define Rtl8723_PHY_REG_Array_PG Rtl8723SPHY_REG_Array_PG - #define Rtl8723_PHY_REG_Array_PGLength Rtl8723SPHY_REG_Array_PGLength -#if MP_DRIVER == 1 - #define Rtl8723E_FwBTImgArray Rtl8723EFwBTImgArray - #define Rtl8723E_FwBTImgArrayLength Rtl8723EBTImgArrayLength - - #define Rtl8723_FwUMCBCutMPImageArray Rtl8723SFwUMCBCutMPImgArray - #define Rtl8723_UMCBCutMPImgArrayLength Rtl8723SUMCBCutMPImgArrayLength - - #define Rtl8723_PHY_REG_Array_MP Rtl8723SPHY_REG_Array_MP - #define Rtl8723_PHY_REG_Array_MPLength Rtl8723SPHY_REG_Array_MPLength -#endif - -#ifndef CONFIG_PHY_SETTING_WITH_ODM - // MAC/BB/PHY Array - #define Rtl8723_MAC_Array Rtl8723SMAC_2T_Array - //#define Rtl8723_AGCTAB_2TArray Rtl8723SAGCTAB_2TArray - #define Rtl8723_AGCTAB_1TArray Rtl8723SAGCTAB_1TArray - //#define Rtl8723_PHY_REG_2TArray Rtl8723SPHY_REG_2TArray - #define Rtl8723_PHY_REG_1TArray Rtl8723SPHY_REG_1TArray - //#define Rtl8723_RadioA_2TArray Rtl8723SRadioA_2TArray - #define Rtl8723_RadioA_1TArray Rtl8723SRadioA_1TArray - //#define Rtl8723_RadioB_2TArray Rtl8723SRadioB_2TArray - #define Rtl8723_RadioB_1TArray Rtl8723SRadioB_1TArray - - // Array length - #define Rtl8723_MAC_ArrayLength Rtl8723SMAC_2T_ArrayLength - #define Rtl8723_AGCTAB_1TArrayLength Rtl8723SAGCTAB_1TArrayLength - #define Rtl8723_PHY_REG_1TArrayLength Rtl8723SPHY_REG_1TArrayLength - - #define Rtl8723_RadioA_1TArrayLength Rtl8723SRadioA_1TArrayLength - #define Rtl8723_RadioB_1TArrayLength Rtl8723SRadioB_1TArrayLength -#endif // CONFIG_PHY_SETTING_WITH_ODM -#endif // CONFIG_SDIO_HCI - -#ifdef CONFIG_USB_HCI - - //2TODO: We should define 8192S firmware related macro settings here!! - #define RTL819X_DEFAULT_RF_TYPE RF_1T2R - #define RTL819X_TOTAL_RF_PATH 2 - - //TODO: The following need to check!! - #define RTL8723_FW_UMC_IMG "rtl8192CU\\rtl8723fw.bin" - #define RTL8723_FW_UMC_B_IMG "rtl8192CU\\rtl8723fw_B.bin" - #define RTL8723_PHY_REG "rtl8723S\\PHY_REG_1T.txt" - #define RTL8723_PHY_RADIO_A "rtl8723S\\radio_a_1T.txt" - #define RTL8723_PHY_RADIO_B "rtl8723S\\radio_b_1T.txt" - #define RTL8723_AGC_TAB "rtl8723S\\AGC_TAB_1T.txt" - #define RTL8723_PHY_MACREG "rtl8723S\\MAC_REG.txt" - #define RTL8723_PHY_REG_PG "rtl8723S\\PHY_REG_PG.txt" - #define RTL8723_PHY_REG_MP "rtl8723S\\PHY_REG_MP.txt" - -//--------------------------------------------------------------------- -// RTL8723S From header -//--------------------------------------------------------------------- - - // Fw Array - #define Rtl8723_FwImageArray Rtl8723UFwImgArray - #define Rtl8723_FwUMCBCutImageArrayWithBT Rtl8723UFwUMCBCutImgArrayWithBT - #define Rtl8723_FwUMCBCutImageArrayWithoutBT Rtl8723UFwUMCBCutImgArrayWithoutBT - - #define Rtl8723_ImgArrayLength Rtl8723UImgArrayLength - #define Rtl8723_UMCBCutImgArrayWithBTLength Rtl8723UUMCBCutImgArrayWithBTLength - #define Rtl8723_UMCBCutImgArrayWithoutBTLength Rtl8723UUMCBCutImgArrayWithoutBTLength - - #define Rtl8723_PHY_REG_Array_PG Rtl8723UPHY_REG_Array_PG - #define Rtl8723_PHY_REG_Array_PGLength Rtl8723UPHY_REG_Array_PGLength - -#if MP_DRIVER == 1 - #define Rtl8723E_FwBTImgArray Rtl8723EFwBTImgArray - #define Rtl8723E_FwBTImgArrayLength Rtl8723EBTImgArrayLength - - #define Rtl8723_FwUMCBCutMPImageArray Rtl8723SFwUMCBCutMPImgArray - #define Rtl8723_UMCBCutMPImgArrayLength Rtl8723SUMCBCutMPImgArrayLength - - #define Rtl8723_PHY_REG_Array_MP Rtl8723UPHY_REG_Array_MP - #define Rtl8723_PHY_REG_Array_MPLength Rtl8723UPHY_REG_Array_MPLength -#endif -#ifndef CONFIG_PHY_SETTING_WITH_ODM - // MAC/BB/PHY Array - #define Rtl8723_MAC_Array Rtl8723UMAC_2T_Array - //#define Rtl8723_AGCTAB_2TArray Rtl8723UAGCTAB_2TArray - #define Rtl8723_AGCTAB_1TArray Rtl8723UAGCTAB_1TArray - //#define Rtl8723_PHY_REG_2TArray Rtl8723UPHY_REG_2TArray - #define Rtl8723_PHY_REG_1TArray Rtl8723UPHY_REG_1TArray - //#define Rtl8723_RadioA_2TArray Rtl8723URadioA_2TArray - #define Rtl8723_RadioA_1TArray Rtl8723URadioA_1TArray - //#define Rtl8723_RadioB_2TArray Rtl8723URadioB_2TArray - #define Rtl8723_RadioB_1TArray Rtl8723URadioB_1TArray - - - - // Array length - - #define Rtl8723_MAC_ArrayLength Rtl8723UMAC_2T_ArrayLength - #define Rtl8723_AGCTAB_1TArrayLength Rtl8723UAGCTAB_1TArrayLength - #define Rtl8723_PHY_REG_1TArrayLength Rtl8723UPHY_REG_1TArrayLength - - - #define Rtl8723_RadioA_1TArrayLength Rtl8723URadioA_1TArrayLength - #define Rtl8723_RadioB_1TArrayLength Rtl8723URadioB_1TArrayLength -#endif -#endif - -#define DRVINFO_SZ 4 // unit is 8bytes -#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) - -#define FW_8723A_SIZE 0x8000 -#define FW_8723A_START_ADDRESS 0x1000 -#define FW_8723A_END_ADDRESS 0x1FFF //0x5FFF - -#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes - -#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300) - -typedef enum _FIRMWARE_SOURCE { - FW_SOURCE_IMG_FILE = 0, - FW_SOURCE_HEADER_FILE = 1, //from header file -} FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; - -typedef struct _RT_FIRMWARE { - FIRMWARE_SOURCE eFWSource; -#ifdef CONFIG_EMBEDDED_FWIMG - u8* szFwBuffer; -#else - u8 szFwBuffer[FW_8723A_SIZE]; -#endif - u32 ulFwLength; - -#ifdef CONFIG_EMBEDDED_FWIMG - u8* szBTFwBuffer; -#else - u8 szBTFwBuffer[FW_8723A_SIZE]; -#endif - u32 ulBTFwLength; -} RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_8723A, *PRT_FIRMWARE_8723A; - -// -// This structure must be cared byte-ordering -// -// Added by tynli. 2009.12.04. -typedef struct _RT_8723A_FIRMWARE_HDR -{ - // 8-byte alinment required - - //--- LONG WORD 0 ---- - u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut - u8 Category; // AP/NIC and USB/PCI - u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions - u16 Version; // FW Version - u8 Subversion; // FW Subversion, default 0x00 - u16 Rsvd1; - - - //--- LONG WORD 1 ---- - u8 Month; // Release time Month field - u8 Date; // Release time Date field - u8 Hour; // Release time Hour field - u8 Minute; // Release time Minute field - u16 RamCodeSize; // The size of RAM code - u16 Rsvd2; - - //--- LONG WORD 2 ---- - u32 SvnIdx; // The SVN entry index - u32 Rsvd3; - - //--- LONG WORD 3 ---- - u32 Rsvd4; - u32 Rsvd5; -}RT_8723A_FIRMWARE_HDR, *PRT_8723A_FIRMWARE_HDR; - -#define DRIVER_EARLY_INT_TIME 0x05 -#define BCN_DMA_ATIME_INT_TIME 0x02 - -#ifdef CONFIG_USB_RX_AGGREGATION - -typedef enum _USB_RX_AGG_MODE{ - USB_RX_AGG_DISABLE, - USB_RX_AGG_DMA, - USB_RX_AGG_USB, - USB_RX_AGG_MIX -}USB_RX_AGG_MODE; - -#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer - -#endif - - -// BK, BE, VI, VO, HCCA, MANAGEMENT, COMMAND, HIGH, BEACON. -#define MAX_TX_QUEUE 9 - -#define TX_SELE_HQ BIT(0) // High Queue -#define TX_SELE_LQ BIT(1) // Low Queue -#define TX_SELE_NQ BIT(2) // Normal Queue - -// Note: We will divide number of page equally for each queue other than public queue! -#define TX_TOTAL_PAGE_NUMBER 0xF8 -#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER + 1) - -// For Normal Chip Setting -// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER -#define NORMAL_PAGE_NUM_PUBQ 0xE7 -#define NORMAL_PAGE_NUM_HPQ 0x0C -#define NORMAL_PAGE_NUM_LPQ 0x02 -#define NORMAL_PAGE_NUM_NPQ 0x02 - -// For Test Chip Setting -// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER -#define TEST_PAGE_NUM_PUBQ 0x7E - -// For Test Chip Setting -#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 -#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 -#define WMM_TEST_PAGE_NUM_HPQ 0x29 -#define WMM_TEST_PAGE_NUM_LPQ 0x29 - -// Note: For Normal Chip Setting, modify later -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 -#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_NORMAL_PAGE_NUM_PUBQ 0xB0 -#define WMM_NORMAL_PAGE_NUM_HPQ 0x29 -#define WMM_NORMAL_PAGE_NUM_LPQ 0x1C -#define WMM_NORMAL_PAGE_NUM_NPQ 0x1C - - -//------------------------------------------------------------------------- -// Chip specific -//------------------------------------------------------------------------- -#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) -#define CHIP_BONDING_92C_1T2R 0x1 -#define CHIP_BONDING_88C_USB_MCARD 0x2 -#define CHIP_BONDING_88C_USB_HP 0x1 - -#include "HalVerDef.h" -#include "hal_com.h" - -//------------------------------------------------------------------------- -// Channel Plan -//------------------------------------------------------------------------- -enum ChannelPlan -{ - CHPL_FCC = 0, - CHPL_IC = 1, - CHPL_ETSI = 2, - CHPL_SPAIN = 3, - CHPL_FRANCE = 4, - CHPL_MKK = 5, - CHPL_MKK1 = 6, - CHPL_ISRAEL = 7, - CHPL_TELEC = 8, - CHPL_GLOBAL = 9, - CHPL_WORLD = 10, -}; - -#define HAL_EFUSE_MEMORY - -#define EFUSE_REAL_CONTENT_LEN 512 -#define EFUSE_MAP_LEN 128 -#define EFUSE_MAX_SECTION 16 -#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. -#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) -// -// -// To prevent out of boundary programming case, -// leave 1byte and program full section -// 9bytes + 1byt + 5bytes and pre 1byte. -// For worst case: -// | 1byte|----8bytes----|1byte|--5bytes--| -// | | Reserved(14bytes) | -// - -// PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. -#define EFUSE_OOB_PROTECT_BYTES 15 - -#define EFUSE_REAL_CONTENT_LEN_8723A 512 -#define EFUSE_MAP_LEN_8723A 256 -#define EFUSE_MAX_SECTION_8723A 32 - -//======================================================== -// EFUSE for BT definition -//======================================================== -#define EFUSE_BT_REAL_BANK_CONTENT_LEN 512 -#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 -#define EFUSE_BT_MAP_LEN 1024 // 1k bytes -#define EFUSE_BT_MAX_SECTION 128 // 1024/8 - -#define EFUSE_PROTECT_BYTES_BANK 16 - -// -// For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06. -// -typedef enum _RT_MULTI_FUNC { - RT_MULTI_FUNC_NONE = 0x00, - RT_MULTI_FUNC_WIFI = 0x01, - RT_MULTI_FUNC_BT = 0x02, - RT_MULTI_FUNC_GPS = 0x04, -} RT_MULTI_FUNC, *PRT_MULTI_FUNC; - -// -// For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08. -// -typedef enum _RT_POLARITY_CTL { - RT_POLARITY_LOW_ACT = 0, - RT_POLARITY_HIGH_ACT = 1, -} RT_POLARITY_CTL, *PRT_POLARITY_CTL; - -// For RTL8723 regulator mode. by tynli. 2011.01.14. -typedef enum _RT_REGULATOR_MODE { - RT_SWITCHING_REGULATOR = 0, - RT_LDO_REGULATOR = 1, -} RT_REGULATOR_MODE, *PRT_REGULATOR_MODE; - -// Description: Determine the types of C2H events that are the same in driver and Fw. -// Fisrt constructed by tynli. 2009.10.09. -typedef enum _RTL8192C_C2H_EVT -{ - C2H_DBG = 0, - C2H_TSF = 1, - C2H_AP_RPT_RSP = 2, - C2H_CCX_TX_RPT = 3, // The FW notify the report of the specific tx packet. - C2H_BT_RSSI = 4, - C2H_BT_OP_MODE = 5, - C2H_EXT_RA_RPT = 6, - C2H_HW_INFO_EXCH = 10, - C2H_C2H_H2C_TEST = 11, - C2H_BT_INFO = 12, - C2H_BT_MP_INFO = 15, - MAX_C2HEVENT -} RTL8192C_C2H_EVT; - -typedef struct hal_data_8723a -{ - HAL_VERSION VersionID; - RT_CUSTOMER_ID CustomerID; - - u16 FirmwareVersion; - u16 FirmwareVersionRev; - u16 FirmwareSubVersion; - u16 FirmwareSignature; - - //current WIFI_PHY values - u32 ReceiveConfig; - WIRELESS_MODE CurrentWirelessMode; - HT_CHANNEL_WIDTH CurrentChannelBW; - u8 CurrentChannel; - u8 nCur40MhzPrimeSC;// Control channel sub-carrier - - u16 BasicRateSet; - - //rf_ctrl - u8 rf_chip; - u8 rf_type; - u8 NumTotalRFPath; - - u8 BoardType; - u8 CrystalCap; - // - // EEPROM setting. - // - u8 EEPROMVersion; - u16 EEPROMVID; - u16 EEPROMPID; - u16 EEPROMSVID; - u16 EEPROMSDID; - u8 EEPROMCustomerID; - u8 EEPROMSubCustomerID; - u8 EEPROMRegulatory; - u8 EEPROMThermalMeter; - u8 EEPROMBluetoothCoexist; - u8 EEPROMBluetoothType; - u8 EEPROMBluetoothAntNum; - u8 EEPROMBluetoothAntIsolation; - u8 EEPROMBluetoothRadioShared; - - u8 bTXPowerDataReadFromEEPORM; - u8 bAPKThermalMeterIgnore; - - u8 bIQKInitialized; - u8 bAntennaDetected; - - u8 TxPwrLevelCck[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; - u8 TxPwrLevelHT40_1S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrLevelHT40_2S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrHt20Diff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff - u8 TxPwrLegacyHtDiff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff - // For power group - u8 PwrGroupHT20[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; - u8 PwrGroupHT40[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; - - u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff - - // Read/write are allow for following hardware information variables - u8 framesync; - u32 framesyncC34; - u8 framesyncMonitor; - u8 DefaultInitialGain[4]; - u8 pwrGroupCnt; - u32 MCSTxPowerLevelOriginalOffset[7][16]; - u32 CCKTxPowerLevelOriginalOffset; - - u32 AntennaTxPath; // Antenna path Tx - u32 AntennaRxPath; // Antenna path Rx - u8 ExternalPA; - - u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. - - //u32 LedControlNum; - //u32 LedControlMode; - //u32 TxPowerTrackControl; - u8 b1x1RecvCombine; // for 1T1R receive combining - - // For EDCA Turbo mode -// u8 bIsAnyNonBEPkts; // Adapter->recvpriv.bIsAnyNonBEPkts -// u8 bCurrentTurboEDCA; -// u8 bForcedDisableTurboEDCA; -// u8 bIsCurRDLState; // pdmpriv->prv_traffic_idx - - u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. - - //vivi, for tx power tracking, 20080407 - //u16 TSSI_13dBm; - //u32 Pwr_Track; - // The current Tx Power Level - u8 CurrentCckTxPwrIdx; - u8 CurrentOfdm24GTxPwrIdx; - - BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D - - BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. - - u32 RfRegChnlVal[2]; - - u8 bCckHighPower; - - //RDG enable - BOOLEAN bRDGEnable; - - //for host message to fw - u8 LastHMEBoxNum; - - u8 fw_ractrl; - u8 RegTxPause; - // Beacon function related global variable. - u32 RegBcnCtrlVal; - u8 RegFwHwTxQCtrl; - u8 RegReg542; - - struct dm_priv dmpriv; - DM_ODM_T odmpriv; - //_lock odm_stainfo_lock; -#ifdef DBG_CONFIG_ERROR_DETECT - struct sreset_priv srestpriv; -#endif - -#ifdef CONFIG_BT_COEXIST - u8 bBTMode; - // BT only. - BT30Info BtInfo; - // For bluetooth co-existance - BT_COEXIST_STR bt_coexist; -#endif - -#ifdef CONFIG_ANTENNA_DIVERSITY - u8 CurAntenna; - - // SW Antenna Switch - s32 RSSI_sum_A; - s32 RSSI_sum_B; - s32 RSSI_cnt_A; - s32 RSSI_cnt_B; - u8 RSSI_test; - u8 AntDivCfg; -#endif - - u8 bDumpRxPkt;//for debug - u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. - - // 2010/08/09 MH Add CU power down mode. - u8 pwrdown; - - // Add for dual MAC 0--Mac0 1--Mac1 - u32 interfaceIndex; - - u8 OutEpQueueSel; - u8 OutEpNumber; - - // 2010/12/10 MH Add for USB aggreation mode dynamic shceme. - BOOLEAN UsbRxHighSpeedMode; - - // 2010/11/22 MH Add for slim combo debug mode selective. - // This is used for fix the drawback of CU TSMC-A/UMC-A cut. HW auto suspend ability. Close BT clock. - BOOLEAN SlimComboDbg; - - // - // Add For EEPROM Efuse switch and Efuse Shadow map Setting - // - u8 EepromOrEfuse; -// u8 EfuseMap[2][HWSET_MAX_SIZE_512]; //92C:256bytes, 88E:512bytes, we use union set (512bytes) - u16 EfuseUsedBytes; - u8 EfuseUsedPercentage; -#ifdef HAL_EFUSE_MEMORY - EFUSE_HAL EfuseHal; -#endif - - // Interrupt relatd register information. - u32 SysIntrStatus; - u32 SysIntrMask; - - // - // 2011/02/23 MH Add for 8723 mylti function definition. The define should be moved to an - // independent file in the future. - // - //------------------------8723-----------------------------------------// - RT_MULTI_FUNC MultiFunc; // For multi-function consideration. - RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. - RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO - //------------------------8723-----------------------------------------// - // - // 2011/02/23 MH Add for 8723 mylti function definition. The define should be moved to an - // independent file in the future. - - BOOLEAN bMACFuncEnable; - -#ifdef CONFIG_P2P - struct P2P_PS_Offload_t p2p_ps_offload; -#endif - - - // - // For USB Interface HAL related - // -#ifdef CONFIG_USB_HCI - u32 UsbBulkOutSize; - - // Interrupt relatd register information. - u32 IntArray[2]; - u32 IntrMask[2]; -#endif - - - // - // For SDIO Interface HAL related - // - - // Auto FSM to Turn On, include clock, isolation, power control for MAC only - u8 bMacPwrCtrlOn; - -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - // - // SDIO ISR Related - // -// u32 IntrMask[1]; -// u32 IntrMaskToSet[1]; -// LOG_INTERRUPT InterruptLog; - u32 sdio_himr; - u32 sdio_hisr; - - // - // SDIO Tx FIFO related. - // - // HIQ, MID, LOW, PUB free pages; padapter->xmitpriv.free_txpg - u8 SdioTxFIFOFreePage[SDIO_TX_FREE_PG_QUEUE]; - _lock SdioTxFIFOFreePageLock; - _thread_hdl_ SdioXmitThread; - _sema SdioXmitSema; - _sema SdioXmitTerminateSema; - - // - // SDIO Rx FIFO related. - // - u8 SdioRxFIFOCnt; - u16 SdioRxFIFOSize; -#endif -} HAL_DATA_8723A, *PHAL_DATA_8723A; - -#if 0 -#define HAL_DATA_TYPE HAL_DATA_8723A -#define PHAL_DATA_TYPE PHAL_DATA_8723A -#else -typedef struct hal_data_8723a HAL_DATA_TYPE, *PHAL_DATA_TYPE; -#endif - -#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) -#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) - -#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) -#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) - -typedef struct rxreport_8723a -{ - u32 pktlen:14; - u32 crc32:1; - u32 icverr:1; - u32 drvinfosize:4; - u32 security:3; - u32 qos:1; - u32 shift:2; - u32 physt:1; - u32 swdec:1; - u32 ls:1; - u32 fs:1; - u32 eor:1; - u32 own:1; - - u32 macid:5; - u32 tid:4; - u32 hwrsvd:4; - u32 amsdu:1; - u32 paggr:1; - u32 faggr:1; - u32 a1fit:4; - u32 a2fit:4; - u32 pam:1; - u32 pwr:1; - u32 md:1; - u32 mf:1; - u32 type:2; - u32 mc:1; - u32 bc:1; - - u32 seq:12; - u32 frag:4; - u32 nextpktlen:14; - u32 nextind:1; - u32 rsvd0831:1; - - u32 rxmcs:6; - u32 rxht:1; - u32 gf:1; - u32 splcp:1; - u32 bw:1; - u32 htc:1; - u32 eosp:1; - u32 bssidfit:2; - u32 rsvd1214:16; - u32 unicastwake:1; - u32 magicwake:1; - - u32 pattern0match:1; - u32 pattern1match:1; - u32 pattern2match:1; - u32 pattern3match:1; - u32 pattern4match:1; - u32 pattern5match:1; - u32 pattern6match:1; - u32 pattern7match:1; - u32 pattern8match:1; - u32 pattern9match:1; - u32 patternamatch:1; - u32 patternbmatch:1; - u32 patterncmatch:1; - u32 rsvd1613:19; - - u32 tsfl; - - u32 bassn:12; - u32 bavld:1; - u32 rsvd2413:19; -} RXREPORT, *PRXREPORT; - -typedef struct phystatus_8723a -{ - u32 rxgain_a:7; - u32 trsw_a:1; - u32 rxgain_b:7; - u32 trsw_b:1; - u32 chcorr_l:16; - - u32 sigqualcck:8; - u32 cfo_a:8; - u32 cfo_b:8; - u32 chcorr_h:8; - - u32 noisepwrdb_h:8; - u32 cfo_tail_a:8; - u32 cfo_tail_b:8; - u32 rsvd0824:8; - - u32 rsvd1200:8; - u32 rxevm_a:8; - u32 rxevm_b:8; - u32 rxsnr_a:8; - - u32 rxsnr_b:8; - u32 noisepwrdb_l:8; - u32 rsvd1616:8; - u32 postsnr_a:8; - - u32 postsnr_b:8; - u32 csi_a:8; - u32 csi_b:8; - u32 targetcsi_a:8; - - u32 targetcsi_b:8; - u32 sigevm:8; - u32 maxexpwr:8; - u32 exintflag:1; - u32 sgien:1; - u32 rxsc:2; - u32 idlelong:1; - u32 anttrainen:1; - u32 antselb:1; - u32 antsel:1; -} PHYSTATUS, *PPHYSTATUS; - - -// rtl8723a_hal_init.c -int FirmwareDownloadBT(IN PADAPTER Adapter, PRT_FIRMWARE_8723A pFirmware); -s32 rtl8723a_FirmwareDownload(PADAPTER padapter); -void rtl8723a_FirmwareSelfReset(PADAPTER padapter); -void rtl8723a_InitializeFirmwareVars(PADAPTER padapter); - -void rtl8723a_InitAntenna_Selection(PADAPTER padapter); -void rtl8723a_DeinitAntenna_Selection(PADAPTER padapter); -void rtl8723a_CheckAntenna_Selection(PADAPTER padapter); -void rtl8723a_init_default_value(PADAPTER padapter); - -s32 InitLLTTable(PADAPTER padapter, u32 boundary); - -s32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU); -s32 CardDisableWithoutHWSM(PADAPTER padapter); - -// EFuse -u8 GetEEPROMSize8723A(PADAPTER padapter); -void Hal_InitPGData(PADAPTER padapter, u8 *PROMContent); -void Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo); -void Hal_EfuseParseTxPowerInfo_8723A(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail); -void Hal_EfuseParseBTCoexistInfo_8723A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseEEPROMVer(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void rtl8723a_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseCustomerID(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseAntennaDiversity(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseRateIndicationOption(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -void Hal_EfuseParseXtal_8723A(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail); -void Hal_EfuseParseThermalMeter_8723A(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail); - -//RT_CHANNEL_DOMAIN rtl8723a_HalMapChannelPlan(PADAPTER padapter, u8 HalChannelPlan); -//VERSION_8192C rtl8723a_ReadChipVersion(PADAPTER padapter); -//void rtl8723a_ReadBluetoothCoexistInfo(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoloadFail); -void Hal_InitChannelPlan(PADAPTER padapter); - -void rtl8723a_set_hal_ops(struct hal_ops *pHalFunc); -void SetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val); -void GetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val); -#ifdef CONFIG_BT_COEXIST -void rtl8723a_SingleDualAntennaDetection(PADAPTER padapter); -#endif - -// register -void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); -void rtl8723a_InitBeaconParameters(PADAPTER padapter); -void rtl8723a_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode); - -void rtl8723a_clone_haldata(_adapter *dst_adapter, _adapter *src_adapter); -void rtl8723a_start_thread(_adapter *padapter); -void rtl8723a_stop_thread(_adapter *padapter); - -s32 c2h_id_filter_ccx_8723a(u8 id); - - -#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) -void rtl8723a_init_checkbthang_workqueue(_adapter * padapter); -void rtl8723a_free_checkbthang_workqueue(_adapter * padapter); -void rtl8723a_cancel_checkbthang_workqueue(_adapter * padapter); -void rtl8723a_hal_check_bt_hang(_adapter * padapter); -#endif -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723A_HAL_H__ +#define __RTL8723A_HAL_H__ + +#include "rtl8723a_spec.h" +#include "rtl8723a_pg.h" +#include "Hal8723APhyReg.h" +#include "Hal8723APhyCfg.h" +#include "rtl8723a_rf.h" +#ifdef CONFIG_BT_COEXIST +#include "rtl8723a_bt-coexist.h" +#endif +#include "rtl8723a_dm.h" +#include "rtl8723a_recv.h" +#include "rtl8723a_xmit.h" +#include "rtl8723a_cmd.h" +#ifdef DBG_CONFIG_ERROR_DETECT +#include "rtl8723a_sreset.h" +#endif +#include "rtw_efuse.h" + +#include "../hal/OUTSRC/odm_precomp.h" + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + +//--------------------------------------------------------------------- +// RTL8723S From file +//--------------------------------------------------------------------- + #define RTL8723_FW_UMC_IMG "rtl8723S\\rtl8723fw.bin" + #define RTL8723_FW_UMC_B_IMG "rtl8723S\\rtl8723fw_B.bin" + #define RTL8723_PHY_REG "rtl8723S\\PHY_REG_1T.txt" + #define RTL8723_PHY_RADIO_A "rtl8723S\\radio_a_1T.txt" + #define RTL8723_PHY_RADIO_B "rtl8723S\\radio_b_1T.txt" + #define RTL8723_AGC_TAB "rtl8723S\\AGC_TAB_1T.txt" + #define RTL8723_PHY_MACREG "rtl8723S\\MAC_REG.txt" + #define RTL8723_PHY_REG_PG "rtl8723S\\PHY_REG_PG.txt" + #define RTL8723_PHY_REG_MP "rtl8723S\\PHY_REG_MP.txt" + +//--------------------------------------------------------------------- +// RTL8723S From header +//--------------------------------------------------------------------- + + // Fw Array + #define Rtl8723_FwImageArray Rtl8723SFwImgArray + #define Rtl8723_FwUMCBCutImageArrayWithBT Rtl8723SFwUMCBCutImgArrayWithBT + #define Rtl8723_FwUMCBCutImageArrayWithoutBT Rtl8723SFwUMCBCutImgArrayWithoutBT + + #define Rtl8723_ImgArrayLength Rtl8723SImgArrayLength + #define Rtl8723_UMCBCutImgArrayWithBTLength Rtl8723SUMCBCutImgArrayWithBTLength + #define Rtl8723_UMCBCutImgArrayWithoutBTLength Rtl8723SUMCBCutImgArrayWithoutBTLength + + #define Rtl8723_PHY_REG_Array_PG Rtl8723SPHY_REG_Array_PG + #define Rtl8723_PHY_REG_Array_PGLength Rtl8723SPHY_REG_Array_PGLength +#if MP_DRIVER == 1 + #define Rtl8723E_FwBTImgArray Rtl8723EFwBTImgArray + #define Rtl8723E_FwBTImgArrayLength Rtl8723EBTImgArrayLength + + #define Rtl8723_FwUMCBCutMPImageArray Rtl8723SFwUMCBCutMPImgArray + #define Rtl8723_UMCBCutMPImgArrayLength Rtl8723SUMCBCutMPImgArrayLength + + #define Rtl8723_PHY_REG_Array_MP Rtl8723SPHY_REG_Array_MP + #define Rtl8723_PHY_REG_Array_MPLength Rtl8723SPHY_REG_Array_MPLength +#endif + +#ifndef CONFIG_PHY_SETTING_WITH_ODM + // MAC/BB/PHY Array + #define Rtl8723_MAC_Array Rtl8723SMAC_2T_Array + //#define Rtl8723_AGCTAB_2TArray Rtl8723SAGCTAB_2TArray + #define Rtl8723_AGCTAB_1TArray Rtl8723SAGCTAB_1TArray + //#define Rtl8723_PHY_REG_2TArray Rtl8723SPHY_REG_2TArray + #define Rtl8723_PHY_REG_1TArray Rtl8723SPHY_REG_1TArray + //#define Rtl8723_RadioA_2TArray Rtl8723SRadioA_2TArray + #define Rtl8723_RadioA_1TArray Rtl8723SRadioA_1TArray + //#define Rtl8723_RadioB_2TArray Rtl8723SRadioB_2TArray + #define Rtl8723_RadioB_1TArray Rtl8723SRadioB_1TArray + + // Array length + #define Rtl8723_MAC_ArrayLength Rtl8723SMAC_2T_ArrayLength + #define Rtl8723_AGCTAB_1TArrayLength Rtl8723SAGCTAB_1TArrayLength + #define Rtl8723_PHY_REG_1TArrayLength Rtl8723SPHY_REG_1TArrayLength + + #define Rtl8723_RadioA_1TArrayLength Rtl8723SRadioA_1TArrayLength + #define Rtl8723_RadioB_1TArrayLength Rtl8723SRadioB_1TArrayLength +#endif // CONFIG_PHY_SETTING_WITH_ODM +#endif // CONFIG_SDIO_HCI + +#ifdef CONFIG_USB_HCI + + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //TODO: The following need to check!! + #define RTL8723_FW_UMC_IMG "rtl8192CU\\rtl8723fw.bin" + #define RTL8723_FW_UMC_B_IMG "rtl8192CU\\rtl8723fw_B.bin" + #define RTL8723_PHY_REG "rtl8723S\\PHY_REG_1T.txt" + #define RTL8723_PHY_RADIO_A "rtl8723S\\radio_a_1T.txt" + #define RTL8723_PHY_RADIO_B "rtl8723S\\radio_b_1T.txt" + #define RTL8723_AGC_TAB "rtl8723S\\AGC_TAB_1T.txt" + #define RTL8723_PHY_MACREG "rtl8723S\\MAC_REG.txt" + #define RTL8723_PHY_REG_PG "rtl8723S\\PHY_REG_PG.txt" + #define RTL8723_PHY_REG_MP "rtl8723S\\PHY_REG_MP.txt" + +//--------------------------------------------------------------------- +// RTL8723S From header +//--------------------------------------------------------------------- + + // Fw Array + #define Rtl8723_FwImageArray Rtl8723UFwImgArray + #define Rtl8723_FwUMCBCutImageArrayWithBT Rtl8723UFwUMCBCutImgArrayWithBT + #define Rtl8723_FwUMCBCutImageArrayWithoutBT Rtl8723UFwUMCBCutImgArrayWithoutBT + + #define Rtl8723_ImgArrayLength Rtl8723UImgArrayLength + #define Rtl8723_UMCBCutImgArrayWithBTLength Rtl8723UUMCBCutImgArrayWithBTLength + #define Rtl8723_UMCBCutImgArrayWithoutBTLength Rtl8723UUMCBCutImgArrayWithoutBTLength + + #define Rtl8723_PHY_REG_Array_PG Rtl8723UPHY_REG_Array_PG + #define Rtl8723_PHY_REG_Array_PGLength Rtl8723UPHY_REG_Array_PGLength + +#if MP_DRIVER == 1 + #define Rtl8723E_FwBTImgArray Rtl8723EFwBTImgArray + #define Rtl8723E_FwBTImgArrayLength Rtl8723EBTImgArrayLength + + #define Rtl8723_FwUMCBCutMPImageArray Rtl8723SFwUMCBCutMPImgArray + #define Rtl8723_UMCBCutMPImgArrayLength Rtl8723SUMCBCutMPImgArrayLength + + #define Rtl8723_PHY_REG_Array_MP Rtl8723UPHY_REG_Array_MP + #define Rtl8723_PHY_REG_Array_MPLength Rtl8723UPHY_REG_Array_MPLength +#endif +#ifndef CONFIG_PHY_SETTING_WITH_ODM + // MAC/BB/PHY Array + #define Rtl8723_MAC_Array Rtl8723UMAC_2T_Array + //#define Rtl8723_AGCTAB_2TArray Rtl8723UAGCTAB_2TArray + #define Rtl8723_AGCTAB_1TArray Rtl8723UAGCTAB_1TArray + //#define Rtl8723_PHY_REG_2TArray Rtl8723UPHY_REG_2TArray + #define Rtl8723_PHY_REG_1TArray Rtl8723UPHY_REG_1TArray + //#define Rtl8723_RadioA_2TArray Rtl8723URadioA_2TArray + #define Rtl8723_RadioA_1TArray Rtl8723URadioA_1TArray + //#define Rtl8723_RadioB_2TArray Rtl8723URadioB_2TArray + #define Rtl8723_RadioB_1TArray Rtl8723URadioB_1TArray + + + + // Array length + + #define Rtl8723_MAC_ArrayLength Rtl8723UMAC_2T_ArrayLength + #define Rtl8723_AGCTAB_1TArrayLength Rtl8723UAGCTAB_1TArrayLength + #define Rtl8723_PHY_REG_1TArrayLength Rtl8723UPHY_REG_1TArrayLength + + + #define Rtl8723_RadioA_1TArrayLength Rtl8723URadioA_1TArrayLength + #define Rtl8723_RadioB_1TArrayLength Rtl8723URadioB_1TArrayLength +#endif +#endif + +#define DRVINFO_SZ 4 // unit is 8bytes +#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) + +#define FW_8723A_SIZE 0x8000 +#define FW_8723A_START_ADDRESS 0x1000 +#define FW_8723A_END_ADDRESS 0x1FFF //0x5FFF + +#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes + +#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300) + +typedef enum _FIRMWARE_SOURCE { + FW_SOURCE_IMG_FILE = 0, + FW_SOURCE_HEADER_FILE = 1, //from header file +} FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; + +typedef struct _RT_FIRMWARE { + FIRMWARE_SOURCE eFWSource; +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; +#else + u8 szFwBuffer[FW_8723A_SIZE]; +#endif + u32 ulFwLength; + +#ifdef CONFIG_EMBEDDED_FWIMG + u8* szBTFwBuffer; +#else + u8 szBTFwBuffer[FW_8723A_SIZE]; +#endif + u32 ulBTFwLength; +} RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_8723A, *PRT_FIRMWARE_8723A; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. +typedef struct _RT_8723A_FIRMWARE_HDR +{ + // 8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u16 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u16 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; +}RT_8723A_FIRMWARE_HDR, *PRT_8723A_FIRMWARE_HDR; + +#define DRIVER_EARLY_INT_TIME 0x05 +#define BCN_DMA_ATIME_INT_TIME 0x02 + +#ifdef CONFIG_USB_RX_AGGREGATION + +typedef enum _USB_RX_AGG_MODE{ + USB_RX_AGG_DISABLE, + USB_RX_AGG_DMA, + USB_RX_AGG_USB, + USB_RX_AGG_MIX +}USB_RX_AGG_MODE; + +#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer + +#endif + + +// BK, BE, VI, VO, HCCA, MANAGEMENT, COMMAND, HIGH, BEACON. +#define MAX_TX_QUEUE 9 + +#define TX_SELE_HQ BIT(0) // High Queue +#define TX_SELE_LQ BIT(1) // Low Queue +#define TX_SELE_NQ BIT(2) // Normal Queue + +// Note: We will divide number of page equally for each queue other than public queue! +#define TX_TOTAL_PAGE_NUMBER 0xF8 +#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER + 1) + +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define NORMAL_PAGE_NUM_PUBQ 0xE7 +#define NORMAL_PAGE_NUM_HPQ 0x0C +#define NORMAL_PAGE_NUM_LPQ 0x02 +#define NORMAL_PAGE_NUM_NPQ 0x02 + +// For Test Chip Setting +// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define TEST_PAGE_NUM_PUBQ 0x7E + +// For Test Chip Setting +#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 +#define WMM_TEST_PAGE_NUM_HPQ 0x29 +#define WMM_TEST_PAGE_NUM_LPQ 0x29 + +// Note: For Normal Chip Setting, modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_NORMAL_PAGE_NUM_PUBQ 0xB0 +#define WMM_NORMAL_PAGE_NUM_HPQ 0x29 +#define WMM_NORMAL_PAGE_NUM_LPQ 0x1C +#define WMM_NORMAL_PAGE_NUM_NPQ 0x1C + + +//------------------------------------------------------------------------- +// Chip specific +//------------------------------------------------------------------------- +#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) +#define CHIP_BONDING_92C_1T2R 0x1 +#define CHIP_BONDING_88C_USB_MCARD 0x2 +#define CHIP_BONDING_88C_USB_HP 0x1 + +#include "HalVerDef.h" +#include "hal_com.h" + +//------------------------------------------------------------------------- +// Channel Plan +//------------------------------------------------------------------------- +enum ChannelPlan +{ + CHPL_FCC = 0, + CHPL_IC = 1, + CHPL_ETSI = 2, + CHPL_SPAIN = 3, + CHPL_FRANCE = 4, + CHPL_MKK = 5, + CHPL_MKK1 = 6, + CHPL_ISRAEL = 7, + CHPL_TELEC = 8, + CHPL_GLOBAL = 9, + CHPL_WORLD = 10, +}; + +#define HAL_EFUSE_MEMORY + +#define EFUSE_REAL_CONTENT_LEN 512 +#define EFUSE_MAP_LEN 128 +#define EFUSE_MAX_SECTION 16 +#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) +// +// +// To prevent out of boundary programming case, +// leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 1byte|----8bytes----|1byte|--5bytes--| +// | | Reserved(14bytes) | +// + +// PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. +#define EFUSE_OOB_PROTECT_BYTES 15 + +#define EFUSE_REAL_CONTENT_LEN_8723A 512 +#define EFUSE_MAP_LEN_8723A 256 +#define EFUSE_MAX_SECTION_8723A 32 + +//======================================================== +// EFUSE for BT definition +//======================================================== +#define EFUSE_BT_REAL_BANK_CONTENT_LEN 512 +#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 +#define EFUSE_BT_MAP_LEN 1024 // 1k bytes +#define EFUSE_BT_MAX_SECTION 128 // 1024/8 + +#define EFUSE_PROTECT_BYTES_BANK 16 + +// +// For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06. +// +typedef enum _RT_MULTI_FUNC { + RT_MULTI_FUNC_NONE = 0x00, + RT_MULTI_FUNC_WIFI = 0x01, + RT_MULTI_FUNC_BT = 0x02, + RT_MULTI_FUNC_GPS = 0x04, +} RT_MULTI_FUNC, *PRT_MULTI_FUNC; + +// +// For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08. +// +typedef enum _RT_POLARITY_CTL { + RT_POLARITY_LOW_ACT = 0, + RT_POLARITY_HIGH_ACT = 1, +} RT_POLARITY_CTL, *PRT_POLARITY_CTL; + +// For RTL8723 regulator mode. by tynli. 2011.01.14. +typedef enum _RT_REGULATOR_MODE { + RT_SWITCHING_REGULATOR = 0, + RT_LDO_REGULATOR = 1, +} RT_REGULATOR_MODE, *PRT_REGULATOR_MODE; + +// Description: Determine the types of C2H events that are the same in driver and Fw. +// Fisrt constructed by tynli. 2009.10.09. +typedef enum _RTL8192C_C2H_EVT +{ + C2H_DBG = 0, + C2H_TSF = 1, + C2H_AP_RPT_RSP = 2, + C2H_CCX_TX_RPT = 3, // The FW notify the report of the specific tx packet. + C2H_BT_RSSI = 4, + C2H_BT_OP_MODE = 5, + C2H_EXT_RA_RPT = 6, + C2H_HW_INFO_EXCH = 10, + C2H_C2H_H2C_TEST = 11, + C2H_BT_INFO = 12, + C2H_BT_MP_INFO = 15, + MAX_C2HEVENT +} RTL8192C_C2H_EVT; + +typedef struct hal_data_8723a +{ + HAL_VERSION VersionID; + RT_CUSTOMER_ID CustomerID; + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + u16 FirmwareSignature; + + //current WIFI_PHY values + u32 ReceiveConfig; + WIRELESS_MODE CurrentWirelessMode; + HT_CHANNEL_WIDTH CurrentChannelBW; + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + + u16 BasicRateSet; + + //rf_ctrl + u8 rf_chip; + u8 rf_type; + u8 NumTotalRFPath; + + u8 BoardType; + u8 CrystalCap; + // + // EEPROM setting. + // + u8 EEPROMVersion; + u16 EEPROMVID; + u16 EEPROMPID; + u16 EEPROMSVID; + u16 EEPROMSDID; + u8 EEPROMCustomerID; + u8 EEPROMSubCustomerID; + u8 EEPROMRegulatory; + u8 EEPROMThermalMeter; + u8 EEPROMBluetoothCoexist; + u8 EEPROMBluetoothType; + u8 EEPROMBluetoothAntNum; + u8 EEPROMBluetoothAntIsolation; + u8 EEPROMBluetoothRadioShared; + + u8 bTXPowerDataReadFromEEPORM; + u8 bAPKThermalMeterIgnore; + + u8 bIQKInitialized; + u8 bAntennaDetected; + + u8 TxPwrLevelCck[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 TxPwrLevelHT40_1S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[RF_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff + // For power group + u8 PwrGroupHT20[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 PwrGroupHT40[RF_PATH_MAX][CHANNEL_MAX_NUMBER]; + + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + + // Read/write are allow for following hardware information variables + u8 framesync; + u32 framesyncC34; + u8 framesyncMonitor; + u8 DefaultInitialGain[4]; + u8 pwrGroupCnt; + u32 MCSTxPowerLevelOriginalOffset[7][16]; + u32 CCKTxPowerLevelOriginalOffset; + + u32 AntennaTxPath; // Antenna path Tx + u32 AntennaRxPath; // Antenna path Rx + u8 ExternalPA; + + u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. + + //u32 LedControlNum; + //u32 LedControlMode; + //u32 TxPowerTrackControl; + u8 b1x1RecvCombine; // for 1T1R receive combining + + // For EDCA Turbo mode +// u8 bIsAnyNonBEPkts; // Adapter->recvpriv.bIsAnyNonBEPkts +// u8 bCurrentTurboEDCA; +// u8 bForcedDisableTurboEDCA; +// u8 bIsCurRDLState; // pdmpriv->prv_traffic_idx + + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + + //vivi, for tx power tracking, 20080407 + //u16 TSSI_13dBm; + //u32 Pwr_Track; + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. + + u32 RfRegChnlVal[2]; + + u8 bCckHighPower; + + //RDG enable + BOOLEAN bRDGEnable; + + //for host message to fw + u8 LastHMEBoxNum; + + u8 fw_ractrl; + u8 RegTxPause; + // Beacon function related global variable. + u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; + + struct dm_priv dmpriv; + DM_ODM_T odmpriv; + //_lock odm_stainfo_lock; +#ifdef DBG_CONFIG_ERROR_DETECT + struct sreset_priv srestpriv; +#endif + +#ifdef CONFIG_BT_COEXIST + u8 bBTMode; + // BT only. + BT30Info BtInfo; + // For bluetooth co-existance + BT_COEXIST_STR bt_coexist; +#endif + +#ifdef CONFIG_ANTENNA_DIVERSITY + u8 CurAntenna; + + // SW Antenna Switch + s32 RSSI_sum_A; + s32 RSSI_sum_B; + s32 RSSI_cnt_A; + s32 RSSI_cnt_B; + u8 RSSI_test; + u8 AntDivCfg; +#endif + + u8 bDumpRxPkt;//for debug + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + // 2010/08/09 MH Add CU power down mode. + u8 pwrdown; + + // Add for dual MAC 0--Mac0 1--Mac1 + u32 interfaceIndex; + + u8 OutEpQueueSel; + u8 OutEpNumber; + + // 2010/12/10 MH Add for USB aggreation mode dynamic shceme. + BOOLEAN UsbRxHighSpeedMode; + + // 2010/11/22 MH Add for slim combo debug mode selective. + // This is used for fix the drawback of CU TSMC-A/UMC-A cut. HW auto suspend ability. Close BT clock. + BOOLEAN SlimComboDbg; + + // + // Add For EEPROM Efuse switch and Efuse Shadow map Setting + // + u8 EepromOrEfuse; +// u8 EfuseMap[2][HWSET_MAX_SIZE_512]; //92C:256bytes, 88E:512bytes, we use union set (512bytes) + u16 EfuseUsedBytes; + u8 EfuseUsedPercentage; +#ifdef HAL_EFUSE_MEMORY + EFUSE_HAL EfuseHal; +#endif + + // Interrupt relatd register information. + u32 SysIntrStatus; + u32 SysIntrMask; + + // + // 2011/02/23 MH Add for 8723 mylti function definition. The define should be moved to an + // independent file in the future. + // + //------------------------8723-----------------------------------------// + RT_MULTI_FUNC MultiFunc; // For multi-function consideration. + RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. + RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO + //------------------------8723-----------------------------------------// + // + // 2011/02/23 MH Add for 8723 mylti function definition. The define should be moved to an + // independent file in the future. + + BOOLEAN bMACFuncEnable; + +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif + + + // + // For USB Interface HAL related + // +#ifdef CONFIG_USB_HCI + u32 UsbBulkOutSize; + + // Interrupt relatd register information. + u32 IntArray[2]; + u32 IntrMask[2]; +#endif + + + // + // For SDIO Interface HAL related + // + + // Auto FSM to Turn On, include clock, isolation, power control for MAC only + u8 bMacPwrCtrlOn; + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + // + // SDIO ISR Related + // +// u32 IntrMask[1]; +// u32 IntrMaskToSet[1]; +// LOG_INTERRUPT InterruptLog; + u32 sdio_himr; + u32 sdio_hisr; + + // + // SDIO Tx FIFO related. + // + // HIQ, MID, LOW, PUB free pages; padapter->xmitpriv.free_txpg + u8 SdioTxFIFOFreePage[SDIO_TX_FREE_PG_QUEUE]; + _lock SdioTxFIFOFreePageLock; + + // + // SDIO Rx FIFO related. + // + u8 SdioRxFIFOCnt; + u16 SdioRxFIFOSize; +#endif +} HAL_DATA_8723A, *PHAL_DATA_8723A; + +#if 0 +#define HAL_DATA_TYPE HAL_DATA_8723A +#define PHAL_DATA_TYPE PHAL_DATA_8723A +#else +typedef struct hal_data_8723a HAL_DATA_TYPE, *PHAL_DATA_TYPE; +#endif + +#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +typedef struct rxreport_8723a +{ + u32 pktlen:14; + u32 crc32:1; + u32 icverr:1; + u32 drvinfosize:4; + u32 security:3; + u32 qos:1; + u32 shift:2; + u32 physt:1; + u32 swdec:1; + u32 ls:1; + u32 fs:1; + u32 eor:1; + u32 own:1; + + u32 macid:5; + u32 tid:4; + u32 hwrsvd:4; + u32 amsdu:1; + u32 paggr:1; + u32 faggr:1; + u32 a1fit:4; + u32 a2fit:4; + u32 pam:1; + u32 pwr:1; + u32 md:1; + u32 mf:1; + u32 type:2; + u32 mc:1; + u32 bc:1; + + u32 seq:12; + u32 frag:4; + u32 nextpktlen:14; + u32 nextind:1; + u32 rsvd0831:1; + + u32 rxmcs:6; + u32 rxht:1; + u32 gf:1; + u32 splcp:1; + u32 bw:1; + u32 htc:1; + u32 eosp:1; + u32 bssidfit:2; + u32 rsvd1214:16; + u32 unicastwake:1; + u32 magicwake:1; + + u32 pattern0match:1; + u32 pattern1match:1; + u32 pattern2match:1; + u32 pattern3match:1; + u32 pattern4match:1; + u32 pattern5match:1; + u32 pattern6match:1; + u32 pattern7match:1; + u32 pattern8match:1; + u32 pattern9match:1; + u32 patternamatch:1; + u32 patternbmatch:1; + u32 patterncmatch:1; + u32 rsvd1613:19; + + u32 tsfl; + + u32 bassn:12; + u32 bavld:1; + u32 rsvd2413:19; +} RXREPORT, *PRXREPORT; + +typedef struct phystatus_8723a +{ + u32 rxgain_a:7; + u32 trsw_a:1; + u32 rxgain_b:7; + u32 trsw_b:1; + u32 chcorr_l:16; + + u32 sigqualcck:8; + u32 cfo_a:8; + u32 cfo_b:8; + u32 chcorr_h:8; + + u32 noisepwrdb_h:8; + u32 cfo_tail_a:8; + u32 cfo_tail_b:8; + u32 rsvd0824:8; + + u32 rsvd1200:8; + u32 rxevm_a:8; + u32 rxevm_b:8; + u32 rxsnr_a:8; + + u32 rxsnr_b:8; + u32 noisepwrdb_l:8; + u32 rsvd1616:8; + u32 postsnr_a:8; + + u32 postsnr_b:8; + u32 csi_a:8; + u32 csi_b:8; + u32 targetcsi_a:8; + + u32 targetcsi_b:8; + u32 sigevm:8; + u32 maxexpwr:8; + u32 exintflag:1; + u32 sgien:1; + u32 rxsc:2; + u32 idlelong:1; + u32 anttrainen:1; + u32 antselb:1; + u32 antsel:1; +} PHYSTATUS, *PPHYSTATUS; + + +// rtl8723a_hal_init.c +int FirmwareDownloadBT(IN PADAPTER Adapter, PRT_FIRMWARE_8723A pFirmware); +s32 rtl8723a_FirmwareDownload(PADAPTER padapter); +void rtl8723a_FirmwareSelfReset(PADAPTER padapter); +void rtl8723a_InitializeFirmwareVars(PADAPTER padapter); +void _8051Reset8723A(PADAPTER padapter); + +void rtl8723a_InitAntenna_Selection(PADAPTER padapter); +void rtl8723a_DeinitAntenna_Selection(PADAPTER padapter); +void rtl8723a_CheckAntenna_Selection(PADAPTER padapter); +void rtl8723a_init_default_value(PADAPTER padapter); + +s32 InitLLTTable(PADAPTER padapter, u32 boundary); + +s32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU); +s32 CardDisableWithoutHWSM(PADAPTER padapter); + +// EFuse +u8 GetEEPROMSize8723A(PADAPTER padapter); +void Hal_InitPGData(PADAPTER padapter, u8 *PROMContent); +void Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo); +void Hal_EfuseParseTxPowerInfo_8723A(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail); +void Hal_EfuseParseBTCoexistInfo_8723A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseEEPROMVer(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void rtl8723a_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseCustomerID(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseAntennaDiversity(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseRateIndicationOption(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); +void Hal_EfuseParseXtal_8723A(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail); +void Hal_EfuseParseThermalMeter_8723A(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail); + +//RT_CHANNEL_DOMAIN rtl8723a_HalMapChannelPlan(PADAPTER padapter, u8 HalChannelPlan); +//VERSION_8192C rtl8723a_ReadChipVersion(PADAPTER padapter); +//void rtl8723a_ReadBluetoothCoexistInfo(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoloadFail); +void Hal_InitChannelPlan(PADAPTER padapter); + +void rtl8723a_set_hal_ops(struct hal_ops *pHalFunc); +void SetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val); +void GetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val); +#ifdef CONFIG_BT_COEXIST +void rtl8723a_SingleDualAntennaDetection(PADAPTER padapter); +#endif + +// register +void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits); +void rtl8723a_InitBeaconParameters(PADAPTER padapter); +void rtl8723a_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode); + +void rtl8723a_start_thread(_adapter *padapter); +void rtl8723a_stop_thread(_adapter *padapter); + +s32 c2h_id_filter_ccx_8723a(u8 id); + + +#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) +void rtl8723a_init_checkbthang_workqueue(_adapter * padapter); +void rtl8723a_free_checkbthang_workqueue(_adapter * padapter); +void rtl8723a_cancel_checkbthang_workqueue(_adapter * padapter); +void rtl8723a_hal_check_bt_hang(_adapter * padapter); +#endif + + +#ifdef CONFIG_RF_GAIN_OFFSET +void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); +#endif //CONFIG_RF_GAIN_OFFSET + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8723a_led.h b/drivers/net/wireless/rtl8723as/include/rtl8723a_led.h index f0adfa50628b..1af419937025 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8723a_led.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8723a_led.h @@ -1,50 +1,50 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723A_LED_H__ -#define __RTL8723A_LED_H__ - -#include -#include -#include - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8723au_InitSwLeds(PADAPTER padapter); -void rtl8723au_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_PCI_HCI -void rtl8723ae_gen_RefreshLedState(PADAPTER Adapter); -void rtl8723ae_InitSwLeds(PADAPTER padapter); -void rtl8723ae_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_SDIO_HCI -void rtl8723as_InitSwLeds(PADAPTER padapter); -void rtl8723as_DeInitSwLeds(PADAPTER padapter); -#endif -#ifdef CONFIG_GSPI_HCI -void rtl8723as_InitSwLeds(PADAPTER padapter); -void rtl8723as_DeInitSwLeds(PADAPTER padapter); -#endif - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723A_LED_H__ +#define __RTL8723A_LED_H__ + +#include +#include +#include + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8723au_InitSwLeds(PADAPTER padapter); +void rtl8723au_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_PCI_HCI +void rtl8723ae_gen_RefreshLedState(PADAPTER Adapter); +void rtl8723ae_InitSwLeds(PADAPTER padapter); +void rtl8723ae_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_SDIO_HCI +void rtl8723as_InitSwLeds(PADAPTER padapter); +void rtl8723as_DeInitSwLeds(PADAPTER padapter); +#endif +#ifdef CONFIG_GSPI_HCI +void rtl8723as_InitSwLeds(PADAPTER padapter); +void rtl8723as_DeInitSwLeds(PADAPTER padapter); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8723a_recv.h b/drivers/net/wireless/rtl8723as/include/rtl8723a_recv.h index c7765cc7f12d..988316788325 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8723a_recv.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8723a_recv.h @@ -1,41 +1,41 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723A_RECV_H__ -#define __RTL8723A_RECV_H__ - -#include - - -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) -#ifdef CONFIG_DIRECT_RECV -void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf); -#endif -s32 rtl8723as_init_recv_priv(PADAPTER padapter); -void rtl8723as_free_recv_priv(PADAPTER padapter); -#endif - -void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); -void rtl8192c_process_phy_info(PADAPTER padapter, void *prframe); -#ifdef CONFIG_USB_HCI -void update_recvframe_attrib(union recv_frame *precvframe, struct recv_stat *prxstat); -void update_recvframe_phyinfo(union recv_frame *precvframe, struct phy_stat *pphy_info); -#endif -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723A_RECV_H__ +#define __RTL8723A_RECV_H__ + +#include + + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) +#ifdef CONFIG_DIRECT_RECV +void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf); +#endif +s32 rtl8723as_init_recv_priv(PADAPTER padapter); +void rtl8723as_free_recv_priv(PADAPTER padapter); +#endif + +void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); +void rtl8192c_process_phy_info(PADAPTER padapter, void *prframe); +#ifdef CONFIG_USB_HCI +void update_recvframe_attrib(union recv_frame *precvframe, struct recv_stat *prxstat); +void update_recvframe_phyinfo(union recv_frame *precvframe, struct phy_stat *pphy_info); +#endif +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8723a_spec.h b/drivers/net/wireless/rtl8723as/include/rtl8723a_spec.h index e631962125b1..a51bc5a0096f 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8723a_spec.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8723a_spec.h @@ -1,531 +1,538 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - *******************************************************************************/ -#ifndef __RTL8723A_SPEC_H__ -#define __RTL8723A_SPEC_H__ - -#include - - -//============================================================================ -// 8723A Regsiter offset definition -//============================================================================ -#define HAL_8723A_NAV_UPPER_UNIT 128 // micro-second - -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- -#define REG_SYSON_REG_LOCK 0x001C - - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- -#define REG_FTIMR 0x0138 - - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- - - -//----------------------------------------------------- -// -// 0x0280h ~ 0x02FFh RXDMA Configuration -// -//----------------------------------------------------- - - -//----------------------------------------------------- -// -// 0x0300h ~ 0x03FFh PCIe -// -//----------------------------------------------------- - - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- -#define REG_EARLY_MODE_CONTROL 0x4D0 - - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- - -//2 BCN_CTRL -#define DIS_ATIM BIT(0) -#define DIS_BCNQ_SUB BIT(1) -#define DIS_TSF_UDT BIT(4) - - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- -// -// Note: -// The NAV upper value is very important to WiFi 11n 5.2.3 NAV test. The default value is -// always too small, but the WiFi TestPlan test by 25,000 microseconds of NAV through sending -// CTS in the air. We must update this value greater than 25,000 microseconds to pass the item. -// The offset of NAV_UPPER in 8192C Spec is incorrect, and the offset should be 0x0652. Commented -// by SD1 Scott. -// By Bruce, 2011-07-18. -// -#define REG_NAV_UPPER 0x0652 // unit of 128 - - -//============================================================================ -// 8723 Regsiter Bit and Content definition -//============================================================================ - -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- - -//2 SPS0_CTRL - -//2 SYS_ISO_CTRL - -//2 SYS_FUNC_EN - -//2 APS_FSMCO -#define EN_WLON BIT(16) - -//2 SYS_CLKR - -//2 9346CR - -//2 AFE_MISC - -//2 SPS0_CTRL - -//2 SPS_OCP_CFG - -//2 SYSON_REG_LOCK -#define WLOCK_ALL BIT(0) -#define WLOCK_00 BIT(1) -#define WLOCK_04 BIT(2) -#define WLOCK_08 BIT(3) -#define WLOCK_40 BIT(4) -#define WLOCK_1C_B6 BIT(5) -#define R_DIS_PRST_1 BIT(6) -#define LOCK_ALL_EN BIT(7) - -//2 RF_CTRL - -//2 LDOA15_CTRL - -//2 LDOV12D_CTRL - -//2 AFE_XTAL_CTRL - -//2 AFE_PLL_CTRL - -//2 EFUSE_CTRL - -//2 EFUSE_TEST (For RTL8723 partially) - -//2 PWR_DATA - -//2 CAL_TIMER - -//2 ACLK_MON - -//2 GPIO_MUXCFG - -//2 GPIO_PIN_CTRL - -//2 GPIO_INTM - -//2 LEDCFG - -//2 FSIMR - -//2 FSISR - -//2 HSIMR -// 8723 Host System Interrupt Mask Register (offset 0x58, 32 byte) -#define HSIMR_GPIO12_0_INT_EN BIT(0) -#define HSIMR_SPS_OCP_INT_EN BIT(5) -#define HSIMR_RON_INT_EN BIT(6) -#define HSIMR_PDNINT_EN BIT(7) -#define HSIMR_GPIO9_INT_EN BIT(25) - -//2 HSISR -// 8723 Host System Interrupt Status Register (offset 0x5C, 32 byte) -#define HSISR_GPIO12_0_INT BIT(0) -#define HSISR_SPS_OCP_INT BIT(5) -#define HSISR_RON_INT BIT(6) -#define HSISR_PDNINT BIT(7) -#define HSISR_GPIO9_INT BIT(25) - -// interrupt mask which needs to clear -#define MASK_HSISR_CLEAR (HSISR_GPIO12_0_INT |\ - HSISR_SPS_OCP_INT |\ - HSISR_RON_INT |\ - HSISR_PDNINT |\ - HSISR_GPIO9_INT) - -//2 MCUFWDL -#define RAM_DL_SEL BIT7 // 1:RAM, 0:ROM - -//2 HPON_FSM - -//2 SYS_CFG -#define RTL_ID BIT(23) // TestChip ID, 1:Test(RLE); 0:MP(RL) -#define SPS_SEL BIT(24) // 1:LDO regulator mode; 0:Switching regulator mode - - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- - -//2 Function Enable Registers - -//2 CR -#define CALTMR_EN BIT(10) - -//2 PBP - Page Size Register - -//2 TX/RXDMA - -//2 TRXFF_BNDY - -//2 LLT_INIT - -//2 BB_ACCESS_CTRL - - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- - -//2 RQPN - -//2 TDECTRL - -//2 TDECTL - -//2 TXDMA_OFFSET_CHK - - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- - -//2 FWHW_TXQ_CTRL - -//2 INIRTSMCS_SEL - -//2 SPEC SIFS - -//2 RRSR - -//2 ARFR - -//2 AGGLEN_LMT_L - -//2 RL - -//2 DARFRC - -//2 RARFRC - - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- - -//2 EDCA setting - -//2 EDCA_VO_PARAM - -//2 SIFS_CCK - -//2 SIFS_OFDM - -//2 TBTT PROHIBIT - -//2 REG_RD_CTRL - -//2 BCN_CTRL - -//2 ACMHWCTRL - - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- - -//2 APSD_CTRL - -//2 BWOPMODE - -//2 TCR - -//2 RCR - -//2 RX_PKT_LIMIT - -//2 RX_DLK_TIME - -//2 MBIDCAMCFG - -//2 AMPDU_MIN_SPACE - -//2 RXERR_RPT - -//2 SECCFG - - -//----------------------------------------------------- -// -// 0xFE00h ~ 0xFE55h RTL8723 SDIO Configuration -// -//----------------------------------------------------- - -// I/O bus domain address mapping -#define SDIO_LOCAL_BASE 0x10250000 -#define WLAN_IOREG_BASE 0x10260000 -#define FIRMWARE_FIFO_BASE 0x10270000 -#define TX_HIQ_BASE 0x10310000 -#define TX_MIQ_BASE 0x10320000 -#define TX_LOQ_BASE 0x10330000 -#define RX_RX0FF_BASE 0x10340000 - -// SDIO host local register space mapping. -#define SDIO_LOCAL_MSK 0x0FFF -#define WLAN_IOREG_MSK 0x7FFF -#define WLAN_FIFO_MSK 0x1FFF // Aggregation Length[12:0] -#define WLAN_RX0FF_MSK 0x0003 - -#define SDIO_WITHOUT_REF_DEVICE_ID 0 // Without reference to the SDIO Device ID -#define SDIO_LOCAL_DEVICE_ID 0 // 0b[16], 000b[15:13] -#define WLAN_TX_HIQ_DEVICE_ID 4 // 0b[16], 100b[15:13] -#define WLAN_TX_MIQ_DEVICE_ID 5 // 0b[16], 101b[15:13] -#define WLAN_TX_LOQ_DEVICE_ID 6 // 0b[16], 110b[15:13] -#define WLAN_RX0FF_DEVICE_ID 7 // 0b[16], 111b[15:13] -#define WLAN_IOREG_DEVICE_ID 8 // 1b[16] - -// SDIO Tx Free Page Index -#define HI_QUEUE_IDX 0 -#define MID_QUEUE_IDX 1 -#define LOW_QUEUE_IDX 2 -#define PUBLIC_QUEUE_IDX 3 - -#define SDIO_MAX_TX_QUEUE 3 // HIQ, MIQ and LOQ -#define SDIO_MAX_RX_QUEUE 1 - -#define SDIO_REG_TX_CTRL 0x0000 // SDIO Tx Control -#define SDIO_REG_HIMR 0x0014 // SDIO Host Interrupt Mask -#define SDIO_REG_HISR 0x0018 // SDIO Host Interrupt Service Routine -#define SDIO_REG_HCPWM 0x0019 // HCI Current Power Mode -#define SDIO_REG_RX0_REQ_LEN 0x001C // RXDMA Request Length -#define SDIO_REG_FREE_TXPG 0x0020 // Free Tx Buffer Page -#define SDIO_REG_HCPWM1 0x0024 // HCI Current Power Mode 1 -#define SDIO_REG_HCPWM2 0x0026 // HCI Current Power Mode 2 -#define SDIO_REG_HTSFR_INFO 0x0030 // HTSF Informaion -#define SDIO_REG_HRPWM1 0x0080 // HCI Request Power Mode 1 -#define SDIO_REG_HRPWM2 0x0082 // HCI Request Power Mode 2 -#define SDIO_REG_HPS_CLKR 0x0084 // HCI Power Save Clock -#define SDIO_REG_HSUS_CTRL 0x0086 // SDIO HCI Suspend Control -#define SDIO_REG_HIMR_ON 0x0090 // SDIO Host Extension Interrupt Mask Always -#define SDIO_REG_HISR_ON 0x0091 // SDIO Host Extension Interrupt Status Always - -#define SDIO_HIMR_DISABLED 0 - -// SDIO Host Interrupt Mask Register -#define SDIO_HIMR_RX_REQUEST_MSK BIT0 -#define SDIO_HIMR_AVAL_MSK BIT1 -#define SDIO_HIMR_TXERR_MSK BIT2 -#define SDIO_HIMR_RXERR_MSK BIT3 -#define SDIO_HIMR_TXFOVW_MSK BIT4 -#define SDIO_HIMR_RXFOVW_MSK BIT5 -#define SDIO_HIMR_TXBCNOK_MSK BIT6 -#define SDIO_HIMR_TXBCNERR_MSK BIT7 -#define SDIO_HIMR_BCNERLY_INT_MSK BIT16 -#define SDIO_HIMR_C2HCMD_MSK BIT17 -#define SDIO_HIMR_CPWM1_MSK BIT18 -#define SDIO_HIMR_CPWM2_MSK BIT19 -#define SDIO_HIMR_HSISR_IND_MSK BIT20 -#define SDIO_HIMR_GTINT3_IND_MSK BIT21 -#define SDIO_HIMR_GTINT4_IND_MSK BIT22 -#define SDIO_HIMR_PSTIMEOUT_MSK BIT23 -#define SDIO_HIMR_OCPINT_MSK BIT24 -#define SDIO_HIMR_ATIMEND_MSK BIT25 -#define SDIO_HIMR_ATIMEND_E_MSK BIT26 -#define SDIO_HIMR_CTWEND_MSK BIT27 - -// SDIO Host Interrupt Service Routine -#define SDIO_HISR_RX_REQUEST BIT0 -#define SDIO_HISR_AVAL BIT1 -#define SDIO_HISR_TXERR BIT2 -#define SDIO_HISR_RXERR BIT3 -#define SDIO_HISR_TXFOVW BIT4 -#define SDIO_HISR_RXFOVW BIT5 -#define SDIO_HISR_TXBCNOK BIT6 -#define SDIO_HISR_TXBCNERR BIT7 -#define SDIO_HISR_BCNERLY_INT BIT16 -#define SDIO_HISR_C2HCMD BIT17 -#define SDIO_HISR_CPWM1 BIT18 -#define SDIO_HISR_CPWM2 BIT19 -#define SDIO_HISR_HSISR_IND BIT20 -#define SDIO_HISR_GTINT3_IND BIT21 -#define SDIO_HISR_GTINT4_IND BIT22 -#define SDIO_HISR_PSTIMEOUT BIT23 -#define SDIO_HISR_OCPINT BIT24 -#define SDIO_HISR_ATIMEND BIT25 -#define SDIO_HISR_ATIMEND_E BIT26 -#define SDIO_HISR_CTWEND BIT27 - -#define MASK_SDIO_HISR_CLEAR (SDIO_HISR_TXERR |\ - SDIO_HISR_RXERR |\ - SDIO_HISR_TXFOVW |\ - SDIO_HISR_RXFOVW |\ - SDIO_HISR_TXBCNOK |\ - SDIO_HISR_TXBCNERR |\ - SDIO_HISR_C2HCMD |\ - SDIO_HISR_CPWM1 |\ - SDIO_HISR_CPWM2 |\ - SDIO_HISR_HSISR_IND |\ - SDIO_HISR_GTINT3_IND |\ - SDIO_HISR_GTINT4_IND |\ - SDIO_HISR_PSTIMEOUT |\ - SDIO_HISR_OCPINT) - -// SDIO HCI Suspend Control Register -#define HCI_RESUME_PWR_RDY BIT1 -#define HCI_SUS_CTRL BIT0 - -// SDIO Tx FIFO related -#define SDIO_TX_FREE_PG_QUEUE 4 // The number of Tx FIFO free page -#define SDIO_TX_FIFO_PAGE_SZ 128 - -// vivi added for new cam search flow, 20091028 -#define SCR_TxUseBroadcastDK BIT6 // Force Tx Use Broadcast Default Key -#define SCR_RxUseBroadcastDK BIT7 // Force Rx Use Broadcast Default Key - - -//---------------------------------------------------------------------------- -// 8723 EFUSE -//---------------------------------------------------------------------------- -#ifdef HWSET_MAX_SIZE -#undef HWSET_MAX_SIZE -#endif -#define HWSET_MAX_SIZE 256 - - -//----------------------------------------------------------------------------- -//USB interrupt -//----------------------------------------------------------------------------- -#define UHIMR_TIMEOUT2 BIT31 -#define UHIMR_TIMEOUT1 BIT30 -#define UHIMR_PSTIMEOUT BIT29 -#define UHIMR_GTINT4 BIT28 -#define UHIMR_GTINT3 BIT27 -#define UHIMR_TXBCNERR BIT26 -#define UHIMR_TXBCNOK BIT25 -#define UHIMR_TSF_BIT32_TOGGLE BIT24 -#define UHIMR_BCNDMAINT3 BIT23 -#define UHIMR_BCNDMAINT2 BIT22 -#define UHIMR_BCNDMAINT1 BIT21 -#define UHIMR_BCNDMAINT0 BIT20 -#define UHIMR_BCNDOK3 BIT19 -#define UHIMR_BCNDOK2 BIT18 -#define UHIMR_BCNDOK1 BIT17 -#define UHIMR_BCNDOK0 BIT16 -#define UHIMR_HSISR_IND BIT15 -#define UHIMR_BCNDMAINT_E BIT14 -//RSVD BIT13 -#define UHIMR_CTW_END BIT12 -//RSVD BIT11 -#define UHIMR_C2HCMD BIT10 -#define UHIMR_CPWM2 BIT9 -#define UHIMR_CPWM BIT8 -#define UHIMR_HIGHDOK BIT7 // High Queue DMA OK Interrupt -#define UHIMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt -#define UHIMR_BKDOK BIT5 // AC_BK DMA OK Interrupt -#define UHIMR_BEDOK BIT4 // AC_BE DMA OK Interrupt -#define UHIMR_VIDOK BIT3 // AC_VI DMA OK Interrupt -#define UHIMR_VODOK BIT2 // AC_VO DMA Interrupt -#define UHIMR_RDU BIT1 // Receive Descriptor Unavailable -#define UHIMR_ROK BIT0 // Receive DMA OK Interrupt - -// USB Host Interrupt Status Extension bit -#define UHIMR_BCNDMAINT7 BIT23 -#define UHIMR_BCNDMAINT6 BIT22 -#define UHIMR_BCNDMAINT5 BIT21 -#define UHIMR_BCNDMAINT4 BIT20 -#define UHIMR_BCNDOK7 BIT19 -#define UHIMR_BCNDOK6 BIT18 -#define UHIMR_BCNDOK5 BIT17 -#define UHIMR_BCNDOK4 BIT16 -// bit14-15: RSVD -#define UHIMR_ATIMEND_E BIT13 -#define UHIMR_ATIMEND BIT12 -#define UHIMR_TXERR BIT11 -#define UHIMR_RXERR BIT10 -#define UHIMR_TXFOVW BIT9 -#define UHIMR_RXFOVW BIT8 -// bit2-7: RSVD -#define UHIMR_OCPINT BIT1 -// bit0: RSVD - -#define REG_USB_HIMR 0xFE38 -#define REG_USB_HIMRE 0xFE3C -#define REG_USB_HISR 0xFE78 -#define REG_USB_HISRE 0xFE7C - -#define USB_INTR_CPWM_OFFSET 16 -#define USB_INTR_CONTENT_HISR_OFFSET 48 -#define USB_INTR_CONTENT_HISRE_OFFSET 52 -#define USB_INTR_CONTENT_LENGTH 56 -#define USB_C2H_CMDID_OFFSET 0 -#define USB_C2H_SEQ_OFFSET 1 -#define USB_C2H_EVENT_OFFSET 2 -//============================================================================ -// General definitions -//============================================================================ - - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#ifndef __RTL8723A_SPEC_H__ +#define __RTL8723A_SPEC_H__ + +#include + + +//============================================================================ +// 8723A Regsiter offset definition +//============================================================================ +#define HAL_8723A_NAV_UPPER_UNIT 128 // micro-second + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_SYSON_REG_LOCK 0x001C + + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_FTIMR 0x0138 + + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- + + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- + + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- + + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +//#define REG_EARLY_MODE_CONTROL 0x4D0 +#define REG_MACID_NO_LINK 0x4D0 + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + +//2 BCN_CTRL +#define DIS_ATIM BIT(0) +#define DIS_BCNQ_SUB BIT(1) +#define DIS_TSF_UDT BIT(4) + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +// +// Note: +// The NAV upper value is very important to WiFi 11n 5.2.3 NAV test. The default value is +// always too small, but the WiFi TestPlan test by 25,000 microseconds of NAV through sending +// CTS in the air. We must update this value greater than 25,000 microseconds to pass the item. +// The offset of NAV_UPPER in 8192C Spec is incorrect, and the offset should be 0x0652. Commented +// by SD1 Scott. +// By Bruce, 2011-07-18. +// +#define REG_NAV_UPPER 0x0652 // unit of 128 + +#define REG_BT_COEX_TABLE_1 0x06C0 +#define REG_BT_COEX_TABLE_2 0x06C4 + +//============================================================================ +// 8723 Regsiter Bit and Content definition +//============================================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- + +//2 SPS0_CTRL + +//2 SYS_ISO_CTRL + +//2 SYS_FUNC_EN + +//2 APS_FSMCO +#define EN_WLON BIT(16) + +//2 SYS_CLKR + +//2 9346CR + +//2 AFE_MISC + +//2 SPS0_CTRL + +//2 SPS_OCP_CFG + +//2 SYSON_REG_LOCK +#define WLOCK_ALL BIT(0) +#define WLOCK_00 BIT(1) +#define WLOCK_04 BIT(2) +#define WLOCK_08 BIT(3) +#define WLOCK_40 BIT(4) +#define WLOCK_1C_B6 BIT(5) +#define R_DIS_PRST_1 BIT(6) +#define LOCK_ALL_EN BIT(7) + +//2 RF_CTRL + +//2 LDOA15_CTRL + +//2 LDOV12D_CTRL + +//2 AFE_XTAL_CTRL + +//2 AFE_PLL_CTRL + +//2 EFUSE_CTRL + +//2 EFUSE_TEST (For RTL8723 partially) + +//2 PWR_DATA + +//2 CAL_TIMER + +//2 ACLK_MON + +//2 GPIO_MUXCFG + +//2 GPIO_PIN_CTRL + +//2 GPIO_INTM + +//2 LEDCFG + +//2 FSIMR + +//2 FSISR + +//2 HSIMR +// 8723 Host System Interrupt Mask Register (offset 0x58, 32 byte) +#define HSIMR_GPIO12_0_INT_EN BIT(0) +#define HSIMR_SPS_OCP_INT_EN BIT(5) +#define HSIMR_RON_INT_EN BIT(6) +#define HSIMR_PDNINT_EN BIT(7) +#define HSIMR_GPIO9_INT_EN BIT(25) + +//2 HSISR +// 8723 Host System Interrupt Status Register (offset 0x5C, 32 byte) +#define HSISR_GPIO12_0_INT BIT(0) +#define HSISR_SPS_OCP_INT BIT(5) +#define HSISR_RON_INT BIT(6) +#define HSISR_PDNINT BIT(7) +#define HSISR_GPIO9_INT BIT(25) + +// interrupt mask which needs to clear +#define MASK_HSISR_CLEAR (HSISR_GPIO12_0_INT |\ + HSISR_SPS_OCP_INT |\ + HSISR_RON_INT |\ + HSISR_PDNINT |\ + HSISR_GPIO9_INT) + +//2 MCUFWDL +#define RAM_DL_SEL BIT7 // 1:RAM, 0:ROM + +//2 HPON_FSM + +//2 SYS_CFG +#define RTL_ID BIT(23) // TestChip ID, 1:Test(RLE); 0:MP(RL) +#define SPS_SEL BIT(24) // 1:LDO regulator mode; 0:Switching regulator mode + + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- + +//2 Function Enable Registers + +//2 CR +#define CALTMR_EN BIT(10) + +//2 PBP - Page Size Register + +//2 TX/RXDMA + +//2 TRXFF_BNDY + +//2 LLT_INIT + +//2 BB_ACCESS_CTRL + + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- + +//2 RQPN + +//2 TDECTRL + +//2 TDECTL + +//2 TXDMA_OFFSET_CHK + + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- + +//2 FWHW_TXQ_CTRL + +//2 INIRTSMCS_SEL + +//2 SPEC SIFS + +//2 RRSR + +//2 ARFR + +//2 AGGLEN_LMT_L + +//2 RL + +//2 DARFRC + +//2 RARFRC + + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + +//2 EDCA setting + +//2 EDCA_VO_PARAM + +//2 SIFS_CCK + +//2 SIFS_OFDM + +//2 TBTT PROHIBIT + +//2 REG_RD_CTRL + +//2 BCN_CTRL + +//2 ACMHWCTRL + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + +//2 APSD_CTRL + +//2 BWOPMODE + +//2 TCR + +//2 RCR + +//2 RX_PKT_LIMIT + +//2 RX_DLK_TIME + +//2 MBIDCAMCFG + +//2 AMPDU_MIN_SPACE + +//2 RXERR_RPT + +//2 SECCFG + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h RTL8723 SDIO Configuration +// +//----------------------------------------------------- + +// I/O bus domain address mapping +#define SDIO_LOCAL_BASE 0x10250000 +#define WLAN_IOREG_BASE 0x10260000 +#define FIRMWARE_FIFO_BASE 0x10270000 +#define TX_HIQ_BASE 0x10310000 +#define TX_MIQ_BASE 0x10320000 +#define TX_LOQ_BASE 0x10330000 +#define RX_RX0FF_BASE 0x10340000 + +// SDIO host local register space mapping. +#define SDIO_LOCAL_MSK 0x0FFF +#define WLAN_IOREG_MSK 0x7FFF +#define WLAN_FIFO_MSK 0x1FFF // Aggregation Length[12:0] +#define WLAN_RX0FF_MSK 0x0003 + +#define SDIO_WITHOUT_REF_DEVICE_ID 0 // Without reference to the SDIO Device ID +#define SDIO_LOCAL_DEVICE_ID 0 // 0b[16], 000b[15:13] +#define WLAN_TX_HIQ_DEVICE_ID 4 // 0b[16], 100b[15:13] +#define WLAN_TX_MIQ_DEVICE_ID 5 // 0b[16], 101b[15:13] +#define WLAN_TX_LOQ_DEVICE_ID 6 // 0b[16], 110b[15:13] +#define WLAN_RX0FF_DEVICE_ID 7 // 0b[16], 111b[15:13] +#define WLAN_IOREG_DEVICE_ID 8 // 1b[16] + +// SDIO Tx Free Page Index +#define HI_QUEUE_IDX 0 +#define MID_QUEUE_IDX 1 +#define LOW_QUEUE_IDX 2 +#define PUBLIC_QUEUE_IDX 3 + +#define SDIO_MAX_TX_QUEUE 3 // HIQ, MIQ and LOQ +#define SDIO_MAX_RX_QUEUE 1 + +#define SDIO_REG_TX_CTRL 0x0000 // SDIO Tx Control +#define SDIO_REG_HIMR 0x0014 // SDIO Host Interrupt Mask +#define SDIO_REG_HISR 0x0018 // SDIO Host Interrupt Service Routine +#define SDIO_REG_HCPWM 0x0019 // HCI Current Power Mode +#define SDIO_REG_RX0_REQ_LEN 0x001C // RXDMA Request Length +#define SDIO_REG_FREE_TXPG 0x0020 // Free Tx Buffer Page +#define SDIO_REG_HCPWM1 0x0024 // HCI Current Power Mode 1 +#define SDIO_REG_HCPWM2 0x0026 // HCI Current Power Mode 2 +#define SDIO_REG_HTSFR_INFO 0x0030 // HTSF Informaion +#define SDIO_REG_HRPWM1 0x0080 // HCI Request Power Mode 1 +#define SDIO_REG_HRPWM2 0x0082 // HCI Request Power Mode 2 +#define SDIO_REG_HPS_CLKR 0x0084 // HCI Power Save Clock +#define SDIO_REG_HSUS_CTRL 0x0086 // SDIO HCI Suspend Control +#define SDIO_REG_HIMR_ON 0x0090 // SDIO Host Extension Interrupt Mask Always +#define SDIO_REG_HISR_ON 0x0091 // SDIO Host Extension Interrupt Status Always + +#define SDIO_HIMR_DISABLED 0 + +// SDIO Host Interrupt Mask Register +#define SDIO_HIMR_RX_REQUEST_MSK BIT0 +#define SDIO_HIMR_AVAL_MSK BIT1 +#define SDIO_HIMR_TXERR_MSK BIT2 +#define SDIO_HIMR_RXERR_MSK BIT3 +#define SDIO_HIMR_TXFOVW_MSK BIT4 +#define SDIO_HIMR_RXFOVW_MSK BIT5 +#define SDIO_HIMR_TXBCNOK_MSK BIT6 +#define SDIO_HIMR_TXBCNERR_MSK BIT7 +#define SDIO_HIMR_BCNERLY_INT_MSK BIT16 +#define SDIO_HIMR_C2HCMD_MSK BIT17 +#define SDIO_HIMR_CPWM1_MSK BIT18 +#define SDIO_HIMR_CPWM2_MSK BIT19 +#define SDIO_HIMR_HSISR_IND_MSK BIT20 +#define SDIO_HIMR_GTINT3_IND_MSK BIT21 +#define SDIO_HIMR_GTINT4_IND_MSK BIT22 +#define SDIO_HIMR_PSTIMEOUT_MSK BIT23 +#define SDIO_HIMR_OCPINT_MSK BIT24 +#define SDIO_HIMR_ATIMEND_MSK BIT25 +#define SDIO_HIMR_ATIMEND_E_MSK BIT26 +#define SDIO_HIMR_CTWEND_MSK BIT27 + +// SDIO Host Interrupt Service Routine +#define SDIO_HISR_RX_REQUEST BIT0 +#define SDIO_HISR_AVAL BIT1 +#define SDIO_HISR_TXERR BIT2 +#define SDIO_HISR_RXERR BIT3 +#define SDIO_HISR_TXFOVW BIT4 +#define SDIO_HISR_RXFOVW BIT5 +#define SDIO_HISR_TXBCNOK BIT6 +#define SDIO_HISR_TXBCNERR BIT7 +#define SDIO_HISR_BCNERLY_INT BIT16 +#define SDIO_HISR_C2HCMD BIT17 +#define SDIO_HISR_CPWM1 BIT18 +#define SDIO_HISR_CPWM2 BIT19 +#define SDIO_HISR_HSISR_IND BIT20 +#define SDIO_HISR_GTINT3_IND BIT21 +#define SDIO_HISR_GTINT4_IND BIT22 +#define SDIO_HISR_PSTIMEOUT BIT23 +#define SDIO_HISR_OCPINT BIT24 +#define SDIO_HISR_ATIMEND BIT25 +#define SDIO_HISR_ATIMEND_E BIT26 +#define SDIO_HISR_CTWEND BIT27 + +#define MASK_SDIO_HISR_CLEAR (SDIO_HISR_TXERR |\ + SDIO_HISR_RXERR |\ + SDIO_HISR_TXFOVW |\ + SDIO_HISR_RXFOVW |\ + SDIO_HISR_TXBCNOK |\ + SDIO_HISR_TXBCNERR |\ + SDIO_HISR_C2HCMD |\ + SDIO_HISR_CPWM1 |\ + SDIO_HISR_CPWM2 |\ + SDIO_HISR_HSISR_IND |\ + SDIO_HISR_GTINT3_IND |\ + SDIO_HISR_GTINT4_IND |\ + SDIO_HISR_PSTIMEOUT |\ + SDIO_HISR_OCPINT) + +// SDIO HCI Suspend Control Register +#define HCI_RESUME_PWR_RDY BIT1 +#define HCI_SUS_CTRL BIT0 + +// SDIO Tx FIFO related +#define SDIO_TX_FREE_PG_QUEUE 4 // The number of Tx FIFO free page +#define SDIO_TX_FIFO_PAGE_SZ 128 + +// vivi added for new cam search flow, 20091028 +#define SCR_TxUseBroadcastDK BIT6 // Force Tx Use Broadcast Default Key +#define SCR_RxUseBroadcastDK BIT7 // Force Rx Use Broadcast Default Key + + +//---------------------------------------------------------------------------- +// 8723 EFUSE +//---------------------------------------------------------------------------- +#ifdef HWSET_MAX_SIZE +#undef HWSET_MAX_SIZE +#endif +#define HWSET_MAX_SIZE 256 + + +//----------------------------------------------------------------------------- +//USB interrupt +//----------------------------------------------------------------------------- +#define UHIMR_TIMEOUT2 BIT31 +#define UHIMR_TIMEOUT1 BIT30 +#define UHIMR_PSTIMEOUT BIT29 +#define UHIMR_GTINT4 BIT28 +#define UHIMR_GTINT3 BIT27 +#define UHIMR_TXBCNERR BIT26 +#define UHIMR_TXBCNOK BIT25 +#define UHIMR_TSF_BIT32_TOGGLE BIT24 +#define UHIMR_BCNDMAINT3 BIT23 +#define UHIMR_BCNDMAINT2 BIT22 +#define UHIMR_BCNDMAINT1 BIT21 +#define UHIMR_BCNDMAINT0 BIT20 +#define UHIMR_BCNDOK3 BIT19 +#define UHIMR_BCNDOK2 BIT18 +#define UHIMR_BCNDOK1 BIT17 +#define UHIMR_BCNDOK0 BIT16 +#define UHIMR_HSISR_IND BIT15 +#define UHIMR_BCNDMAINT_E BIT14 +//RSVD BIT13 +#define UHIMR_CTW_END BIT12 +//RSVD BIT11 +#define UHIMR_C2HCMD BIT10 +#define UHIMR_CPWM2 BIT9 +#define UHIMR_CPWM BIT8 +#define UHIMR_HIGHDOK BIT7 // High Queue DMA OK Interrupt +#define UHIMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt +#define UHIMR_BKDOK BIT5 // AC_BK DMA OK Interrupt +#define UHIMR_BEDOK BIT4 // AC_BE DMA OK Interrupt +#define UHIMR_VIDOK BIT3 // AC_VI DMA OK Interrupt +#define UHIMR_VODOK BIT2 // AC_VO DMA Interrupt +#define UHIMR_RDU BIT1 // Receive Descriptor Unavailable +#define UHIMR_ROK BIT0 // Receive DMA OK Interrupt + +// USB Host Interrupt Status Extension bit +#define UHIMR_BCNDMAINT7 BIT23 +#define UHIMR_BCNDMAINT6 BIT22 +#define UHIMR_BCNDMAINT5 BIT21 +#define UHIMR_BCNDMAINT4 BIT20 +#define UHIMR_BCNDOK7 BIT19 +#define UHIMR_BCNDOK6 BIT18 +#define UHIMR_BCNDOK5 BIT17 +#define UHIMR_BCNDOK4 BIT16 +// bit14-15: RSVD +#define UHIMR_ATIMEND_E BIT13 +#define UHIMR_ATIMEND BIT12 +#define UHIMR_TXERR BIT11 +#define UHIMR_RXERR BIT10 +#define UHIMR_TXFOVW BIT9 +#define UHIMR_RXFOVW BIT8 +// bit2-7: RSVD +#define UHIMR_OCPINT BIT1 +// bit0: RSVD + +#define REG_USB_HIMR 0xFE38 +#define REG_USB_HIMRE 0xFE3C +#define REG_USB_HISR 0xFE78 +#define REG_USB_HISRE 0xFE7C + +#define USB_INTR_CPWM_OFFSET 16 +#define USB_INTR_CONTENT_HISR_OFFSET 48 +#define USB_INTR_CONTENT_HISRE_OFFSET 52 +#define USB_INTR_CONTENT_LENGTH 56 +#define USB_C2H_CMDID_OFFSET 0 +#define USB_C2H_SEQ_OFFSET 1 +#define USB_C2H_EVENT_OFFSET 2 +//============================================================================ +// General definitions +//============================================================================ + +#ifdef CONFIG_RF_GAIN_OFFSET +#define EEPROM_RF_GAIN_OFFSET 0x2F +#define EEPROM_RF_GAIN_VAL 0x1F6 +#endif //CONFIG_RF_GAIN_OFFSET + + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtl8723a_xmit.h b/drivers/net/wireless/rtl8723as/include/rtl8723a_xmit.h index d1ead94b94da..c3658435169a 100755 --- a/drivers/net/wireless/rtl8723as/include/rtl8723a_xmit.h +++ b/drivers/net/wireless/rtl8723as/include/rtl8723a_xmit.h @@ -1,238 +1,238 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTL8723A_XMIT_H__ -#define __RTL8723A_XMIT_H__ - -#include - -// -//defined for TX DESC Operation -// - -#define MAX_TID (15) - -//OFFSET 0 -#define OFFSET_SZ 0 -#define OFFSET_SHT 16 -#define BMC BIT(24) -#define LSG BIT(26) -#define FSG BIT(27) -#define OWN BIT(31) - - -//OFFSET 4 -#define PKT_OFFSET_SZ 0 -#define BK BIT(6) -#define QSEL_SHT 8 -#define Rate_ID_SHT 16 -#define NAVUSEHDR BIT(20) -#define PKT_OFFSET_SHT 26 -#define HWPC BIT(31) - -//OFFSET 8 -#define AGG_EN BIT(29) - -//OFFSET 12 -#define SEQ_SHT 16 - -//OFFSET 16 -#define QoS BIT(6) -#define HW_SEQ_EN BIT(7) -#define USERATE BIT(8) -#define DISDATAFB BIT(10) -#define DATA_SHORT BIT(24) -#define DATA_BW BIT(25) - -//OFFSET 20 -#define SGI BIT(6) - -typedef struct txdesc_8723a -{ - u32 pktlen:16; - u32 offset:8; - u32 bmc:1; - u32 htc:1; - u32 ls:1; - u32 fs:1; - u32 linip:1; - u32 noacm:1; - u32 gf:1; - u32 own:1; - - u32 macid:5; - u32 agg_en:1; - u32 bk:1; - u32 rd_en:1; - u32 qsel:5; - u32 rd_nav_ext:1; - u32 lsig_txop_en:1; - u32 pifs:1; - u32 rate_id:4; - u32 navusehdr:1; - u32 en_desc_id:1; - u32 sectype:2; - u32 rsvd0424:2; - u32 pkt_offset:5; // unit: 8 bytes - u32 rsvd0431:1; - - u32 rts_rc:6; - u32 data_rc:6; - u32 rsvd0812:2; - u32 bar_rty_th:2; - u32 rsvd0816:1; - u32 morefrag:1; - u32 raw:1; - u32 ccx:1; - u32 ampdu_density:3; - u32 bt_null:1; - u32 ant_sel_a:1; - u32 ant_sel_b:1; - u32 tx_ant_cck:2; - u32 tx_antl:2; - u32 tx_ant_ht:2; - - u32 nextheadpage:8; - u32 tailpage:8; - u32 seq:12; - u32 cpu_handle:1; - u32 tag1:1; - u32 trigger_int:1; - u32 hwseq_en:1; - - u32 rtsrate:5; - u32 ap_dcfe:1; - u32 hwseq_sel:2; - u32 userate:1; - u32 disrtsfb:1; - u32 disdatafb:1; - u32 cts2self:1; - u32 rtsen:1; - u32 hw_rts_en:1; - u32 port_id:1; - u32 rsvd1615:3; - u32 wait_dcts:1; - u32 cts2ap_en:1; - u32 data_sc:2; - u32 data_stbc:2; - u32 data_short:1; - u32 data_bw:1; - u32 rts_short:1; - u32 rts_bw:1; - u32 rts_sc:2; - u32 vcs_stbc:2; - - u32 datarate:6; - u32 sgi:1; - u32 try_rate:1; - u32 data_ratefb_lmt:5; - u32 rts_ratefb_lmt:4; - u32 rty_lmt_en:1; - u32 data_rt_lmt:6; - u32 usb_txagg_num:8; - - u32 txagg_a:5; - u32 txagg_b:5; - u32 use_max_len:1; - u32 max_agg_num:5; - u32 mcsg1_max_len:4; - u32 mcsg2_max_len:4; - u32 mcsg3_max_len:4; - u32 mcs7_sgi_max_len:4; - - u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) - u32 mcsg4_max_len:4; - u32 mcsg5_max_len:4; - u32 mcsg6_max_len:4; - u32 mcs15_sgi_max_len:4; -}TXDESC, *PTXDESC; - -#define txdesc_set_ccx_sw_8723a(txdesc, value) \ - do { \ - ((struct txdesc_8723a *)(txdesc))->mcsg4_max_len = (((value)>>8) & 0x0f); \ - ((struct txdesc_8723a *)(txdesc))->mcs15_sgi_max_len= (((value)>>4) & 0x0f); \ - ((struct txdesc_8723a *)(txdesc))->mcsg6_max_len = ((value) & 0x0f); \ - } while (0) - -struct txrpt_ccx_8723a { - /* offset 0 */ - u8 tag1:1; - u8 rsvd:4; - u8 int_bt:1; - u8 int_tri:1; - u8 int_ccx:1; - - /* offset 1 */ - u8 mac_id:5; - u8 pkt_drop:1; - u8 pkt_ok:1; - u8 bmc:1; - - /* offset 2 */ - u8 retry_cnt:6; - u8 lifetime_over:1; - u8 retry_over:1; - - /* offset 3 */ - u8 ccx_qtime0; - u8 ccx_qtime1; - - /* offset 5 */ - u8 final_data_rate; - - /* offset 6 */ - u8 sw1:4; - u8 qsel:4; - - /* offset 7 */ - u8 sw0; -}; - -#define txrpt_ccx_sw_8723a(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8)) -#define txrpt_ccx_qtime_8723a(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8)) - -#ifdef CONFIG_XMIT_ACK -void dump_txrpt_ccx_8723a(void *buf); -void handle_txrpt_ccx_8723a(_adapter *adapter, void *buf); -#else -#define dump_txrpt_ccx_8723a(buf) do {} while(0) -#define handle_txrpt_ccx_8723a(adapter, buf) do {} while(0) -#endif //CONFIG_XMIT_ACK - -void rtl8723a_update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem); -void rtl8723a_fill_fake_txdesc(PADAPTER padapter, u8 *pDesc, u32 BufferLen, u8 IsPsPoll, u8 IsBTQosNull); - -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) -s32 rtl8723as_init_xmit_priv(PADAPTER padapter); -void rtl8723as_free_xmit_priv(PADAPTER padapter); -s32 rtl8723as_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); -s32 rtl8723as_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); -s32 rtl8723as_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -s32 rtl8723as_xmit_buf_handler(PADAPTER padapter); -thread_return rtl8723as_xmit_thread(thread_context context); -#define hal_xmit_handler rtl8723as_xmit_buf_handler -#endif - -#ifdef CONFIG_USB_HCI -s32 rtl8723au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -s32 rtl8723au_xmit_buf_handler(PADAPTER padapter); -#define hal_xmit_handler rtl8723au_xmit_buf_handler -#endif -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTL8723A_XMIT_H__ +#define __RTL8723A_XMIT_H__ + +#include + +// +//defined for TX DESC Operation +// + +#define MAX_TID (15) + +//OFFSET 0 +#define OFFSET_SZ 0 +#define OFFSET_SHT 16 +#define BMC BIT(24) +#define LSG BIT(26) +#define FSG BIT(27) +#define OWN BIT(31) + + +//OFFSET 4 +#define PKT_OFFSET_SZ 0 +#define BK BIT(6) +#define QSEL_SHT 8 +#define Rate_ID_SHT 16 +#define NAVUSEHDR BIT(20) +#define PKT_OFFSET_SHT 26 +#define HWPC BIT(31) + +//OFFSET 8 +#define AGG_EN BIT(29) + +//OFFSET 12 +#define SEQ_SHT 16 + +//OFFSET 16 +#define QoS BIT(6) +#define HW_SEQ_EN BIT(7) +#define USERATE BIT(8) +#define DISDATAFB BIT(10) +#define DATA_SHORT BIT(24) +#define DATA_BW BIT(25) + +//OFFSET 20 +#define SGI BIT(6) + +typedef struct txdesc_8723a +{ + u32 pktlen:16; + u32 offset:8; + u32 bmc:1; + u32 htc:1; + u32 ls:1; + u32 fs:1; + u32 linip:1; + u32 noacm:1; + u32 gf:1; + u32 own:1; + + u32 macid:5; + u32 agg_en:1; + u32 bk:1; + u32 rd_en:1; + u32 qsel:5; + u32 rd_nav_ext:1; + u32 lsig_txop_en:1; + u32 pifs:1; + u32 rate_id:4; + u32 navusehdr:1; + u32 en_desc_id:1; + u32 sectype:2; + u32 rsvd0424:2; + u32 pkt_offset:5; // unit: 8 bytes + u32 rsvd0431:1; + + u32 rts_rc:6; + u32 data_rc:6; + u32 rsvd0812:2; + u32 bar_rty_th:2; + u32 rsvd0816:1; + u32 morefrag:1; + u32 raw:1; + u32 ccx:1; + u32 ampdu_density:3; + u32 bt_null:1; + u32 ant_sel_a:1; + u32 ant_sel_b:1; + u32 tx_ant_cck:2; + u32 tx_antl:2; + u32 tx_ant_ht:2; + + u32 nextheadpage:8; + u32 tailpage:8; + u32 seq:12; + u32 cpu_handle:1; + u32 tag1:1; + u32 trigger_int:1; + u32 hwseq_en:1; + + u32 rtsrate:5; + u32 ap_dcfe:1; + u32 hwseq_sel:2; + u32 userate:1; + u32 disrtsfb:1; + u32 disdatafb:1; + u32 cts2self:1; + u32 rtsen:1; + u32 hw_rts_en:1; + u32 port_id:1; + u32 rsvd1615:3; + u32 wait_dcts:1; + u32 cts2ap_en:1; + u32 data_sc:2; + u32 data_stbc:2; + u32 data_short:1; + u32 data_bw:1; + u32 rts_short:1; + u32 rts_bw:1; + u32 rts_sc:2; + u32 vcs_stbc:2; + + u32 datarate:6; + u32 sgi:1; + u32 try_rate:1; + u32 data_ratefb_lmt:5; + u32 rts_ratefb_lmt:4; + u32 rty_lmt_en:1; + u32 data_rt_lmt:6; + u32 usb_txagg_num:8; + + u32 txagg_a:5; + u32 txagg_b:5; + u32 use_max_len:1; + u32 max_agg_num:5; + u32 mcsg1_max_len:4; + u32 mcsg2_max_len:4; + u32 mcsg3_max_len:4; + u32 mcs7_sgi_max_len:4; + + u32 checksum:16; // TxBuffSize(PCIe)/CheckSum(USB) + u32 mcsg4_max_len:4; + u32 mcsg5_max_len:4; + u32 mcsg6_max_len:4; + u32 mcs15_sgi_max_len:4; +}TXDESC, *PTXDESC; + +#define txdesc_set_ccx_sw_8723a(txdesc, value) \ + do { \ + ((struct txdesc_8723a *)(txdesc))->mcsg4_max_len = (((value)>>8) & 0x0f); \ + ((struct txdesc_8723a *)(txdesc))->mcs15_sgi_max_len= (((value)>>4) & 0x0f); \ + ((struct txdesc_8723a *)(txdesc))->mcsg6_max_len = ((value) & 0x0f); \ + } while (0) + +struct txrpt_ccx_8723a { + /* offset 0 */ + u8 tag1:1; + u8 rsvd:4; + u8 int_bt:1; + u8 int_tri:1; + u8 int_ccx:1; + + /* offset 1 */ + u8 mac_id:5; + u8 pkt_drop:1; + u8 pkt_ok:1; + u8 bmc:1; + + /* offset 2 */ + u8 retry_cnt:6; + u8 lifetime_over:1; + u8 retry_over:1; + + /* offset 3 */ + u8 ccx_qtime0; + u8 ccx_qtime1; + + /* offset 5 */ + u8 final_data_rate; + + /* offset 6 */ + u8 sw1:4; + u8 qsel:4; + + /* offset 7 */ + u8 sw0; +}; + +#define txrpt_ccx_sw_8723a(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8)) +#define txrpt_ccx_qtime_8723a(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8)) + +#ifdef CONFIG_XMIT_ACK +void dump_txrpt_ccx_8723a(void *buf); +void handle_txrpt_ccx_8723a(_adapter *adapter, void *buf); +#else +#define dump_txrpt_ccx_8723a(buf) do {} while(0) +#define handle_txrpt_ccx_8723a(adapter, buf) do {} while(0) +#endif //CONFIG_XMIT_ACK + +void rtl8723a_update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem); +void rtl8723a_fill_fake_txdesc(PADAPTER padapter, u8 *pDesc, u32 BufferLen, u8 IsPsPoll, u8 IsBTQosNull); + +#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) +s32 rtl8723as_init_xmit_priv(PADAPTER padapter); +void rtl8723as_free_xmit_priv(PADAPTER padapter); +s32 rtl8723as_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe); +s32 rtl8723as_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe); +s32 rtl8723as_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtl8723as_xmit_buf_handler(PADAPTER padapter); +thread_return rtl8723as_xmit_thread(thread_context context); +#define hal_xmit_handler rtl8723as_xmit_buf_handler +#endif + +#ifdef CONFIG_USB_HCI +s32 rtl8723au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +s32 rtl8723au_xmit_buf_handler(PADAPTER padapter); +#define hal_xmit_handler rtl8723au_xmit_buf_handler +#endif +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtw_ap.h b/drivers/net/wireless/rtl8723as/include/rtw_ap.h index 02a14da5fbd0..a93e1e8da886 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_ap.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_ap.h @@ -1,65 +1,65 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTW_AP_H_ -#define __RTW_AP_H_ - -#include -#include -#include - - -#ifdef CONFIG_AP_MODE - -//external function -extern void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta); -extern void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta); - - -void init_mlme_ap_info(_adapter *padapter); -void free_mlme_ap_info(_adapter *padapter); -//void update_BCNTIM(_adapter *padapter); -void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len); -void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index); -void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx); -void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level); -void expire_timeout_chk(_adapter *padapter); -void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta); -int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len); -void rtw_ap_restore_network(_adapter *padapter); -void rtw_set_macaddr_acl(_adapter *padapter, int mode); -int rtw_acl_add_sta(_adapter *padapter, u8 *addr); -int rtw_acl_remove_sta(_adapter *padapter, u8 *addr); - -#ifdef CONFIG_NATIVEAP_MLME -void associated_clients_update(_adapter *padapter, u8 updated); -void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta); -u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta); -void sta_info_update(_adapter *padapter, struct sta_info *psta); -void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta); -u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason); -int rtw_sta_flush(_adapter *padapter); -int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset); -void start_ap_mode(_adapter *padapter); -void stop_ap_mode(_adapter *padapter); -#endif -#endif //end of CONFIG_AP_MODE - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_AP_H_ +#define __RTW_AP_H_ + +#include +#include +#include + + +#ifdef CONFIG_AP_MODE + +//external function +extern void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta); +extern void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta); + + +void init_mlme_ap_info(_adapter *padapter); +void free_mlme_ap_info(_adapter *padapter); +//void update_BCNTIM(_adapter *padapter); +void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len); +void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index); +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx); +void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level); +void expire_timeout_chk(_adapter *padapter); +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta); +int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len); +void rtw_ap_restore_network(_adapter *padapter); +void rtw_set_macaddr_acl(_adapter *padapter, int mode); +int rtw_acl_add_sta(_adapter *padapter, u8 *addr); +int rtw_acl_remove_sta(_adapter *padapter, u8 *addr); + +#ifdef CONFIG_NATIVEAP_MLME +void associated_clients_update(_adapter *padapter, u8 updated); +void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta); +u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta); +void sta_info_update(_adapter *padapter, struct sta_info *psta); +void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta); +u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason); +int rtw_sta_flush(_adapter *padapter); +int rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset); +void start_ap_mode(_adapter *padapter); +void stop_ap_mode(_adapter *padapter); +#endif +#endif //end of CONFIG_AP_MODE + +#endif +void update_bmc_sta(_adapter *padapter); diff --git a/drivers/net/wireless/rtl8723as/include/rtw_bt_mp.h b/drivers/net/wireless/rtl8723as/include/rtw_bt_mp.h index 9a73aa3d1f33..15746616f470 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_bt_mp.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_bt_mp.h @@ -1,318 +1,318 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __RTW_BT_MP_H -#define __RTW_BT_MP_H - -#include -#include -#include - - -#if(MP_DRIVER == 1) - -#pragma pack(1) - -// definition for BT_UP_OP_BT_READY -#define MP_BT_NOT_READY 0 -#define MP_BT_READY 1 - -// definition for BT_UP_OP_BT_SET_MODE -typedef enum _MP_BT_MODE{ - MP_BT_MODE_RF_TXRX_TEST_MODE = 0, - MP_BT_MODE_BT20_DUT_TEST_MODE = 1, - MP_BT_MODE_BT40_DIRECT_TEST_MODE = 2, - MP_BT_MODE_CONNECT_TEST_MODE = 3, - MP_BT_MODE_MAX -}MP_BT_MODE,*PMP_BT_MODE; - - -// definition for BT_UP_OP_BT_SET_TX_RX_PARAMETER -typedef struct _BT_TXRX_PARAMETERS{ - u1Byte txrxChannel; - u4Byte txrxTxPktCnt; - u1Byte txrxTxPktInterval; - u1Byte txrxPayloadType; - u1Byte txrxPktType; - u2Byte txrxPayloadLen; - u4Byte txrxPktHeader; - u1Byte txrxWhitenCoeff; - u1Byte txrxBdaddr[6]; - u1Byte txrxTxGainIndex; -} BT_TXRX_PARAMETERS, *PBT_TXRX_PARAMETERS; - -// txrxPktType -typedef enum _MP_BT_PKT_TYPE{ - MP_BT_PKT_DH1 = 0, - MP_BT_PKT_DH3 = 1, - MP_BT_PKT_DH5 = 2, - MP_BT_PKT_2DH1 = 3, - MP_BT_PKT_2DH3 = 4, - MP_BT_PKT_2DH5 = 5, - MP_BT_PKT_3DH1 = 6, - MP_BT_PKT_3DH3 = 7, - MP_BT_PKT_3DH5 = 8, - MP_BT_PKT_LE = 9, - MP_BT_PKT_MAX -}MP_BT_PKT_TYPE,*PMP_BT_PKT_TYPE; -// txrxPayloadType -typedef enum _MP_BT_PAYLOAD_TYPE{ - MP_BT_PAYLOAD_01010101 = 0, - MP_BT_PAYLOAD_ALL_1 = 1, - MP_BT_PAYLOAD_ALL_0 = 2, - MP_BT_PAYLOAD_11110000 = 3, - MP_BT_PAYLOAD_PRBS9 = 4, - MP_BT_PAYLOAD_MAX -}MP_BT_PAYLOAD_TYPE,*PMP_BT_PAYLOAD_TYPE; - - -// definition for BT_UP_OP_BT_TEST_CTRL -typedef enum _MP_BT_TEST_CTRL{ - MP_BT_TEST_STOP_ALL_TESTS = 0, - MP_BT_TEST_START_RX_TEST = 1, - MP_BT_TEST_START_PACKET_TX_TEST = 2, - MP_BT_TEST_START_CONTINUOUS_TX_TEST = 3, - MP_BT_TEST_START_INQUIRY_SCAN_TEST = 4, - MP_BT_TEST_START_PAGE_SCAN_TEST = 5, - MP_BT_TEST_START_INQUIRY_PAGE_SCAN_TEST = 6, - MP_BT_TEST_START_LEGACY_CONNECT_TEST = 7, - MP_BT_TEST_START_LE_CONNECT_TEST_INITIATOR = 8, - MP_BT_TEST_START_LE_CONNECT_TEST_ADVERTISER = 9, - MP_BT_TEST_MAX -}MP_BT_TEST_CTRL,*PMP_BT_TEST_CTRL; - - -typedef enum _RTL_EXT_C2H_EVT -{ - EXT_C2H_WIFI_FW_ACTIVE_RSP = 0, - EXT_C2H_TRIG_BY_BT_FW = 1, - MAX_EXT_C2HEVENT -}RTL_EXT_C2H_EVT; - - -// return status definition to the user layer -typedef enum _BT_CTRL_STATUS{ - BT_STATUS_SUCCESS = 0x00, // Success - BT_STATUS_BT_OP_SUCCESS = 0x01, // bt fw op execution success - BT_STATUS_H2C_SUCCESS = 0x02, // H2c success - BT_STATUS_H2C_TIMTOUT = 0x03, // H2c timeout - BT_STATUS_H2C_BT_NO_RSP = 0x04, // H2c sent, bt no rsp - BT_STATUS_C2H_SUCCESS = 0x05, // C2h success - BT_STATUS_C2H_REQNUM_MISMATCH = 0x06, // bt fw wrong rsp - BT_STATUS_OPCODE_U_VERSION_MISMATCH = 0x07, // Upper layer OP code version mismatch. - BT_STATUS_OPCODE_L_VERSION_MISMATCH = 0x08, // Lower layer OP code version mismatch. - BT_STATUS_UNKNOWN_OPCODE_U = 0x09, // Unknown Upper layer OP code - BT_STATUS_UNKNOWN_OPCODE_L = 0x0a, // Unknown Lower layer OP code - BT_STATUS_PARAMETER_FORMAT_ERROR_U = 0x0b, // Wrong parameters sent by upper layer. - BT_STATUS_PARAMETER_FORMAT_ERROR_L = 0x0c, // bt fw parameter format is not consistency - BT_STATUS_PARAMETER_OUT_OF_RANGE_U = 0x0d, // uppery layer parameter value is out of range - BT_STATUS_PARAMETER_OUT_OF_RANGE_L = 0x0e, // bt fw parameter value is out of range - BT_STATUS_UNKNOWN_STATUS_L = 0x0f, // bt returned an defined status code - BT_STATUS_UNKNOWN_STATUS_H = 0x10, // driver need to do error handle or not handle-well. - BT_STATUS_WRONG_LEVEL = 0x11, // should be under passive level - BT_STATUS_MAX -}BT_CTRL_STATUS,*PBT_CTRL_STATUS; - -// OP codes definition between the user layer and driver -typedef enum _BT_CTRL_OPCODE_UPPER{ - BT_UP_OP_BT_READY = 0x00, - BT_UP_OP_BT_SET_MODE = 0x01, - BT_UP_OP_BT_SET_TX_RX_PARAMETER = 0x02, - BT_UP_OP_BT_SET_GENERAL = 0x03, - BT_UP_OP_BT_GET_GENERAL = 0x04, - BT_UP_OP_BT_TEST_CTRL = 0x05, - BT_UP_OP_TEST_BT = 0x06, - BT_UP_OP_MAX -}BT_CTRL_OPCODE_UPPER,*PBT_CTRL_OPCODE_UPPER; - - -typedef enum _BT_SET_GENERAL{ - BT_GSET_REG = 0x00, - BT_GSET_RESET = 0x01, - BT_GSET_TARGET_BD_ADDR = 0x02, - BT_GSET_TX_PWR_FINETUNE = 0x03, - BT_SET_TRACKING_INTERVAL = 0x04, - BT_SET_THERMAL_METER = 0x05, - BT_ENABLE_CFO_TRACKING = 0x06, - BT_GSET_UPDATE_BT_PATCH = 0x07, - BT_GSET_MAX -}BT_SET_GENERAL,*PBT_SET_GENERAL; - -typedef enum _BT_GET_GENERAL{ - BT_GGET_REG = 0x00, - BT_GGET_STATUS = 0x01, - BT_GGET_REPORT = 0x02, - BT_GGET_AFH_MAP = 0x03, - BT_GGET_AFH_STATUS = 0x04, - BT_GGET_MAX -}BT_GET_GENERAL,*PBT_GET_GENERAL; - -// definition for BT_UP_OP_BT_SET_GENERAL -typedef enum _BT_REG_TYPE{ - BT_REG_RF = 0, - BT_REG_MODEM = 1, - BT_REG_BLUEWIZE = 2, - BT_REG_VENDOR = 3, - BT_REG_LE = 4, - BT_REG_MAX -}BT_REG_TYPE,*PBT_REG_TYPE; - -// definition for BT_LO_OP_GET_AFH_MAP -typedef enum _BT_AFH_MAP_TYPE{ - BT_AFH_MAP_RESULT = 0, - BT_AFH_MAP_WIFI_PSD_ONLY = 1, - BT_AFH_MAP_WIFI_CH_BW_ONLY = 2, - BT_AFH_MAP_BT_PSD_ONLY = 3, - BT_AFH_MAP_HOST_CLASSIFICATION_ONLY = 4, - BT_AFH_MAP_MAX -}BT_AFH_MAP_TYPE,*PBT_AFH_MAP_TYPE; - -// definition for BT_UP_OP_BT_GET_GENERAL -typedef enum _BT_REPORT_TYPE{ - BT_REPORT_RX_PACKET_CNT = 0, - BT_REPORT_RX_ERROR_BITS = 1, - BT_REPORT_RSSI = 2, - BT_REPORT_CFO_HDR_QUALITY = 3, - BT_REPORT_CONNECT_TARGET_BD_ADDR = 4, - BT_REPORT_MAX -}BT_REPORT_TYPE,*PBT_REPORT_TYPE; - -VOID -MPTBT_Test( - IN PADAPTER Adapter, - IN u1Byte opCode, - IN u1Byte byte1, - IN u1Byte byte2, - IN u1Byte byte3 - ); - -NDIS_STATUS -MPTBT_SendOidBT( - IN PADAPTER pAdapter, - IN PVOID InformationBuffer, - IN ULONG InformationBufferLength, - OUT PULONG BytesRead, - OUT PULONG BytesNeeded - ); - -VOID -MPTBT_FwC2hBtMpCtrl( - PADAPTER Adapter, - pu1Byte tmpBuf, - u1Byte length - ); - -void MPh2c_timeout_handle(void *FunctionContext); - -VOID mptbt_BtControlProcess( - PADAPTER Adapter, - PVOID pInBuf - ); - -#define BT_H2C_MAX_RETRY 1 -#define BT_MAX_C2H_LEN 20 - -typedef struct _BT_REQ_CMD{ - UCHAR opCodeVer; - UCHAR OpCode; - USHORT paraLength; - UCHAR pParamStart[100]; -} BT_REQ_CMD, *PBT_REQ_CMD; - -typedef struct _BT_RSP_CMD{ - USHORT status; - USHORT paraLength; - UCHAR pParamStart[100]; -} BT_RSP_CMD, *PBT_RSP_CMD; - - -typedef struct _BT_H2C{ - u1Byte opCodeVer:4; - u1Byte reqNum:4; - u1Byte opCode; - u1Byte buf[100]; -}BT_H2C, *PBT_H2C; - - - -typedef struct _BT_EXT_C2H{ - u1Byte extendId; - u1Byte statusCode:4; - u1Byte retLen:4; - u1Byte opCodeVer:4; - u1Byte reqNum:4; - u1Byte buf[100]; -}BT_EXT_C2H, *PBT_EXT_C2H; - -typedef enum _BT_OPCODE_STATUS{ - BT_OP_STATUS_SUCCESS = 0x00, // Success - BT_OP_STATUS_VERSION_MISMATCH = 0x01, - BT_OP_STATUS_UNKNOWN_OPCODE = 0x02, - BT_OP_STATUS_ERROR_PARAMETER = 0x03, - BT_OP_STATUS_MAX -}BT_OPCODE_STATUS,*PBT_OPCODE_STATUS; - - -//OP codes definition between driver and bt fw -typedef enum _BT_CTRL_OPCODE_LOWER{ - BT_LO_OP_GET_BT_VERSION = 0x00, - BT_LO_OP_RESET = 0x01, - BT_LO_OP_TEST_CTRL = 0x02, - BT_LO_OP_SET_BT_MODE = 0x03, - BT_LO_OP_SET_CHNL_TX_GAIN = 0x04, - BT_LO_OP_SET_PKT_TYPE_LEN = 0x05, - BT_LO_OP_SET_PKT_CNT_L_PL_TYPE = 0x06, - BT_LO_OP_SET_PKT_CNT_H_PKT_INTV = 0x07, - BT_LO_OP_SET_PKT_HEADER = 0x08, - BT_LO_OP_SET_WHITENCOEFF = 0x09, - BT_LO_OP_SET_BD_ADDR_L = 0x0a, - BT_LO_OP_SET_BD_ADDR_H = 0x0b, - BT_LO_OP_WRITE_REG_ADDR = 0x0c, - BT_LO_OP_WRITE_REG_VALUE = 0x0d, - BT_LO_OP_GET_BT_STATUS = 0x0e, - BT_LO_OP_GET_BD_ADDR_L = 0x0f, - BT_LO_OP_GET_BD_ADDR_H = 0x10, - BT_LO_OP_READ_REG = 0x11, - BT_LO_OP_SET_TARGET_BD_ADDR_L = 0x12, - BT_LO_OP_SET_TARGET_BD_ADDR_H = 0x13, - BT_LO_OP_SET_TX_POWER_CALIBRATION = 0x14, - BT_LO_OP_GET_RX_PKT_CNT_L = 0x15, - BT_LO_OP_GET_RX_PKT_CNT_H = 0x16, - BT_LO_OP_GET_RX_ERROR_BITS_L = 0x17, - BT_LO_OP_GET_RX_ERROR_BITS_H = 0x18, - BT_LO_OP_GET_RSSI = 0x19, - BT_LO_OP_GET_CFO_HDR_QUALITY_L = 0x1a, - BT_LO_OP_GET_CFO_HDR_QUALITY_H = 0x1b, - BT_LO_OP_GET_TARGET_BD_ADDR_L = 0x1c, - BT_LO_OP_GET_TARGET_BD_ADDR_H = 0x1d, - BT_LO_OP_GET_AFH_MAP_L = 0x1e, - BT_LO_OP_GET_AFH_MAP_M = 0x1f, - BT_LO_OP_GET_AFH_MAP_H = 0x20, - BT_LO_OP_GET_AFH_STATUS = 0x21, - BT_LO_OP_SET_TRACKING_INTERVAL = 0x22, - BT_LO_OP_SET_THERMAL_METER = 0x23, - BT_LO_OP_ENABLE_CFO_TRACKING = 0x24, - BT_LO_OP_MAX -}BT_CTRL_OPCODE_LOWER,*PBT_CTRL_OPCODE_LOWER; - -#endif /* #if(MP_DRIVER == 1) */ - -#endif // #ifndef __INC_MPT_BT_H - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __RTW_BT_MP_H +#define __RTW_BT_MP_H + +#include +#include +#include + + +#if(MP_DRIVER == 1) + +#pragma pack(1) + +// definition for BT_UP_OP_BT_READY +#define MP_BT_NOT_READY 0 +#define MP_BT_READY 1 + +// definition for BT_UP_OP_BT_SET_MODE +typedef enum _MP_BT_MODE{ + MP_BT_MODE_RF_TXRX_TEST_MODE = 0, + MP_BT_MODE_BT20_DUT_TEST_MODE = 1, + MP_BT_MODE_BT40_DIRECT_TEST_MODE = 2, + MP_BT_MODE_CONNECT_TEST_MODE = 3, + MP_BT_MODE_MAX +}MP_BT_MODE,*PMP_BT_MODE; + + +// definition for BT_UP_OP_BT_SET_TX_RX_PARAMETER +typedef struct _BT_TXRX_PARAMETERS{ + u1Byte txrxChannel; + u4Byte txrxTxPktCnt; + u1Byte txrxTxPktInterval; + u1Byte txrxPayloadType; + u1Byte txrxPktType; + u2Byte txrxPayloadLen; + u4Byte txrxPktHeader; + u1Byte txrxWhitenCoeff; + u1Byte txrxBdaddr[6]; + u1Byte txrxTxGainIndex; +} BT_TXRX_PARAMETERS, *PBT_TXRX_PARAMETERS; + +// txrxPktType +typedef enum _MP_BT_PKT_TYPE{ + MP_BT_PKT_DH1 = 0, + MP_BT_PKT_DH3 = 1, + MP_BT_PKT_DH5 = 2, + MP_BT_PKT_2DH1 = 3, + MP_BT_PKT_2DH3 = 4, + MP_BT_PKT_2DH5 = 5, + MP_BT_PKT_3DH1 = 6, + MP_BT_PKT_3DH3 = 7, + MP_BT_PKT_3DH5 = 8, + MP_BT_PKT_LE = 9, + MP_BT_PKT_MAX +}MP_BT_PKT_TYPE,*PMP_BT_PKT_TYPE; +// txrxPayloadType +typedef enum _MP_BT_PAYLOAD_TYPE{ + MP_BT_PAYLOAD_01010101 = 0, + MP_BT_PAYLOAD_ALL_1 = 1, + MP_BT_PAYLOAD_ALL_0 = 2, + MP_BT_PAYLOAD_11110000 = 3, + MP_BT_PAYLOAD_PRBS9 = 4, + MP_BT_PAYLOAD_MAX +}MP_BT_PAYLOAD_TYPE,*PMP_BT_PAYLOAD_TYPE; + + +// definition for BT_UP_OP_BT_TEST_CTRL +typedef enum _MP_BT_TEST_CTRL{ + MP_BT_TEST_STOP_ALL_TESTS = 0, + MP_BT_TEST_START_RX_TEST = 1, + MP_BT_TEST_START_PACKET_TX_TEST = 2, + MP_BT_TEST_START_CONTINUOUS_TX_TEST = 3, + MP_BT_TEST_START_INQUIRY_SCAN_TEST = 4, + MP_BT_TEST_START_PAGE_SCAN_TEST = 5, + MP_BT_TEST_START_INQUIRY_PAGE_SCAN_TEST = 6, + MP_BT_TEST_START_LEGACY_CONNECT_TEST = 7, + MP_BT_TEST_START_LE_CONNECT_TEST_INITIATOR = 8, + MP_BT_TEST_START_LE_CONNECT_TEST_ADVERTISER = 9, + MP_BT_TEST_MAX +}MP_BT_TEST_CTRL,*PMP_BT_TEST_CTRL; + + +typedef enum _RTL_EXT_C2H_EVT +{ + EXT_C2H_WIFI_FW_ACTIVE_RSP = 0, + EXT_C2H_TRIG_BY_BT_FW = 1, + MAX_EXT_C2HEVENT +}RTL_EXT_C2H_EVT; + + +// return status definition to the user layer +typedef enum _BT_CTRL_STATUS{ + BT_STATUS_SUCCESS = 0x00, // Success + BT_STATUS_BT_OP_SUCCESS = 0x01, // bt fw op execution success + BT_STATUS_H2C_SUCCESS = 0x02, // H2c success + BT_STATUS_H2C_TIMTOUT = 0x03, // H2c timeout + BT_STATUS_H2C_BT_NO_RSP = 0x04, // H2c sent, bt no rsp + BT_STATUS_C2H_SUCCESS = 0x05, // C2h success + BT_STATUS_C2H_REQNUM_MISMATCH = 0x06, // bt fw wrong rsp + BT_STATUS_OPCODE_U_VERSION_MISMATCH = 0x07, // Upper layer OP code version mismatch. + BT_STATUS_OPCODE_L_VERSION_MISMATCH = 0x08, // Lower layer OP code version mismatch. + BT_STATUS_UNKNOWN_OPCODE_U = 0x09, // Unknown Upper layer OP code + BT_STATUS_UNKNOWN_OPCODE_L = 0x0a, // Unknown Lower layer OP code + BT_STATUS_PARAMETER_FORMAT_ERROR_U = 0x0b, // Wrong parameters sent by upper layer. + BT_STATUS_PARAMETER_FORMAT_ERROR_L = 0x0c, // bt fw parameter format is not consistency + BT_STATUS_PARAMETER_OUT_OF_RANGE_U = 0x0d, // uppery layer parameter value is out of range + BT_STATUS_PARAMETER_OUT_OF_RANGE_L = 0x0e, // bt fw parameter value is out of range + BT_STATUS_UNKNOWN_STATUS_L = 0x0f, // bt returned an defined status code + BT_STATUS_UNKNOWN_STATUS_H = 0x10, // driver need to do error handle or not handle-well. + BT_STATUS_WRONG_LEVEL = 0x11, // should be under passive level + BT_STATUS_MAX +}BT_CTRL_STATUS,*PBT_CTRL_STATUS; + +// OP codes definition between the user layer and driver +typedef enum _BT_CTRL_OPCODE_UPPER{ + BT_UP_OP_BT_READY = 0x00, + BT_UP_OP_BT_SET_MODE = 0x01, + BT_UP_OP_BT_SET_TX_RX_PARAMETER = 0x02, + BT_UP_OP_BT_SET_GENERAL = 0x03, + BT_UP_OP_BT_GET_GENERAL = 0x04, + BT_UP_OP_BT_TEST_CTRL = 0x05, + BT_UP_OP_TEST_BT = 0x06, + BT_UP_OP_MAX +}BT_CTRL_OPCODE_UPPER,*PBT_CTRL_OPCODE_UPPER; + + +typedef enum _BT_SET_GENERAL{ + BT_GSET_REG = 0x00, + BT_GSET_RESET = 0x01, + BT_GSET_TARGET_BD_ADDR = 0x02, + BT_GSET_TX_PWR_FINETUNE = 0x03, + BT_SET_TRACKING_INTERVAL = 0x04, + BT_SET_THERMAL_METER = 0x05, + BT_ENABLE_CFO_TRACKING = 0x06, + BT_GSET_UPDATE_BT_PATCH = 0x07, + BT_GSET_MAX +}BT_SET_GENERAL,*PBT_SET_GENERAL; + +typedef enum _BT_GET_GENERAL{ + BT_GGET_REG = 0x00, + BT_GGET_STATUS = 0x01, + BT_GGET_REPORT = 0x02, + BT_GGET_AFH_MAP = 0x03, + BT_GGET_AFH_STATUS = 0x04, + BT_GGET_MAX +}BT_GET_GENERAL,*PBT_GET_GENERAL; + +// definition for BT_UP_OP_BT_SET_GENERAL +typedef enum _BT_REG_TYPE{ + BT_REG_RF = 0, + BT_REG_MODEM = 1, + BT_REG_BLUEWIZE = 2, + BT_REG_VENDOR = 3, + BT_REG_LE = 4, + BT_REG_MAX +}BT_REG_TYPE,*PBT_REG_TYPE; + +// definition for BT_LO_OP_GET_AFH_MAP +typedef enum _BT_AFH_MAP_TYPE{ + BT_AFH_MAP_RESULT = 0, + BT_AFH_MAP_WIFI_PSD_ONLY = 1, + BT_AFH_MAP_WIFI_CH_BW_ONLY = 2, + BT_AFH_MAP_BT_PSD_ONLY = 3, + BT_AFH_MAP_HOST_CLASSIFICATION_ONLY = 4, + BT_AFH_MAP_MAX +}BT_AFH_MAP_TYPE,*PBT_AFH_MAP_TYPE; + +// definition for BT_UP_OP_BT_GET_GENERAL +typedef enum _BT_REPORT_TYPE{ + BT_REPORT_RX_PACKET_CNT = 0, + BT_REPORT_RX_ERROR_BITS = 1, + BT_REPORT_RSSI = 2, + BT_REPORT_CFO_HDR_QUALITY = 3, + BT_REPORT_CONNECT_TARGET_BD_ADDR = 4, + BT_REPORT_MAX +}BT_REPORT_TYPE,*PBT_REPORT_TYPE; + +VOID +MPTBT_Test( + IN PADAPTER Adapter, + IN u1Byte opCode, + IN u1Byte byte1, + IN u1Byte byte2, + IN u1Byte byte3 + ); + +NDIS_STATUS +MPTBT_SendOidBT( + IN PADAPTER pAdapter, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ); + +VOID +MPTBT_FwC2hBtMpCtrl( + PADAPTER Adapter, + pu1Byte tmpBuf, + u1Byte length + ); + +void MPh2c_timeout_handle(void *FunctionContext); + +VOID mptbt_BtControlProcess( + PADAPTER Adapter, + PVOID pInBuf + ); + +#define BT_H2C_MAX_RETRY 1 +#define BT_MAX_C2H_LEN 20 + +typedef struct _BT_REQ_CMD{ + UCHAR opCodeVer; + UCHAR OpCode; + USHORT paraLength; + UCHAR pParamStart[100]; +} BT_REQ_CMD, *PBT_REQ_CMD; + +typedef struct _BT_RSP_CMD{ + USHORT status; + USHORT paraLength; + UCHAR pParamStart[100]; +} BT_RSP_CMD, *PBT_RSP_CMD; + + +typedef struct _BT_H2C{ + u1Byte opCodeVer:4; + u1Byte reqNum:4; + u1Byte opCode; + u1Byte buf[100]; +}BT_H2C, *PBT_H2C; + + + +typedef struct _BT_EXT_C2H{ + u1Byte extendId; + u1Byte statusCode:4; + u1Byte retLen:4; + u1Byte opCodeVer:4; + u1Byte reqNum:4; + u1Byte buf[100]; +}BT_EXT_C2H, *PBT_EXT_C2H; + +typedef enum _BT_OPCODE_STATUS{ + BT_OP_STATUS_SUCCESS = 0x00, // Success + BT_OP_STATUS_VERSION_MISMATCH = 0x01, + BT_OP_STATUS_UNKNOWN_OPCODE = 0x02, + BT_OP_STATUS_ERROR_PARAMETER = 0x03, + BT_OP_STATUS_MAX +}BT_OPCODE_STATUS,*PBT_OPCODE_STATUS; + + +//OP codes definition between driver and bt fw +typedef enum _BT_CTRL_OPCODE_LOWER{ + BT_LO_OP_GET_BT_VERSION = 0x00, + BT_LO_OP_RESET = 0x01, + BT_LO_OP_TEST_CTRL = 0x02, + BT_LO_OP_SET_BT_MODE = 0x03, + BT_LO_OP_SET_CHNL_TX_GAIN = 0x04, + BT_LO_OP_SET_PKT_TYPE_LEN = 0x05, + BT_LO_OP_SET_PKT_CNT_L_PL_TYPE = 0x06, + BT_LO_OP_SET_PKT_CNT_H_PKT_INTV = 0x07, + BT_LO_OP_SET_PKT_HEADER = 0x08, + BT_LO_OP_SET_WHITENCOEFF = 0x09, + BT_LO_OP_SET_BD_ADDR_L = 0x0a, + BT_LO_OP_SET_BD_ADDR_H = 0x0b, + BT_LO_OP_WRITE_REG_ADDR = 0x0c, + BT_LO_OP_WRITE_REG_VALUE = 0x0d, + BT_LO_OP_GET_BT_STATUS = 0x0e, + BT_LO_OP_GET_BD_ADDR_L = 0x0f, + BT_LO_OP_GET_BD_ADDR_H = 0x10, + BT_LO_OP_READ_REG = 0x11, + BT_LO_OP_SET_TARGET_BD_ADDR_L = 0x12, + BT_LO_OP_SET_TARGET_BD_ADDR_H = 0x13, + BT_LO_OP_SET_TX_POWER_CALIBRATION = 0x14, + BT_LO_OP_GET_RX_PKT_CNT_L = 0x15, + BT_LO_OP_GET_RX_PKT_CNT_H = 0x16, + BT_LO_OP_GET_RX_ERROR_BITS_L = 0x17, + BT_LO_OP_GET_RX_ERROR_BITS_H = 0x18, + BT_LO_OP_GET_RSSI = 0x19, + BT_LO_OP_GET_CFO_HDR_QUALITY_L = 0x1a, + BT_LO_OP_GET_CFO_HDR_QUALITY_H = 0x1b, + BT_LO_OP_GET_TARGET_BD_ADDR_L = 0x1c, + BT_LO_OP_GET_TARGET_BD_ADDR_H = 0x1d, + BT_LO_OP_GET_AFH_MAP_L = 0x1e, + BT_LO_OP_GET_AFH_MAP_M = 0x1f, + BT_LO_OP_GET_AFH_MAP_H = 0x20, + BT_LO_OP_GET_AFH_STATUS = 0x21, + BT_LO_OP_SET_TRACKING_INTERVAL = 0x22, + BT_LO_OP_SET_THERMAL_METER = 0x23, + BT_LO_OP_ENABLE_CFO_TRACKING = 0x24, + BT_LO_OP_MAX +}BT_CTRL_OPCODE_LOWER,*PBT_CTRL_OPCODE_LOWER; + +#endif /* #if(MP_DRIVER == 1) */ + +#endif // #ifndef __INC_MPT_BT_H + diff --git a/drivers/net/wireless/rtl8723as/include/rtw_byteorder.h b/drivers/net/wireless/rtl8723as/include/rtw_byteorder.h index 0f06b7acb3aa..ad72188ea549 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_byteorder.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_byteorder.h @@ -27,7 +27,7 @@ #endif #if defined (CONFIG_LITTLE_ENDIAN) -#ifndef CONFIG_PLATFORM_MSTAR389 +#ifndef CONFIG_PLATFORM_MSTAR # include #endif #elif defined (CONFIG_BIG_ENDIAN) diff --git a/drivers/net/wireless/rtl8723as/include/rtw_cmd.h b/drivers/net/wireless/rtl8723as/include/rtw_cmd.h index d081b1b6e6ce..97a468c04b27 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_cmd.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_cmd.h @@ -71,6 +71,7 @@ u32 cmd_done_cnt; u32 rsp_cnt; u8 cmdthd_running; + u8 stop_req; _adapter *padapter; }; @@ -148,6 +149,7 @@ extern struct evt_obj *rtw_dequeue_evt(_queue *queue); extern void rtw_free_evt_obj(struct evt_obj *pcmd); #endif +void rtw_stop_cmd_thread(_adapter *adapter); thread_return rtw_cmd_thread(thread_context context); extern u32 rtw_init_cmd_priv (struct cmd_priv *pcmdpriv); @@ -180,6 +182,11 @@ enum rtw_drvextra_cmd_id INTEl_WIDI_WK_CID, C2H_WK_CID, RTP_TIMER_CFG_WK_CID, + RESET_SECURITYPRIV, // add for CONFIG_IEEE80211W, none 11w also can use + FREE_ASSOC_RESOURCES, // add for CONFIG_IEEE80211W, none 11w also can use +#ifdef CONFIG_DETECT_C2H_BY_POLLING + EVENT_POLLING_CID, +#endif MAX_WK_CID }; @@ -938,11 +945,11 @@ u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *ssid, int ssid_num, extern u8 rtw_createbss_cmd(_adapter *padapter); extern u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz); extern u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch); -extern u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key); +extern u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key, bool enqueue); extern u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue); extern u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork); u8 rtw_disassoc_cmd(_adapter *padapter, u32 deauth_timeout_ms, bool enqueue); -extern u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); +extern u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype, bool enqueue); extern u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset); extern u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset); extern u8 rtw_setbbreg_cmd(_adapter * padapter, u8 offset, u8 val); @@ -958,7 +965,9 @@ extern u8 rtw_setfwdig_cmd(_adapter*padapter, u8 type); extern u8 rtw_setfwra_cmd(_adapter*padapter, u8 type); extern u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr); - +// add for CONFIG_IEEE80211W, none 11w also can use +extern u8 rtw_reset_securitypriv_cmd(_adapter*padapter); +extern u8 rtw_free_assoc_resources_cmd(_adapter *padapter); extern u8 rtw_dynamic_chk_wk_cmd(_adapter *adapter); u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue); @@ -984,6 +993,10 @@ extern u8 rtw_tdls_cmd(_adapter*padapter, u8 *addr, u8 option); extern u8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *c2h_evt); +#ifdef CONFIG_DETECT_C2H_BY_POLLING +extern u8 rtw_event_polling_cmd(_adapter*padapter); +#endif + u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf); extern void rtw_survey_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); diff --git a/drivers/net/wireless/rtl8723as/include/rtw_debug.h b/drivers/net/wireless/rtl8723as/include/rtw_debug.h index 3d94efbc99d4..f9f6941605a0 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_debug.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_debug.h @@ -286,6 +286,12 @@ extern void rtl871x_cedbg(const char *fmt, ...); off_t offset, int count, int *eof, void *data); +#ifdef DBG_MEM_ALLOC + int proc_get_mstat(char *page, char **start, + off_t offset, int count, + int *eof, void *data); +#endif /* DBG_MEM_ALLOC */ + int proc_get_write_reg(char *page, char **start, off_t offset, int count, int *eof, void *data); @@ -395,6 +401,8 @@ extern void rtl871x_cedbg(const char *fmt, ...); int proc_get_best_channel(char *page, char **start, off_t offset, int count, int *eof, void *data); + int proc_set_best_channel(struct file *file, const char *buffer, + unsigned long count, void *data); #endif int proc_get_rx_signal(char *page, char **start, @@ -460,6 +468,14 @@ int proc_get_sreset(char *page, char **start, off_t offset, int count, int *eof, int proc_set_sreset(struct file *file, const char *buffer, unsigned long count, void *data); #endif /* DBG_CONFIG_ERROR_DETECT */ +int proc_get_odm_dbg_comp(char *page, char **start, off_t offset, int count, int *eof, void *data); +int proc_set_odm_dbg_comp(struct file *file, const char *buffer, unsigned long count, void *data); +int proc_get_odm_dbg_level(char *page, char **start, off_t offset, int count, int *eof, void *data); +int proc_set_odm_dbg_level(struct file *file, const char *buffer, unsigned long count, void *data); + +int proc_get_odm_adaptivity(char *page, char **start, off_t offset, int count, int *eof, void *data); +int proc_set_odm_adaptivity(struct file *file, const char *buffer, unsigned long count, void *data); + #endif //CONFIG_PROC_DEBUG #endif //__RTW_DEBUG_H__ diff --git a/drivers/net/wireless/rtl8723as/include/rtw_eeprom.h b/drivers/net/wireless/rtl8723as/include/rtw_eeprom.h index e00a5068e5ab..564f5cd2d569 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_eeprom.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_eeprom.h @@ -138,6 +138,7 @@ struct eeprom_priv #ifdef CONFIG_RF_GAIN_OFFSET u8 EEPROMRFGainOffset; + u8 EEPROMRFGainVal; #endif //CONFIG_RF_GAIN_OFFSET #ifdef CONFIG_SDIO_HCI diff --git a/drivers/net/wireless/rtl8723as/include/rtw_io.h b/drivers/net/wireless/rtl8723as/include/rtw_io.h index c48f44f6c2c7..bc09b0d8d5f1 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_io.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_io.h @@ -45,15 +45,6 @@ #include #endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) -#define rtw_usb_buffer_alloc(dev, size, dma) usb_alloc_coherent((dev), (size), (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), (dma)) -#define rtw_usb_buffer_free(dev, size, addr, dma) usb_free_coherent((dev), (size), (addr), (dma)) -#else -#define rtw_usb_buffer_alloc(dev, size, dma) usb_buffer_alloc((dev), (size), (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), (dma)) -#define rtw_usb_buffer_free(dev, size, addr, dma) usb_buffer_free((dev), (size), (addr), (dma)) -#endif - - #endif //CONFIG_USB_HCI #endif //PLATFORM_LINUX @@ -333,8 +324,22 @@ struct reg_protocol_wt { #endif }; +#ifdef CONFIG_PCI_HCI +#define MAX_CONTINUAL_IO_ERR 4 +#endif + +#ifdef CONFIG_USB_HCI +#define MAX_CONTINUAL_IO_ERR 4 +#endif + +#ifdef CONFIG_SDIO_HCI +#define SD_IO_TRY_CNT (8) +#define MAX_CONTINUAL_IO_ERR SD_IO_TRY_CNT +#endif +int rtw_inc_and_chk_continual_io_error(struct dvobj_priv *dvobj); +void rtw_reset_continual_io_error(struct dvobj_priv *dvobj); /* Below is the data structure used by _io_handler diff --git a/drivers/net/wireless/rtl8723as/include/rtw_ioctl_set.h b/drivers/net/wireless/rtl8723as/include/rtw_ioctl_set.h index 61e9b65647ee..5f755bd2131b 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_ioctl_set.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_ioctl_set.h @@ -63,9 +63,10 @@ u8 rtw_set_802_11_bssid_list_scan(_adapter* padapter, NDIS_802_11_SSID *pssid, i u8 rtw_set_802_11_infrastructure_mode(_adapter * padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); u8 rtw_set_802_11_remove_wep(_adapter * padapter, u32 keyindex); u8 rtw_set_802_11_ssid(_adapter * padapter, NDIS_802_11_SSID * ssid); +u8 rtw_set_802_11_connect(_adapter* padapter, u8 *bssid, NDIS_802_11_SSID *ssid); u8 rtw_set_802_11_remove_key(_adapter * padapter, NDIS_802_11_REMOVE_KEY * key); - +u8 rtw_validate_bssid(u8 *bssid); u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid); u16 rtw_get_cur_max_rate(_adapter *adapter); diff --git a/drivers/net/wireless/rtl8723as/include/rtw_iol.h b/drivers/net/wireless/rtl8723as/include/rtw_iol.h index 7e6cbcf7ad28..0b0672a1a18d 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_iol.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_iol.h @@ -1,139 +1,139 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTW_IOL_H_ -#define __RTW_IOL_H_ - -#include -#include -#include -struct xmit_frame *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter); -int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len); -int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary); -int rtw_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt); -bool rtw_IOL_applied(ADAPTER *adapter); -int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us); -int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms); -int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame); - - -#ifdef CONFIG_IOL_NEW_GENERATION -#define IOREG_CMD_END_LEN 4 - -struct ioreg_cfg{ - u8 length; - u8 cmd_id; - u16 address; - u32 data; - u32 mask; -}; -enum ioreg_cmd{ - IOREG_CMD_LLT = 0x01, - IOREG_CMD_REFUSE = 0x02, - IOREG_CMD_EFUSE_PATH = 0x03, - IOREG_CMD_WB_REG = 0x04, - IOREG_CMD_WW_REG = 0x05, - IOREG_CMD_WD_REG = 0x06, - IOREG_CMD_W_RF = 0x07, - IOREG_CMD_DELAY_US = 0x10, - IOREG_CMD_DELAY_MS = 0x11, - IOREG_CMD_END = 0xFF, -}; -void read_efuse_from_txpktbuf(ADAPTER *adapter, int bcnhead, u8 *content, u16 *size); - -int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask); -int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask); -int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask); -int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask); -#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value) ,(mask)) -#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value),(mask)) -#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value),(mask)) -#define rtw_IOL_append_WRF_cmd(xmit_frame, rf_path, addr, value,mask) _rtw_IOL_append_WRF_cmd((xmit_frame),(rf_path), (addr), (value),(mask)) - -u8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame); -void rtw_IOL_cmd_buf_dump(ADAPTER *Adapter,int buf_len,u8 *pbuf); - -#ifdef CONFIG_IOL_IOREG_CFG_DBG - struct cmd_cmp{ - u16 addr; - u32 value; - }; -#endif - -#else //CONFIG_IOL_NEW_GENERATION - -typedef struct _io_offload_cmd { - u8 rsvd0; - u8 cmd; - u16 address; - u32 value; -} IO_OFFLOAD_CMD, IOL_CMD; - -#define IOL_CMD_LLT 0x00 -//#define IOL_CMD_R_EFUSE 0x01 -#define IOL_CMD_WB_REG 0x02 -#define IOL_CMD_WW_REG 0x03 -#define IOL_CMD_WD_REG 0x04 -//#define IOL_CMD_W_RF 0x05 -#define IOL_CMD_DELAY_US 0x80 -#define IOL_CMD_DELAY_MS 0x81 -//#define IOL_CMD_DELAY_S 0x82 -#define IOL_CMD_END 0x83 - -/***************************************************** -CMD Address Value -(B1) (B2/B3:H/L addr) (B4:B7 : MSB:LSB) -****************************************************** -IOL_CMD_LLT - B7: PGBNDY -//IOL_CMD_R_EFUSE - - -IOL_CMD_WB_REG 0x0~0xFFFF B7 -IOL_CMD_WW_REG 0x0~0xFFFF B6~B7 -IOL_CMD_WD_REG 0x0~0xFFFF B4~B7 -//IOL_CMD_W_RF RF Reg B5~B7 -IOL_CMD_DELAY_US - B6~B7 -IOL_CMD_DELAY_MS - B6~B7 -//IOL_CMD_DELAY_S - B6~B7 -IOL_CMD_END - - -******************************************************/ -int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value); -int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value); -int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value); - - -int rtw_IOL_exec_cmd_array_sync(PADAPTER adapter, u8 *IOL_cmds, u32 cmd_num, u32 max_wating_ms); -int rtw_IOL_exec_empty_cmds_sync(ADAPTER *adapter, u32 max_wating_ms); - -#ifdef DBG_IO -int dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, const char *caller, const int line); -int dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, const char *caller, const int line); -int dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, const char *caller, const int line); -#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) -#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) -#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) -#else -#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value)) -#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value)) -#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value)) -#endif // DBG_IO -#endif // CONFIG_IOL_NEW_GENERATION - - - -#endif //__RTW_IOL_H_ - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_IOL_H_ +#define __RTW_IOL_H_ + +#include +#include +#include +struct xmit_frame *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter); +int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len); +int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary); +int rtw_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt); +bool rtw_IOL_applied(ADAPTER *adapter); +int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us); +int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms); +int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame); + + +#ifdef CONFIG_IOL_NEW_GENERATION +#define IOREG_CMD_END_LEN 4 + +struct ioreg_cfg{ + u8 length; + u8 cmd_id; + u16 address; + u32 data; + u32 mask; +}; +enum ioreg_cmd{ + IOREG_CMD_LLT = 0x01, + IOREG_CMD_REFUSE = 0x02, + IOREG_CMD_EFUSE_PATH = 0x03, + IOREG_CMD_WB_REG = 0x04, + IOREG_CMD_WW_REG = 0x05, + IOREG_CMD_WD_REG = 0x06, + IOREG_CMD_W_RF = 0x07, + IOREG_CMD_DELAY_US = 0x10, + IOREG_CMD_DELAY_MS = 0x11, + IOREG_CMD_END = 0xFF, +}; +void read_efuse_from_txpktbuf(ADAPTER *adapter, int bcnhead, u8 *content, u16 *size); + +int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask); +int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask); +int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask); +int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask); +#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value) ,(mask)) +#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value),(mask)) +#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value),(mask)) +#define rtw_IOL_append_WRF_cmd(xmit_frame, rf_path, addr, value,mask) _rtw_IOL_append_WRF_cmd((xmit_frame),(rf_path), (addr), (value),(mask)) + +u8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame); +void rtw_IOL_cmd_buf_dump(ADAPTER *Adapter,int buf_len,u8 *pbuf); + +#ifdef CONFIG_IOL_IOREG_CFG_DBG + struct cmd_cmp{ + u16 addr; + u32 value; + }; +#endif + +#else //CONFIG_IOL_NEW_GENERATION + +typedef struct _io_offload_cmd { + u8 rsvd0; + u8 cmd; + u16 address; + u32 value; +} IO_OFFLOAD_CMD, IOL_CMD; + +#define IOL_CMD_LLT 0x00 +//#define IOL_CMD_R_EFUSE 0x01 +#define IOL_CMD_WB_REG 0x02 +#define IOL_CMD_WW_REG 0x03 +#define IOL_CMD_WD_REG 0x04 +//#define IOL_CMD_W_RF 0x05 +#define IOL_CMD_DELAY_US 0x80 +#define IOL_CMD_DELAY_MS 0x81 +//#define IOL_CMD_DELAY_S 0x82 +#define IOL_CMD_END 0x83 + +/***************************************************** +CMD Address Value +(B1) (B2/B3:H/L addr) (B4:B7 : MSB:LSB) +****************************************************** +IOL_CMD_LLT - B7: PGBNDY +//IOL_CMD_R_EFUSE - - +IOL_CMD_WB_REG 0x0~0xFFFF B7 +IOL_CMD_WW_REG 0x0~0xFFFF B6~B7 +IOL_CMD_WD_REG 0x0~0xFFFF B4~B7 +//IOL_CMD_W_RF RF Reg B5~B7 +IOL_CMD_DELAY_US - B6~B7 +IOL_CMD_DELAY_MS - B6~B7 +//IOL_CMD_DELAY_S - B6~B7 +IOL_CMD_END - - +******************************************************/ +int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value); +int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value); +int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value); + + +int rtw_IOL_exec_cmd_array_sync(PADAPTER adapter, u8 *IOL_cmds, u32 cmd_num, u32 max_wating_ms); +int rtw_IOL_exec_empty_cmds_sync(ADAPTER *adapter, u32 max_wating_ms); + +#ifdef DBG_IO +int dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, const char *caller, const int line); +int dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, const char *caller, const int line); +int dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, const char *caller, const int line); +#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) +#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) +#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__) +#else +#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value)) +#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value)) +#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value)) +#endif // DBG_IO +#endif // CONFIG_IOL_NEW_GENERATION + + + +#endif //__RTW_IOL_H_ + diff --git a/drivers/net/wireless/rtl8723as/include/rtw_led.h b/drivers/net/wireless/rtl8723as/include/rtw_led.h index b017eb19138d..2bba754ca81f 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_led.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_led.h @@ -16,222 +16,222 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -#ifndef __RTW_LED_H_ -#define __RTW_LED_H_ - -#include -#include -#include - -#define MSECS(t) (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000) - -#define LED_BLINK_NORMAL_INTERVAL 100 -#define LED_BLINK_SLOWLY_INTERVAL 200 -#define LED_BLINK_LONG_INTERVAL 400 - -#define LED_BLINK_NO_LINK_INTERVAL_ALPHA 1000 -#define LED_BLINK_LINK_INTERVAL_ALPHA 500 //500 -#define LED_BLINK_SCAN_INTERVAL_ALPHA 180 //150 -#define LED_BLINK_FASTER_INTERVAL_ALPHA 50 -#define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA 5000 - -#define LED_BLINK_NORMAL_INTERVAL_NETTRONIX 100 -#define LED_BLINK_SLOWLY_INTERVAL_NETTRONIX 2000 - -#define LED_BLINK_SLOWLY_INTERVAL_PORNET 1000 -#define LED_BLINK_NORMAL_INTERVAL_PORNET 100 - -#define LED_BLINK_FAST_INTERVAL_BITLAND 30 - -// 060403, rcnjko: Customized for AzWave. -#define LED_CM2_BLINK_ON_INTERVAL 250 -#define LED_CM2_BLINK_OFF_INTERVAL 4750 - -#define LED_CM8_BLINK_INTERVAL 500 //for QMI -#define LED_CM8_BLINK_OFF_INTERVAL 3750 //for QMI - -// 080124, lanhsin: Customized for RunTop -#define LED_RunTop_BLINK_INTERVAL 300 - -// 060421, rcnjko: Customized for Sercomm Printer Server case. -#define LED_CM3_BLINK_INTERVAL 1500 - -typedef enum _LED_CTL_MODE{ - LED_CTL_POWER_ON = 1, - LED_CTL_LINK = 2, - LED_CTL_NO_LINK = 3, - LED_CTL_TX = 4, - LED_CTL_RX = 5, - LED_CTL_SITE_SURVEY = 6, - LED_CTL_POWER_OFF = 7, - LED_CTL_START_TO_LINK = 8, - LED_CTL_START_WPS = 9, - LED_CTL_STOP_WPS = 10, - LED_CTL_START_WPS_BOTTON = 11, //added for runtop - LED_CTL_STOP_WPS_FAIL = 12, //added for ALPHA - LED_CTL_STOP_WPS_FAIL_OVERLAP = 13, //added for BELKIN - LED_CTL_CONNECTION_NO_TRANSFER = 14, -}LED_CTL_MODE; - -typedef enum _LED_STATE_871x{ - LED_UNKNOWN = 0, - RTW_LED_ON = 1, - RTW_LED_OFF = 2, - LED_BLINK_NORMAL = 3, - LED_BLINK_SLOWLY = 4, - LED_BLINK_POWER_ON = 5, - LED_BLINK_SCAN = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning. - LED_BLINK_NO_LINK = 7, // LED is blinking during no link state. - LED_BLINK_StartToBlink = 8,// Customzied for Sercomm Printer Server case - LED_BLINK_TXRX = 9, - LED_BLINK_WPS = 10, // LED is blinkg during WPS communication - LED_BLINK_WPS_STOP = 11, //for ALPHA - LED_BLINK_WPS_STOP_OVERLAP = 12, //for BELKIN - LED_BLINK_RUNTOP = 13, // Customized for RunTop - LED_BLINK_CAMEO = 14, - LED_BLINK_XAVI = 15, - LED_BLINK_ALWAYS_ON = 16, -}LED_STATE_871x; - -typedef enum _LED_PIN_871x{ - LED_PIN_NULL = 0, - LED_PIN_LED0 = 1, - LED_PIN_LED1 = 2, - LED_PIN_LED2 = 3, - LED_PIN_GPIO0 = 4, -}LED_PIN_871x; - -typedef struct _LED_871x{ - _adapter *padapter; - - LED_PIN_871x LedPin; // Identify how to implement this SW led. - LED_STATE_871x CurrLedState; // Current LED state. - LED_STATE_871x BlinkingLedState; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. - - u8 bLedOn; // true if LED is ON, false if LED is OFF. - - u8 bLedBlinkInProgress; // true if it is blinking, false o.w.. - - u8 bLedWPSBlinkInProgress; - - u32 BlinkTimes; // Number of times to toggle led state for blinking. - - _timer BlinkTimer; // Timer object for led blinking. - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - u8 bSWLedCtrl; - - // ALPHA, added by chiyoko, 20090106 - u8 bLedNoLinkBlinkInProgress; - u8 bLedLinkBlinkInProgress; - u8 bLedStartToLinkBlinkInProgress; - u8 bLedScanBlinkInProgress; - - #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)|| defined PLATFORM_FREEBSD - _workitem BlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED. - #endif -#endif //defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - -#if defined(CONFIG_PCI_HCI) - u8 bLedSlowBlinkInProgress;//added by vivi, for led new mode -#endif - -} LED_871x, *PLED_871x; - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - -#define IS_LED_WPS_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS \ - || ((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS_STOP \ - || ((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress) - -#define IS_LED_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress \ - ||((PLED_871x)_LED_871x)->bLedScanBlinkInProgress) - -//================================================================================ -// LED customization. -//================================================================================ - -typedef enum _LED_STRATEGY_871x{ - SW_LED_MODE0 = 0, // SW control 1 LED via GPIO0. It is default option. - SW_LED_MODE1= 1, // 2 LEDs, through LED0 and LED1. For ALPHA. - SW_LED_MODE2 = 2, // SW control 1 LED via GPIO0, customized for AzWave 8187 minicard. - SW_LED_MODE3 = 3, // SW control 1 LED via GPIO0, customized for Sercomm Printer Server case. - SW_LED_MODE4 = 4, //for Edimax / Belkin - SW_LED_MODE5 = 5, //for Sercomm / Belkin - SW_LED_MODE6 = 6, //for 88CU minicard, porting from ce SW_LED_MODE7 - HW_LED = 50, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes, see MAC.CONFIG1 for details.) - LED_ST_NONE = 99, -}LED_STRATEGY_871x, *PLED_STRATEGY_871x; - -void -LedControl871x( - _adapter *padapter, - LED_CTL_MODE LedAction - ); -#endif //defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - -#if defined(CONFIG_PCI_HCI) -//================================================================================ -// LED customization. -//================================================================================ - -typedef enum _LED_STRATEGY_871x{ - SW_LED_MODE0 = 0, // SW control 1 LED via GPIO0. It is default option. - SW_LED_MODE1 = 1, // SW control for PCI Express - SW_LED_MODE2 = 2, // SW control for Cameo. - SW_LED_MODE3 = 3, // SW contorl for RunTop. - SW_LED_MODE4 = 4, // SW control for Netcore - SW_LED_MODE5 = 5, //added by vivi, for led new mode, DLINK - SW_LED_MODE6 = 6, //added by vivi, for led new mode, PRONET - SW_LED_MODE7 = 7, //added by chiyokolin, for Lenovo, PCI Express Minicard Spec Rev.1.2 spec - SW_LED_MODE8 = 8, //added by chiyokolin, for QMI - SW_LED_MODE9 = 9, //added by chiyokolin, for BITLAND, PCI Express Minicard Spec Rev.1.1 - SW_LED_MODE10 = 10, //added by chiyokolin, for Edimax-ASUS - HW_LED = 50, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes) - LED_ST_NONE = 99, -}LED_STRATEGY_871x, *PLED_STRATEGY_871x; -#endif //defined(CONFIG_PCI_HCI) - -struct led_priv{ - /* add for led controll */ - LED_871x SwLed0; - LED_871x SwLed1; - LED_STRATEGY_871x LedStrategy; - u8 bRegUseLed; - void (*LedControlHandler)(_adapter *padapter, LED_CTL_MODE LedAction); - /* add for led controll */ -}; - -#ifdef CONFIG_SW_LED -#define rtw_led_control(adapter, LedAction) \ - do { \ - if((adapter)->ledpriv.LedControlHandler) \ - (adapter)->ledpriv.LedControlHandler((adapter), (LedAction)); \ - } while(0) -#else //CONFIG_SW_LED -#define rtw_led_control(adapter, LedAction) -#endif //CONFIG_SW_LED - -void BlinkTimerCallback(void *data); -void BlinkWorkItemCallback(struct work_struct *work); - -void ResetLedStatus(PLED_871x pLed); - -void -InitLed871x( - _adapter *padapter, - PLED_871x pLed, - LED_PIN_871x LedPin - ); - -void -DeInitLed871x( - PLED_871x pLed - ); - -//hal... -extern void BlinkHandler(PLED_871x pLed); - -#endif //__RTW_LED_H_ - + ******************************************************************************/ +#ifndef __RTW_LED_H_ +#define __RTW_LED_H_ + +#include +#include +#include + +#define MSECS(t) (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000) + +#define LED_BLINK_NORMAL_INTERVAL 100 +#define LED_BLINK_SLOWLY_INTERVAL 200 +#define LED_BLINK_LONG_INTERVAL 400 + +#define LED_BLINK_NO_LINK_INTERVAL_ALPHA 1000 +#define LED_BLINK_LINK_INTERVAL_ALPHA 500 //500 +#define LED_BLINK_SCAN_INTERVAL_ALPHA 180 //150 +#define LED_BLINK_FASTER_INTERVAL_ALPHA 50 +#define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA 5000 + +#define LED_BLINK_NORMAL_INTERVAL_NETTRONIX 100 +#define LED_BLINK_SLOWLY_INTERVAL_NETTRONIX 2000 + +#define LED_BLINK_SLOWLY_INTERVAL_PORNET 1000 +#define LED_BLINK_NORMAL_INTERVAL_PORNET 100 + +#define LED_BLINK_FAST_INTERVAL_BITLAND 30 + +// 060403, rcnjko: Customized for AzWave. +#define LED_CM2_BLINK_ON_INTERVAL 250 +#define LED_CM2_BLINK_OFF_INTERVAL 4750 + +#define LED_CM8_BLINK_INTERVAL 500 //for QMI +#define LED_CM8_BLINK_OFF_INTERVAL 3750 //for QMI + +// 080124, lanhsin: Customized for RunTop +#define LED_RunTop_BLINK_INTERVAL 300 + +// 060421, rcnjko: Customized for Sercomm Printer Server case. +#define LED_CM3_BLINK_INTERVAL 1500 + +typedef enum _LED_CTL_MODE{ + LED_CTL_POWER_ON = 1, + LED_CTL_LINK = 2, + LED_CTL_NO_LINK = 3, + LED_CTL_TX = 4, + LED_CTL_RX = 5, + LED_CTL_SITE_SURVEY = 6, + LED_CTL_POWER_OFF = 7, + LED_CTL_START_TO_LINK = 8, + LED_CTL_START_WPS = 9, + LED_CTL_STOP_WPS = 10, + LED_CTL_START_WPS_BOTTON = 11, //added for runtop + LED_CTL_STOP_WPS_FAIL = 12, //added for ALPHA + LED_CTL_STOP_WPS_FAIL_OVERLAP = 13, //added for BELKIN + LED_CTL_CONNECTION_NO_TRANSFER = 14, +}LED_CTL_MODE; + +typedef enum _LED_STATE_871x{ + LED_UNKNOWN = 0, + RTW_LED_ON = 1, + RTW_LED_OFF = 2, + LED_BLINK_NORMAL = 3, + LED_BLINK_SLOWLY = 4, + LED_BLINK_POWER_ON = 5, + LED_BLINK_SCAN = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning. + LED_BLINK_NO_LINK = 7, // LED is blinking during no link state. + LED_BLINK_StartToBlink = 8,// Customzied for Sercomm Printer Server case + LED_BLINK_TXRX = 9, + LED_BLINK_WPS = 10, // LED is blinkg during WPS communication + LED_BLINK_WPS_STOP = 11, //for ALPHA + LED_BLINK_WPS_STOP_OVERLAP = 12, //for BELKIN + LED_BLINK_RUNTOP = 13, // Customized for RunTop + LED_BLINK_CAMEO = 14, + LED_BLINK_XAVI = 15, + LED_BLINK_ALWAYS_ON = 16, +}LED_STATE_871x; + +typedef enum _LED_PIN_871x{ + LED_PIN_NULL = 0, + LED_PIN_LED0 = 1, + LED_PIN_LED1 = 2, + LED_PIN_LED2 = 3, + LED_PIN_GPIO0 = 4, +}LED_PIN_871x; + +typedef struct _LED_871x{ + _adapter *padapter; + + LED_PIN_871x LedPin; // Identify how to implement this SW led. + LED_STATE_871x CurrLedState; // Current LED state. + LED_STATE_871x BlinkingLedState; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are. + + u8 bLedOn; // true if LED is ON, false if LED is OFF. + + u8 bLedBlinkInProgress; // true if it is blinking, false o.w.. + + u8 bLedWPSBlinkInProgress; + + u32 BlinkTimes; // Number of times to toggle led state for blinking. + + _timer BlinkTimer; // Timer object for led blinking. + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + u8 bSWLedCtrl; + + // ALPHA, added by chiyoko, 20090106 + u8 bLedNoLinkBlinkInProgress; + u8 bLedLinkBlinkInProgress; + u8 bLedStartToLinkBlinkInProgress; + u8 bLedScanBlinkInProgress; + + #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)|| defined PLATFORM_FREEBSD + _workitem BlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED. + #endif +#endif //defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + +#if defined(CONFIG_PCI_HCI) + u8 bLedSlowBlinkInProgress;//added by vivi, for led new mode +#endif + +} LED_871x, *PLED_871x; + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + +#define IS_LED_WPS_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS \ + || ((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS_STOP \ + || ((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress) + +#define IS_LED_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress \ + ||((PLED_871x)_LED_871x)->bLedScanBlinkInProgress) + +//================================================================================ +// LED customization. +//================================================================================ + +typedef enum _LED_STRATEGY_871x{ + SW_LED_MODE0 = 0, // SW control 1 LED via GPIO0. It is default option. + SW_LED_MODE1= 1, // 2 LEDs, through LED0 and LED1. For ALPHA. + SW_LED_MODE2 = 2, // SW control 1 LED via GPIO0, customized for AzWave 8187 minicard. + SW_LED_MODE3 = 3, // SW control 1 LED via GPIO0, customized for Sercomm Printer Server case. + SW_LED_MODE4 = 4, //for Edimax / Belkin + SW_LED_MODE5 = 5, //for Sercomm / Belkin + SW_LED_MODE6 = 6, //for 88CU minicard, porting from ce SW_LED_MODE7 + HW_LED = 50, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes, see MAC.CONFIG1 for details.) + LED_ST_NONE = 99, +}LED_STRATEGY_871x, *PLED_STRATEGY_871x; + +void +LedControl871x( + _adapter *padapter, + LED_CTL_MODE LedAction + ); +#endif //defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + +#if defined(CONFIG_PCI_HCI) +//================================================================================ +// LED customization. +//================================================================================ + +typedef enum _LED_STRATEGY_871x{ + SW_LED_MODE0 = 0, // SW control 1 LED via GPIO0. It is default option. + SW_LED_MODE1 = 1, // SW control for PCI Express + SW_LED_MODE2 = 2, // SW control for Cameo. + SW_LED_MODE3 = 3, // SW contorl for RunTop. + SW_LED_MODE4 = 4, // SW control for Netcore + SW_LED_MODE5 = 5, //added by vivi, for led new mode, DLINK + SW_LED_MODE6 = 6, //added by vivi, for led new mode, PRONET + SW_LED_MODE7 = 7, //added by chiyokolin, for Lenovo, PCI Express Minicard Spec Rev.1.2 spec + SW_LED_MODE8 = 8, //added by chiyokolin, for QMI + SW_LED_MODE9 = 9, //added by chiyokolin, for BITLAND, PCI Express Minicard Spec Rev.1.1 + SW_LED_MODE10 = 10, //added by chiyokolin, for Edimax-ASUS + HW_LED = 50, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes) + LED_ST_NONE = 99, +}LED_STRATEGY_871x, *PLED_STRATEGY_871x; +#endif //defined(CONFIG_PCI_HCI) + +struct led_priv{ + /* add for led controll */ + LED_871x SwLed0; + LED_871x SwLed1; + LED_STRATEGY_871x LedStrategy; + u8 bRegUseLed; + void (*LedControlHandler)(_adapter *padapter, LED_CTL_MODE LedAction); + /* add for led controll */ +}; + +#ifdef CONFIG_SW_LED +#define rtw_led_control(adapter, LedAction) \ + do { \ + if((adapter)->ledpriv.LedControlHandler) \ + (adapter)->ledpriv.LedControlHandler((adapter), (LedAction)); \ + } while(0) +#else //CONFIG_SW_LED +#define rtw_led_control(adapter, LedAction) +#endif //CONFIG_SW_LED + +void BlinkTimerCallback(void *data); +void BlinkWorkItemCallback(struct work_struct *work); + +void ResetLedStatus(PLED_871x pLed); + +void +InitLed871x( + _adapter *padapter, + PLED_871x pLed, + LED_PIN_871x LedPin + ); + +void +DeInitLed871x( + PLED_871x pLed + ); + +//hal... +extern void BlinkHandler(PLED_871x pLed); + +#endif //__RTW_LED_H_ + diff --git a/drivers/net/wireless/rtl8723as/include/rtw_mlme.h b/drivers/net/wireless/rtl8723as/include/rtw_mlme.h index 0ed99f769786..bdb47cb88130 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_mlme.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_mlme.h @@ -122,6 +122,11 @@ enum _BAND GHZ_24, }; +enum DriverInterface { + DRIVER_WEXT = 1, + DRIVER_CFG80211 = 2 +}; + enum SCAN_RESULT_TYPE { SCAN_RESULT_P2P_ONLY = 0, // Will return all the P2P devices. @@ -242,7 +247,11 @@ struct group_id_info{ struct scan_limit_info{ u8 scan_op_ch_only; // When this flag is set, the driver should just scan the operation channel +#ifndef P2P_OP_CHECK_SOCIAL_CH u8 operation_ch[2]; // Store the operation channel of invitation request frame +#else + u8 operation_ch[5]; // Store additional channel 1,6,11 for Android 4.2 IOT & Nexus 4 +#endif //P2P_OP_CHECK_SOCIAL_CH }; #ifdef CONFIG_IOCTL_CFG80211 @@ -329,9 +338,13 @@ struct wifidirect_info{ enum P2P_WPSINFO ui_got_wps_info; // This field will store the WPS value (PIN value or PBC) that UI had got from the user. u16 supported_wps_cm; // This field describes the WPS config method which this driver supported. // The value should be the combination of config method defined in page104 of WPS v2.0 spec. + u8 external_uuid; // UUID flag + u8 uuid[16]; // UUID uint channel_list_attr_len; // This field will contain the length of body of P2P Channel List attribute of group negotitation response frame. u8 channel_list_attr[100]; // This field will contain the body of P2P Channel List attribute of group negotitation response frame. // We will use the channel_cnt and channel_list fields when constructing the group negotitation confirm frame. + u8 driver_interface; // Indicate DRIVER_WEXT or DRIVER_CFG80211 + #ifdef CONFIG_CONCURRENT_MODE u16 ext_listen_interval; // The interval to be available with legacy AP (ms) u16 ext_listen_period; // The time period to be available for P2P listen state (ms) @@ -401,6 +414,12 @@ struct mlme_priv { u8 assoc_bssid[6]; struct wlan_network cur_network; + struct wlan_network *cur_network_scanned; +#ifdef CONFIG_ARP_KEEP_ALIVE + // for arp offload keep alive + u8 gw_mac_addr[6]; + u8 gw_ip[4]; +#endif //uint wireless_mode; no used, remove it @@ -419,6 +438,10 @@ struct mlme_priv { ATOMIC_T set_scan_deny; //0: allowed, 1: deny #endif + #ifdef CONFIG_DETECT_C2H_BY_POLLING + _timer event_polling_timer; + #endif + struct qos_priv qospriv; #ifdef CONFIG_80211N_HT @@ -439,7 +462,6 @@ struct mlme_priv { RT_LINK_DETECT_T LinkDetectInfo; _timer dynamic_chk_timer; //dynamic/periodic check timer - u8 key_mask; //use for ips to set wep key after ips_leave u8 acm_mask; // for wmm acm mask u8 ChannelPlan; RT_SCAN_TYPE scan_mode; // active: 1, passive: 0 @@ -554,6 +576,22 @@ struct mlme_priv { u8 channel_idx; u8 group_cnt; //In WiDi 3.5, they specified another scan algo. for WFD/RDS co-existed u8 sa_ext[L2SDTA_SERVICE_VE_LEN]; + + u8 widi_enable; + /** + * For WiDi 4; upper layer would set + * p2p_primary_device_type_category_id + * p2p_primary_device_type_sub_category_id + * p2p_secondary_device_type_category_id + * p2p_secondary_device_type_sub_category_id + */ + u16 p2p_pdt_cid; + u16 p2p_pdt_scid; + u8 num_p2p_sdt; + u16 p2p_sdt_cid[MAX_NUM_P2P_SDT]; + u16 p2p_sdt_scid[MAX_NUM_P2P_SDT]; + u8 p2p_reject_disable; //When starting NL80211 wpa_supplicant/hostapd, it will call netdev_close + //such that it will cause p2p disabled. Use this flag to reject. #endif // CONFIG_INTEL_WIDI #ifdef CONFIG_CONCURRENT_MODE @@ -624,7 +662,7 @@ extern void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv); extern sint rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv); -extern sint rtw_set_key(_adapter *adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx); +extern sint rtw_set_key(_adapter *adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx, bool enqueue); extern sint rtw_set_auth(_adapter *adapter,struct security_priv *psecuritypriv); __inline static u8 *get_bssid(struct mlme_priv *pmlmepriv) @@ -763,6 +801,9 @@ void rtw_set_scan_deny(_adapter *adapter, u32 ms); #define rtw_set_scan_deny(adapter, ms) do {} while (0) #endif +#ifdef CONFIG_DETECT_C2H_BY_POLLING +extern void rtw_event_polling_timer_hdl(_adapter *adapter); +#endif extern int _rtw_init_mlme_priv(_adapter *padapter); @@ -803,7 +844,7 @@ void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe); #endif int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork); -int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst); +int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst, u8 feature); #ifdef CONFIG_LAYER2_ROAMING void _rtw_roaming(_adapter *adapter, struct wlan_network *tgt_network); @@ -817,7 +858,8 @@ u8 rtw_to_roaming(_adapter *adapter); #define rtw_to_roaming(adapter) 0 #endif -void rtw_stassoc_hw_rpt(_adapter *adapter,struct sta_info *psta); +void rtw_sta_media_status_rpt(_adapter *adapter,struct sta_info *psta, u32 mstatus); + #ifdef CONFIG_INTEL_PROXIM void rtw_proxim_enable(_adapter *padapter); void rtw_proxim_disable(_adapter *padapter); diff --git a/drivers/net/wireless/rtl8723as/include/rtw_mlme_ext.h b/drivers/net/wireless/rtl8723as/include/rtw_mlme_ext.h index 61f808ee20c0..284e99c27b68 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_mlme_ext.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_mlme_ext.h @@ -504,7 +504,11 @@ struct mlme_ext_priv u8 mlmeext_init; ATOMIC_T event_seq; u16 mgnt_seq; - +#ifdef CONFIG_IEEE80211W + u16 sa_query_seq; + u64 mgnt_80211w_IPN; + u64 mgnt_80211w_IPN_rx; +#endif //CONFIG_IEEE80211W //struct fw_priv fwpriv; unsigned char cur_channel; @@ -523,6 +527,9 @@ struct mlme_ext_priv //for ap mode, network includes ap's cap_info _timer survey_timer; _timer link_timer; +#ifdef CONFIG_IEEE80211W + _timer sa_query_timer; +#endif //CONFIG_IEEE80211W //_timer ADDBA_timer; u16 chan_scan_time; @@ -583,13 +590,15 @@ u8 rtw_get_oper_bw(_adapter *adapter); void rtw_set_oper_bw(_adapter *adapter, u8 bw); u8 rtw_get_oper_choffset(_adapter *adapter); void rtw_set_oper_choffset(_adapter *adapter, u8 offset); +u32 rtw_get_on_oper_ch_time(_adapter *adapter); +u32 rtw_get_on_cur_ch_time(_adapter *adapter); void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode); void SelectChannel(_adapter *padapter, unsigned char channel); void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset); unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval); - +void read_cam(_adapter *padapter ,u8 entry); void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key); void clear_cam_entry(_adapter *padapter, u8 entry); @@ -641,6 +650,11 @@ void update_tx_basic_rate(_adapter *padapter, u8 modulation); void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id); int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx); +#ifdef CONFIG_WOWLAN +void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip); +void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr); +#endif + //for sta/adhoc mode void update_sta_info(_adapter *padapter, struct sta_info *psta); unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz); @@ -694,6 +708,9 @@ int issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason); int issue_deauth_ex(_adapter *padapter, u8 *da, unsigned short reason, int try_cnt, int wait_ms); void issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_offset); void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status); +#ifdef CONFIG_IEEE80211W +void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short tid); +#endif //CONFIG_IEEE80211W unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr); unsigned int send_beacon(_adapter *padapter); @@ -721,6 +738,9 @@ unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame); unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame); unsigned int on_action_public(_adapter *padapter, union recv_frame *precv_frame); unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame); +#ifdef CONFIG_IEEE80211W +unsigned int OnAction_sa_query(_adapter *padapter, union recv_frame *precv_frame); +#endif //CONFIG_IEEE80211W unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame); unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame); @@ -734,6 +754,9 @@ void linked_status_chk(_adapter *padapter); void survey_timer_hdl (_adapter *padapter); void link_timer_hdl (_adapter *padapter); void addba_timer_hdl(struct sta_info *psta); +#ifdef CONFIG_IEEE80211W +void sa_query_timer_hdl(_adapter *padapter); +#endif //CONFIG_IEEE80211W //void reauth_timer_hdl(_adapter *padapter); //void reassoc_timer_hdl(_adapter *padapter); @@ -748,7 +771,13 @@ void addba_timer_hdl(struct sta_info *psta); /*DBG_871X("%s set_link_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \ _set_timer(&(mlmeext)->link_timer, (ms)); \ } while(0) - +#ifdef CONFIG_IEEE80211W +#define set_sa_query_timer(mlmeext, ms) \ + do { \ + DBG_871X("%s set_sa_query_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms)); \ + _set_timer(&(mlmeext)->sa_query_timer, (ms)); \ + } while(0) +#endif //CONFIG_IEEE80211W extern int cckrates_included(unsigned char *rate, int ratelen); extern int cckratesonly_included(unsigned char *rate, int ratelen); @@ -760,7 +789,6 @@ extern void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext); #ifdef CONFIG_CONCURRENT_MODE sint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state); -int concurrent_chk_start_clnt_join(_adapter *padapter); void concurrent_chk_joinbss_done(_adapter *padapter, int join_res); #endif //CONFIG_CONCURRENT_MODE @@ -779,6 +807,9 @@ void dc_resume_xmit(_adapter *padapter); u8 dc_check_xmit(_adapter *padapter); #endif +int rtw_chk_start_clnt_join(_adapter *padapter); +int rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset); + struct cmd_hdl { uint parmsize; u8 (*h2cfuns)(struct _ADAPTER *padapter, u8 *pbuf); diff --git a/drivers/net/wireless/rtl8723as/include/rtw_mp.h b/drivers/net/wireless/rtl8723as/include/rtw_mp.h index cda76083f0c0..9a017a46db4a 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_mp.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_mp.h @@ -403,6 +403,9 @@ enum { CTA_TEST, MP_DISABLE_BT_COEXIST, MP_PwrCtlDM, +#ifdef CONFIG_WOWLAN + MP_WOW_ENABLE, +#endif MP_NULL, }; diff --git a/drivers/net/wireless/rtl8723as/include/rtw_odm.h b/drivers/net/wireless/rtl8723as/include/rtw_odm.h new file mode 100755 index 000000000000..d01acd64b20b --- /dev/null +++ b/drivers/net/wireless/rtl8723as/include/rtw_odm.h @@ -0,0 +1,42 @@ +/****************************************************************************** + * + * Copyright(c) 2013 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_ODM_H__ +#define __RTW_ODM_H__ + +#include + +/* +* This file provides utilities/wrappers for rtw driver to use ODM +*/ + +int _rtw_odm_dbg_comp_msg(_adapter *adapter, char *buf, int len); +void rtw_odm_dbg_comp_msg(_adapter *adapter); +void rtw_odm_dbg_comp_set(_adapter *adapter, u64 comps); +int _rtw_odm_dbg_level_msg(_adapter *adapter, char *buf, int len); +void rtw_odm_dbg_level_msg(_adapter *adapter); +void rtw_odm_dbg_level_set(_adapter *adapter, u32 level); + +int _rtw_odm_adaptivity_parm_msg(_adapter *adapter, char *buf, int len); +void rtw_odm_adaptivity_parm_msg(_adapter *adapter); +void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff, + s8 IGI_Base, bool ForceEDCCA, u8 AdapEn_RSSI, u8 IGI_LowerBound); + +#endif // __RTW_ODM_H__ + diff --git a/drivers/net/wireless/rtl8723as/include/rtw_pwrctrl.h b/drivers/net/wireless/rtl8723as/include/rtw_pwrctrl.h index 3d3dc8275e8f..4b63a1e056cf 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_pwrctrl.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_pwrctrl.h @@ -257,6 +257,7 @@ struct pwrctrl_priv u8 wowlan_pattern_idx; u8 wowlan_wake_reason; u32 wowlan_pattern_context[8][5]; + u64 wowlan_fw_iv; #endif // CONFIG_WOWLAN _timer pwr_state_check_timer; int pwr_state_check_interval; @@ -268,7 +269,6 @@ struct pwrctrl_priv //rt_rf_power_state current_rfpwrstate; rt_rf_power_state change_rfpwrstate; - u8 wepkeymask; u8 bHWPowerdown;//if support hw power down u8 bHWPwrPindetect; u8 bkeepfwalive; @@ -295,22 +295,22 @@ struct pwrctrl_priv #endif }; -#define rtw_get_ips_mode_req(pwrctrlpriv) \ - (pwrctrlpriv)->ips_mode_req +#define rtw_get_ips_mode_req(pwrctl) \ + (pwrctl)->ips_mode_req -#define rtw_ips_mode_req(pwrctrlpriv, ips_mode) \ - (pwrctrlpriv)->ips_mode_req = (ips_mode) +#define rtw_ips_mode_req(pwrctl, ips_mode) \ + (pwrctl)->ips_mode_req = (ips_mode) #define RTW_PWR_STATE_CHK_INTERVAL 2000 -#define _rtw_set_pwr_state_check_timer(pwrctrlpriv, ms) \ +#define _rtw_set_pwr_state_check_timer(pwrctl, ms) \ do { \ - /*DBG_871X("%s _rtw_set_pwr_state_check_timer(%p, %d)\n", __FUNCTION__, (pwrctrlpriv), (ms));*/ \ - _set_timer(&(pwrctrlpriv)->pwr_state_check_timer, (ms)); \ + /*DBG_871X("%s _rtw_set_pwr_state_check_timer(%p, %d)\n", __FUNCTION__, (pwrctl), (ms));*/ \ + _set_timer(&(pwrctl)->pwr_state_check_timer, (ms)); \ } while(0) -#define rtw_set_pwr_state_check_timer(pwrctrlpriv) \ - _rtw_set_pwr_state_check_timer((pwrctrlpriv), (pwrctrlpriv)->pwr_state_check_interval) +#define rtw_set_pwr_state_check_timer(pwrctl) \ + _rtw_set_pwr_state_check_timer((pwrctl), (pwrctl)->pwr_state_check_interval) extern void rtw_init_pwrctrl_priv(_adapter *adapter); extern void rtw_free_pwrctrl_priv(_adapter * adapter); @@ -332,7 +332,9 @@ extern void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_a extern void rtw_set_rpwm(_adapter * padapter, u8 val8); extern void LeaveAllPowerSaveMode(PADAPTER Adapter); #ifdef CONFIG_IPS +void _ips_enter(_adapter * padapter); void ips_enter(_adapter * padapter); +int _ips_leave(_adapter * padapter); int ips_leave(_adapter * padapter); #endif diff --git a/drivers/net/wireless/rtl8723as/include/rtw_recv.h b/drivers/net/wireless/rtl8723as/include/rtw_recv.h index 340413169e26..97ffea34a063 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_recv.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_recv.h @@ -101,6 +101,26 @@ struct signal_stat { u32 total_num; //num of valid elements u32 total_val; //sum of valid elements }; +/* +#define MAX_PATH_NUM_92CS 2 + +typedef struct _ODM_Phy_Status_Info_ +{ + u1Byte RxPWDBAll; + u1Byte SignalQuality; // in 0-100 index. + u1Byte RxMIMOSignalQuality[MAX_PATH_NUM_92CS]; //EVM + u1Byte RxMIMOSignalStrength[MAX_PATH_NUM_92CS];// in 0~100 index +#if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE)) + s1Byte RxPower; // in dBm Translate from PWdB + s1Byte RecvSignalPower;// Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures. + u1Byte BTRxRSSIPercentage; + u1Byte SignalStrength; // in 0-100 index. + u1Byte RxPwr[MAX_PATH_NUM_92CS];//per-path's pwdb +#endif + u1Byte RxSNR[MAX_PATH_NUM_92CS];//per-path's SNR +}ODM_PHY_INFO_T,*PODM_PHY_INFO_T; +*/ + #define MAX_PATH_NUM_92CS 2 struct phy_info //ODM_PHY_INFO_T { diff --git a/drivers/net/wireless/rtl8723as/include/rtw_security.h b/drivers/net/wireless/rtl8723as/include/rtw_security.h index e0790f95edbe..730857c2b97e 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_security.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_security.h @@ -34,7 +34,9 @@ #define _WEP104_ 0x5 #define _WEP_WPA_MIXED_ 0x07 // WEP + WPA #define _SMS4_ 0x06 - +#ifdef CONFIG_IEEE80211W +#define _BIP_ 0x8 +#endif //CONFIG_IEEE80211W #define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_)) #define _WPA_IE_ID_ 0xdd @@ -122,6 +124,7 @@ struct security_priv u32 dot11PrivacyKeyIndex; // this is only valid for legendary wep, 0~3 for key id. (tx key index) union Keytype dot11DefKey[4]; // this is only valid for def. key u32 dot11DefKeylen[4]; + u8 key_mask; /* use to restore wep key after hal_init */ u32 dot118021XGrpPrivacy; // This specify the privacy algthm. used for Grp key u32 dot118021XGrpKeyid; // key id used for Grp Key ( tx key index) @@ -130,7 +133,12 @@ struct security_priv union Keytype dot118021XGrprxmickey[4]; union pn48 dot11Grptxpn; // PN48 used for Grp Key xmit. union pn48 dot11Grprxpn; // PN48 used for Grp Key recv. - +#ifdef CONFIG_IEEE80211W + u32 dot11wBIPKeyid; // key id used for BIP Key ( tx key index) + union Keytype dot11wBIPKey[6]; // BIP Key, for index4 and index5 + union pn48 dot11wBIPtxpn; // PN48 used for Grp Key xmit. + union pn48 dot11wBIPrxpn; // PN48 used for Grp Key recv. +#endif //CONFIG_IEEE80211W #ifdef CONFIG_AP_MODE //extend security capabilities for AP_MODE unsigned int dot8021xalg;//0:disable, 1:psk, 2:802.1x @@ -146,6 +154,9 @@ struct security_priv u8 binstallGrpkey; +#ifdef CONFIG_IEEE80211W + u8 binstallBIPkey; +#endif //CONFIG_IEEE80211W u8 busetkipkey; //_timer tkip_timer; u8 bcheck_grpkey; @@ -397,7 +408,9 @@ static const unsigned long K[64] = { #ifndef MIN #define MIN(x, y) (((x) < (y)) ? (x) : (y)) #endif - +#ifdef CONFIG_IEEE80211W +int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac); +#endif //CONFIG_IEEE80211W void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key ); void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b ); void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nBytes ); @@ -418,7 +431,9 @@ void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe); u32 rtw_aes_decrypt(_adapter *padapter, u8 *precvframe); u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe); void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe); - +#ifdef CONFIG_IEEE80211W +u32 rtw_BIP_verify(_adapter *padapter, u8 *precvframe); +#endif //CONFIG_IEEE80211W #ifdef CONFIG_TDLS void wpa_tdls_generate_tpk(_adapter *padapter, struct sta_info *psta); int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, @@ -443,5 +458,9 @@ void rtw_use_tkipkey_handler(void* FunctionContext); #ifdef PLATFORM_FREEBSD void rtw_use_tkipkey_handler(void* FunctionContext); #endif //PLATFORM_FREEBSD + +void rtw_sec_restore_wep_key(_adapter *adapter); +u8 rtw_handle_tkip_countermeasure(_adapter* adapter, const char *caller); + #endif //__RTL871X_SECURITY_H_ diff --git a/drivers/net/wireless/rtl8723as/include/rtw_tdls.h b/drivers/net/wireless/rtl8723as/include/rtw_tdls.h index 72ecc209f7b6..bc22cfee2958 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_tdls.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_tdls.h @@ -1,143 +1,143 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTW_TDLS_H_ -#define __RTW_TDLS_H_ - -#include - -#ifdef CONFIG_TDLS -/* TDLS STA state */ -#define TDLS_STATE_NONE 0x00000000 //default state -#define TDLS_INITIATOR_STATE 0x10000000 -#define TDLS_RESPONDER_STATE 0x20000000 -#define TDLS_LINKED_STATE 0x40000000 -#define TDLS_CH_SWITCH_ON_STATE 0x01000000 -#define TDLS_PEER_AT_OFF_STATE 0x02000000 //could send pkt on target ch -#define TDLS_AT_OFF_CH_STATE 0x04000000 -#define TDLS_CH_SW_INITIATOR_STATE 0x08000000 //avoiding duplicated or unconditional ch. switch rsp. -#define TDLS_APSD_CHSW_STATE 0x00100000 //in APSD and want to setup channel switch -#define TDLS_PEER_SLEEP_STATE 0x00200000 //peer sta is sleeping -#define TDLS_SW_OFF_STATE 0x00400000 //terminate channel swithcing -#define TDLS_ALIVE_STATE 0x00010000 //Check if peer sta is alived. - -#define TPK_RESEND_COUNT 301 -#define CH_SWITCH_TIME 10 -#define CH_SWITCH_TIMEOUT 30 -#define TDLS_STAY_TIME 500 -#define TDLS_SIGNAL_THRESH 0x20 -#define TDLS_WATCHDOG_PERIOD 10 //Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec -#define TDLS_ALIVE_TIMER_PH1 5000 -#define TDLS_ALIVE_TIMER_PH2 2000 -#define TDLS_STAY_TIME 500 -#define TDLS_HANDSHAKE_TIME 8000 -#define TDLS_ALIVE_COUNT 3 -#define TDLS_INI_MACID_ENTRY 6 - -/* TDLS */ -#define TDLS_MIC_LEN 16 -#define WPA_NONCE_LEN 32 -#define TDLS_TIMEOUT_LEN 4 - -struct wpa_tdls_ftie { - u8 ie_type; /* FTIE */ - u8 ie_len; - u8 mic_ctrl[2]; - u8 mic[TDLS_MIC_LEN]; - u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */ - u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */ - /* followed by optional elements */ -} ; - -struct wpa_tdls_lnkid { - u8 ie_type; /* Link Identifier IE */ - u8 ie_len; - u8 bssid[ETH_ALEN]; - u8 init_sta[ETH_ALEN]; - u8 resp_sta[ETH_ALEN]; -} ; - -static u8 TDLS_RSNIE[]={ 0x01, 0x00, //version shall be set to 1 - 0x00, 0x0f, 0xac, 0x07, //group sipher suite - 0x01, 0x00, //pairwise cipher suite count - 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only - 0x01, 0x00, //AKM suite count - 0x00, 0x0f, 0xac, 0x07, //TPK Handshake - 0x00, 0x02, - //PMKID shall not be present - }; - -static u8 TDLS_WMMIE[]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero - -static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) - -// SRC: Supported Regulatory Classes -static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 }; - -void rtw_reset_tdls_info(_adapter* padapter); -int rtw_init_tdls_info(_adapter* padapter); -void rtw_free_tdls_info(struct tdls_info *ptdlsinfo); -void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode); -void init_TPK_timer(_adapter *padapter, struct sta_info *psta); -void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta); -void init_base_ch_timer(_adapter *padapter, struct sta_info *psta); -void init_off_ch_timer(_adapter *padapter, struct sta_info *psta); -void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta); -void init_handshake_timer(_adapter *padapter, struct sta_info *psta); -void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta); -#ifdef CONFIG_WFD -void issue_tunneled_probe_req(_adapter *padapter); -void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame); -#endif //CONFIG_WFD -void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr); -void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr); -void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame); -void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame); -void issue_tdls_dis_rsp(_adapter * padapter, union recv_frame * precv_frame, u8 dialog); -void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr); -void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta); -void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr); -void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr); -sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame); -sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame); -void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog); -void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); - -int update_sgi_tdls(_adapter *padapter, struct sta_info *psta); -u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta); -#endif //CONFIG_TDLS - -#endif - +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_TDLS_H_ +#define __RTW_TDLS_H_ + +#include + +#ifdef CONFIG_TDLS +/* TDLS STA state */ +#define TDLS_STATE_NONE 0x00000000 //default state +#define TDLS_INITIATOR_STATE 0x10000000 +#define TDLS_RESPONDER_STATE 0x20000000 +#define TDLS_LINKED_STATE 0x40000000 +#define TDLS_CH_SWITCH_ON_STATE 0x01000000 +#define TDLS_PEER_AT_OFF_STATE 0x02000000 //could send pkt on target ch +#define TDLS_AT_OFF_CH_STATE 0x04000000 +#define TDLS_CH_SW_INITIATOR_STATE 0x08000000 //avoiding duplicated or unconditional ch. switch rsp. +#define TDLS_APSD_CHSW_STATE 0x00100000 //in APSD and want to setup channel switch +#define TDLS_PEER_SLEEP_STATE 0x00200000 //peer sta is sleeping +#define TDLS_SW_OFF_STATE 0x00400000 //terminate channel swithcing +#define TDLS_ALIVE_STATE 0x00010000 //Check if peer sta is alived. + +#define TPK_RESEND_COUNT 301 +#define CH_SWITCH_TIME 10 +#define CH_SWITCH_TIMEOUT 30 +#define TDLS_STAY_TIME 500 +#define TDLS_SIGNAL_THRESH 0x20 +#define TDLS_WATCHDOG_PERIOD 10 //Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec +#define TDLS_ALIVE_TIMER_PH1 5000 +#define TDLS_ALIVE_TIMER_PH2 2000 +#define TDLS_STAY_TIME 500 +#define TDLS_HANDSHAKE_TIME 8000 +#define TDLS_ALIVE_COUNT 3 +#define TDLS_INI_MACID_ENTRY 6 + +/* TDLS */ +#define TDLS_MIC_LEN 16 +#define WPA_NONCE_LEN 32 +#define TDLS_TIMEOUT_LEN 4 + +struct wpa_tdls_ftie { + u8 ie_type; /* FTIE */ + u8 ie_len; + u8 mic_ctrl[2]; + u8 mic[TDLS_MIC_LEN]; + u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */ + u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */ + /* followed by optional elements */ +} ; + +struct wpa_tdls_lnkid { + u8 ie_type; /* Link Identifier IE */ + u8 ie_len; + u8 bssid[ETH_ALEN]; + u8 init_sta[ETH_ALEN]; + u8 resp_sta[ETH_ALEN]; +} ; + +static u8 TDLS_RSNIE[]={ 0x01, 0x00, //version shall be set to 1 + 0x00, 0x0f, 0xac, 0x07, //group sipher suite + 0x01, 0x00, //pairwise cipher suite count + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only + 0x01, 0x00, //AKM suite count + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake + 0x00, 0x02, + //PMKID shall not be present + }; + +static u8 TDLS_WMMIE[]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero + +static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) + +// SRC: Supported Regulatory Classes +static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 }; + +void rtw_reset_tdls_info(_adapter* padapter); +int rtw_init_tdls_info(_adapter* padapter); +void rtw_free_tdls_info(struct tdls_info *ptdlsinfo); +void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode); +void init_TPK_timer(_adapter *padapter, struct sta_info *psta); +void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta); +void init_base_ch_timer(_adapter *padapter, struct sta_info *psta); +void init_off_ch_timer(_adapter *padapter, struct sta_info *psta); +void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta); +void init_handshake_timer(_adapter *padapter, struct sta_info *psta); +void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta); +#ifdef CONFIG_WFD +void issue_tunneled_probe_req(_adapter *padapter); +void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame); +#endif //CONFIG_WFD +void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr); +void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr); +void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame); +void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame); +void issue_tdls_dis_rsp(_adapter * padapter, union recv_frame * precv_frame, u8 dialog); +void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr); +void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta); +void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr); +void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr); +sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame); +sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame); +void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog); +void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); + +int update_sgi_tdls(_adapter *padapter, struct sta_info *psta); +u32 update_mask_tdls(_adapter *padapter, struct sta_info *psta); +#endif //CONFIG_TDLS + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/rtw_version.h b/drivers/net/wireless/rtl8723as/include/rtw_version.h index c947733a3e3e..de07ed041ffd 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_version.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_version.h @@ -1 +1 @@ -#define DRIVERVERSION "v4.1.6_7336.20130426" +#define DRIVERVERSION "v4.1.8_9180.20130927_BTCOEX20130528_ver3.3_beta" diff --git a/drivers/net/wireless/rtl8723as/include/rtw_wapi.h b/drivers/net/wireless/rtl8723as/include/rtw_wapi.h index 2d583b587c60..f72c666dd226 100755 --- a/drivers/net/wireless/rtl8723as/include/rtw_wapi.h +++ b/drivers/net/wireless/rtl8723as/include/rtw_wapi.h @@ -1,229 +1,229 @@ -#ifndef __INC_WAPI_H -#define __INC_WAPI_H - -#include -#include -#include -#include -#include -#include -//#include "rtl819x_Qos.h" - -#define CONFIG_WAPI_SW_SMS4 -#define WAPI_DEBUG - -#define SMS4_MIC_LEN 16 -#define WAPI_EXT_LEN 18 -#define MAX_WAPI_IE_LEN 256 -#define sMacHdrLng 24 // octets in data header, no WEP - -#ifdef WAPI_DEBUG - -/* WAPI trace debug */ -extern u32 wapi_debug_component; - -static inline void dump_buf(u8 *buf, u32 len) -{ - u32 i; - printk("-----------------Len %d----------------\n", len); - for(i=0; i +#include +#include +#include +#include +#include +//#include "rtl819x_Qos.h" + +#define CONFIG_WAPI_SW_SMS4 +#define WAPI_DEBUG + +#define SMS4_MIC_LEN 16 +#define WAPI_EXT_LEN 18 +#define MAX_WAPI_IE_LEN 256 +#define sMacHdrLng 24 // octets in data header, no WEP + +#ifdef WAPI_DEBUG + +/* WAPI trace debug */ +extern u32 wapi_debug_component; + +static inline void dump_buf(u8 *buf, u32 len) +{ + u32 i; + printk("-----------------Len %d----------------\n", len); + for(i=0; iattrib) extern s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe); +#ifdef CONFIG_IEEE80211W +extern s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe); +#endif //CONFIG_IEEE80211W #ifdef CONFIG_TDLS s32 rtw_xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, u8 action); #endif diff --git a/drivers/net/wireless/rtl8723as/include/sdio_ops_ce.h b/drivers/net/wireless/rtl8723as/include/sdio_ops_ce.h index 6dfc774188ee..d2da29331f28 100755 --- a/drivers/net/wireless/rtl8723as/include/sdio_ops_ce.h +++ b/drivers/net/wireless/rtl8723as/include/sdio_ops_ce.h @@ -16,40 +16,40 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * - ******************************************************************************/ -#ifndef _SDIO_OPS_WINCE_H_ -#define _SDIO_OPS_WINCE_H_ - -#include -#include -#include -#include - - -#ifdef PLATFORM_OS_CE - - -extern u8 sdbus_cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); - - -extern void sdbus_cmd52w_ce(struct intf_priv *pintfpriv, u32 addr,u8 val8); - - -uint sdbus_read_blocks_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - -extern uint sdbus_read_bytes_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - - -extern uint sdbus_write_blocks_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); - -extern uint sdbus_write_bytes_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -extern u8 sdbus_func1cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); -extern void sdbus_func1cmd52w_ce(struct intf_priv *pintfpriv, u32 addr, u8 val8); -extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); -extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); -extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); - -#endif - -#endif - + ******************************************************************************/ +#ifndef _SDIO_OPS_WINCE_H_ +#define _SDIO_OPS_WINCE_H_ + +#include +#include +#include +#include + + +#ifdef PLATFORM_OS_CE + + +extern u8 sdbus_cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); + + +extern void sdbus_cmd52w_ce(struct intf_priv *pintfpriv, u32 addr,u8 val8); + + +uint sdbus_read_blocks_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + +extern uint sdbus_read_bytes_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + +extern uint sdbus_write_blocks_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); + +extern uint sdbus_write_bytes_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); +extern u8 sdbus_func1cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); +extern void sdbus_func1cmd52w_ce(struct intf_priv *pintfpriv, u32 addr, u8 val8); +extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); + +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8723as/include/sdio_ops_linux.h b/drivers/net/wireless/rtl8723as/include/sdio_ops_linux.h index e6ebd38c6578..008c5bf0cabc 100755 --- a/drivers/net/wireless/rtl8723as/include/sdio_ops_linux.h +++ b/drivers/net/wireless/rtl8723as/include/sdio_ops_linux.h @@ -20,7 +20,33 @@ #ifndef __SDIO_OPS_LINUX_H__ #define __SDIO_OPS_LINUX_H__ -void rtw_sdio_set_irq_thd(struct dvobj_priv *dvobj, _thread_hdl_ thd_hdl); +#define SDIO_ERR_VAL8 0xEA +#define SDIO_ERR_VAL16 0xEAEA +#define SDIO_ERR_VAL32 0xEAEAEAEA + +u8 sd_f0_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err); +void sd_f0_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err); + +s32 _sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata); +s32 _sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata); +s32 sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata); +s32 sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata); +u8 _sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err); +u8 sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err); +u16 sd_read16(struct intf_hdl *pintfhdl, u32 addr, s32 *err); +u32 _sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err); +u32 sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err); +s32 _sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata); +s32 sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata); +void sd_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err); +void sd_write16(struct intf_hdl *pintfhdl, u32 addr, u16 v, s32 *err); +void _sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err); +void sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err); +s32 _sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata); +s32 sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata); + + +void rtw_sdio_set_irq_thd(struct dvobj_priv *dvobj, _thread_hdl_ thd_hdl); #endif diff --git a/drivers/net/wireless/rtl8723as/include/sta_info.h b/drivers/net/wireless/rtl8723as/include/sta_info.h index c0de35e4d103..5f2fca33b4f6 100755 --- a/drivers/net/wireless/rtl8723as/include/sta_info.h +++ b/drivers/net/wireless/rtl8723as/include/sta_info.h @@ -120,6 +120,9 @@ struct sta_info { union Keytype dot11tkiprxmickey; union Keytype dot118021x_UncstKey; union pn48 dot11txpn; // PN48 used for Unicast xmit. +#ifdef CONFIG_IEEE80211W + union pn48 dot11wtxpn; // PN48 used for Unicast mgmt xmit. +#endif //CONFIG_IEEE80211W union pn48 dot11rxpn; // PN48 used for Unicast recv. @@ -261,10 +264,22 @@ struct sta_info { u32 assoc_req_len; #endif +#ifdef DBG_TRX_STA_PKTS + //per AC dbg irp cnts + int rx_be_cnt; + int rx_bk_cnt; + int rx_vi_cnt; + int rx_vo_cnt; + //per AC dbg irp cnts + int tx_be_cnt; + int tx_bk_cnt; + int tx_vi_cnt; + int tx_vo_cnt; +#endif //for DM RSSI_STA rssi_stat; - // + //ODM_STA_INFO_T // ================ODM Relative Info======================= // Please be care, dont declare too much structure here. It will cost memory * STA support num. // @@ -274,15 +289,15 @@ struct sta_info { // Driver Write u8 bValid; // record the sta status link or not? //u8 WirelessMode; // - u8 IOTPeer; // Enum value. HT_IOT_PEER_E - u8 rssi_level; //for Refresh RA mask + u8 IOTPeer; // Enum value. HT_IOT_PEER_E // ODM Write //1 PHY_STATUS_INFO u8 RSSI_Path[4]; // u8 RSSI_Ave; u8 RXEVM[4]; u8 RXSNR[4]; - + + u8 rssi_level; //for Refresh RA mask // ODM Write //1 TX_INFO (may changed by IC) //TX_INFO_T pTxInfo; // Define in IC folder. Move lower layer. diff --git a/drivers/net/wireless/rtl8723as/include/usb_ops.h b/drivers/net/wireless/rtl8723as/include/usb_ops.h index d80dba860fe1..bb0a2b6d7699 100755 --- a/drivers/net/wireless/rtl8723as/include/usb_ops.h +++ b/drivers/net/wireless/rtl8723as/include/usb_ops.h @@ -103,32 +103,6 @@ void rtl8188eu_set_intf_ops(struct _io_ops *pops); #define usb_set_intf_ops rtl8188eu_set_intf_ops #endif -/* -* Increase and check if the continual_urb_error of this @param dvobjprive is larger than MAX_CONTINUAL_URB_ERR -* @return _TRUE: -* @return _FALSE: -*/ -static inline int rtw_inc_and_chk_continual_urb_error(struct dvobj_priv *dvobj) -{ - int ret = _FALSE; - int value; - if( (value=ATOMIC_INC_RETURN(&dvobj->continual_urb_error)) > MAX_CONTINUAL_URB_ERR) { - DBG_871X("[dvobj:%p][ERROR] continual_urb_error:%d > %d\n", dvobj, value, MAX_CONTINUAL_URB_ERR); - ret = _TRUE; - } else { - //DBG_871X("[dvobj:%p] continual_urb_error:%d\n", dvobj, value); - } - return ret; -} - -/* -* Set the continual_urb_error of this @param dvobjprive to 0 -*/ -static inline void rtw_reset_continual_urb_error(struct dvobj_priv *dvobj) -{ - ATOMIC_SET(&dvobj->continual_urb_error, 0); -} - #define USB_HIGH_SPEED_BULK_SIZE 512 #define USB_FULL_SPEED_BULK_SIZE 64 diff --git a/drivers/net/wireless/rtl8723as/include/wifi.h b/drivers/net/wireless/rtl8723as/include/wifi.h index ffefdd9aa31d..39f46186b189 100755 --- a/drivers/net/wireless/rtl8723as/include/wifi.h +++ b/drivers/net/wireless/rtl8723as/include/wifi.h @@ -573,7 +573,9 @@ __inline static int IsFrameTypeCtrl(unsigned char *pframe) #define EID_BSSCoexistence 72 // 20/40 BSS Coexistence #define EID_BSSIntolerantChlReport 73 #define _RIC_Descriptor_IE_ 75 - +#ifdef CONFIG_IEEE80211W +#define _MME_IE_ 76 //802.11w Management MIC element +#endif //CONFIG_IEEE80211W #define _LINK_ID_IE_ 101 #define _CH_SWITCH_TIMING_ 104 #define _PTI_BUFFER_STATUS_ 106 @@ -630,7 +632,10 @@ __inline static int IsFrameTypeCtrl(unsigned char *pframe) #define _WEP_104_PRIVACY_ 5 #define _WEP_WPA_MIXED_PRIVACY_ 6 // WEP + WPA */ - + +#ifdef CONFIG_IEEE80211W +#define _MME_IE_LENGTH_ 18 +#endif //CONFIG_IEEE80211W /*----------------------------------------------------------------------------- Below is the definition for WMM ------------------------------------------------------------------------------*/ diff --git a/drivers/net/wireless/rtl8723as/include/xmit_osdep.h b/drivers/net/wireless/rtl8723as/include/xmit_osdep.h index fd8a4b97b197..090a4475f4a9 100755 --- a/drivers/net/wireless/rtl8723as/include/xmit_osdep.h +++ b/drivers/net/wireless/rtl8723as/include/xmit_osdep.h @@ -75,6 +75,7 @@ struct sta_xmit_priv; struct xmit_frame; struct xmit_buf; +extern int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev); extern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev); #endif diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/custom_gpio_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/custom_gpio_linux.c index 4604d006db93..eaf2e14e70c1 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/custom_gpio_linux.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/custom_gpio_linux.c @@ -30,9 +30,30 @@ #if !(defined ANDROID_2X) +#ifdef CONFIG_RTL8188E +#include +#include +#endif // CONFIG_RTL8188E + +#ifndef GPIO_WIFI_POWER +#define GPIO_WIFI_POWER -1 +#endif // !GPIO_WIFI_POWER + +#ifndef GPIO_WIFI_RESET +#define GPIO_WIFI_RESET -1 +#endif // !GPIO_WIFI_RESET + +#ifndef GPIO_WIFI_PWDN +#define GPIO_WIFI_PWDN -1 +#endif // !GPIO_WIFI_RESET #ifdef CONFIG_GSPI_HCI extern unsigned int oob_irq; -#endif //CONFIG_GSPI_HCI +#endif // CONFIG_GSPI_HCI + +#ifdef CONFIG_SDIO_HCI +extern int rtw_mp_mode; +#else // !CONFIG_SDIO_HCI +#endif // !CONFIG_SDIO_HCI int rtw_wifi_gpio_init(void) { @@ -70,15 +91,17 @@ void rtw_wifi_gpio_wlan_ctrl(int onoff) { switch (onoff) { case WLAN_PWDN_OFF: - DBG_8192C("%s: call customer specific GPIO to set wifi power down pin to 0\n", - __FUNCTION__); + DBG_8192C("%s: call customer specific GPIO(%d) to set wifi power down pin to 0\n", + __FUNCTION__, GPIO_WIFI_RESET); + if (GPIO_WIFI_RESET > 0) gpio_direction_output(GPIO_WIFI_RESET , 0); break; case WLAN_PWDN_ON: - DBG_8192C("%s: callc customer specific GPIO to set wifi power down pin to 1\n", - __FUNCTION__); + DBG_8192C("%s: callc customer specific GPIO(%d) to set wifi power down pin to 1\n", + __FUNCTION__, GPIO_WIFI_RESET); + if (GPIO_WIFI_RESET > 0) gpio_direction_output(GPIO_WIFI_RESET , 1); break; diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/gspi_intf.c b/drivers/net/wireless/rtl8723as/os_dep/linux/gspi_intf.c index af5d6a143f76..aa08f2b1e4eb 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/gspi_intf.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/gspi_intf.c @@ -192,7 +192,7 @@ _func_enter_; _rtw_mutex_init(&dvobj->h2c_fwcmd_mutex); _rtw_mutex_init(&dvobj->setch_mutex); _rtw_mutex_init(&dvobj->setbw_mutex); - + dvobj->processing_dev_remove = _FALSE; //spi init /* This is the only SPI value that we need to set here, the rest * comes from the board-peripherals file */ @@ -223,7 +223,7 @@ _func_enter_; DBG_871X("%s: initialize GSPI Failed!\n", __FUNCTION__); goto free_dvobj; } - + rtw_reset_continual_io_error(dvobj); status = _SUCCESS; free_dvobj: @@ -331,7 +331,7 @@ static void gspi_intf_stop(PADAPTER padapter) /* * Do deinit job corresponding to netdev_open() */ -static void rtw_dev_unload(PADAPTER padapter) +void rtw_dev_unload(PADAPTER padapter) { struct net_device *pnetdev = (struct net_device*)padapter->pnetdev; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; @@ -354,7 +354,7 @@ static void rtw_dev_unload(PADAPTER padapter) #endif RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("@ rtw_dev_unload: stop intf complete!\n")); - if (!padapter->pwrctrlpriv.bInternalAutoSuspend) + if (!adapter_to_pwrctl(padapter)->bInternalAutoSuspend) rtw_stop_drv_threads(padapter); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("@ rtw_dev_unload: stop thread complete!\n")); @@ -362,7 +362,7 @@ static void rtw_dev_unload(PADAPTER padapter) if (padapter->bSurpriseRemoved == _FALSE) { #ifdef CONFIG_WOWLAN - if (padapter->pwrctrlpriv.bSupportRemoteWakeup == _TRUE) { + if (adapter_to_pwrctl(padapter)->bSupportRemoteWakeup == _TRUE) { DBG_871X("%s bSupportRemoteWakeup==_TRUE do not run rtw_hal_deinit()\n",__FUNCTION__); } else @@ -528,14 +528,14 @@ static void rtw_gspi_if1_deinit(PADAPTER if1) hostapd_mode_unload(if1); #endif #endif - +/* if(if1->DriverState != DRIVER_DISAPPEAR) { if(pnetdev) { unregister_netdev(pnetdev); //will call netdev_close() rtw_proc_remove_one(pnetdev); } } - +*/ rtw_cancel_all_timer(if1); rtw_dev_unload(if1); @@ -546,7 +546,7 @@ static void rtw_gspi_if1_deinit(PADAPTER if1) #ifdef CONFIG_IOCTL_CFG80211 if (if1->rtw_wdev) { - rtw_wdev_unregister(if1->rtw_wdev); + //rtw_wdev_unregister(if1->rtw_wdev); rtw_wdev_free(if1->rtw_wdev); } #endif @@ -641,7 +641,7 @@ free_dvobj: exit: return status == _SUCCESS?0:-ENODEV; } - +extern void rtw_unregister_netdevs(struct dvobj_priv *dvobj); static int /*__devexit*/ rtw_dev_remove(struct spi_device *spi) { struct dvobj_priv *dvobj = spi_get_drvdata(spi); @@ -651,8 +651,11 @@ _func_enter_; RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+rtw_dev_remove\n")); + dvobj->processing_dev_remove = _TRUE; + rtw_unregister_netdevs(dvobj); + #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) - rtw_unregister_early_suspend(&padapter->pwrctrlpriv); + rtw_unregister_early_suspend(dvobj_to_pwrctl(dvobj)); #endif rtw_pm_set_ips(padapter, IPS_NONE); @@ -683,7 +686,7 @@ static int rtw_gspi_suspend(struct spi_device *spi, pm_message_t mesg) { struct dvobj_priv *dvobj = spi_get_drvdata(spi); PADAPTER padapter = dvobj->if1; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj); struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct net_device *pnetdev = padapter->pnetdev; int ret = 0; @@ -717,7 +720,7 @@ static int rtw_gspi_suspend(struct spi_device *spi, pm_message_t mesg) rtw_netif_stop_queue(pnetdev); } #ifdef CONFIG_WOWLAN - padapter->pwrctrlpriv.bSupportRemoteWakeup=_TRUE; + pwrpriv->bSupportRemoteWakeup=_TRUE; #else //s2. rtw_disassoc_cmd(padapter, 0, _FALSE); @@ -798,7 +801,7 @@ int rtw_resume_process(_adapter *padapter) if (padapter) { pnetdev = padapter->pnetdev; - pwrpriv = &padapter->pwrctrlpriv; + pwrpriv = adapter_to_pwrctl(padapter); } else { ret = -1; goto exit; @@ -858,7 +861,7 @@ static int rtw_gspi_resume(struct spi_device *spi) { struct dvobj_priv *dvobj = spi_get_drvdata(spi); PADAPTER padapter = dvobj->if1; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj); int ret = 0; @@ -923,8 +926,7 @@ static void __exit rtw_drv_halt(void) { RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+rtw_drv_halt\n")); DBG_8192C("RTW: rtw_drv_halt enter\n"); - - rtw_suspend_lock_uninit(); + drvpriv.drv_registered = _FALSE; spi_unregister_driver(&rtw_spi_drv); @@ -933,8 +935,11 @@ static void __exit rtw_drv_halt(void) rtw_wifi_gpio_wlan_ctrl(WLAN_PWDN_OFF); rtw_wifi_gpio_deinit(); + rtw_suspend_lock_uninit(); DBG_8192C("RTW: rtw_drv_halt enter\n"); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("-rtw_drv_halt\n")); + + rtw_mstat_dump(); } module_init(rtw_drv_entry); module_exit(rtw_drv_halt); diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_cfg80211.c b/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_cfg80211.c index cf079c0bc2b1..1e64c2de06a4 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_cfg80211.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_cfg80211.c @@ -1,5466 +1,5651 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _IOCTL_CFG80211_C_ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_IOCTL_CFG80211 - -#include "ioctl_cfg80211.h" - -#define RTW_MAX_MGMT_TX_CNT (8) - -#define RTW_SCAN_IE_LEN_MAX 2304 -#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 65535 //ms -#define RTW_MAX_NUM_PMKIDS 4 - -#define RTW_CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */ - -static const u32 rtw_cipher_suites[] = { - WLAN_CIPHER_SUITE_WEP40, - WLAN_CIPHER_SUITE_WEP104, - WLAN_CIPHER_SUITE_TKIP, - WLAN_CIPHER_SUITE_CCMP, -}; - -#define RATETAB_ENT(_rate, _rateid, _flags) \ - { \ - .bitrate = (_rate), \ - .hw_value = (_rateid), \ - .flags = (_flags), \ - } - -#define CHAN2G(_channel, _freq, _flags) { \ - .band = IEEE80211_BAND_2GHZ, \ - .center_freq = (_freq), \ - .hw_value = (_channel), \ - .flags = (_flags), \ - .max_antenna_gain = 0, \ - .max_power = 30, \ -} - -#define CHAN5G(_channel, _flags) { \ - .band = IEEE80211_BAND_5GHZ, \ - .center_freq = 5000 + (5 * (_channel)), \ - .hw_value = (_channel), \ - .flags = (_flags), \ - .max_antenna_gain = 0, \ - .max_power = 30, \ -} - -static struct ieee80211_rate rtw_rates[] = { - RATETAB_ENT(10, 0x1, 0), - RATETAB_ENT(20, 0x2, 0), - RATETAB_ENT(55, 0x4, 0), - RATETAB_ENT(110, 0x8, 0), - RATETAB_ENT(60, 0x10, 0), - RATETAB_ENT(90, 0x20, 0), - RATETAB_ENT(120, 0x40, 0), - RATETAB_ENT(180, 0x80, 0), - RATETAB_ENT(240, 0x100, 0), - RATETAB_ENT(360, 0x200, 0), - RATETAB_ENT(480, 0x400, 0), - RATETAB_ENT(540, 0x800, 0), -}; - -#define rtw_a_rates (rtw_rates + 4) -#define RTW_A_RATES_NUM 8 -#define rtw_g_rates (rtw_rates + 0) -#define RTW_G_RATES_NUM 12 - -#define RTW_2G_CHANNELS_NUM 14 -#define RTW_5G_CHANNELS_NUM 37 - -static struct ieee80211_channel rtw_2ghz_channels[] = { - CHAN2G(1, 2412, 0), - CHAN2G(2, 2417, 0), - CHAN2G(3, 2422, 0), - CHAN2G(4, 2427, 0), - CHAN2G(5, 2432, 0), - CHAN2G(6, 2437, 0), - CHAN2G(7, 2442, 0), - CHAN2G(8, 2447, 0), - CHAN2G(9, 2452, 0), - CHAN2G(10, 2457, 0), - CHAN2G(11, 2462, 0), - CHAN2G(12, 2467, 0), - CHAN2G(13, 2472, 0), - CHAN2G(14, 2484, 0), -}; - -static struct ieee80211_channel rtw_5ghz_a_channels[] = { - CHAN5G(34, 0), CHAN5G(36, 0), - CHAN5G(38, 0), CHAN5G(40, 0), - CHAN5G(42, 0), CHAN5G(44, 0), - CHAN5G(46, 0), CHAN5G(48, 0), - CHAN5G(52, 0), CHAN5G(56, 0), - CHAN5G(60, 0), CHAN5G(64, 0), - CHAN5G(100, 0), CHAN5G(104, 0), - CHAN5G(108, 0), CHAN5G(112, 0), - CHAN5G(116, 0), CHAN5G(120, 0), - CHAN5G(124, 0), CHAN5G(128, 0), - CHAN5G(132, 0), CHAN5G(136, 0), - CHAN5G(140, 0), CHAN5G(149, 0), - CHAN5G(153, 0), CHAN5G(157, 0), - CHAN5G(161, 0), CHAN5G(165, 0), - CHAN5G(184, 0), CHAN5G(188, 0), - CHAN5G(192, 0), CHAN5G(196, 0), - CHAN5G(200, 0), CHAN5G(204, 0), - CHAN5G(208, 0), CHAN5G(212, 0), - CHAN5G(216, 0), -}; - - -void rtw_2g_channels_init(struct ieee80211_channel *channels) -{ - _rtw_memcpy((void*)channels, (void*)rtw_2ghz_channels, - sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM - ); -} - -void rtw_5g_channels_init(struct ieee80211_channel *channels) -{ - _rtw_memcpy((void*)channels, (void*)rtw_5ghz_a_channels, - sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM - ); -} - -void rtw_2g_rates_init(struct ieee80211_rate *rates) -{ - _rtw_memcpy(rates, rtw_g_rates, - sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM - ); -} - -void rtw_5g_rates_init(struct ieee80211_rate *rates) -{ - _rtw_memcpy(rates, rtw_a_rates, - sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM - ); -} - -struct ieee80211_supported_band *rtw_spt_band_alloc( - enum ieee80211_band band - ) -{ - struct ieee80211_supported_band *spt_band = NULL; - int n_channels, n_bitrates; - - if(band == IEEE80211_BAND_2GHZ) - { - n_channels = RTW_2G_CHANNELS_NUM; - n_bitrates = RTW_G_RATES_NUM; - } - else if(band == IEEE80211_BAND_5GHZ) - { - n_channels = RTW_5G_CHANNELS_NUM; - n_bitrates = RTW_A_RATES_NUM; - } - else - { - goto exit; - } - - spt_band = (struct ieee80211_supported_band *)rtw_zmalloc( - sizeof(struct ieee80211_supported_band) - + sizeof(struct ieee80211_channel)*n_channels - + sizeof(struct ieee80211_rate)*n_bitrates - ); - if(!spt_band) - goto exit; - - spt_band->channels = (struct ieee80211_channel*)(((u8*)spt_band)+sizeof(struct ieee80211_supported_band)); - spt_band->bitrates= (struct ieee80211_rate*)(((u8*)spt_band->channels)+sizeof(struct ieee80211_channel)*n_channels); - spt_band->band = band; - spt_band->n_channels = n_channels; - spt_band->n_bitrates = n_bitrates; - - if(band == IEEE80211_BAND_2GHZ) - { - rtw_2g_channels_init(spt_band->channels); - rtw_2g_rates_init(spt_band->bitrates); - } - else if(band == IEEE80211_BAND_5GHZ) - { - rtw_5g_channels_init(spt_band->channels); - rtw_5g_rates_init(spt_band->bitrates); - } - - //spt_band.ht_cap - -exit: - - return spt_band; -} - -void rtw_spt_band_free(struct ieee80211_supported_band *spt_band) -{ - u32 size; - - if(!spt_band) - return; - - if(spt_band->band == IEEE80211_BAND_2GHZ) - { - size = sizeof(struct ieee80211_supported_band) - + sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM - + sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM; - } - else if(spt_band->band == IEEE80211_BAND_5GHZ) - { - size = sizeof(struct ieee80211_supported_band) - + sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM - + sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM; - } - else - { - - } - rtw_mfree((u8*)spt_band, size); -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) -static const struct ieee80211_txrx_stypes -rtw_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { - [NL80211_IFTYPE_ADHOC] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_STATION] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_AP] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_AP_VLAN] = { - /* copy AP */ - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_P2P_CLIENT] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_P2P_GO] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, -}; -#endif - -static int rtw_ieee80211_channel_to_frequency(int chan, int band) -{ - /* see 802.11 17.3.8.3.2 and Annex J - * there are overlapping channel numbers in 5GHz and 2GHz bands */ - - if (band == IEEE80211_BAND_5GHZ) { - if (chan >= 182 && chan <= 196) - return 4000 + chan * 5; - else - return 5000 + chan * 5; - } else { /* IEEE80211_BAND_2GHZ */ - if (chan == 14) - return 2484; - else if (chan < 14) - return 2407 + chan * 5; - else - return 0; /* not supported */ - } -} - -#define MAX_BSSINFO_LEN 1000 -static int rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork) -{ - int ret=0; - struct ieee80211_channel *notify_channel; - struct cfg80211_bss *bss; - //struct ieee80211_supported_band *band; - u16 channel; - u32 freq; - u64 notify_timestamp; - u16 notify_capability; - u16 notify_interval; - u8 *notify_ie; - size_t notify_ielen; - s32 notify_signal; - u8 buf[MAX_BSSINFO_LEN], *pbuf; - size_t len,bssinf_len=0; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - struct wireless_dev *wdev = padapter->rtw_wdev; - struct wiphy *wiphy = wdev->wiphy; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - - //DBG_8192C("%s\n", __func__); - - bssinf_len = pnetwork->network.IELength+sizeof (struct rtw_ieee80211_hdr_3addr); - if(bssinf_len > MAX_BSSINFO_LEN){ - DBG_871X("%s IE Length too long > %d byte \n",__FUNCTION__,MAX_BSSINFO_LEN); - goto exit; - } - - channel = pnetwork->network.Configuration.DSConfig; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - notify_channel = ieee80211_get_channel(wiphy, freq); - - //rtw_get_timestampe_from_ie() - notify_timestamp = jiffies_to_msecs(jiffies)*1000; /* uSec */ - - notify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs)); - notify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs)); - - - notify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_; - notify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_; - - //We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) - if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE && - is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) { - notify_signal = 100*translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm - } else { - notify_signal = 100*translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm - } - -/* - DBG_8192C("bssid: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n", - pnetwork->network.MacAddress[0], pnetwork->network.MacAddress[1], pnetwork->network.MacAddress[2], - pnetwork->network.MacAddress[3], pnetwork->network.MacAddress[4], pnetwork->network.MacAddress[5]); - DBG_8192C("Channel: %d(%d)\n", channel, freq); - DBG_8192C("Capability: %X\n", notify_capability); - DBG_8192C("Beacon interval: %d\n", notify_interval); - DBG_8192C("Signal: %d\n", notify_signal); - DBG_8192C("notify_timestamp: %#018llx\n", notify_timestamp); -*/ - - pbuf = buf; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pbuf; - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); - //pmlmeext->mgnt_seq++; - - if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - SetFrameSubType(pbuf, WIFI_BEACON); - } else { - _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); - SetFrameSubType(pbuf, WIFI_PROBERSP); - } - - _rtw_memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN); - - - pbuf += sizeof(struct rtw_ieee80211_hdr_3addr); - len = sizeof (struct rtw_ieee80211_hdr_3addr); - - _rtw_memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength); - len += pnetwork->network.IELength; - - //#ifdef CONFIG_P2P - //if(rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL)) - //{ - // DBG_8192C("%s, got p2p_ie\n", __func__); - //} - //#endif - - -#if 1 - bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)buf, - len, notify_signal, GFP_ATOMIC); -#else - - bss = cfg80211_inform_bss(wiphy, notify_channel, (const u8 *)pnetwork->network.MacAddress, - notify_timestamp, notify_capability, notify_interval, notify_ie, - notify_ielen, notify_signal, GFP_ATOMIC/*GFP_KERNEL*/); -#endif - - if (unlikely(!bss)) { - DBG_8192C("rtw_cfg80211_inform_bss error\n"); - return -EINVAL; - } - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) -#ifndef COMPAT_KERNEL_RELEASE - //patch for cfg80211, update beacon ies to information_elements - if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON - - if(bss->len_information_elements != bss->len_beacon_ies) - { - bss->information_elements = bss->beacon_ies; - bss->len_information_elements = bss->len_beacon_ies; - } - } -#endif //COMPAT_KERNEL_RELEASE -#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38) - -/* - { - if( bss->information_elements == bss->proberesp_ies) - { - if( bss->len_information_elements != bss->len_proberesp_ies) - { - DBG_8192C("error!, len_information_elements != bss->len_proberesp_ies\n"); - } - - } - else if(bss->len_information_elements < bss->len_beacon_ies) - { - bss->information_elements = bss->beacon_ies; - bss->len_information_elements = bss->len_beacon_ies; - } - } -*/ - - cfg80211_put_bss(bss); - -exit: - return ret; - -} - -void rtw_cfg80211_indicate_connect(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &(pmlmepriv->cur_network); - struct wireless_dev *pwdev = padapter->rtw_wdev; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif - - - DBG_8192C("%s(padapter=%p)\n", __func__, padapter); - - if (pwdev->iftype != NL80211_IFTYPE_STATION - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT - #endif - ) { - return; - } - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - return; - -#ifdef CONFIG_P2P - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); - rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); - DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } -#endif //CONFIG_P2P - - #ifdef CONFIG_LAYER2_ROAMING - if (rtw_to_roaming(padapter) > 0) { - #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) - struct wiphy *wiphy = pwdev->wiphy; - struct ieee80211_channel *notify_channel; - u32 freq; - u16 channel = cur_network->network.Configuration.DSConfig; - - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - notify_channel = ieee80211_get_channel(wiphy, freq); - #endif - - DBG_871X("%s call cfg80211_roamed\n", __FUNCTION__); - cfg80211_roamed(padapter->pnetdev - #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) - , notify_channel - #endif - , cur_network->network.MacAddress - , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2 - , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2 - , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6 - , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6 - , GFP_ATOMIC); - } - else - #endif - { - DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state); - cfg80211_connect_result(padapter->pnetdev, cur_network->network.MacAddress - , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2 - , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2 - , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6 - , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6 - , WLAN_STATUS_SUCCESS, GFP_ATOMIC); - DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state); - } -} - -void rtw_cfg80211_indicate_disconnect(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wireless_dev *pwdev = padapter->rtw_wdev; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif - - DBG_8192C("%s(padapter=%p)\n", __func__, padapter); - - if (pwdev->iftype != NL80211_IFTYPE_STATION - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT - #endif - ) { - return; - } - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - return; - -#ifdef CONFIG_P2P - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - - DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } -#endif //CONFIG_P2P - - if (!padapter->mlmepriv.not_indic_disco) { - DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state); - - if(pwdev->sme_state==CFG80211_SME_CONNECTING) - cfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0, - WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC/*GFP_KERNEL*/); - else if(pwdev->sme_state==CFG80211_SME_CONNECTED) - cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC); - //else - //DBG_8192C("pwdev->sme_state=%d\n", pwdev->sme_state); - - DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state); - } -} - - -#ifdef CONFIG_AP_MODE -static u8 set_pairwise_key(_adapter *padapter, struct sta_info *psta) -{ - struct cmd_obj* ph2c; - struct set_stakey_parm *psetstakey_para; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if ( ph2c == NULL){ - res= _FAIL; - goto exit; - } - - psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); - if(psetstakey_para==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res=_FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); - - - psetstakey_para->algorithm = (u8)psta->dot118021XPrivacy; - - _rtw_memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN); - - _rtw_memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16); - - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - - return res; - -} - -static int set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid) -{ - u8 keylen; - struct cmd_obj* pcmd; - struct setkey_parm *psetkeyparm; - struct cmd_priv *pcmdpriv=&(padapter->cmdpriv); - int res=_SUCCESS; - - DBG_8192C("%s\n", __FUNCTION__); - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res= _FAIL; - goto exit; - } - psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); - if(psetkeyparm==NULL){ - rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); - - psetkeyparm->keyid=(u8)keyid; - if (is_wep_enc(alg)) - padapter->mlmepriv.key_mask |= BIT(psetkeyparm->keyid); - - psetkeyparm->algorithm = alg; - - psetkeyparm->set_tx = 1; - - switch(alg) - { - case _WEP40_: - keylen = 5; - break; - case _WEP104_: - keylen = 13; - break; - case _TKIP_: - case _TKIP_WTMIC_: - case _AES_: - keylen = 16; - default: - keylen = 16; - } - - _rtw_memcpy(&(psetkeyparm->key[0]), key, keylen); - - pcmd->cmdcode = _SetKey_CMD_; - pcmd->parmbuf = (u8 *)psetkeyparm; - pcmd->cmdsz = (sizeof(struct setkey_parm)); - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - - _rtw_init_listhead(&pcmd->list); - - res = rtw_enqueue_cmd(pcmdpriv, pcmd); - -exit: - - return res; - - -} - -static int set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid) -{ - u8 alg; - - switch(keylen) - { - case 5: - alg =_WEP40_; - break; - case 13: - alg =_WEP104_; - break; - default: - alg =_NO_PRIVACY_; - } - - return set_group_key(padapter, key, alg, keyid); - -} - -static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) -{ - int ret = 0; - u32 wep_key_idx, wep_key_len,wep_total_len; - struct sta_info *psta = NULL, *pbcmc_sta = NULL; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - struct sta_priv *pstapriv = &padapter->stapriv; - - DBG_8192C("%s\n", __FUNCTION__); - - param->u.crypt.err = 0; - param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; - - //sizeof(struct ieee_param) = 64 bytes; - //if (param_len != (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) - if (param_len != sizeof(struct ieee_param) + param->u.crypt.key_len) - { - ret = -EINVAL; - goto exit; - } - - if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && - param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && - param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) - { - if (param->u.crypt.idx >= WEP_KEYS) - { - ret = -EINVAL; - goto exit; - } - } - else - { - psta = rtw_get_stainfo(pstapriv, param->sta_addr); - if(!psta) - { - //ret = -EINVAL; - DBG_8192C("rtw_set_encryption(), sta has already been removed or never been added\n"); - goto exit; - } - } - - if (strcmp(param->u.crypt.alg, "none") == 0 && (psta==NULL)) - { - //todo:clear default encryption keys - - DBG_8192C("clear default encryption keys, keyid=%d\n", param->u.crypt.idx); - - goto exit; - } - - - if (strcmp(param->u.crypt.alg, "WEP") == 0 && (psta==NULL)) - { - DBG_8192C("r871x_set_encryption, crypt.alg = WEP\n"); - - wep_key_idx = param->u.crypt.idx; - wep_key_len = param->u.crypt.key_len; - - DBG_8192C("r871x_set_encryption, wep_key_idx=%d, len=%d\n", wep_key_idx, wep_key_len); - - if((wep_key_idx >= WEP_KEYS) || (wep_key_len<=0)) - { - ret = -EINVAL; - goto exit; - } - - if (wep_key_len > 0) - { - wep_key_len = wep_key_len <= 5 ? 5 : 13; - } - - if (psecuritypriv->bWepDefaultKeyIdxSet == 0) - { - //wep default key has not been set, so use this key index as default key. - - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - psecuritypriv->dot11PrivacyAlgrthm=_WEP40_; - psecuritypriv->dot118021XGrpPrivacy=_WEP40_; - - if(wep_key_len == 13) - { - psecuritypriv->dot11PrivacyAlgrthm=_WEP104_; - psecuritypriv->dot118021XGrpPrivacy=_WEP104_; - } - - psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; - } - - _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); - - psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; - - set_wep_key(padapter, param->u.crypt.key, wep_key_len, wep_key_idx); - - goto exit; - - } - - - if(!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) // //group key - { - if(param->u.crypt.set_tx == 0) //group key - { - if(strcmp(param->u.crypt.alg, "WEP") == 0) - { - DBG_8192C("%s, set group_key, WEP\n", __FUNCTION__); - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - if(param->u.crypt.key_len==13) - { - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - - } - else if(strcmp(param->u.crypt.alg, "TKIP") == 0) - { - DBG_8192C("%s, set group_key, TKIP\n", __FUNCTION__); - - psecuritypriv->dot118021XGrpPrivacy = _TKIP_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); - //set mic key - _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); - - psecuritypriv->busetkipkey = _TRUE; - - } - else if(strcmp(param->u.crypt.alg, "CCMP") == 0) - { - DBG_8192C("%s, set group_key, CCMP\n", __FUNCTION__); - - psecuritypriv->dot118021XGrpPrivacy = _AES_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - } - else - { - DBG_8192C("%s, set group_key, none\n", __FUNCTION__); - - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; - } - - psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; - - psecuritypriv->binstallGrpkey = _TRUE; - - psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!! - - set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); - - pbcmc_sta=rtw_get_bcmc_stainfo(padapter); - if(pbcmc_sta) - { - pbcmc_sta->ieee8021x_blocked = _FALSE; - pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy - } - - } - - goto exit; - - } - - if(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) // psk/802_1x - { - if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) - { - if(param->u.crypt.set_tx ==1) //pairwise key - { - _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - if(strcmp(param->u.crypt.alg, "WEP") == 0) - { - DBG_8192C("%s, set pairwise key, WEP\n", __FUNCTION__); - - psta->dot118021XPrivacy = _WEP40_; - if(param->u.crypt.key_len==13) - { - psta->dot118021XPrivacy = _WEP104_; - } - } - else if(strcmp(param->u.crypt.alg, "TKIP") == 0) - { - DBG_8192C("%s, set pairwise key, TKIP\n", __FUNCTION__); - - psta->dot118021XPrivacy = _TKIP_; - - //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); - //set mic key - _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); - - psecuritypriv->busetkipkey = _TRUE; - - } - else if(strcmp(param->u.crypt.alg, "CCMP") == 0) - { - - DBG_8192C("%s, set pairwise key, CCMP\n", __FUNCTION__); - - psta->dot118021XPrivacy = _AES_; - } - else - { - DBG_8192C("%s, set pairwise key, none\n", __FUNCTION__); - - psta->dot118021XPrivacy = _NO_PRIVACY_; - } - - set_pairwise_key(padapter, psta); - - psta->ieee8021x_blocked = _FALSE; - - psta->bpairwise_key_installed = _TRUE; - - } - else//group key??? - { - if(strcmp(param->u.crypt.alg, "WEP") == 0) - { - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - if(param->u.crypt.key_len==13) - { - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - } - else if(strcmp(param->u.crypt.alg, "TKIP") == 0) - { - psecuritypriv->dot118021XGrpPrivacy = _TKIP_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); - //set mic key - _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); - - psecuritypriv->busetkipkey = _TRUE; - - } - else if(strcmp(param->u.crypt.alg, "CCMP") == 0) - { - psecuritypriv->dot118021XGrpPrivacy = _AES_; - - _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - } - else - { - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; - } - - psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; - - psecuritypriv->binstallGrpkey = _TRUE; - - psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!! - - set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); - - pbcmc_sta=rtw_get_bcmc_stainfo(padapter); - if(pbcmc_sta) - { - pbcmc_sta->ieee8021x_blocked = _FALSE; - pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy - } - - } - - } - - } - -exit: - - return ret; - -} -#endif - -static int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) -{ - int ret = 0; - u32 wep_key_idx, wep_key_len,wep_total_len; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; -#ifdef CONFIG_P2P - struct wifidirect_info* pwdinfo = &padapter->wdinfo; -#endif //CONFIG_P2P - -_func_enter_; - - DBG_8192C("%s\n", __func__); - - param->u.crypt.err = 0; - param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; - - if (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) - { - ret = -EINVAL; - goto exit; - } - - if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && - param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && - param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) - { - if (param->u.crypt.idx >= WEP_KEYS) - { - ret = -EINVAL; - goto exit; - } - } else { -#ifdef CONFIG_WAPI_SUPPORT - if (strcmp(param->u.crypt.alg, "SMS4")) -#endif - { - ret = -EINVAL; - goto exit; - } - } - - if (strcmp(param->u.crypt.alg, "WEP") == 0) - { - RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("wpa_set_encryption, crypt.alg = WEP\n")); - DBG_8192C("wpa_set_encryption, crypt.alg = WEP\n"); - - wep_key_idx = param->u.crypt.idx; - wep_key_len = param->u.crypt.key_len; - - if ((wep_key_idx > WEP_KEYS) || (wep_key_len <= 0)) - { - ret = -EINVAL; - goto exit; - } - - if (psecuritypriv->bWepDefaultKeyIdxSet == 0) - { - //wep default key has not been set, so use this key index as default key. - - wep_key_len = wep_key_len <= 5 ? 5 : 13; - - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - - if(wep_key_len==13) - { - psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - - psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; - } - - _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); - - psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; - - rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0); - - goto exit; - } - - if(padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) // 802_1x - { - struct sta_info * psta,*pbcmc_sta; - struct sta_priv * pstapriv = &padapter->stapriv; - - //DBG_8192C("%s, : dot11AuthAlgrthm == dot11AuthAlgrthm_8021X \n", __func__); - - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == _TRUE) //sta mode - { - psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); - if (psta == NULL) { - //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); - DBG_8192C("%s, : Obtain Sta_info fail \n", __func__); - } - else - { - //Jeff: don't disable ieee8021x_blocked while clearing key - if (strcmp(param->u.crypt.alg, "none") != 0) - psta->ieee8021x_blocked = _FALSE; - - - if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)|| - (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) - { - psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; - } - - if(param->u.crypt.set_tx ==1)//pairwise key - { - - DBG_8192C("%s, : param->u.crypt.set_tx ==1 \n", __func__); - - _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - - if(strcmp(param->u.crypt.alg, "TKIP") == 0)//set mic key - { - //DEBUG_ERR(("\nset key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); - _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); - _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); - - padapter->securitypriv.busetkipkey=_FALSE; - //_set_timer(&padapter->securitypriv.tkip_timer, 50); - } - - //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len)); - DBG_871X(" ~~~~set sta key:unicastkey\n"); - - rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); - } - else//group key - { - _rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8); - _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8); - padapter->securitypriv.binstallGrpkey = _TRUE; - //DEBUG_ERR((" param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); - DBG_871X(" ~~~~set sta key:groupkey\n"); - - padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; - - rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1); -#ifdef CONFIG_P2P - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) - { - rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE); - } -#endif //CONFIG_P2P - - } - } - - pbcmc_sta=rtw_get_bcmc_stainfo(padapter); - if(pbcmc_sta==NULL) - { - //DEBUG_ERR( ("Set OID_802_11_ADD_KEY: bcmc stainfo is null \n")); - } - else - { - //Jeff: don't disable ieee8021x_blocked while clearing key - if (strcmp(param->u.crypt.alg, "none") != 0) - pbcmc_sta->ieee8021x_blocked = _FALSE; - - if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)|| - (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) - { - pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; - } - } - } - else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) //adhoc mode - { - } - } - -#ifdef CONFIG_WAPI_SUPPORT - if (strcmp(param->u.crypt.alg, "SMS4") == 0) - { - PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; - PRT_WAPI_STA_INFO pWapiSta; - u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; - - if(param->u.crypt.set_tx == 1) - { - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if(_rtw_memcmp(pWapiSta->PeerMacAddr,param->sta_addr,6)) - { - _rtw_memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); - - pWapiSta->wapiUsk.bSet = true; - _rtw_memcpy(pWapiSta->wapiUsk.dataKey,param->u.crypt.key,16); - _rtw_memcpy(pWapiSta->wapiUsk.micKey,param->u.crypt.key+16,16); - pWapiSta->wapiUsk.keyId = param->u.crypt.idx ; - pWapiSta->wapiUsk.bTxEnable = true; - - _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16); - _rtw_memcpy(pWapiSta->lastRxUnicastPN,WapiAEPNInitialValueSrc,16); - pWapiSta->wapiUskUpdate.bTxEnable = false; - pWapiSta->wapiUskUpdate.bSet = false; - - if (psecuritypriv->sw_encrypt== false || psecuritypriv->sw_decrypt == false) - { - //set unicast key for ASUE - rtw_wapi_set_key(padapter, &pWapiSta->wapiUsk, pWapiSta, false, false); - } - } - } - } - else - { - list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { - if(_rtw_memcmp(pWapiSta->PeerMacAddr,get_bssid(pmlmepriv),6)) - { - pWapiSta->wapiMsk.bSet = true; - _rtw_memcpy(pWapiSta->wapiMsk.dataKey,param->u.crypt.key,16); - _rtw_memcpy(pWapiSta->wapiMsk.micKey,param->u.crypt.key+16,16); - pWapiSta->wapiMsk.keyId = param->u.crypt.idx ; - pWapiSta->wapiMsk.bTxEnable = false; - if(!pWapiSta->bSetkeyOk) - pWapiSta->bSetkeyOk = true; - pWapiSta->bAuthenticateInProgress = false; - - _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); - - if (psecuritypriv->sw_decrypt == false) - { - //set rx broadcast key for ASUE - rtw_wapi_set_key(padapter, &pWapiSta->wapiMsk, pWapiSta, true, false); - } - } - - } - } - } -#endif - - -exit: - - DBG_8192C("%s, ret=%d\n", __func__, ret); - - _func_exit_; - - return ret; -} - -static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - u8 key_index, bool pairwise, const u8 *mac_addr, -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - u8 key_index, const u8 *mac_addr, -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - struct key_params *params) -{ - char *alg_name; - u32 param_len; - struct ieee_param *param = NULL; - int ret=0; - struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - DBG_871X(FUNC_NDEV_FMT" adding key for %pM\n", FUNC_NDEV_ARG(ndev), mac_addr); - DBG_871X("cipher=0x%x\n", params->cipher); - DBG_871X("key_len=0x%x\n", params->key_len); - DBG_871X("seq_len=0x%x\n", params->seq_len); - DBG_871X("key_index=%d\n", key_index); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - DBG_871X("pairwise=%d\n", pairwise); -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - - param_len = sizeof(struct ieee_param) + params->key_len; - param = (struct ieee_param *)rtw_malloc(param_len); - if (param == NULL) - return -1; - - _rtw_memset(param, 0, param_len); - - param->cmd = IEEE_CMD_SET_ENCRYPTION; - _rtw_memset(param->sta_addr, 0xff, ETH_ALEN); - - switch (params->cipher) { - case IW_AUTH_CIPHER_NONE: - //todo: remove key - //remove = 1; - alg_name = "none"; - break; - case WLAN_CIPHER_SUITE_WEP40: - case WLAN_CIPHER_SUITE_WEP104: - alg_name = "WEP"; - break; - case WLAN_CIPHER_SUITE_TKIP: - alg_name = "TKIP"; - break; - case WLAN_CIPHER_SUITE_CCMP: - alg_name = "CCMP"; - break; - -#ifdef CONFIG_WAPI_SUPPORT - case WLAN_CIPHER_SUITE_SMS4: - alg_name= "SMS4"; - if(pairwise == NL80211_KEYTYPE_PAIRWISE) { - if (key_index != 0 && key_index != 1) { - ret = -ENOTSUPP; - goto addkey_end; - } - _rtw_memcpy((void*)param->sta_addr, (void*)mac_addr, ETH_ALEN); - } else { - DBG_871X("mac_addr is null \n"); - } - DBG_871X("rtw_wx_set_enc_ext: SMS4 case \n"); - break; -#endif - - default: - ret = -ENOTSUPP; - goto addkey_end; - } - - strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN); - - - if (!mac_addr || is_broadcast_ether_addr(mac_addr)) - { - param->u.crypt.set_tx = 0; //for wpa/wpa2 group key - } else { - param->u.crypt.set_tx = 1; //for wpa/wpa2 pairwise key - } - - - //param->u.crypt.idx = key_index - 1; - param->u.crypt.idx = key_index; - - if (params->seq_len && params->seq) - { - _rtw_memcpy(param->u.crypt.seq, params->seq, params->seq_len); - } - - if(params->key_len && params->key) - { - param->u.crypt.key_len = params->key_len; - _rtw_memcpy(param->u.crypt.key, params->key, params->key_len); - } - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - ret = rtw_cfg80211_set_encryption(ndev, param, param_len); - } - else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { -#ifdef CONFIG_AP_MODE - if(mac_addr) - _rtw_memcpy(param->sta_addr, (void*)mac_addr, ETH_ALEN); - - ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len); -#endif - } - else - { - DBG_8192C("error! fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype); - - } - -addkey_end: - if(param) - { - rtw_mfree((u8*)param, param_len); - } - - return ret; - -} - -static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - u8 key_index, bool pairwise, const u8 *mac_addr, -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - u8 key_index, const u8 *mac_addr, -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - void *cookie, - void (*callback)(void *cookie, - struct key_params*)) -{ -#if 0 - struct iwm_priv *iwm = ndev_to_iwm(ndev); - struct iwm_key *key = &iwm->keys[key_index]; - struct key_params params; - - IWM_DBG_WEXT(iwm, DBG, "Getting key %d\n", key_index); - - memset(¶ms, 0, sizeof(params)); - - params.cipher = key->cipher; - params.key_len = key->key_len; - params.seq_len = key->seq_len; - params.seq = key->seq; - params.key = key->key; - - callback(cookie, ¶ms); - - return key->key_len ? 0 : -ENOENT; -#endif - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - u8 key_index, bool pairwise, const u8 *mac_addr) -#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - u8 key_index, const u8 *mac_addr) -#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_871X(FUNC_NDEV_FMT" key_index=%d\n", FUNC_NDEV_ARG(ndev), key_index); - - if (key_index == psecuritypriv->dot11PrivacyKeyIndex) - { - //clear the flag of wep default key set. - psecuritypriv->bWepDefaultKeyIdxSet = 0; - } - - return 0; -} - -static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, - struct net_device *ndev, u8 key_index - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - , bool unicast, bool multicast - #endif - ) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_871X(FUNC_NDEV_FMT" key_index=%d" - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - ", unicast=%d, multicast=%d" - #endif - ".\n", FUNC_NDEV_ARG(ndev), key_index - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - , unicast, multicast - #endif - ); - - if ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) //set wep default key - { - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - - psecuritypriv->dot11PrivacyKeyIndex = key_index; - - psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - if (psecuritypriv->dot11DefKeylen[key_index] == 13) - { - psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; - } - - psecuritypriv->bWepDefaultKeyIdxSet = 1; //set the flag to represent that wep default key has been set - } - - return 0; - -} - -static int cfg80211_rtw_get_station(struct wiphy *wiphy, - struct net_device *ndev, - u8 *mac, struct station_info *sinfo) -{ - int ret = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - sinfo->filled = 0; - - if (!mac) { - DBG_871X(FUNC_NDEV_FMT" mac==%p\n", FUNC_NDEV_ARG(ndev), mac); - ret = -ENOENT; - goto exit; - } - - psta = rtw_get_stainfo(pstapriv, mac); - if (psta == NULL) { - DBG_8192C("%s, sta_info is null\n", __func__); - ret = -ENOENT; - goto exit; - } - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X(FUNC_NDEV_FMT" mac="MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(mac)); -#endif - - //for infra./P2PClient mode - if( check_fwstate(pmlmepriv, WIFI_STATION_STATE) - && check_fwstate(pmlmepriv, _FW_LINKED) - ) - { - struct wlan_network *cur_network = &(pmlmepriv->cur_network); - - if (_rtw_memcmp(mac, cur_network->network.MacAddress, ETH_ALEN) == _FALSE) { - DBG_871X("%s, mismatch bssid="MAC_FMT"\n", __func__, MAC_ARG(cur_network->network.MacAddress)); - ret = -ENOENT; - goto exit; - } - - sinfo->filled |= STATION_INFO_SIGNAL; - sinfo->signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); - - sinfo->filled |= STATION_INFO_TX_BITRATE; - sinfo->txrate.legacy = rtw_get_cur_max_rate(padapter); - - sinfo->filled |= STATION_INFO_RX_PACKETS; - sinfo->rx_packets = sta_rx_data_pkts(psta); - - sinfo->filled |= STATION_INFO_TX_PACKETS; - sinfo->tx_packets = psta->sta_stats.tx_pkts; - - } - - //for Ad-Hoc/AP mode - if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) - ||check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) - ||check_fwstate(pmlmepriv, WIFI_AP_STATE)) - && check_fwstate(pmlmepriv, _FW_LINKED) - ) - { - //TODO: should acquire station info... - } - -exit: - return ret; -} - -extern int netdev_open(struct net_device *pnetdev); -#ifdef CONFIG_CONCURRENT_MODE -extern int netdev_if2_open(struct net_device *pnetdev); -#endif - -/* -enum nl80211_iftype { - NL80211_IFTYPE_UNSPECIFIED, - NL80211_IFTYPE_ADHOC, //1 - NL80211_IFTYPE_STATION, //2 - NL80211_IFTYPE_AP, //3 - NL80211_IFTYPE_AP_VLAN, - NL80211_IFTYPE_WDS, - NL80211_IFTYPE_MONITOR, //6 - NL80211_IFTYPE_MESH_POINT, - NL80211_IFTYPE_P2P_CLIENT, //8 - NL80211_IFTYPE_P2P_GO, //9 - //keep last - NUM_NL80211_IFTYPES, - NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1 -}; -*/ -static int cfg80211_rtw_change_iface(struct wiphy *wiphy, - struct net_device *ndev, - enum nl80211_iftype type, u32 *flags, - struct vif_params *params) -{ - enum nl80211_iftype old_type; - NDIS_802_11_NETWORK_INFRASTRUCTURE networkType ; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif - int ret = 0; - u8 change = _FALSE; - -#ifdef CONFIG_CONCURRENT_MODE - if(padapter->adapter_type == SECONDARY_ADAPTER) - { - DBG_871X(FUNC_NDEV_FMT" call netdev_if2_open\n", FUNC_NDEV_ARG(ndev)); - if(netdev_if2_open(ndev) != 0) { - ret= -EPERM; - goto exit; - } - } - else if(padapter->adapter_type == PRIMARY_ADAPTER) -#endif //CONFIG_CONCURRENT_MODE - { - DBG_871X(FUNC_NDEV_FMT" call netdev_open\n", FUNC_NDEV_ARG(ndev)); - if(netdev_open(ndev) != 0) { - ret= -EPERM; - goto exit; - } - } - - if(_FAIL == rtw_pwr_wakeup(padapter)) { - ret= -EPERM; - goto exit; - } - - old_type = rtw_wdev->iftype; - DBG_871X(FUNC_NDEV_FMT" old_iftype=%d, new_iftype=%d\n", - FUNC_NDEV_ARG(ndev), old_type, type); - - if(old_type != type) - { - change = _TRUE; - pmlmeext->action_public_rxseq = 0xffff; - pmlmeext->action_public_dialog_token = 0xff; - } - - switch (type) { - case NL80211_IFTYPE_ADHOC: - networkType = Ndis802_11IBSS; - break; -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - case NL80211_IFTYPE_P2P_CLIENT: -#endif - case NL80211_IFTYPE_STATION: - networkType = Ndis802_11Infrastructure; - #ifdef CONFIG_P2P - if(change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - //it means remove GO and change mode from AP(GO) to station(P2P DEVICE) - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - - DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } - #endif //CONFIG_P2P - break; -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - case NL80211_IFTYPE_P2P_GO: -#endif - case NL80211_IFTYPE_AP: - networkType = Ndis802_11APMode; - #ifdef CONFIG_P2P - if(change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - //it means P2P Group created, we will be GO and change mode from P2P DEVICE to AP(GO) - rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - } - #endif //CONFIG_P2P - break; - default: - return -EOPNOTSUPP; - } - - rtw_wdev->iftype = type; - - if (rtw_set_802_11_infrastructure_mode(padapter, networkType) ==_FALSE) - { - rtw_wdev->iftype = old_type; - ret = -EPERM; - goto exit; - } - - rtw_setopmode_cmd(padapter, networkType); - -exit: - - return ret; -} - -void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted) -{ - _irqL irqL; - - _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); - if(pwdev_priv->scan_request != NULL) - { - //struct cfg80211_scan_request *scan_request = pwdev_priv->scan_request; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("%s with scan req\n", __FUNCTION__); - #endif - - //avoid WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req); - //if(scan_request == wiphy_to_dev(scan_request->wiphy)->scan_req) - if(pwdev_priv->scan_request->wiphy != pwdev_priv->rtw_wdev->wiphy) - { - DBG_8192C("error wiphy compare\n"); - } - else - { - cfg80211_scan_done(pwdev_priv->scan_request, aborted); - } - - pwdev_priv->scan_request = NULL; - - } else { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("%s without scan req\n", __FUNCTION__); - #endif - } - _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); -} - -void rtw_cfg80211_surveydone_event_callback(_adapter *padapter) -{ - _irqL irqL; - _list *plist, *phead; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - _queue *queue = &(pmlmepriv->scanned_queue); - struct wlan_network *pnetwork = NULL; - u32 cnt=0; - u32 wait_for_surveydone; - sint wait_status; -#ifdef CONFIG_P2P - struct wifidirect_info* pwdinfo = &padapter->wdinfo; -#endif //CONFIG_P2P - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s\n", __func__); -#endif - - _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - phead = get_list_head(queue); - plist = get_next(phead); - - while(1) - { - if (rtw_end_of_queue_search(phead,plist)== _TRUE) - break; - - pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); - - //report network only if the current channel set contains the channel to which this network belongs - if(rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0 - #ifdef CONFIG_VALIDATE_SSID - && _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid)) - #endif - ) - { - //ev=translate_scan(padapter, a, pnetwork, ev, stop); - rtw_cfg80211_inform_bss(padapter, pnetwork); - } - - plist = get_next(plist); - - } - - _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - //call this after other things have been done - rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev), _FALSE); -} - -static int rtw_cfg80211_set_probe_req_wpsp2pie(_adapter *padapter, char *buf, int len) -{ - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; - u32 p2p_ielen = 0; - u8 *p2p_ie; - u32 wfd_ielen = 0; - u8 *wfd_ie; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ielen=%d\n", __func__, len); -#endif - - if(len>0) - { - if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_req_wps_ielen=%d\n", wps_ielen); - #endif - - if(pmlmepriv->wps_probe_req_ie) - { - u32 free_len = pmlmepriv->wps_probe_req_ie_len; - pmlmepriv->wps_probe_req_ie_len = 0; - rtw_mfree(pmlmepriv->wps_probe_req_ie, free_len); - pmlmepriv->wps_probe_req_ie = NULL; - } - - pmlmepriv->wps_probe_req_ie = rtw_malloc(wps_ielen); - if ( pmlmepriv->wps_probe_req_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen); - pmlmepriv->wps_probe_req_ie_len = wps_ielen; - } - - //buf += wps_ielen; - //len -= wps_ielen; - - #ifdef CONFIG_P2P - if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_req_p2p_ielen=%d\n", p2p_ielen); - #endif - - if(pmlmepriv->p2p_probe_req_ie) - { - u32 free_len = pmlmepriv->p2p_probe_req_ie_len; - pmlmepriv->p2p_probe_req_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_probe_req_ie, free_len); - pmlmepriv->p2p_probe_req_ie = NULL; - } - - pmlmepriv->p2p_probe_req_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_probe_req_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_probe_req_ie_len = p2p_ielen; - } - #endif //CONFIG_P2P - - //buf += p2p_ielen; - //len -= p2p_ielen; - - #ifdef CONFIG_WFD - if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_req_wfd_ielen=%d\n", wfd_ielen); - #endif - - if(pmlmepriv->wfd_probe_req_ie) - { - u32 free_len = pmlmepriv->wfd_probe_req_ie_len; - pmlmepriv->wfd_probe_req_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_probe_req_ie, free_len); - pmlmepriv->wfd_probe_req_ie = NULL; - } - - pmlmepriv->wfd_probe_req_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_probe_req_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len); - } - #endif //CONFIG_WFD - - } - - return ret; - -} - -static int cfg80211_rtw_scan(struct wiphy *wiphy - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) - , struct net_device *ndev - #endif - , struct cfg80211_scan_request *request) -{ - int i; - u8 _status = _FALSE; - int ret = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv= &padapter->mlmepriv; - NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT]; - struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT]; - _irqL irqL; - u8 *wps_ie=NULL; - uint wps_ielen=0; - u8 *p2p_ie=NULL; - uint p2p_ielen=0; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif //CONFIG_P2P - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct cfg80211_ssid *ssids = request->ssids; - int social_channel = 0, j = 0; - bool need_indicate_scan_done = _FALSE; -#ifdef CONFIG_CONCURRENT_MODE - PADAPTER pbuddy_adapter = NULL; - struct mlme_priv *pbuddy_mlmepriv = NULL; -#endif //CONFIG_CONCURRENT_MODE - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); -#endif - -#ifdef CONFIG_CONCURRENT_MODE - if(rtw_buddy_adapter_up(padapter)) - { - pbuddy_adapter = padapter->pbuddy_adapter; - pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); - } -#endif //CONFIG_CONCURRENT_MODE - -#ifdef CONFIG_MP_INCLUDED -if (padapter->registrypriv.mp_mode == 1) -{ - if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) - { - ret = -EPERM; - goto exit; - } -} -#endif - - _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); - pwdev_priv->scan_request = request; - _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X("%s under WIFI_AP_STATE\n", __FUNCTION__); -#endif - //need_indicate_scan_done = _TRUE; - //goto check_need_indicate_scan_done; - } - - if(_FAIL == rtw_pwr_wakeup(padapter)) { - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } - - #ifdef CONFIG_P2P - if(ssids->ssid != NULL - && _rtw_memcmp(ssids->ssid, "DIRECT-", 7) - && rtw_get_p2p_ie((u8 *)request->ie, request->ie_len, NULL, NULL) - ) - { - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE; - } - else - { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); - #endif - } - rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - - if(request->n_channels == 3 && - request->channels[0]->hw_value == 1 && - request->channels[1]->hw_value == 6 && - request->channels[2]->hw_value == 11 - ) - { - social_channel = 1; - } - } - #endif //CONFIG_P2P - - if(request->ie && request->ie_len>0) - { - rtw_cfg80211_set_probe_req_wpsp2pie(padapter, (u8 *)request->ie, request->ie_len ); - } - - if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE) - { - DBG_8192C("%s, bBusyTraffic == _TRUE\n", __func__); - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } - if (rtw_is_scan_deny(padapter)){ - DBG_871X(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter)); - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } - -#ifdef CONFIG_CONCURRENT_MODE - if(pbuddy_mlmepriv && (pbuddy_mlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)) - { - DBG_8192C("%s, bBusyTraffic == _TRUE at buddy_intf\n", __func__); - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } -#endif //CONFIG_CONCURRENT_MODE - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) - { - DBG_8192C("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state); - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } - -#ifdef CONFIG_CONCURRENT_MODE - if (check_buddy_fwstate(padapter, - _FW_UNDER_SURVEY|_FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE) - { - if(check_buddy_fwstate(padapter, _FW_UNDER_SURVEY)) - { - DBG_8192C("scanning_via_buddy_intf\n"); - pmlmepriv->scanning_via_buddy_intf = _TRUE; - } - - DBG_8192C("buddy_intf's mlme state:0x%x\n", pbuddy_mlmepriv->fw_state); - - need_indicate_scan_done = _TRUE; - goto check_need_indicate_scan_done; - } -#endif - - -#ifdef CONFIG_P2P - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) - { - rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); - rtw_free_network_queue(padapter, _TRUE); - - if(social_channel == 0) - rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); - else - rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST); - } -#endif //CONFIG_P2P - - - _rtw_memset(ssid, 0, sizeof(NDIS_802_11_SSID)*RTW_SSID_SCAN_AMOUNT); - //parsing request ssids, n_ssids - for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("ssid=%s, len=%d\n", ssids[i].ssid, ssids[i].ssid_len); - #endif - _rtw_memcpy(ssid[i].Ssid, ssids[i].ssid, ssids[i].ssid_len); - ssid[i].SsidLength = ssids[i].ssid_len; - } - - - /* parsing channels, n_channels */ - _rtw_memset(ch, 0, sizeof(struct rtw_ieee80211_channel)*RTW_CHANNEL_SCAN_AMOUNT); - if (request->n_channels == 1) - for (i=0;in_channels && ichannels[i])); - #endif - ch[i].hw_value = request->channels[i]->hw_value; - ch[i].flags = request->channels[i]->flags; - } - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - if (request->n_channels == 1) { - _rtw_memcpy(&ch[1], &ch[0], sizeof(struct rtw_ieee80211_channel)); - _rtw_memcpy(&ch[2], &ch[0], sizeof(struct rtw_ieee80211_channel)); - _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, 3); - } else { - _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, NULL, 0); - } - _exit_critical_bh(&pmlmepriv->lock, &irqL); - - - if(_status == _FALSE) - { - ret = -1; - } - -check_need_indicate_scan_done: - if(need_indicate_scan_done) - rtw_cfg80211_surveydone_event_callback(padapter); - -exit: - - return ret; - -} - -static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed) -{ -#if 0 - struct iwm_priv *iwm = wiphy_to_iwm(wiphy); - - if (changed & WIPHY_PARAM_RTS_THRESHOLD && - (iwm->conf.rts_threshold != wiphy->rts_threshold)) { - int ret; - - iwm->conf.rts_threshold = wiphy->rts_threshold; - - ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, - CFG_RTS_THRESHOLD, - iwm->conf.rts_threshold); - if (ret < 0) - return ret; - } - - if (changed & WIPHY_PARAM_FRAG_THRESHOLD && - (iwm->conf.frag_threshold != wiphy->frag_threshold)) { - int ret; - - iwm->conf.frag_threshold = wiphy->frag_threshold; - - ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_FA_CFG_FIX, - CFG_FRAG_THRESHOLD, - iwm->conf.frag_threshold); - if (ret < 0) - return ret; - } -#endif - DBG_8192C("%s\n", __func__); - return 0; -} - -static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_ibss_params *params) -{ -#if 0 - struct iwm_priv *iwm = wiphy_to_iwm(wiphy); - struct ieee80211_channel *chan = params->channel; - - if (!test_bit(IWM_STATUS_READY, &iwm->status)) - return -EIO; - - /* UMAC doesn't support creating or joining an IBSS network - * with specified bssid. */ - if (params->bssid) - return -EOPNOTSUPP; - - iwm->channel = ieee80211_frequency_to_channel(chan->center_freq); - iwm->umac_profile->ibss.band = chan->band; - iwm->umac_profile->ibss.channel = iwm->channel; - iwm->umac_profile->ssid.ssid_len = params->ssid_len; - memcpy(iwm->umac_profile->ssid.ssid, params->ssid, params->ssid_len); - - return iwm_send_mlme_profile(iwm); -#endif - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev) -{ -#if 0 - struct iwm_priv *iwm = wiphy_to_iwm(wiphy); - - if (iwm->umac_profile_active) - return iwm_invalidate_mlme_profile(iwm); -#endif - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -static int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv, u32 wpa_version) -{ - DBG_8192C("%s, wpa_version=%d\n", __func__, wpa_version); - - if (!wpa_version) { - psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; - return 0; - } - - - if (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2)) - { - psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK; - } - -/* - if (wpa_version & NL80211_WPA_VERSION_2) - { - psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; - } -*/ - - return 0; - -} - -static int rtw_cfg80211_set_auth_type(struct security_priv *psecuritypriv, - enum nl80211_auth_type sme_auth_type) -{ - DBG_8192C("%s, nl80211_auth_type=%d\n", __func__, sme_auth_type); - - - switch (sme_auth_type) { - case NL80211_AUTHTYPE_AUTOMATIC: - - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; - - break; - case NL80211_AUTHTYPE_OPEN_SYSTEM: - - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - - if(psecuritypriv->ndisauthtype>Ndis802_11AuthModeWPA) - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - -#ifdef CONFIG_WAPI_SUPPORT - if(psecuritypriv->ndisauthtype == Ndis802_11AuthModeWAPI) - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; -#endif - - break; - case NL80211_AUTHTYPE_SHARED_KEY: - - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Shared; - - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - - - break; - default: - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - //return -ENOTSUPP; - } - - return 0; - -} - -static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv, u32 cipher, bool ucast) -{ - u32 ndisencryptstatus = Ndis802_11EncryptionDisabled; - - u32 *profile_cipher = ucast ? &psecuritypriv->dot11PrivacyAlgrthm : - &psecuritypriv->dot118021XGrpPrivacy; - - DBG_8192C("%s, ucast=%d, cipher=0x%x\n", __func__, ucast, cipher); - - - if (!cipher) { - *profile_cipher = _NO_PRIVACY_; - psecuritypriv->ndisencryptstatus = ndisencryptstatus; - return 0; - } - - switch (cipher) { - case IW_AUTH_CIPHER_NONE: - *profile_cipher = _NO_PRIVACY_; - ndisencryptstatus = Ndis802_11EncryptionDisabled; -#ifdef CONFIG_WAPI_SUPPORT - if(psecuritypriv->dot11PrivacyAlgrthm ==_SMS4_ ) - { - *profile_cipher = _SMS4_; - } -#endif - break; - case WLAN_CIPHER_SUITE_WEP40: - *profile_cipher = _WEP40_; - ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WLAN_CIPHER_SUITE_WEP104: - *profile_cipher = _WEP104_; - ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WLAN_CIPHER_SUITE_TKIP: - *profile_cipher = _TKIP_; - ndisencryptstatus = Ndis802_11Encryption2Enabled; - break; - case WLAN_CIPHER_SUITE_CCMP: - *profile_cipher = _AES_; - ndisencryptstatus = Ndis802_11Encryption3Enabled; - break; -#ifdef CONFIG_WAPI_SUPPORT - case WLAN_CIPHER_SUITE_SMS4: - *profile_cipher = _SMS4_; - ndisencryptstatus = Ndis802_11_EncrypteionWAPI; - break; -#endif - default: - DBG_8192C("Unsupported cipher: 0x%x\n", cipher); - return -ENOTSUPP; - } - - if(ucast) - { - psecuritypriv->ndisencryptstatus = ndisencryptstatus; - - //if(psecuritypriv->dot11PrivacyAlgrthm >= _AES_) - // psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; - } - - return 0; -} - -static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, u32 key_mgt) -{ - DBG_8192C("%s, key_mgt=0x%x\n", __func__, key_mgt); - - if (key_mgt == WLAN_AKM_SUITE_8021X) - //*auth_type = UMAC_AUTH_TYPE_8021X; - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - else if (key_mgt == WLAN_AKM_SUITE_PSK) { - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - } -#ifdef CONFIG_WAPI_SUPPORT - else if(key_mgt ==WLAN_AKM_SUITE_WAPI_PSK){ - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; - } - else if(key_mgt ==WLAN_AKM_SUITE_WAPI_CERT){ - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; - } -#endif - - - else { - DBG_8192C("Invalid key mgt: 0x%x\n", key_mgt); - //return -EINVAL; - } - - return 0; -} - -static int rtw_cfg80211_set_wpa_ie(_adapter *padapter, u8 *pie, size_t ielen) -{ - u8 *buf=NULL, *pos=NULL; - u32 left; - int group_cipher = 0, pairwise_cipher = 0; - int ret = 0; - int wpa_ielen=0; - int wpa2_ielen=0; - u8 *pwpa, *pwpa2; - u8 null_addr[]= {0,0,0,0,0,0}; - - if (pie == NULL || !ielen) { - /* Treat this as normal case, but need to clear WIFI_UNDER_WPS */ - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - goto exit; - } - - if (ielen > MAX_WPA_IE_LEN+MAX_WPS_IE_LEN+MAX_P2P_IE_LEN) { - ret = -EINVAL; - goto exit; - } - - buf = rtw_zmalloc(ielen); - if (buf == NULL){ - ret = -ENOMEM; - goto exit; - } - - _rtw_memcpy(buf, pie , ielen); - - //dump - { - int i; - DBG_8192C("set wpa_ie(length:%zu):\n", ielen); - for(i=0;i0) - { - if(rtw_parse_wpa_ie(pwpa, wpa_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPAPSK; - _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0], wpa_ielen+2); - - DBG_8192C("got wpa_ie, wpa_ielen:%u\n", wpa_ielen); - } - } - - pwpa2 = rtw_get_wpa2_ie(buf, &wpa2_ielen, ielen); - if(pwpa2 && wpa2_ielen>0) - { - if(rtw_parse_wpa2_ie(pwpa2, wpa2_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) - { - padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; - padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPA2PSK; - _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0], wpa2_ielen+2); - - DBG_8192C("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen); - } - } - - if (group_cipher == 0) - { - group_cipher = WPA_CIPHER_NONE; - } - if (pairwise_cipher == 0) - { - pairwise_cipher = WPA_CIPHER_NONE; - } - - switch(group_cipher) - { - case WPA_CIPHER_NONE: - padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_; - padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled; - break; - case WPA_CIPHER_WEP40: - padapter->securitypriv.dot118021XGrpPrivacy=_WEP40_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WPA_CIPHER_TKIP: - padapter->securitypriv.dot118021XGrpPrivacy=_TKIP_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; - break; - case WPA_CIPHER_CCMP: - padapter->securitypriv.dot118021XGrpPrivacy=_AES_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; - break; - case WPA_CIPHER_WEP104: - padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - } - - switch(pairwise_cipher) - { - case WPA_CIPHER_NONE: - padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_; - padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled; - break; - case WPA_CIPHER_WEP40: - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WPA_CIPHER_TKIP: - padapter->securitypriv.dot11PrivacyAlgrthm=_TKIP_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; - break; - case WPA_CIPHER_CCMP: - padapter->securitypriv.dot11PrivacyAlgrthm=_AES_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; - break; - case WPA_CIPHER_WEP104: - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; - padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - } - - {/* handle wps_ie */ - uint wps_ielen; - u8 *wps_ie; - - wps_ie = rtw_get_wps_ie(buf, ielen, NULL, &wps_ielen); - if (wps_ie && wps_ielen > 0) { - DBG_8192C("got wps_ie, wps_ielen:%u\n", wps_ielen); - padapter->securitypriv.wps_ie_len = wps_ielensecuritypriv.wps_ie, wps_ie, padapter->securitypriv.wps_ie_len); - set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS); - } else { - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - } - } - - #ifdef CONFIG_P2P - {//check p2p_ie for assoc req; - uint p2p_ielen=0; - u8 *p2p_ie; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - if((p2p_ie=rtw_get_p2p_ie(buf, ielen, NULL, &p2p_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s p2p_assoc_req_ielen=%d\n", __FUNCTION__, p2p_ielen); - #endif - - if(pmlmepriv->p2p_assoc_req_ie) - { - u32 free_len = pmlmepriv->p2p_assoc_req_ie_len; - pmlmepriv->p2p_assoc_req_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_assoc_req_ie, free_len); - pmlmepriv->p2p_assoc_req_ie = NULL; - } - - pmlmepriv->p2p_assoc_req_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_assoc_req_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - goto exit; - } - _rtw_memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen; - } - } - #endif //CONFIG_P2P - - #ifdef CONFIG_WFD - {//check wfd_ie for assoc req; - uint wfd_ielen=0; - u8 *wfd_ie; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - if(rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s wfd_assoc_req_ielen=%d\n", __FUNCTION__, wfd_ielen); - #endif - - if(pmlmepriv->wfd_assoc_req_ie) - { - u32 free_len = pmlmepriv->wfd_assoc_req_ie_len; - pmlmepriv->wfd_assoc_req_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_assoc_req_ie, free_len); - pmlmepriv->wfd_assoc_req_ie = NULL; - } - - pmlmepriv->wfd_assoc_req_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_assoc_req_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - goto exit; - } - rtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len); - } - } - #endif //CONFIG_WFD - - //TKIP and AES disallow multicast packets until installing group key - if(padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_ - || padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_ - || padapter->securitypriv.dot11PrivacyAlgrthm == _AES_) - //WPS open need to enable multicast - //|| check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == _TRUE) - rtw_hal_set_hwreg(padapter, HW_VAR_OFF_RCR_AM, null_addr); - - RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_, - ("rtw_set_wpa_ie: pairwise_cipher=0x%08x padapter->securitypriv.ndisencryptstatus=%d padapter->securitypriv.ndisauthtype=%d\n", - pairwise_cipher, padapter->securitypriv.ndisencryptstatus, padapter->securitypriv.ndisauthtype)); - -exit: - if (buf) - rtw_mfree(buf, ielen); - if (ret) - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - return ret; -} - -static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_connect_params *sme) -{ - int ret=0; - _irqL irqL; - _list *phead; - struct wlan_network *pnetwork = NULL; - NDIS_802_11_AUTHENTICATION_MODE authmode; - NDIS_802_11_SSID ndis_ssid; - u8 *dst_ssid, *src_ssid; - u8 *dst_bssid, *src_bssid; - //u8 matched_by_bssid=_FALSE; - //u8 matched_by_ssid=_FALSE; - u8 matched=_FALSE; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - _queue *queue = &pmlmepriv->scanned_queue; - - DBG_871X("=>"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - DBG_871X("privacy=%d, key=%p, key_len=%d, key_idx=%d\n", - sme->privacy, sme->key, sme->key_len, sme->key_idx); - - - if(wdev_to_priv(padapter->rtw_wdev)->block == _TRUE) - { - ret = -EBUSY; - DBG_871X("%s wdev_priv.block is set\n", __FUNCTION__); - goto exit; - } - -#ifdef CONFIG_PLATFORM_MSTAR_TITANIA12 - printk("MStar Android!\n"); - if((wdev_to_priv(padapter->rtw_wdev))->bandroid_scan == _FALSE) - { -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) -#endif //CONFIG_P2P - { - ret = -EBUSY; - printk("Android hasn't attached yet!\n"); - goto exit; - } - } -#endif - - if(_FAIL == rtw_pwr_wakeup(padapter)) { - ret= -EPERM; - goto exit; - } - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) { - ret = -EPERM; - goto exit; - } - -#ifdef CONFIG_CONCURRENT_MODE - if (check_buddy_fwstate(padapter, _FW_UNDER_LINKING) == _TRUE) { - DBG_8192C("%s, but buddy_intf is under linking\n", __FUNCTION__); - ret = -EINVAL; - goto exit; - } - if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY) == _TRUE) { - rtw_scan_abort(padapter->pbuddy_adapter); - } -#endif - - if (!sme->ssid || !sme->ssid_len) - { - ret = -EINVAL; - goto exit; - } - - if (sme->ssid_len > IW_ESSID_MAX_SIZE){ - - ret= -E2BIG; - goto exit; - } - - - _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID)); - ndis_ssid.SsidLength = sme->ssid_len; - _rtw_memcpy(ndis_ssid.Ssid, sme->ssid, sme->ssid_len); - - DBG_8192C("ssid=%s, len=%zu\n", ndis_ssid.Ssid, sme->ssid_len); - - - if (sme->bssid) - DBG_8192C("bssid="MAC_FMT"\n", MAC_ARG(sme->bssid)); - - - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { - ret = -EBUSY; - DBG_8192C("%s, fw_state=0x%x, goto exit\n", __FUNCTION__, pmlmepriv->fw_state); - goto exit; - } - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { - rtw_scan_abort(padapter); - } - - _enter_critical_bh(&queue->lock, &irqL); - - phead = get_list_head(queue); - pmlmepriv->pscanned = get_next(phead); - - while (1) - { - if (rtw_end_of_queue_search(phead, pmlmepriv->pscanned) == _TRUE) - { - break; - } - - pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); - pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); - - dst_ssid = pnetwork->network.Ssid.Ssid; - dst_bssid = pnetwork->network.MacAddress; - - if(sme->bssid) { - if(_rtw_memcmp(pnetwork->network.MacAddress, sme->bssid, ETH_ALEN) == _FALSE) - continue; - } - - if(sme->ssid && sme->ssid_len) { - if( pnetwork->network.Ssid.SsidLength != sme->ssid_len - || _rtw_memcmp(pnetwork->network.Ssid.Ssid, sme->ssid, sme->ssid_len) == _FALSE - ) - continue; - } - - - if (sme->bssid) - { - src_bssid = sme->bssid; - - if ((_rtw_memcmp(dst_bssid, src_bssid, ETH_ALEN)) == _TRUE) - { - DBG_8192C("matched by bssid\n"); - - ndis_ssid.SsidLength = pnetwork->network.Ssid.SsidLength; - _rtw_memcpy(ndis_ssid.Ssid, pnetwork->network.Ssid.Ssid, pnetwork->network.Ssid.SsidLength); - - matched=_TRUE; - break; - } - - } - else if (sme->ssid && sme->ssid_len) - { - src_ssid = ndis_ssid.Ssid; - - if ((_rtw_memcmp(dst_ssid, src_ssid, ndis_ssid.SsidLength) == _TRUE) && - (pnetwork->network.Ssid.SsidLength==ndis_ssid.SsidLength)) - { - DBG_8192C("matched by ssid\n"); - matched=_TRUE; - break; - } - } - - } - - _exit_critical_bh(&queue->lock, &irqL); - - if((matched == _FALSE) || (pnetwork== NULL)) - { - ret = -ENOENT; - DBG_8192C("connect, matched == _FALSE, goto exit\n"); - goto exit; - } - - - if (rtw_set_802_11_infrastructure_mode(padapter, pnetwork->network.InfrastructureMode) == _FALSE) - { - ret = -EPERM; - goto exit; - } - - psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled; - psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system - psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; - -#ifdef CONFIG_WAPI_SUPPORT - padapter->wapiInfo.bWapiEnable = false; -#endif - - ret = rtw_cfg80211_set_wpa_version(psecuritypriv, sme->crypto.wpa_versions); - if (ret < 0) - goto exit; - -#ifdef CONFIG_WAPI_SUPPORT - if(sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1) - { - padapter->wapiInfo.bWapiEnable = true; - padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; - padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; - } -#endif - - ret = rtw_cfg80211_set_auth_type(psecuritypriv, sme->auth_type); - -#ifdef CONFIG_WAPI_SUPPORT - if(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_WAPI) - padapter->mlmeextpriv.mlmext_info.auth_algo = psecuritypriv->dot11AuthAlgrthm; -#endif - - - if (ret < 0) - goto exit; - - DBG_8192C("%s, ie_len=%zu\n", __func__, sme->ie_len); - - ret = rtw_cfg80211_set_wpa_ie(padapter, sme->ie, sme->ie_len); - if (ret < 0) - goto exit; - - if (sme->crypto.n_ciphers_pairwise) { - ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.ciphers_pairwise[0], _TRUE); - if (ret < 0) - goto exit; - } - - //For WEP Shared auth - if((psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Shared - || psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Auto) && sme->key - ) - { - u32 wep_key_idx, wep_key_len,wep_total_len; - NDIS_802_11_WEP *pwep = NULL; - DBG_871X("%s(): Shared/Auto WEP\n",__FUNCTION__); - - wep_key_idx = sme->key_idx; - wep_key_len = sme->key_len; - - if (sme->key_idx > WEP_KEYS) { - ret = -EINVAL; - goto exit; - } - - if (wep_key_len > 0) - { - wep_key_len = wep_key_len <= 5 ? 5 : 13; - wep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial); - pwep =(NDIS_802_11_WEP *) rtw_malloc(wep_total_len); - if(pwep == NULL){ - DBG_871X(" wpa_set_encryption: pwep allocate fail !!!\n"); - ret = -ENOMEM; - goto exit; - } - - _rtw_memset(pwep, 0, wep_total_len); - - pwep->KeyLength = wep_key_len; - pwep->Length = wep_total_len; - - if(wep_key_len==13) - { - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; - padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_; - } - } - else { - ret = -EINVAL; - goto exit; - } - - pwep->KeyIndex = wep_key_idx; - pwep->KeyIndex |= 0x80000000; - - _rtw_memcpy(pwep->KeyMaterial, (void *)sme->key, pwep->KeyLength); - - if(rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL) - { - ret = -EOPNOTSUPP ; - } - - if (pwep) { - rtw_mfree((u8 *)pwep,wep_total_len); - } - - if(ret < 0) - goto exit; - } - - ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.cipher_group, _FALSE); - if (ret < 0) - return ret; - - if (sme->crypto.n_akm_suites) { - ret = rtw_cfg80211_set_key_mgt(psecuritypriv, sme->crypto.akm_suites[0]); - if (ret < 0) - goto exit; - } - -#ifdef CONFIG_WAPI_SUPPORT - if(sme->crypto.akm_suites[0] ==WLAN_AKM_SUITE_WAPI_PSK){ - padapter->wapiInfo.bWapiPSK = true; - } - else if(sme->crypto.akm_suites[0] ==WLAN_AKM_SUITE_WAPI_CERT){ - padapter->wapiInfo.bWapiPSK = false; - } -#endif - - authmode = psecuritypriv->ndisauthtype; - rtw_set_802_11_authentication_mode(padapter, authmode); - - //rtw_set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus); - - if (rtw_set_802_11_ssid(padapter, &ndis_ssid) == _FALSE) { - ret = -1; - goto exit; - } - - - DBG_8192C("set ssid:dot11AuthAlgrthm=%d, dot11PrivacyAlgrthm=%d, dot118021XGrpPrivacy=%d\n", psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, psecuritypriv->dot118021XGrpPrivacy); - -exit: - - DBG_8192C("<=%s, ret %d\n",__FUNCTION__, ret); - - return ret; -} - -static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev, - u16 reason_code) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - rtw_set_roaming(padapter, 0); - - if(check_fwstate(&padapter->mlmepriv, _FW_LINKED)) - { - rtw_scan_abort(padapter); - LeaveAllPowerSaveMode(padapter); - rtw_disassoc_cmd(padapter, 500, _FALSE); - - DBG_871X("%s...call rtw_indicate_disconnect\n", __FUNCTION__); - - padapter->mlmepriv.not_indic_disco = _TRUE; - rtw_indicate_disconnect(padapter); - padapter->mlmepriv.not_indic_disco = _FALSE; - - rtw_free_assoc_resources(padapter, 1); - } - - return 0; -} - -static int cfg80211_rtw_set_txpower(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) - struct wireless_dev *wdev, -#endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) || defined(COMPAT_KERNEL_RELEASE) - enum nl80211_tx_power_setting type, int mbm) -#else - enum tx_power_setting type, int dbm) -#endif -{ -#if 0 - struct iwm_priv *iwm = wiphy_to_iwm(wiphy); - int ret; - - switch (type) { - case NL80211_TX_POWER_AUTOMATIC: - return 0; - case NL80211_TX_POWER_FIXED: - if (mbm < 0 || (mbm % 100)) - return -EOPNOTSUPP; - - if (!test_bit(IWM_STATUS_READY, &iwm->status)) - return 0; - - ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, - CFG_TX_PWR_LIMIT_USR, - MBM_TO_DBM(mbm) * 2); - if (ret < 0) - return ret; - - return iwm_tx_power_trigger(iwm); - default: - IWM_ERR(iwm, "Unsupported power type: %d\n", type); - return -EOPNOTSUPP; - } -#endif - DBG_8192C("%s\n", __func__); - return 0; -} - -static int cfg80211_rtw_get_txpower(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) - struct wireless_dev *wdev, -#endif - int *dbm) -{ - //_adapter *padapter = wiphy_to_adapter(wiphy); - - DBG_8192C("%s\n", __func__); - - *dbm = (12); - - return 0; -} - -inline bool rtw_cfg80211_pwr_mgmt(_adapter *adapter) -{ - struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(adapter->rtw_wdev); - return rtw_wdev_priv->power_mgmt; -} - -static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy, - struct net_device *ndev, - bool enabled, int timeout) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(padapter->rtw_wdev); - - DBG_871X(FUNC_NDEV_FMT" enabled:%u, timeout:%d\n", FUNC_NDEV_ARG(ndev), - enabled, timeout); - - rtw_wdev_priv->power_mgmt = enabled; - - #ifdef CONFIG_LPS - if (!enabled) - LPS_Leave(padapter); - #endif - - return 0; -} - -static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy, - struct net_device *netdev, - struct cfg80211_pmksa *pmksa) -{ - u8 index,blInserted = _FALSE; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - u8 strZeroMacAddress[ ETH_ALEN ] = { 0x00 }; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); - - if ( _rtw_memcmp( pmksa->bssid, strZeroMacAddress, ETH_ALEN ) == _TRUE ) - { - return -EINVAL; - } - - blInserted = _FALSE; - - //overwrite PMKID - for(index=0 ; indexPMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE ) - { // BSSID is matched, the same AP => rewrite with new PMKID. - DBG_871X(FUNC_NDEV_FMT" BSSID exists in the PMKList.\n", FUNC_NDEV_ARG(netdev)); - - _rtw_memcpy( psecuritypriv->PMKIDList[index].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); - psecuritypriv->PMKIDList[index].bUsed = _TRUE; - psecuritypriv->PMKIDIndex = index+1; - blInserted = _TRUE; - break; - } - } - - if(!blInserted) - { - // Find a new entry - DBG_871X(FUNC_NDEV_FMT" Use the new entry index = %d for this PMKID.\n", - FUNC_NDEV_ARG(netdev), psecuritypriv->PMKIDIndex ); - - _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, pmksa->bssid, ETH_ALEN); - _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); - - psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = _TRUE; - psecuritypriv->PMKIDIndex++ ; - if(psecuritypriv->PMKIDIndex==16) - { - psecuritypriv->PMKIDIndex =0; - } - } - - return 0; -} - -static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy, - struct net_device *netdev, - struct cfg80211_pmksa *pmksa) -{ - u8 index, bMatched = _FALSE; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); - - for(index=0 ; indexPMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE ) - { // BSSID is matched, the same AP => Remove this PMKID information and reset it. - _rtw_memset( psecuritypriv->PMKIDList[index].Bssid, 0x00, ETH_ALEN ); - _rtw_memset( psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN ); - psecuritypriv->PMKIDList[index].bUsed = _FALSE; - bMatched = _TRUE; - break; - } - } - - if(_FALSE == bMatched) - { - DBG_871X(FUNC_NDEV_FMT" do not have matched BSSID\n" - , FUNC_NDEV_ARG(netdev)); - return -EINVAL; - } - - return 0; -} - -static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy, - struct net_device *netdev) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); - - _rtw_memset( &psecuritypriv->PMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); - psecuritypriv->PMKIDIndex = 0; - - return 0; -} - -#ifdef CONFIG_AP_MODE -void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) -{ - s32 freq; - int channel; - struct wireless_dev *pwdev = padapter->rtw_wdev; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct net_device *ndev = padapter->pnetdev; - - DBG_8192C("%s(padapter=%p,%s)\n", __func__, padapter, ndev->name); - -#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) - { - struct station_info sinfo; - u8 ie_offset; - if (GetFrameSubType(pmgmt_frame) == WIFI_ASSOCREQ) - ie_offset = _ASOCREQ_IE_OFFSET_; - else // WIFI_REASSOCREQ - ie_offset = _REASOCREQ_IE_OFFSET_; - - sinfo.filled = 0; - sinfo.filled = STATION_INFO_ASSOC_REQ_IES; - sinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset; - sinfo.assoc_req_ies_len = frame_len - WLAN_HDR_A3_LEN - ie_offset; - cfg80211_new_sta(ndev, GetAddr2Ptr(pmgmt_frame), &sinfo, GFP_ATOMIC); - } -#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ - channel = pmlmeext->cur_channel; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); - #else //COMPAT_KERNEL_RELEASE - { - //to avoid WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION) when calling cfg80211_send_rx_assoc() - #ifndef CONFIG_PLATFORM_MSTAR_TITANIA12 - pwdev->iftype = NL80211_IFTYPE_STATION; - #endif //CONFIG_PLATFORM_MSTAR_TITANIA12 - DBG_8192C("iftype=%d before call cfg80211_send_rx_assoc()\n", pwdev->iftype); - rtw_cfg80211_send_rx_assoc(padapter, NULL, pmgmt_frame, frame_len); - DBG_8192C("iftype=%d after call cfg80211_send_rx_assoc()\n", pwdev->iftype); - pwdev->iftype = NL80211_IFTYPE_AP; - //cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); - } - #endif //COMPAT_KERNEL_RELEASE -#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ - -} - -void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason) -{ - s32 freq; - int channel; - u8 *pmgmt_frame; - uint frame_len; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - u8 mgmt_buf[128] = {0}; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct net_device *ndev = padapter->pnetdev; - - DBG_8192C("%s(padapter=%p,%s)\n", __func__, padapter, ndev->name); - -#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) - cfg80211_del_sta(ndev, da, GFP_ATOMIC); -#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ - channel = pmlmeext->cur_channel; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - - pmgmt_frame = mgmt_buf; - pwlanhdr = (struct rtw_ieee80211_hdr *)pmgmt_frame; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - //_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - //_rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pmgmt_frame, WIFI_DEAUTH); - - pmgmt_frame += sizeof(struct rtw_ieee80211_hdr_3addr); - frame_len = sizeof(struct rtw_ieee80211_hdr_3addr); - - reason = cpu_to_le16(reason); - pmgmt_frame = rtw_set_fixed_ie(pmgmt_frame, _RSON_CODE_ , (unsigned char *)&reason, &frame_len); - - #ifdef COMPAT_KERNEL_RELEASE - rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); - #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) - rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); - #else //COMPAT_KERNEL_RELEASE - cfg80211_send_disassoc(padapter->pnetdev, mgmt_buf, frame_len); - //cfg80211_rx_action(padapter->pnetdev, freq, mgmt_buf, frame_len, GFP_ATOMIC); - #endif //COMPAT_KERNEL_RELEASE -#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ -} - -static int rtw_cfg80211_monitor_if_open(struct net_device *ndev) -{ - int ret = 0; - - DBG_8192C("%s\n", __func__); - - return ret; -} - -static int rtw_cfg80211_monitor_if_close(struct net_device *ndev) -{ - int ret = 0; - - DBG_8192C("%s\n", __func__); - - return ret; -} - -static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct net_device *ndev) -{ - int ret = 0; - int rtap_len; - int qos_len = 0; - int dot11_hdr_len = 24; - int snap_len = 6; - unsigned char *pdata; - u16 frame_ctl; - unsigned char src_mac_addr[6]; - unsigned char dst_mac_addr[6]; - struct ieee80211_hdr *dot11_hdr; - struct ieee80211_radiotap_header *rtap_hdr; - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) - goto fail; - - rtap_hdr = (struct ieee80211_radiotap_header *)skb->data; - if (unlikely(rtap_hdr->it_version)) - goto fail; - - rtap_len = ieee80211_get_radiotap_len(skb->data); - if (unlikely(skb->len < rtap_len)) - goto fail; - - if(rtap_len != 14) - { - DBG_8192C("radiotap len (should be 14): %d\n", rtap_len); - goto fail; - } - - /* Skip the ratio tap header */ - skb_pull(skb, rtap_len); - - dot11_hdr = (struct ieee80211_hdr *)skb->data; - frame_ctl = le16_to_cpu(dot11_hdr->frame_control); - /* Check if the QoS bit is set */ - if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) { - /* Check if this ia a Wireless Distribution System (WDS) frame - * which has 4 MAC addresses - */ - if (dot11_hdr->frame_control & 0x0080) - qos_len = 2; - if ((dot11_hdr->frame_control & 0x0300) == 0x0300) - dot11_hdr_len += 6; - - memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr)); - memcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr)); - - /* Skip the 802.11 header, QoS (if any) and SNAP, but leave spaces for - * for two MAC addresses - */ - skb_pull(skb, dot11_hdr_len + qos_len + snap_len - sizeof(src_mac_addr) * 2); - pdata = (unsigned char*)skb->data; - memcpy(pdata, dst_mac_addr, sizeof(dst_mac_addr)); - memcpy(pdata + sizeof(dst_mac_addr), src_mac_addr, sizeof(src_mac_addr)); - - DBG_8192C("should be eapol packet\n"); - - /* Use the real net device to transmit the packet */ - ret = rtw_xmit_entry(skb, padapter->pnetdev); - - return ret; - - } - else if ((frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)) - == (RTW_IEEE80211_FTYPE_MGMT|RTW_IEEE80211_STYPE_ACTION) - ) - { - //only for action frames - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - //u8 category, action, OUI_Subtype, dialogToken=0; - //unsigned char *frame_body; - struct rtw_ieee80211_hdr *pwlanhdr; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - u8 *buf = skb->data; - u32 len = skb->len; - u8 category, action; - int type = -1; - - if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) { - DBG_8192C(FUNC_NDEV_FMT" frame_control:0x%x\n", FUNC_NDEV_ARG(ndev), - le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); - goto fail; - } - - DBG_8192C("RTW_Tx:da="MAC_FMT" via "FUNC_NDEV_FMT"\n", - MAC_ARG(GetAddr1Ptr(buf)), FUNC_NDEV_ARG(ndev)); - #ifdef CONFIG_P2P - if((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0) - goto dump; - #endif - if (category == RTW_WLAN_CATEGORY_PUBLIC) - DBG_871X("RTW_Tx:%s\n", action_public_str(action)); - else - DBG_871X("RTW_Tx:category(%u), action(%u)\n", category, action); - -dump: - //starting alloc mgmt frame to dump it - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - goto fail; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->retry_ctrl = _FALSE; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - _rtw_memcpy(pframe, (void*)buf, len); - #ifdef CONFIG_WFD - if (type >= 0) - { - struct wifi_display_info *pwfd_info; - - pwfd_info = padapter->wdinfo.wfd_info; - - if ( _TRUE == pwfd_info->wfd_enable ) - { - rtw_append_wfd_ie( padapter, pframe, &len ); - } - } - #endif // CONFIG_WFD - pattrib->pktlen = len; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - //update seq number - pmlmeext->mgnt_seq = GetSequence(pwlanhdr); - pattrib->seqnum = pmlmeext->mgnt_seq; - pmlmeext->mgnt_seq++; - - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - } - else - { - DBG_8192C("frame_ctl=0x%x\n", frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)); - } - - -fail: - - dev_kfree_skb(skb); - - return 0; - -} - -static void rtw_cfg80211_monitor_if_set_multicast_list(struct net_device *ndev) -{ - DBG_8192C("%s\n", __func__); -} - -static int rtw_cfg80211_monitor_if_set_mac_address(struct net_device *ndev, void *addr) -{ - int ret = 0; - - DBG_8192C("%s\n", __func__); - - return ret; -} - -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) -static const struct net_device_ops rtw_cfg80211_monitor_if_ops = { - .ndo_open = rtw_cfg80211_monitor_if_open, - .ndo_stop = rtw_cfg80211_monitor_if_close, - .ndo_start_xmit = rtw_cfg80211_monitor_if_xmit_entry, - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) - .ndo_set_multicast_list = rtw_cfg80211_monitor_if_set_multicast_list, - #endif - .ndo_set_mac_address = rtw_cfg80211_monitor_if_set_mac_address, -}; -#endif - -static int rtw_cfg80211_add_monitor_if(_adapter *padapter, char *name, struct net_device **ndev) -{ - int ret = 0; - struct net_device* mon_ndev = NULL; - struct wireless_dev* mon_wdev = NULL; - struct rtw_netdev_priv_indicator *pnpi; - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - - if (!name ) { - DBG_871X(FUNC_ADPT_FMT" without specific name\n", FUNC_ADPT_ARG(padapter)); - ret = -EINVAL; - goto out; - } - - if (pwdev_priv->pmon_ndev) { - DBG_871X(FUNC_ADPT_FMT" monitor interface exist: "NDEV_FMT"\n", - FUNC_ADPT_ARG(padapter), NDEV_ARG(pwdev_priv->pmon_ndev)); - ret = -EBUSY; - goto out; - } - - mon_ndev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); - if (!mon_ndev) { - DBG_871X(FUNC_ADPT_FMT" allocate ndev fail\n", FUNC_ADPT_ARG(padapter)); - ret = -ENOMEM; - goto out; - } - - mon_ndev->type = ARPHRD_IEEE80211_RADIOTAP; - strncpy(mon_ndev->name, name, IFNAMSIZ); - mon_ndev->name[IFNAMSIZ - 1] = 0; - mon_ndev->destructor = rtw_ndev_destructor; - -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) - mon_ndev->netdev_ops = &rtw_cfg80211_monitor_if_ops; -#else - mon_ndev->open = rtw_cfg80211_monitor_if_open; - mon_ndev->stop = rtw_cfg80211_monitor_if_close; - mon_ndev->hard_start_xmit = rtw_cfg80211_monitor_if_xmit_entry; - mon_ndev->set_mac_address = rtw_cfg80211_monitor_if_set_mac_address; -#endif - - pnpi = netdev_priv(mon_ndev); - pnpi->priv = padapter; - pnpi->sizeof_priv = sizeof(_adapter); - - /* wdev */ - mon_wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); - if (!mon_wdev) { - DBG_871X(FUNC_ADPT_FMT" allocate mon_wdev fail\n", FUNC_ADPT_ARG(padapter)); - ret = -ENOMEM; - goto out; - } - - mon_wdev->wiphy = padapter->rtw_wdev->wiphy; - mon_wdev->netdev = mon_ndev; - mon_wdev->iftype = NL80211_IFTYPE_MONITOR; - mon_ndev->ieee80211_ptr = mon_wdev; - - ret = register_netdevice(mon_ndev); - if (ret) { - goto out; - } - - *ndev = pwdev_priv->pmon_ndev = mon_ndev; - _rtw_memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ+1); - -out: - if (ret && mon_wdev) { - rtw_mfree((u8*)mon_wdev, sizeof(struct wireless_dev)); - mon_wdev = NULL; - } - - if (ret && mon_ndev) { - free_netdev(mon_ndev); - *ndev = mon_ndev = NULL; - } - - return ret; -} - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) -static struct wireless_dev * -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) -static struct net_device * -#else -static int -#endif - cfg80211_rtw_add_virtual_intf( - struct wiphy *wiphy, - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)) - const char *name, - #else - char *name, - #endif - enum nl80211_iftype type, u32 *flags, struct vif_params *params) -{ - int ret = 0; - struct net_device* ndev = NULL; - _adapter *padapter = wiphy_to_adapter(wiphy); - - DBG_871X(FUNC_ADPT_FMT " wiphy:%s, name:%s, type:%d\n", - FUNC_ADPT_ARG(padapter), wiphy_name(wiphy), name, type); - - switch (type) { - case NL80211_IFTYPE_ADHOC: - case NL80211_IFTYPE_AP_VLAN: - case NL80211_IFTYPE_WDS: - case NL80211_IFTYPE_MESH_POINT: - ret = -ENODEV; - break; - case NL80211_IFTYPE_MONITOR: - ret = rtw_cfg80211_add_monitor_if(padapter, (char *)name, &ndev); - break; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - case NL80211_IFTYPE_P2P_CLIENT: -#endif - case NL80211_IFTYPE_STATION: - ret = -ENODEV; - break; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - case NL80211_IFTYPE_P2P_GO: -#endif - case NL80211_IFTYPE_AP: - ret = -ENODEV; - break; - default: - ret = -ENODEV; - DBG_871X("Unsupported interface type\n"); - break; - } - - DBG_871X(FUNC_ADPT_FMT" ndev:%p, ret:%d\n", FUNC_ADPT_ARG(padapter), ndev, ret); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - return ndev ? ndev->ieee80211_ptr : ERR_PTR(ret); -#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - return ndev ? ndev : ERR_PTR(ret); -#else - return ret; -#endif -} - -static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - struct wireless_dev *wdev -#else - struct net_device *ndev -#endif -) -{ - struct rtw_wdev_priv *pwdev_priv = (struct rtw_wdev_priv *)wiphy_priv(wiphy); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - struct net_device *ndev; - ndev = wdev ? wdev->netdev : NULL; -#endif - - if (!ndev) - goto exit; - - unregister_netdevice(ndev); - - if (ndev == pwdev_priv->pmon_ndev) { - pwdev_priv->pmon_ndev = NULL; - pwdev_priv->ifname_mon[0] = '\0'; - DBG_871X(FUNC_NDEV_FMT" remove monitor interface\n", FUNC_NDEV_ARG(ndev)); - } - -exit: - return 0; -} - -static int rtw_add_beacon(_adapter *adapter, const u8 *head, size_t head_len, const u8 *tail, size_t tail_len) -{ - int ret=0; - u8 *pbuf = NULL; - uint len, wps_ielen=0; - uint p2p_ielen=0; - u8 *p2p_ie; - u8 got_p2p_ie = _FALSE; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - //struct sta_priv *pstapriv = &padapter->stapriv; - - - DBG_8192C("%s beacon_head_len=%zu, beacon_tail_len=%zu\n", __FUNCTION__, head_len, tail_len); - - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) - return -EINVAL; - - if(head_len<24) - return -EINVAL; - - - pbuf = rtw_zmalloc(head_len+tail_len); - if(!pbuf) - return -ENOMEM; - - - //_rtw_memcpy(&pstapriv->max_num_sta, param->u.bcn_ie.reserved, 2); - - //if((pstapriv->max_num_sta>NUM_STA) || (pstapriv->max_num_sta<=0)) - // pstapriv->max_num_sta = NUM_STA; - - - _rtw_memcpy(pbuf, (void *)head+24, head_len-24);// 24=beacon header len. - _rtw_memcpy(pbuf+head_len-24, (void *)tail, tail_len); - - len = head_len+tail_len-24; - - //check wps ie if inclued - if(rtw_get_wps_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &wps_ielen)) - DBG_8192C("add bcn, wps_ielen=%d\n", wps_ielen); - -#ifdef CONFIG_P2P - //check p2p ie if inclued - if(rtw_get_p2p_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &p2p_ielen)) - { - DBG_8192C("got p2p_ie, len=%d\n", p2p_ielen); - got_p2p_ie = _TRUE; - } -#endif - - /* pbss_network->IEs will not include p2p_ie, wfd ie */ - rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, P2P_OUI, 4); - rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, WFD_OUI, 4); - - if (rtw_check_beacon_data(adapter, pbuf, len) == _SUCCESS) { -#ifdef CONFIG_P2P - //check p2p if enable - if(got_p2p_ie == _TRUE) - { - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct wifidirect_info *pwdinfo= &(adapter->wdinfo); - - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - DBG_8192C("Enable P2P function for the first time\n"); - rtw_p2p_enable(adapter, P2P_ROLE_GO); - wdev_to_priv(adapter->rtw_wdev)->p2p_enabled = _TRUE; - } - else - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - DBG_8192C("enter GO Mode, p2p_ielen=%d\n", p2p_ielen); - - rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); - pwdinfo->intent = 15; - } - - pwdinfo->operating_channel = pmlmeext->cur_channel; - - } -#endif //CONFIG_P2P - - ret = 0; - - } - else - { - ret = -EINVAL; - } - - - rtw_mfree(pbuf, head_len+tail_len); - - return ret; -} - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) -static int cfg80211_rtw_add_beacon(struct wiphy *wiphy, struct net_device *ndev, - struct beacon_parameters *info) -{ - int ret=0; - _adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); - - return ret; -} - -static int cfg80211_rtw_set_beacon(struct wiphy *wiphy, struct net_device *ndev, - struct beacon_parameters *info) -{ - _adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - pmlmeext->bstart_bss = _TRUE; - - cfg80211_rtw_add_beacon(wiphy, ndev, info); - - return 0; -} - -static int cfg80211_rtw_del_beacon(struct wiphy *wiphy, struct net_device *ndev) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} -#else -static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_ap_settings *settings) -{ - int ret = 0; - _adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_871X(FUNC_NDEV_FMT" hidden_ssid:%d, auth_type:%d\n", FUNC_NDEV_ARG(ndev), - settings->hidden_ssid, settings->auth_type); - - ret = rtw_add_beacon(adapter, settings->beacon.head, settings->beacon.head_len, - settings->beacon.tail, settings->beacon.tail_len); - - adapter->mlmeextpriv.mlmext_info.hidden_ssid_mode = settings->hidden_ssid; - - if (settings->ssid && settings->ssid_len) { - WLAN_BSSID_EX *pbss_network = &adapter->mlmepriv.cur_network.network; - WLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network; - - if(0) - DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter), - settings->ssid, settings->ssid_len, - pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength); - - _rtw_memcpy(pbss_network->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); - pbss_network->Ssid.SsidLength = settings->ssid_len; - _rtw_memcpy(pbss_network_ext->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); - pbss_network_ext->Ssid.SsidLength = settings->ssid_len; - - if(0) - DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), - pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, - pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); - } - - return ret; -} - -static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_beacon_data *info) -{ - int ret = 0; - _adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); - - return ret; -} - -static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - return 0; -} - -#endif //(LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) - -static int cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev, - u8 *mac, struct station_parameters *params) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} - -static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev, - u8 *mac) -{ - int ret=0; - _irqL irqL; - _list *phead, *plist; - u8 updated; - struct sta_info *psta = NULL; - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct sta_priv *pstapriv = &padapter->stapriv; - - DBG_871X("+"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE) - { - DBG_8192C("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n", __func__); - return -EINVAL; - } - - - if(!mac) - { - DBG_8192C("flush all sta, and cam_entry\n"); - - flush_all_cam_entry(padapter); //clear CAM - - ret = rtw_sta_flush(padapter); - - return ret; - } - - - DBG_8192C("free sta macaddr =" MAC_FMT "\n", MAC_ARG(mac)); - - if (mac[0] == 0xff && mac[1] == 0xff && - mac[2] == 0xff && mac[3] == 0xff && - mac[4] == 0xff && mac[5] == 0xff) - { - return -EINVAL; - } - - - _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //check asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - if(_rtw_memcmp(mac, psta->hwaddr, ETH_ALEN)) - { - if(psta->dot8021xalg == 1 && psta->bpairwise_key_installed == _FALSE) - { - DBG_8192C("%s, sta's dot8021xalg = 1 and key_installed = _FALSE\n", __func__); - } - else - { - DBG_8192C("free psta=%p, aid=%d\n", psta, psta->aid); - - rtw_list_delete(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - - //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING); - //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - psta = NULL; - - break; - } - - } - - } - - _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); - - associated_clients_update(padapter, updated); - - DBG_871X("-"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return ret; - -} - -static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *ndev, - u8 *mac, struct station_parameters *params) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} - -static int cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev, - int idx, u8 *mac, struct station_info *sinfo) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - //TODO: dump scanned queue - - return -ENOENT; -} - -static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev, - struct bss_parameters *params) -{ - u8 i; - - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); -/* - DBG_8192C("use_cts_prot=%d\n", params->use_cts_prot); - DBG_8192C("use_short_preamble=%d\n", params->use_short_preamble); - DBG_8192C("use_short_slot_time=%d\n", params->use_short_slot_time); - DBG_8192C("ap_isolate=%d\n", params->ap_isolate); - - DBG_8192C("basic_rates_len=%d\n", params->basic_rates_len); - for(i=0; ibasic_rates_len; i++) - { - DBG_8192C("basic_rates=%d\n", params->basic_rates[i]); - - } -*/ - return 0; - -} - -static int cfg80211_rtw_set_channel(struct wiphy *wiphy - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) - , struct net_device *ndev - #endif - , struct ieee80211_channel *chan, enum nl80211_channel_type channel_type) -{ - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - #endif - - return 0; -} - -static int cfg80211_rtw_auth(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_auth_request *req) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} - -static int cfg80211_rtw_assoc(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_assoc_request *req) -{ - DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); - - return 0; -} -#endif //CONFIG_AP_MODE - -void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) -{ - int type; - s32 freq; - int channel; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - u8 category, action; - - channel = rtw_get_oper_ch(padapter); - - DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); - #ifdef CONFIG_P2P - type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE); - if (type >= 0) - goto indicate; - #endif - rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action); - DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); - -indicate: - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); -#else - cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); -#endif -} - -void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) -{ - int type; - s32 freq; - int channel; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - u8 category, action; - - channel = rtw_get_oper_ch(padapter); - - DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); - #ifdef CONFIG_P2P - type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE); - if (type >= 0) { - switch (type) { - case P2P_GO_NEGO_CONF: - case P2P_PROVISION_DISC_RESP: - rtw_clear_scan_deny(padapter); - } - goto indicate; - } - #endif - rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action); - DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); - -indicate: - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); -#else - cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); -#endif -} - -void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg) -{ - s32 freq; - int channel; - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(adapter->rtw_wdev); - u8 category, action; - - channel = rtw_get_oper_ch(adapter); - - rtw_action_frame_parse(frame, frame_len, &category, &action); - - DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); - if (msg) - DBG_871X("RTW_Rx:%s\n", msg); - else - DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); - - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); - else - freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC); -#else - cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); -#endif - -} - -#ifdef CONFIG_P2P -void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len) -{ - u16 wps_devicepassword_id = 0x0000; - uint wps_devicepassword_id_len = 0; - u8 wpsie[ 255 ] = { 0x00 }, p2p_ie[ 255 ] = { 0x00 }; - uint p2p_ielen = 0; - uint wpsielen = 0; - u32 devinfo_contentlen = 0; - u8 devinfo_content[64] = { 0x00 }; - u16 capability = 0; - uint capability_len = 0; - - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u8 dialogToken = 1; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_PROVISION_DISC_REQ; - u32 p2pielen = 0; -#ifdef CONFIG_WFD - u32 wfdielen = 0; -#endif //CONFIG_WFD - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - u8 *frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); - size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr); - - - DBG_871X( "[%s] In\n", __FUNCTION__ ); - - //prepare for building provision_request frame - _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr1Ptr(buf), ETH_ALEN); - _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, GetAddr1Ptr(buf), ETH_ALEN); - - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; - - rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); - rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len); - wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id ); - - switch(wps_devicepassword_id) - { - case WPS_DPID_PIN: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL; - break; - case WPS_DPID_USER_SPEC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA; - break; - case WPS_DPID_MACHINE_SPEC: - break; - case WPS_DPID_REKEY: - break; - case WPS_DPID_PBC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; - break; - case WPS_DPID_REGISTRAR_SPEC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD; - break; - default: - break; - } - - - if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) - { - - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, devinfo_content, &devinfo_contentlen); - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&capability, &capability_len); - - } - - - //start to build provision_request frame - _rtw_memset(wpsie, 0, sizeof(wpsie)); - _rtw_memset(p2p_ie, 0, sizeof(p2p_ie)); - p2p_ielen = 0; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - - //build_prov_disc_request_p2p_ie - // P2P OUI - p2pielen = 0; - p2p_ie[ p2pielen++ ] = 0x50; - p2p_ie[ p2pielen++ ] = 0x6F; - p2p_ie[ p2pielen++ ] = 0x9A; - p2p_ie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20110301 - // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes - // 1. P2P Capability - // 2. Device Info - // 3. Group ID ( When joining an operating P2P Group ) - - // P2P Capability ATTR - // Type: - p2p_ie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - RTW_PUT_LE16(p2p_ie + p2pielen, 0x0002); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - // Group Capability Bitmap, 1 byte - _rtw_memcpy(p2p_ie + p2pielen, &capability, 2); - p2pielen += 2; - - - // Device Info ATTR - // Type: - p2p_ie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - RTW_PUT_LE16(p2p_ie + p2pielen, devinfo_contentlen); - p2pielen += 2; - - // Value: - _rtw_memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen); - p2pielen += devinfo_contentlen; - - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2p_ie, &p2p_ielen); - //p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, NULL, 0, pwdinfo->tx_prov_disc_info.peerDevAddr); - //pframe += p2pielen; - pattrib->pktlen += p2p_ielen; - - wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 - - // Config Method - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - // Value: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request ); - wpsielen += 2; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - -#ifdef CONFIG_WFD - wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; -#endif //CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - //dump_mgntframe(padapter, pmgntframe); - if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) - DBG_8192C("%s, ack to\n", __func__); - - //if(wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) - //{ - // DBG_8192C("waiting for p2p peer key-in PIN CODE\n"); - // rtw_msleep_os(15000); // 15 sec for key in PIN CODE, workaround for GS2 before issuing Nego Req. - //} - -} - -static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - struct wireless_dev *wdev, -#else - struct net_device *ndev, -#endif - struct ieee80211_channel * channel, -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - enum nl80211_channel_type channel_type, -#endif - unsigned int duration, u64 *cookie) -{ - s32 err = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - u8 remain_ch = (u8) ieee80211_frequency_to_channel(channel->center_freq); - u8 ready_on_channel = _FALSE; - - DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter), remain_ch, duration); - - if(pcfg80211_wdinfo->is_ro_ch == _TRUE) - { - DBG_8192C("%s, cancel ro ch timer\n", __func__); - - _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); - -#ifdef CONFIG_CONCURRENT_MODE - ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); -#endif //CONFIG_CONCURRENT_MODE - - p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK); - } - - pcfg80211_wdinfo->is_ro_ch = _TRUE; - - if(_FAIL == rtw_pwr_wakeup(padapter)) { - err = -EFAULT; - goto exit; - } - - _rtw_memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel, sizeof(struct ieee80211_channel)); - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - pcfg80211_wdinfo->remain_on_ch_type= channel_type; - #endif - pcfg80211_wdinfo->remain_on_ch_cookie= *cookie; - - rtw_scan_abort(padapter); -#ifdef CONFIG_CONCURRENT_MODE - if(rtw_buddy_adapter_up(padapter)) - rtw_scan_abort(padapter->pbuddy_adapter); -#endif //CONFIG_CONCURRENT_MODE - - //if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE; - } - else - { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); -#endif - } - - - rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - - - if(duration < 400) - duration = duration*3;//extend from exper. - - -#ifdef CONFIG_CONCURRENT_MODE - if(check_buddy_fwstate(padapter, _FW_LINKED) && - (durationext_listen_interval)) - { - duration = duration + pwdinfo->ext_listen_interval; - } -#endif - - pcfg80211_wdinfo->restore_channel = pmlmeext->cur_channel; - - if(rtw_ch_set_search_ch(pmlmeext->channel_set, remain_ch) >= 0) { -#ifdef CONFIG_CONCURRENT_MODE - if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) - { - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - if(remain_ch != pbuddy_mlmeext->cur_channel) - { - if(ATOMIC_READ(&pwdev_priv->switch_ch_to)==1 || - (remain_ch != pmlmeext->cur_channel)) - { - DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); - issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); - - ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); - - DBG_8192C("%s, set switch ch timer, duration=%d\n", __func__, duration-pwdinfo->ext_listen_interval); - _set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval); - } - } - - ready_on_channel = _TRUE; - //pmlmeext->cur_channel = remain_ch; - //set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - }else -#endif //CONFIG_CONCURRENT_MODE - if(remain_ch != pmlmeext->cur_channel ) - { - ready_on_channel = _TRUE; - //pmlmeext->cur_channel = remain_ch; - //set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - } - } else { - DBG_871X("%s remain_ch:%u not in channel plan!!!!\n", __FUNCTION__, remain_ch); - } - - - //call this after other things have been done -#ifdef CONFIG_CONCURRENT_MODE - if(ATOMIC_READ(&pwdev_priv->ro_ch_to)==1 || - (remain_ch != pmlmeext->cur_channel)) - { - u8 co_channel = 0xff; - ATOMIC_SET(&pwdev_priv->ro_ch_to, 0); -#endif - - if(ready_on_channel == _TRUE) - { - if ( !check_fwstate(&padapter->mlmepriv, _FW_LINKED ) ) - { - pmlmeext->cur_channel = remain_ch; - - - set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - } - } - DBG_8192C("%s, set ro ch timer, duration=%d\n", __func__, duration); - _set_timer( &pcfg80211_wdinfo->remain_on_ch_timer, duration); - -#ifdef CONFIG_CONCURRENT_MODE - } -#endif - - rtw_cfg80211_ready_on_channel(padapter, *cookie, channel, channel_type, duration, GFP_KERNEL); - - pwdinfo->listen_channel = pmlmeext->cur_channel; - -exit: - if (err) - pcfg80211_wdinfo->is_ro_ch = _FALSE; - - return err; -} - -static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - struct wireless_dev *wdev, -#else - struct net_device *ndev, -#endif - u64 cookie) -{ - s32 err = 0; - _adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - - DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); - - if (pcfg80211_wdinfo->is_ro_ch == _TRUE) { - DBG_8192C("%s, cancel ro ch timer\n", __func__); - _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); - #ifdef CONFIG_CONCURRENT_MODE - ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); - #endif - p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK); - } - - #if 0 - // Disable P2P Listen State - if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - { - if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - { - _cancel_timer_ex( &pwdinfo->find_phase_timer ); - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); - - rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE); - _rtw_memset(pwdinfo, 0x00, sizeof(struct wifidirect_info)); - } - } - else - #endif - { - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); -#endif - } - pcfg80211_wdinfo->is_ro_ch = _FALSE; - - return err; -} - -#endif //CONFIG_P2P - -static int _cfg80211_rtw_mgmt_tx(_adapter *padapter, u8 tx_ch, const u8 *buf, size_t len) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - int ret = _FAIL; - bool ack = _TRUE; - struct rtw_ieee80211_hdr *pwlanhdr; - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - //struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; - - if(_FAIL == rtw_pwr_wakeup(padapter)) { - ret = -EFAULT; - goto exit; - } - - rtw_set_scan_deny(padapter, 1000); - - rtw_scan_abort(padapter); - #ifdef CONFIG_CONCURRENT_MODE - if(rtw_buddy_adapter_up(padapter)) - rtw_scan_abort(padapter->pbuddy_adapter); - #endif /* CONFIG_CONCURRENT_MODE */ - - if (padapter->cfg80211_wdinfo.is_ro_ch == _TRUE) { - //DBG_8192C("%s, cancel ro ch timer\n", __func__); - //_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); - //padapter->cfg80211_wdinfo.is_ro_ch = _FALSE; - #ifdef CONFIG_CONCURRENT_MODE - DBG_8192C("%s, extend ro ch time\n", __func__); - _set_timer( &padapter->cfg80211_wdinfo.remain_on_ch_timer, pwdinfo->ext_listen_period); - #endif //CONFIG_CONCURRENT_MODE - } - -#ifdef CONFIG_CONCURRENT_MODE - if (check_buddy_fwstate(padapter, _FW_LINKED )) { - u8 co_channel=0xff; - PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; - struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; - - co_channel = rtw_get_oper_ch(padapter); - - if (tx_ch != pbuddy_mlmeext->cur_channel) { - if (ATOMIC_READ(&pwdev_priv->switch_ch_to)==1) { - DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); - issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); - - ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); - - //DBG_8192C("%s, set switch ch timer, period=%d\n", __func__, pwdinfo->ext_listen_period); - //_set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period); - } - - DBG_8192C("%s, set switch ch timer, period=%d\n", __func__, pwdinfo->ext_listen_period); - _set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period); - } - - if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED )) - pmlmeext->cur_channel = tx_ch; - - if (tx_ch != co_channel) - set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - }else -#endif //CONFIG_CONCURRENT_MODE - //if (tx_ch != pmlmeext->cur_channel) { - if(tx_ch != rtw_get_oper_ch(padapter)) { - if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED )) - pmlmeext->cur_channel = tx_ch; - set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - } - - //starting alloc mgmt frame to dump it - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - //ret = -ENOMEM; - ret = _FAIL; - goto exit; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->retry_ctrl = _FALSE; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - _rtw_memcpy(pframe, (void*)buf, len); - pattrib->pktlen = len; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - //update seq number - pmlmeext->mgnt_seq = GetSequence(pwlanhdr); - pattrib->seqnum = pmlmeext->mgnt_seq; - pmlmeext->mgnt_seq++; - -#ifdef CONFIG_WFD - { - struct wifi_display_info *pwfd_info; - - pwfd_info = padapter->wdinfo.wfd_info; - - if ( _TRUE == pwfd_info->wfd_enable ) - { - rtw_append_wfd_ie( padapter, pframe, &pattrib->pktlen ); - } - } -#endif // CONFIG_WFD - - pattrib->last_txcmdsz = pattrib->pktlen; - - if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) - { - ack = _FALSE; - ret = _FAIL; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ack == _FAIL\n", __func__); - #endif - } - else - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ack=%d, ok!\n", __func__, ack); - #endif - ret = _SUCCESS; - } - -exit: - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ret=%d\n", __func__, ret); - #endif - - return ret; - -} - -static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - struct wireless_dev *wdev, -#else - struct net_device *ndev, -#endif - struct ieee80211_channel *chan, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - bool offchan, -#endif -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - enum nl80211_channel_type channel_type, - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - bool channel_type_valid, - #endif -#endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - unsigned int wait, -#endif - const u8 *buf, size_t len, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) - bool no_cck, -#endif -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) - bool dont_wait_for_ack, -#endif - u64 *cookie) -{ - _adapter *padapter = (_adapter *)wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - int ret = 0; - int tx_ret; - u32 dump_limit = RTW_MAX_MGMT_TX_CNT; - u32 dump_cnt = 0; - bool ack = _TRUE; - u8 tx_ch = (u8)ieee80211_frequency_to_channel(chan->center_freq); - u8 category, action; - int type = (-1); - u32 start = rtw_get_current_time(); - - /* cookie generation */ - *cookie = (unsigned long) buf; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X(FUNC_ADPT_FMT" len=%zu, ch=%d" - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - ", ch_type=%d" - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - ", channel_type_valid=%d" - #endif - #endif - "\n", FUNC_ADPT_ARG(padapter), - len, tx_ch - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - , channel_type - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - , channel_type_valid - #endif - #endif - ); -#endif /* CONFIG_DEBUG_CFG80211 */ - - /* indicate ack before issue frame to avoid racing with rsp frame */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - rtw_cfg80211_mgmt_tx_status(padapter, *cookie, buf, len, ack, GFP_KERNEL); -#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35)) - cfg80211_action_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); -#endif - - if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) { - DBG_8192C(FUNC_ADPT_FMT" frame_control:0x%x\n", FUNC_ADPT_ARG(padapter), - le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); - goto exit; - } - - DBG_8192C("RTW_Tx:tx_ch=%d, da="MAC_FMT"\n", tx_ch, MAC_ARG(GetAddr1Ptr(buf))); - #ifdef CONFIG_P2P - if((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0) - goto dump; - #endif - if (category == RTW_WLAN_CATEGORY_PUBLIC) - DBG_871X("RTW_Tx:%s\n", action_public_str(action)); - else - DBG_871X("RTW_Tx:category(%u), action(%u)\n", category, action); - -dump: - do { - dump_cnt++; - tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len); - } while (dump_cnt < dump_limit && tx_ret != _SUCCESS); - - if (tx_ret != _SUCCESS || dump_cnt > 1) { - DBG_871X(FUNC_ADPT_FMT" %s (%d/%d) in %d ms\n", FUNC_ADPT_ARG(padapter), - tx_ret==_SUCCESS?"OK":"FAIL", dump_cnt, dump_limit, rtw_get_passing_time_ms(start)); - } - - switch (type) { - case P2P_GO_NEGO_CONF: - rtw_clear_scan_deny(padapter); - break; - case P2P_INVIT_RESP: - if (pwdev_priv->invit_info.flags & BIT(0) - && pwdev_priv->invit_info.status == 0) - { - DBG_871X(FUNC_ADPT_FMT" agree with invitation of persistent group\n", - FUNC_ADPT_ARG(padapter)); - rtw_set_scan_deny(padapter, 5000); - rtw_pwr_wakeup_ex(padapter, 5000); - rtw_clear_scan_deny(padapter); - } - break; - } - -exit: - return ret; -} - -static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy, -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) - struct wireless_dev *wdev, -#else - struct net_device *ndev, -#endif - u16 frame_type, bool reg) -{ - _adapter *adapter = wiphy_to_adapter(wiphy); - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_871X(FUNC_ADPT_FMT" frame_type:%x, reg:%d\n", FUNC_ADPT_ARG(adapter), - frame_type, reg); -#endif - - if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ)) - return; - - return; -} - -static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len) -{ - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; - u32 p2p_ielen = 0; - u8 wps_oui[8]={0x0,0x50,0xf2,0x04}; - u8 *p2p_ie; - u32 wfd_ielen = 0; - u8 *wfd_ie; - _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - DBG_871X(FUNC_NDEV_FMT" ielen=%d\n", FUNC_NDEV_ARG(ndev), len); - - if(len>0) - { - if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("bcn_wps_ielen=%d\n", wps_ielen); - #endif - - if(pmlmepriv->wps_beacon_ie) - { - u32 free_len = pmlmepriv->wps_beacon_ie_len; - pmlmepriv->wps_beacon_ie_len = 0; - rtw_mfree(pmlmepriv->wps_beacon_ie, free_len); - pmlmepriv->wps_beacon_ie = NULL; - } - - pmlmepriv->wps_beacon_ie = rtw_malloc(wps_ielen); - if ( pmlmepriv->wps_beacon_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - - _rtw_memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen); - pmlmepriv->wps_beacon_ie_len = wps_ielen; - - update_beacon(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, _TRUE); - - } - - //buf += wps_ielen; - //len -= wps_ielen; - - #ifdef CONFIG_P2P - if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("bcn_p2p_ielen=%d\n", p2p_ielen); - #endif - - if(pmlmepriv->p2p_beacon_ie) - { - u32 free_len = pmlmepriv->p2p_beacon_ie_len; - pmlmepriv->p2p_beacon_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_beacon_ie, free_len); - pmlmepriv->p2p_beacon_ie = NULL; - } - - pmlmepriv->p2p_beacon_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_beacon_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - - _rtw_memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_beacon_ie_len = p2p_ielen; - - } - #endif //CONFIG_P2P - - //buf += p2p_ielen; - //len -= p2p_ielen; - - #ifdef CONFIG_WFD - if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("bcn_wfd_ielen=%d\n", wfd_ielen); - #endif - - if(pmlmepriv->wfd_beacon_ie) - { - u32 free_len = pmlmepriv->wfd_beacon_ie_len; - pmlmepriv->wfd_beacon_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_beacon_ie, free_len); - pmlmepriv->wfd_beacon_ie = NULL; - } - - pmlmepriv->wfd_beacon_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_beacon_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len); - } - #endif //CONFIG_WFD - - pmlmeext->bstart_bss = _TRUE; - - } - - return ret; - -} - -static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net, char *buf, int len) -{ - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; - u32 p2p_ielen = 0; - u8 *p2p_ie; - u32 wfd_ielen = 0; - u8 *wfd_ie; - _adapter *padapter = (_adapter *)rtw_netdev_priv(net); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ielen=%d\n", __func__, len); -#endif - - if(len>0) - { - if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) - { - uint attr_contentlen = 0; - u16 uconfig_method, *puconfig_method = NULL; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_resp_wps_ielen=%d\n", wps_ielen); - #endif - - if(pmlmepriv->wps_probe_resp_ie) - { - u32 free_len = pmlmepriv->wps_probe_resp_ie_len; - pmlmepriv->wps_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->wps_probe_resp_ie, free_len); - pmlmepriv->wps_probe_resp_ie = NULL; - } - - pmlmepriv->wps_probe_resp_ie = rtw_malloc(wps_ielen); - if ( pmlmepriv->wps_probe_resp_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - - //add PUSH_BUTTON config_method by driver self in wpsie of probe_resp at GO Mode - if ( (puconfig_method = (u16*)rtw_get_wps_attr_content( wps_ie, wps_ielen, WPS_ATTR_CONF_METHOD , NULL, &attr_contentlen)) != NULL ) - { - #ifdef CONFIG_DEBUG_CFG80211 - //printk("config_method in wpsie of probe_resp = 0x%x\n", be16_to_cpu(*puconfig_method)); - #endif - - uconfig_method = WPS_CM_PUSH_BUTTON; - uconfig_method = cpu_to_be16( uconfig_method ); - - *puconfig_method |= uconfig_method; - } - - _rtw_memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen); - pmlmepriv->wps_probe_resp_ie_len = wps_ielen; - - } - - //buf += wps_ielen; - //len -= wps_ielen; - - #ifdef CONFIG_P2P - if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) - { - u8 is_GO = _FALSE; - u32 attr_contentlen = 0; - u16 cap_attr=0; - - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_resp_p2p_ielen=%d\n", p2p_ielen); - #endif - - //Check P2P Capability ATTR - if( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen) ) - { - u8 grp_cap=0; - //DBG_8192C( "[%s] Got P2P Capability Attr!!\n", __FUNCTION__ ); - cap_attr = le16_to_cpu(cap_attr); - grp_cap = (u8)((cap_attr >> 8)&0xff); - - is_GO = (grp_cap&BIT(0)) ? _TRUE:_FALSE; - - if(is_GO) - DBG_8192C("Got P2P Capability Attr, grp_cap=0x%x, is_GO\n", grp_cap); - } - - - if(is_GO == _FALSE) - { - if(pmlmepriv->p2p_probe_resp_ie) - { - u32 free_len = pmlmepriv->p2p_probe_resp_ie_len; - pmlmepriv->p2p_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_probe_resp_ie, free_len); - pmlmepriv->p2p_probe_resp_ie = NULL; - } - - pmlmepriv->p2p_probe_resp_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_probe_resp_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen; - } - else - { - if(pmlmepriv->p2p_go_probe_resp_ie) - { - u32 free_len = pmlmepriv->p2p_go_probe_resp_ie_len; - pmlmepriv->p2p_go_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->p2p_go_probe_resp_ie, free_len); - pmlmepriv->p2p_go_probe_resp_ie = NULL; - } - - pmlmepriv->p2p_go_probe_resp_ie = rtw_malloc(p2p_ielen); - if ( pmlmepriv->p2p_go_probe_resp_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->p2p_go_probe_resp_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen; - } - - } - #endif //CONFIG_P2P - - //buf += p2p_ielen; - //len -= p2p_ielen; - - #ifdef CONFIG_WFD - if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) - { - #ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("probe_resp_wfd_ielen=%d\n", wfd_ielen); - #endif - - if(pmlmepriv->wfd_probe_resp_ie) - { - u32 free_len = pmlmepriv->wfd_probe_resp_ie_len; - pmlmepriv->wfd_probe_resp_ie_len = 0; - rtw_mfree(pmlmepriv->wfd_probe_resp_ie, free_len); - pmlmepriv->wfd_probe_resp_ie = NULL; - } - - pmlmepriv->wfd_probe_resp_ie = rtw_malloc(wfd_ielen); - if ( pmlmepriv->wfd_probe_resp_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len); - } - #endif //CONFIG_WFD - - } - - return ret; - -} - -static int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net, char *buf, int len) -{ - int ret = 0; - _adapter *padapter = (_adapter *)rtw_netdev_priv(net); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - DBG_8192C("%s, ielen=%d\n", __func__, len); - - if(len>0) - { - if(pmlmepriv->wps_assoc_resp_ie) - { - u32 free_len = pmlmepriv->wps_assoc_resp_ie_len; - pmlmepriv->wps_assoc_resp_ie_len = 0; - rtw_mfree(pmlmepriv->wps_assoc_resp_ie, free_len); - pmlmepriv->wps_assoc_resp_ie = NULL; - } - - pmlmepriv->wps_assoc_resp_ie = rtw_malloc(len); - if ( pmlmepriv->wps_assoc_resp_ie == NULL) { - DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); - return -EINVAL; - - } - _rtw_memcpy(pmlmepriv->wps_assoc_resp_ie, buf, len); - pmlmepriv->wps_assoc_resp_ie_len = len; - } - - return ret; - -} - -int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, - int type) -{ - int ret = 0; - uint wps_ielen = 0; - u32 p2p_ielen = 0; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8192C("%s, ielen=%d\n", __func__, len); -#endif - - if( (rtw_get_wps_ie(buf, len, NULL, &wps_ielen) && (wps_ielen>0)) - #ifdef CONFIG_P2P - || (rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen) && (p2p_ielen>0)) - #endif - ) - { - if (net != NULL) - { - switch (type) - { - case 0x1: //BEACON - ret = rtw_cfg80211_set_beacon_wpsp2pie(net, buf, len); - break; - case 0x2: //PROBE_RESP - ret = rtw_cfg80211_set_probe_resp_wpsp2pie(net, buf, len); - break; - case 0x4: //ASSOC_RESP - ret = rtw_cfg80211_set_assoc_resp_wpsp2pie(net, buf, len); - break; - } - } - } - - return ret; - -} - -static struct cfg80211_ops rtw_cfg80211_ops = { - .change_virtual_intf = cfg80211_rtw_change_iface, - .add_key = cfg80211_rtw_add_key, - .get_key = cfg80211_rtw_get_key, - .del_key = cfg80211_rtw_del_key, - .set_default_key = cfg80211_rtw_set_default_key, - .get_station = cfg80211_rtw_get_station, - .scan = cfg80211_rtw_scan, - .set_wiphy_params = cfg80211_rtw_set_wiphy_params, - .connect = cfg80211_rtw_connect, - .disconnect = cfg80211_rtw_disconnect, - .join_ibss = cfg80211_rtw_join_ibss, - .leave_ibss = cfg80211_rtw_leave_ibss, - .set_tx_power = cfg80211_rtw_set_txpower, - .get_tx_power = cfg80211_rtw_get_txpower, - .set_power_mgmt = cfg80211_rtw_set_power_mgmt, - .set_pmksa = cfg80211_rtw_set_pmksa, - .del_pmksa = cfg80211_rtw_del_pmksa, - .flush_pmksa = cfg80211_rtw_flush_pmksa, - -#ifdef CONFIG_AP_MODE - .add_virtual_intf = cfg80211_rtw_add_virtual_intf, - .del_virtual_intf = cfg80211_rtw_del_virtual_intf, - - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE) - .add_beacon = cfg80211_rtw_add_beacon, - .set_beacon = cfg80211_rtw_set_beacon, - .del_beacon = cfg80211_rtw_del_beacon, - #else - .start_ap = cfg80211_rtw_start_ap, - .change_beacon = cfg80211_rtw_change_beacon, - .stop_ap = cfg80211_rtw_stop_ap, - #endif - - .add_station = cfg80211_rtw_add_station, - .del_station = cfg80211_rtw_del_station, - .change_station = cfg80211_rtw_change_station, - .dump_station = cfg80211_rtw_dump_station, - .change_bss = cfg80211_rtw_change_bss, - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) - .set_channel = cfg80211_rtw_set_channel, - #endif - //.auth = cfg80211_rtw_auth, - //.assoc = cfg80211_rtw_assoc, -#endif //CONFIG_AP_MODE - -#ifdef CONFIG_P2P - .remain_on_channel = cfg80211_rtw_remain_on_channel, - .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel, -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) - .mgmt_tx = cfg80211_rtw_mgmt_tx, - .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, -#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35)) - .action = cfg80211_rtw_mgmt_tx, -#endif -}; - -static void rtw_cfg80211_init_ht_capab(struct ieee80211_sta_ht_cap *ht_cap, enum ieee80211_band band, u8 rf_type) -{ - -#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */ -#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */ - - ht_cap->ht_supported = _TRUE; - - ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | - IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 | - IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU; - - /* - *Maximum length of AMPDU that the STA can receive. - *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets) - */ - ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; - - /*Minimum MPDU start spacing , */ - ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; - - ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; - - /* - *hw->wiphy->bands[IEEE80211_BAND_2GHZ] - *base on ant_num - *rx_mask: RX mask - *if rx_ant =1 rx_mask[0]=0xff;==>MCS0-MCS7 - *if rx_ant =2 rx_mask[1]=0xff;==>MCS8-MCS15 - *if rx_ant >=3 rx_mask[2]=0xff; - *if BW_40 rx_mask[4]=0x01; - *highest supported RX rate - */ - if(rf_type == RF_1T1R) - { - ht_cap->mcs.rx_mask[0] = 0xFF; - ht_cap->mcs.rx_mask[1] = 0x00; - ht_cap->mcs.rx_mask[4] = 0x01; - - ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS7; - } - else if((rf_type == RF_1T2R) || (rf_type==RF_2T2R)) - { - ht_cap->mcs.rx_mask[0] = 0xFF; - ht_cap->mcs.rx_mask[1] = 0xFF; - ht_cap->mcs.rx_mask[4] = 0x01; - - ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS15; - } - else - { - DBG_8192C("%s, error rf_type=%d\n", __func__, rf_type); - } - -} - -void rtw_cfg80211_init_wiphy(_adapter *padapter) -{ - u8 rf_type; - struct ieee80211_supported_band *bands; - struct wireless_dev *pwdev = padapter->rtw_wdev; - struct wiphy *wiphy = pwdev->wiphy; - - rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - - DBG_8192C("%s:rf_type=%d\n", __func__, rf_type); - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ - { - bands = wiphy->bands[IEEE80211_BAND_2GHZ]; - if(bands) - rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_2GHZ, rf_type); - } - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ - { - bands = wiphy->bands[IEEE80211_BAND_5GHZ]; - if(bands) - rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_5GHZ, rf_type); - } -} - -/* -struct ieee80211_iface_limit rtw_limits[] = { - { .max = 1, .types = BIT(NL80211_IFTYPE_STATION) - | BIT(NL80211_IFTYPE_ADHOC) -#ifdef CONFIG_AP_MODE - | BIT(NL80211_IFTYPE_AP) -#endif -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - | BIT(NL80211_IFTYPE_P2P_CLIENT) - | BIT(NL80211_IFTYPE_P2P_GO) -#endif - }, - {.max = 1, .types = BIT(NL80211_IFTYPE_MONITOR)}, -}; - -struct ieee80211_iface_combination rtw_combinations = { - .limits = rtw_limits, - .n_limits = ARRAY_SIZE(rtw_limits), - .max_interfaces = 2, - .num_different_channels = 1, -}; -*/ - -static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy) -{ - - wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; - - wiphy->max_scan_ssids = RTW_SSID_SCAN_AMOUNT; - wiphy->max_scan_ie_len = RTW_SCAN_IE_LEN_MAX; - wiphy->max_num_pmkids = RTW_MAX_NUM_PMKIDS; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) - wiphy->max_remain_on_channel_duration = RTW_MAX_REMAIN_ON_CHANNEL_DURATION; -#endif - - wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) - | BIT(NL80211_IFTYPE_ADHOC) -#ifdef CONFIG_AP_MODE - | BIT(NL80211_IFTYPE_AP) - | BIT(NL80211_IFTYPE_MONITOR) -#endif -#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) - | BIT(NL80211_IFTYPE_P2P_CLIENT) - | BIT(NL80211_IFTYPE_P2P_GO) -#endif - ; - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) -#ifdef CONFIG_AP_MODE - wiphy->mgmt_stypes = rtw_cfg80211_default_mgmt_stypes; -#endif //CONFIG_AP_MODE -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)) - wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR); -#endif - - /* - wiphy->iface_combinations = &rtw_combinations; - wiphy->n_iface_combinations = 1; - */ - - wiphy->cipher_suites = rtw_cipher_suites; - wiphy->n_cipher_suites = ARRAY_SIZE(rtw_cipher_suites); - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ - wiphy->bands[IEEE80211_BAND_2GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_2GHZ); - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ - wiphy->bands[IEEE80211_BAND_5GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_5GHZ); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) && LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)) - wiphy->flags |= WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS; -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) - wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; - wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME; -#endif - - if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) - wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; - else - wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; -} - -int rtw_wdev_alloc(_adapter *padapter, struct device *dev) -{ - int ret = 0; - struct wiphy *wiphy; - struct wireless_dev *wdev; - struct rtw_wdev_priv *pwdev_priv; - struct net_device *pnetdev = padapter->pnetdev; - - DBG_8192C("%s(padapter=%p)\n", __func__, padapter); - - /* wiphy */ - wiphy = wiphy_new(&rtw_cfg80211_ops, sizeof(struct rtw_wdev_priv)); - if (!wiphy) { - DBG_8192C("Couldn't allocate wiphy device\n"); - ret = -ENOMEM; - goto exit; - } - set_wiphy_dev(wiphy, dev); - rtw_cfg80211_preinit_wiphy(padapter, wiphy); - - ret = wiphy_register(wiphy); - if (ret < 0) { - DBG_8192C("Couldn't register wiphy device\n"); - goto free_wiphy; - } - - /* wdev */ - wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); - if (!wdev) { - DBG_8192C("Couldn't allocate wireless device\n"); - ret = -ENOMEM; - goto unregister_wiphy; - } - wdev->wiphy = wiphy; - wdev->netdev = pnetdev; - //wdev->iftype = NL80211_IFTYPE_STATION; - wdev->iftype = NL80211_IFTYPE_MONITOR; // for rtw_setopmode_cmd() in cfg80211_rtw_change_iface() - padapter->rtw_wdev = wdev; - pnetdev->ieee80211_ptr = wdev; - - //init pwdev_priv - pwdev_priv = wdev_to_priv(wdev); - pwdev_priv->rtw_wdev = wdev; - pwdev_priv->pmon_ndev = NULL; - pwdev_priv->ifname_mon[0] = '\0'; - pwdev_priv->padapter = padapter; - pwdev_priv->scan_request = NULL; - _rtw_spinlock_init(&pwdev_priv->scan_req_lock); - - pwdev_priv->p2p_enabled = _FALSE; - pwdev_priv->provdisc_req_issued = _FALSE; - rtw_wdev_invit_info_init(&pwdev_priv->invit_info); - - pwdev_priv->bandroid_scan = _FALSE; - - if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) - pwdev_priv->power_mgmt = _TRUE; - else - pwdev_priv->power_mgmt = _FALSE; - -#ifdef CONFIG_CONCURRENT_MODE - ATOMIC_SET(&pwdev_priv->switch_ch_to, 1); - ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); -#endif - - return ret; - - rtw_mfree((u8*)wdev, sizeof(struct wireless_dev)); -unregister_wiphy: - wiphy_unregister(wiphy); - free_wiphy: - wiphy_free(wiphy); -exit: - return ret; - -} - -void rtw_wdev_free(struct wireless_dev *wdev) -{ - struct rtw_wdev_priv *pwdev_priv; - - DBG_8192C("%s(wdev=%p)\n", __func__, wdev); - - if (!wdev) - return; - - pwdev_priv = wdev_to_priv(wdev); - - rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_2GHZ]); - rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_5GHZ]); - - wiphy_free(wdev->wiphy); - - rtw_mfree((u8*)wdev, sizeof(struct wireless_dev)); -} - -void rtw_wdev_unregister(struct wireless_dev *wdev) -{ - struct rtw_wdev_priv *pwdev_priv; - - DBG_8192C("%s(wdev=%p)\n", __func__, wdev); - - if (!wdev) - return; - - pwdev_priv = wdev_to_priv(wdev); - - rtw_cfg80211_indicate_scan_done(pwdev_priv, _TRUE); - - if (pwdev_priv->pmon_ndev) { - DBG_8192C("%s, unregister monitor interface\n", __func__); - unregister_netdev(pwdev_priv->pmon_ndev); - } - - wiphy_unregister(wdev->wiphy); -} - -#endif //CONFIG_IOCTL_CFG80211 - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _IOCTL_CFG80211_C_ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_IOCTL_CFG80211 + +#include "ioctl_cfg80211.h" + +#define RTW_MAX_MGMT_TX_CNT (8) + +#define RTW_SCAN_IE_LEN_MAX 2304 +#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 65535 //ms +#define RTW_MAX_NUM_PMKIDS 4 + +#define RTW_CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */ + +static const u32 rtw_cipher_suites[] = { + WLAN_CIPHER_SUITE_WEP40, + WLAN_CIPHER_SUITE_WEP104, + WLAN_CIPHER_SUITE_TKIP, + WLAN_CIPHER_SUITE_CCMP, +#ifdef CONFIG_IEEE80211W + WLAN_CIPHER_SUITE_AES_CMAC, +#endif //CONFIG_IEEE80211W +}; + +#define RATETAB_ENT(_rate, _rateid, _flags) \ + { \ + .bitrate = (_rate), \ + .hw_value = (_rateid), \ + .flags = (_flags), \ + } + +#define CHAN2G(_channel, _freq, _flags) { \ + .band = IEEE80211_BAND_2GHZ, \ + .center_freq = (_freq), \ + .hw_value = (_channel), \ + .flags = (_flags), \ + .max_antenna_gain = 0, \ + .max_power = 30, \ +} + +#define CHAN5G(_channel, _flags) { \ + .band = IEEE80211_BAND_5GHZ, \ + .center_freq = 5000 + (5 * (_channel)), \ + .hw_value = (_channel), \ + .flags = (_flags), \ + .max_antenna_gain = 0, \ + .max_power = 30, \ +} + +static struct ieee80211_rate rtw_rates[] = { + RATETAB_ENT(10, 0x1, 0), + RATETAB_ENT(20, 0x2, 0), + RATETAB_ENT(55, 0x4, 0), + RATETAB_ENT(110, 0x8, 0), + RATETAB_ENT(60, 0x10, 0), + RATETAB_ENT(90, 0x20, 0), + RATETAB_ENT(120, 0x40, 0), + RATETAB_ENT(180, 0x80, 0), + RATETAB_ENT(240, 0x100, 0), + RATETAB_ENT(360, 0x200, 0), + RATETAB_ENT(480, 0x400, 0), + RATETAB_ENT(540, 0x800, 0), +}; + +#define rtw_a_rates (rtw_rates + 4) +#define RTW_A_RATES_NUM 8 +#define rtw_g_rates (rtw_rates + 0) +#define RTW_G_RATES_NUM 12 + +#define RTW_2G_CHANNELS_NUM 14 +#define RTW_5G_CHANNELS_NUM 37 + +static struct ieee80211_channel rtw_2ghz_channels[] = { + CHAN2G(1, 2412, 0), + CHAN2G(2, 2417, 0), + CHAN2G(3, 2422, 0), + CHAN2G(4, 2427, 0), + CHAN2G(5, 2432, 0), + CHAN2G(6, 2437, 0), + CHAN2G(7, 2442, 0), + CHAN2G(8, 2447, 0), + CHAN2G(9, 2452, 0), + CHAN2G(10, 2457, 0), + CHAN2G(11, 2462, 0), + CHAN2G(12, 2467, 0), + CHAN2G(13, 2472, 0), + CHAN2G(14, 2484, 0), +}; + +static struct ieee80211_channel rtw_5ghz_a_channels[] = { + CHAN5G(34, 0), CHAN5G(36, 0), + CHAN5G(38, 0), CHAN5G(40, 0), + CHAN5G(42, 0), CHAN5G(44, 0), + CHAN5G(46, 0), CHAN5G(48, 0), + CHAN5G(52, 0), CHAN5G(56, 0), + CHAN5G(60, 0), CHAN5G(64, 0), + CHAN5G(100, 0), CHAN5G(104, 0), + CHAN5G(108, 0), CHAN5G(112, 0), + CHAN5G(116, 0), CHAN5G(120, 0), + CHAN5G(124, 0), CHAN5G(128, 0), + CHAN5G(132, 0), CHAN5G(136, 0), + CHAN5G(140, 0), CHAN5G(149, 0), + CHAN5G(153, 0), CHAN5G(157, 0), + CHAN5G(161, 0), CHAN5G(165, 0), + CHAN5G(184, 0), CHAN5G(188, 0), + CHAN5G(192, 0), CHAN5G(196, 0), + CHAN5G(200, 0), CHAN5G(204, 0), + CHAN5G(208, 0), CHAN5G(212, 0), + CHAN5G(216, 0), +}; + + +void rtw_2g_channels_init(struct ieee80211_channel *channels) +{ + _rtw_memcpy((void*)channels, (void*)rtw_2ghz_channels, + sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM + ); +} + +void rtw_5g_channels_init(struct ieee80211_channel *channels) +{ + _rtw_memcpy((void*)channels, (void*)rtw_5ghz_a_channels, + sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM + ); +} + +void rtw_2g_rates_init(struct ieee80211_rate *rates) +{ + _rtw_memcpy(rates, rtw_g_rates, + sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM + ); +} + +void rtw_5g_rates_init(struct ieee80211_rate *rates) +{ + _rtw_memcpy(rates, rtw_a_rates, + sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM + ); +} + +struct ieee80211_supported_band *rtw_spt_band_alloc( + enum ieee80211_band band + ) +{ + struct ieee80211_supported_band *spt_band = NULL; + int n_channels, n_bitrates; + + if(band == IEEE80211_BAND_2GHZ) + { + n_channels = RTW_2G_CHANNELS_NUM; + n_bitrates = RTW_G_RATES_NUM; + } + else if(band == IEEE80211_BAND_5GHZ) + { + n_channels = RTW_5G_CHANNELS_NUM; + n_bitrates = RTW_A_RATES_NUM; + } + else + { + goto exit; + } + + spt_band = (struct ieee80211_supported_band *)rtw_zmalloc( + sizeof(struct ieee80211_supported_band) + + sizeof(struct ieee80211_channel)*n_channels + + sizeof(struct ieee80211_rate)*n_bitrates + ); + if(!spt_band) + goto exit; + + spt_band->channels = (struct ieee80211_channel*)(((u8*)spt_band)+sizeof(struct ieee80211_supported_band)); + spt_band->bitrates= (struct ieee80211_rate*)(((u8*)spt_band->channels)+sizeof(struct ieee80211_channel)*n_channels); + spt_band->band = band; + spt_band->n_channels = n_channels; + spt_band->n_bitrates = n_bitrates; + + if(band == IEEE80211_BAND_2GHZ) + { + rtw_2g_channels_init(spt_band->channels); + rtw_2g_rates_init(spt_band->bitrates); + } + else if(band == IEEE80211_BAND_5GHZ) + { + rtw_5g_channels_init(spt_band->channels); + rtw_5g_rates_init(spt_band->bitrates); + } + + //spt_band.ht_cap + +exit: + + return spt_band; +} + +void rtw_spt_band_free(struct ieee80211_supported_band *spt_band) +{ + u32 size; + + if(!spt_band) + return; + + if(spt_band->band == IEEE80211_BAND_2GHZ) + { + size = sizeof(struct ieee80211_supported_band) + + sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM + + sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM; + } + else if(spt_band->band == IEEE80211_BAND_5GHZ) + { + size = sizeof(struct ieee80211_supported_band) + + sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM + + sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM; + } + else + { + + } + rtw_mfree((u8*)spt_band, size); +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) +static const struct ieee80211_txrx_stypes +rtw_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { + [NL80211_IFTYPE_ADHOC] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) + }, + [NL80211_IFTYPE_STATION] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) + }, + [NL80211_IFTYPE_AP] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4) + }, + [NL80211_IFTYPE_AP_VLAN] = { + /* copy AP */ + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4) + }, + [NL80211_IFTYPE_P2P_CLIENT] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) + }, + [NL80211_IFTYPE_P2P_GO] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4) + }, +}; +#endif + +static int rtw_ieee80211_channel_to_frequency(int chan, int band) +{ + /* see 802.11 17.3.8.3.2 and Annex J + * there are overlapping channel numbers in 5GHz and 2GHz bands */ + + if (band == IEEE80211_BAND_5GHZ) { + if (chan >= 182 && chan <= 196) + return 4000 + chan * 5; + else + return 5000 + chan * 5; + } else { /* IEEE80211_BAND_2GHZ */ + if (chan == 14) + return 2484; + else if (chan < 14) + return 2407 + chan * 5; + else + return 0; /* not supported */ + } +} + +#define MAX_BSSINFO_LEN 1000 +struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork) +{ + struct ieee80211_channel *notify_channel; + struct cfg80211_bss *bss = NULL; + //struct ieee80211_supported_band *band; + u16 channel; + u32 freq; + u64 notify_timestamp; + u16 notify_capability; + u16 notify_interval; + u8 *notify_ie; + size_t notify_ielen; + s32 notify_signal; + u8 buf[MAX_BSSINFO_LEN], *pbuf; + size_t len,bssinf_len=0; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + struct wireless_dev *wdev = padapter->rtw_wdev; + struct wiphy *wiphy = wdev->wiphy; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + + //DBG_8192C("%s\n", __func__); + + bssinf_len = pnetwork->network.IELength+sizeof (struct rtw_ieee80211_hdr_3addr); + if(bssinf_len > MAX_BSSINFO_LEN){ + DBG_871X("%s IE Length too long > %d byte \n",__FUNCTION__,MAX_BSSINFO_LEN); + goto exit; + } + + //To reduce PBC Overlap rate + //_enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + if(wdev_to_priv(wdev)->scan_request != NULL) + { + u8 *psr=NULL, sr = 0; + NDIS_802_11_SSID *pssid = &pnetwork->network.Ssid; + struct cfg80211_scan_request *request = wdev_to_priv(wdev)->scan_request; + struct cfg80211_ssid *ssids = request->ssids; + u32 wpsielen=0; + u8 *wpsie=NULL; + + wpsie = rtw_get_wps_ie(pnetwork->network.IEs+_FIXED_IE_LENGTH_, pnetwork->network.IELength-_FIXED_IE_LENGTH_, NULL, &wpsielen); + + if(wpsie && wpsielen>0) + psr = rtw_get_wps_attr_content(wpsie, wpsielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL); + + if (sr != 0) + { + if(request->n_ssids == 1 && request->n_channels == 1) // it means under processing WPS + { + DBG_8192C("ssid=%s, len=%d\n", pssid->Ssid, pssid->SsidLength); + + if(pssid->SsidLength == ssids[0].ssid_len && + _rtw_memcmp(pssid->Ssid, ssids[0].ssid, ssids[0].ssid_len)) + { + DBG_871X("%s, got sr and ssid match!\n", __func__); + } + else + { + if(psr !=NULL) + *psr = 0; //clear sr + +#if 0 + WLAN_BSSID_EX *pselect_network = &pnetwork->network; + struct cfg80211_bss *pselect_bss = NULL; + struct ieee80211_channel *notify_channel = NULL; + u32 freq; + + DBG_871X("%s, got sr, but ssid mismatch, to remove this bss\n", __func__); + + if (pselect_network->Configuration.DSConfig <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(pselect_network->Configuration.DSConfig, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(pselect_network->Configuration.DSConfig, IEEE80211_BAND_5GHZ); + + notify_channel = ieee80211_get_channel(wiphy, freq); + pselect_bss = cfg80211_get_bss(wiphy, NULL/*notify_channel*/, + pselect_network->MacAddress, pselect_network->Ssid.Ssid, + pselect_network->Ssid.SsidLength, 0/*WLAN_CAPABILITY_ESS*/, + 0/*WLAN_CAPABILITY_ESS*/); + + if(pselect_bss) + { + DBG_871X("%s, got bss for cfg80211 for unlinking bss\n", __func__); + + cfg80211_unlink_bss(wiphy, pselect_bss); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) + cfg80211_put_bss(wiphy, pselect_bss); +#else + cfg80211_put_bss(pselect_bss); +#endif + + } + + goto exit; +#endif + } + } + } + } + //_exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + + channel = pnetwork->network.Configuration.DSConfig; + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + + notify_channel = ieee80211_get_channel(wiphy, freq); + + //rtw_get_timestampe_from_ie() + notify_timestamp = jiffies_to_msecs(jiffies)*1000; /* uSec */ + + notify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs)); + notify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs)); + + + notify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_; + notify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_; + + //We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) + if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE && + is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) { + notify_signal = 100*translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm + } else { + notify_signal = 100*translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm + } + + #if 0 + DBG_8192C("bssid: "MAC_FMT"\n", MAC_ARG(pnetwork->network.MacAddress)); + DBG_8192C("Channel: %d(%d)\n", channel, freq); + DBG_8192C("Capability: %X\n", notify_capability); + DBG_8192C("Beacon interval: %d\n", notify_interval); + DBG_8192C("Signal: %d\n", notify_signal); + DBG_8192C("notify_timestamp: %#018llx\n", notify_timestamp); + #endif + + pbuf = buf; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pbuf; + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); + //pmlmeext->mgnt_seq++; + + if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + SetFrameSubType(pbuf, WIFI_BEACON); + } else { + _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); + SetFrameSubType(pbuf, WIFI_PROBERSP); + } + + _rtw_memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN); + + + pbuf += sizeof(struct rtw_ieee80211_hdr_3addr); + len = sizeof (struct rtw_ieee80211_hdr_3addr); + + _rtw_memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength); + len += pnetwork->network.IELength; + + //#ifdef CONFIG_P2P + //if(rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL)) + //{ + // DBG_8192C("%s, got p2p_ie\n", __func__); + //} + //#endif + + +#if 1 + bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)buf, + len, notify_signal, GFP_ATOMIC); +#else + + bss = cfg80211_inform_bss(wiphy, notify_channel, (const u8 *)pnetwork->network.MacAddress, + notify_timestamp, notify_capability, notify_interval, notify_ie, + notify_ielen, notify_signal, GFP_ATOMIC/*GFP_KERNEL*/); +#endif + + if (unlikely(!bss)) { + DBG_8192C(FUNC_ADPT_FMT" bss NULL\n", FUNC_ADPT_ARG(padapter)); + goto exit; + } + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) +#ifndef COMPAT_KERNEL_RELEASE + //patch for cfg80211, update beacon ies to information_elements + if (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON + + if(bss->len_information_elements != bss->len_beacon_ies) + { + bss->information_elements = bss->beacon_ies; + bss->len_information_elements = bss->len_beacon_ies; + } + } +#endif //COMPAT_KERNEL_RELEASE +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38) + +/* + { + if( bss->information_elements == bss->proberesp_ies) + { + if( bss->len_information_elements != bss->len_proberesp_ies) + { + DBG_8192C("error!, len_information_elements != bss->len_proberesp_ies\n"); + } + + } + else if(bss->len_information_elements < bss->len_beacon_ies) + { + bss->information_elements = bss->beacon_ies; + bss->len_information_elements = bss->len_beacon_ies; + } + } +*/ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) + cfg80211_put_bss(wiphy, bss); +#else + cfg80211_put_bss(bss); +#endif + +exit: + return bss; + +} + +/* + Check the given bss is valid by kernel API cfg80211_get_bss() + @padapter : the given adapter + + return _TRUE if bss is valid, _FALSE for not found. +*/ +int rtw_cfg80211_check_bss(_adapter *padapter) +{ + WLAN_BSSID_EX *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network); + struct cfg80211_bss *bss = NULL; + struct ieee80211_channel *notify_channel = NULL; + u32 freq; + + if (!(pnetwork) || !(padapter->rtw_wdev)) + return _FALSE; + + if (pnetwork->Configuration.DSConfig <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(pnetwork->Configuration.DSConfig, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(pnetwork->Configuration.DSConfig, IEEE80211_BAND_5GHZ); + + notify_channel = ieee80211_get_channel(padapter->rtw_wdev->wiphy, freq); + bss = cfg80211_get_bss(padapter->rtw_wdev->wiphy, notify_channel, + pnetwork->MacAddress, pnetwork->Ssid.Ssid, + pnetwork->Ssid.SsidLength, + WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); + + return (bss!=NULL); +} + +void rtw_cfg80211_indicate_connect(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wireless_dev *pwdev = padapter->rtw_wdev; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); +#endif + struct cfg80211_bss *bss = NULL; + + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + if (pwdev->iftype != NL80211_IFTYPE_STATION + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT + #endif + ) { + return; + } + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + return; + +#ifdef CONFIG_P2P + if(pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); + DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); + } + } +#endif //CONFIG_P2P + + if (!rtw_cfg80211_check_bss(padapter)) { + WLAN_BSSID_EX *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network); + struct wlan_network *scanned = pmlmepriv->cur_network_scanned; + + //DBG_871X(FUNC_ADPT_FMT" BSS not found\n", FUNC_ADPT_ARG(padapter)); + + if(scanned == NULL) + rtw_warn_on(1); + + if (_rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE + && _rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE + ) { + if (!rtw_cfg80211_inform_bss(padapter,scanned)) { + DBG_871X(FUNC_ADPT_FMT" inform fail !!\n", FUNC_ADPT_ARG(padapter)); + } else { + //DBG_871X(FUNC_ADPT_FMT" inform success !!\n", FUNC_ADPT_ARG(padapter)); + } + } else { + rtw_warn_on(1); + } + + if (!rtw_cfg80211_check_bss(padapter)) + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" BSS not found !!\n", FUNC_ADPT_ARG(padapter)); + } + + #ifdef CONFIG_LAYER2_ROAMING + if (rtw_to_roaming(padapter) > 0) { + #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) + struct wiphy *wiphy = pwdev->wiphy; + struct ieee80211_channel *notify_channel; + u32 freq; + u16 channel = cur_network->network.Configuration.DSConfig; + + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + + notify_channel = ieee80211_get_channel(wiphy, freq); + #endif + + DBG_871X(FUNC_ADPT_FMT" call cfg80211_roamed\n", FUNC_ADPT_ARG(padapter)); + cfg80211_roamed(padapter->pnetdev + #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) + , notify_channel + #endif + , cur_network->network.MacAddress + , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2 + , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2 + , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6 + , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6 + , GFP_ATOMIC); + } + else + #endif + { + DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state); + cfg80211_connect_result(padapter->pnetdev, cur_network->network.MacAddress + , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2 + , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2 + , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6 + , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6 + , WLAN_STATUS_SUCCESS, GFP_ATOMIC); + DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state); + } +} + +void rtw_cfg80211_indicate_disconnect(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wireless_dev *pwdev = padapter->rtw_wdev; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); +#endif + + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + if (pwdev->iftype != NL80211_IFTYPE_STATION + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT + #endif + ) { + return; + } + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + return; + +#ifdef CONFIG_P2P + if( pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + _cancel_timer_ex( &pwdinfo->find_phase_timer ); + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); + + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + + DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); + } + } +#endif //CONFIG_P2P + + if (!padapter->mlmepriv.not_indic_disco) { + DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state); + + if(pwdev->sme_state==CFG80211_SME_CONNECTING) + cfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0, + WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC/*GFP_KERNEL*/); + else if(pwdev->sme_state==CFG80211_SME_CONNECTED) + cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC); + //else + //DBG_8192C("pwdev->sme_state=%d\n", pwdev->sme_state); + + DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state); + } +} + + +#ifdef CONFIG_AP_MODE +static u8 set_pairwise_key(_adapter *padapter, struct sta_info *psta) +{ + struct cmd_obj* ph2c; + struct set_stakey_parm *psetstakey_para; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if ( ph2c == NULL){ + res= _FAIL; + goto exit; + } + + psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); + if(psetstakey_para==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res=_FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); + + + psetstakey_para->algorithm = (u8)psta->dot118021XPrivacy; + + _rtw_memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN); + + _rtw_memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16); + + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + + return res; + +} + +static int set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid) +{ + u8 keylen; + struct cmd_obj* pcmd; + struct setkey_parm *psetkeyparm; + struct cmd_priv *pcmdpriv=&(padapter->cmdpriv); + int res=_SUCCESS; + + DBG_8192C("%s\n", __FUNCTION__); + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res= _FAIL; + goto exit; + } + psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); + if(psetkeyparm==NULL){ + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); + + psetkeyparm->keyid=(u8)keyid; + if (is_wep_enc(alg)) + padapter->securitypriv.key_mask |= BIT(psetkeyparm->keyid); + + psetkeyparm->algorithm = alg; + + psetkeyparm->set_tx = 1; + + switch(alg) + { + case _WEP40_: + keylen = 5; + break; + case _WEP104_: + keylen = 13; + break; + case _TKIP_: + case _TKIP_WTMIC_: + case _AES_: + keylen = 16; + default: + keylen = 16; + } + + _rtw_memcpy(&(psetkeyparm->key[0]), key, keylen); + + pcmd->cmdcode = _SetKey_CMD_; + pcmd->parmbuf = (u8 *)psetkeyparm; + pcmd->cmdsz = (sizeof(struct setkey_parm)); + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + + _rtw_init_listhead(&pcmd->list); + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + + return res; + + +} + +static int set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid) +{ + u8 alg; + + switch(keylen) + { + case 5: + alg =_WEP40_; + break; + case 13: + alg =_WEP104_; + break; + default: + alg =_NO_PRIVACY_; + } + + return set_group_key(padapter, key, alg, keyid); + +} + +static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) +{ + int ret = 0; + u32 wep_key_idx, wep_key_len,wep_total_len; + struct sta_info *psta = NULL, *pbcmc_sta = NULL; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + struct sta_priv *pstapriv = &padapter->stapriv; + + DBG_8192C("%s\n", __FUNCTION__); + + param->u.crypt.err = 0; + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; + + //sizeof(struct ieee_param) = 64 bytes; + //if (param_len != (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) + if (param_len != sizeof(struct ieee_param) + param->u.crypt.key_len) + { + ret = -EINVAL; + goto exit; + } + + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) + { + if (param->u.crypt.idx >= WEP_KEYS) + { + ret = -EINVAL; + goto exit; + } + } + else + { + psta = rtw_get_stainfo(pstapriv, param->sta_addr); + if(!psta) + { + //ret = -EINVAL; + DBG_8192C("rtw_set_encryption(), sta has already been removed or never been added\n"); + goto exit; + } + } + + if (strcmp(param->u.crypt.alg, "none") == 0 && (psta==NULL)) + { + //todo:clear default encryption keys + + DBG_8192C("clear default encryption keys, keyid=%d\n", param->u.crypt.idx); + + goto exit; + } + + + if (strcmp(param->u.crypt.alg, "WEP") == 0 && (psta==NULL)) + { + DBG_8192C("r871x_set_encryption, crypt.alg = WEP\n"); + + wep_key_idx = param->u.crypt.idx; + wep_key_len = param->u.crypt.key_len; + + DBG_8192C("r871x_set_encryption, wep_key_idx=%d, len=%d\n", wep_key_idx, wep_key_len); + + if((wep_key_idx >= WEP_KEYS) || (wep_key_len<=0)) + { + ret = -EINVAL; + goto exit; + } + + if (wep_key_len > 0) + { + wep_key_len = wep_key_len <= 5 ? 5 : 13; + } + + if (psecuritypriv->bWepDefaultKeyIdxSet == 0) + { + //wep default key has not been set, so use this key index as default key. + + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + psecuritypriv->dot11PrivacyAlgrthm=_WEP40_; + psecuritypriv->dot118021XGrpPrivacy=_WEP40_; + + if(wep_key_len == 13) + { + psecuritypriv->dot11PrivacyAlgrthm=_WEP104_; + psecuritypriv->dot118021XGrpPrivacy=_WEP104_; + } + + psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; + } + + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); + + psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; + + set_wep_key(padapter, param->u.crypt.key, wep_key_len, wep_key_idx); + + goto exit; + + } + + + if(!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) // //group key + { + if(param->u.crypt.set_tx == 0) //group key + { + if(strcmp(param->u.crypt.alg, "WEP") == 0) + { + DBG_8192C("%s, set group_key, WEP\n", __FUNCTION__); + + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + if(param->u.crypt.key_len==13) + { + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + + } + else if(strcmp(param->u.crypt.alg, "TKIP") == 0) + { + DBG_8192C("%s, set group_key, TKIP\n", __FUNCTION__); + + psecuritypriv->dot118021XGrpPrivacy = _TKIP_; + + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); + //set mic key + _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); + + psecuritypriv->busetkipkey = _TRUE; + + } + else if(strcmp(param->u.crypt.alg, "CCMP") == 0) + { + DBG_8192C("%s, set group_key, CCMP\n", __FUNCTION__); + + psecuritypriv->dot118021XGrpPrivacy = _AES_; + + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + } + else + { + DBG_8192C("%s, set group_key, none\n", __FUNCTION__); + + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + } + + psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; + + psecuritypriv->binstallGrpkey = _TRUE; + + psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!! + + set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); + + pbcmc_sta=rtw_get_bcmc_stainfo(padapter); + if(pbcmc_sta) + { + pbcmc_sta->ieee8021x_blocked = _FALSE; + pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy + } + + } + + goto exit; + + } + + if(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) // psk/802_1x + { + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) + { + if(param->u.crypt.set_tx ==1) //pairwise key + { + _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + if(strcmp(param->u.crypt.alg, "WEP") == 0) + { + DBG_8192C("%s, set pairwise key, WEP\n", __FUNCTION__); + + psta->dot118021XPrivacy = _WEP40_; + if(param->u.crypt.key_len==13) + { + psta->dot118021XPrivacy = _WEP104_; + } + } + else if(strcmp(param->u.crypt.alg, "TKIP") == 0) + { + DBG_8192C("%s, set pairwise key, TKIP\n", __FUNCTION__); + + psta->dot118021XPrivacy = _TKIP_; + + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); + //set mic key + _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); + + psecuritypriv->busetkipkey = _TRUE; + + } + else if(strcmp(param->u.crypt.alg, "CCMP") == 0) + { + + DBG_8192C("%s, set pairwise key, CCMP\n", __FUNCTION__); + + psta->dot118021XPrivacy = _AES_; + } + else + { + DBG_8192C("%s, set pairwise key, none\n", __FUNCTION__); + + psta->dot118021XPrivacy = _NO_PRIVACY_; + } + + set_pairwise_key(padapter, psta); + + psta->ieee8021x_blocked = _FALSE; + + psta->bpairwise_key_installed = _TRUE; + + } + else//group key??? + { + if(strcmp(param->u.crypt.alg, "WEP") == 0) + { + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + if(param->u.crypt.key_len==13) + { + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + } + else if(strcmp(param->u.crypt.alg, "TKIP") == 0) + { + psecuritypriv->dot118021XGrpPrivacy = _TKIP_; + + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + //DEBUG_ERR("set key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len); + //set mic key + _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); + + psecuritypriv->busetkipkey = _TRUE; + + } + else if(strcmp(param->u.crypt.alg, "CCMP") == 0) + { + psecuritypriv->dot118021XGrpPrivacy = _AES_; + + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + } + else + { + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + } + + psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; + + psecuritypriv->binstallGrpkey = _TRUE; + + psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!! + + set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); + + pbcmc_sta=rtw_get_bcmc_stainfo(padapter); + if(pbcmc_sta) + { + pbcmc_sta->ieee8021x_blocked = _FALSE; + pbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy + } + + } + + } + + } + +exit: + + return ret; + +} +#endif + +static int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) +{ + int ret = 0; + u32 wep_key_idx, wep_key_len,wep_total_len; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; +#ifdef CONFIG_P2P + struct wifidirect_info* pwdinfo = &padapter->wdinfo; +#endif //CONFIG_P2P + +_func_enter_; + + DBG_8192C("%s\n", __func__); + + param->u.crypt.err = 0; + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; + + if (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) + { + ret = -EINVAL; + goto exit; + } + + if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && + param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) + { + if (param->u.crypt.idx >= WEP_KEYS +#ifdef CONFIG_IEEE80211W + && param->u.crypt.idx > BIP_MAX_KEYID +#endif //CONFIG_IEEE80211W + ) + { + ret = -EINVAL; + goto exit; + } + } else { +#ifdef CONFIG_WAPI_SUPPORT + if (strcmp(param->u.crypt.alg, "SMS4")) +#endif + { + ret = -EINVAL; + goto exit; + } + } + + if (strcmp(param->u.crypt.alg, "WEP") == 0) + { + RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("wpa_set_encryption, crypt.alg = WEP\n")); + DBG_8192C("wpa_set_encryption, crypt.alg = WEP\n"); + + wep_key_idx = param->u.crypt.idx; + wep_key_len = param->u.crypt.key_len; + + if ((wep_key_idx > WEP_KEYS) || (wep_key_len <= 0)) + { + ret = -EINVAL; + goto exit; + } + + if (psecuritypriv->bWepDefaultKeyIdxSet == 0) + { + //wep default key has not been set, so use this key index as default key. + + wep_key_len = wep_key_len <= 5 ? 5 : 13; + + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + + if(wep_key_len==13) + { + psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + + psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; + } + + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); + + psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; + + rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0,_TRUE); + + goto exit; + } + + if(padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) // 802_1x + { + struct sta_info * psta,*pbcmc_sta; + struct sta_priv * pstapriv = &padapter->stapriv; + + //DBG_8192C("%s, : dot11AuthAlgrthm == dot11AuthAlgrthm_8021X \n", __func__); + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == _TRUE) //sta mode + { + psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); + if (psta == NULL) { + //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); + DBG_8192C("%s, : Obtain Sta_info fail \n", __func__); + } + else + { + //Jeff: don't disable ieee8021x_blocked while clearing key + if (strcmp(param->u.crypt.alg, "none") != 0) + psta->ieee8021x_blocked = _FALSE; + + + if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)|| + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) + { + psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; + } + + if(param->u.crypt.set_tx ==1)//pairwise key + { + + DBG_8192C("%s, : param->u.crypt.set_tx ==1 \n", __func__); + + _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + + if(strcmp(param->u.crypt.alg, "TKIP") == 0)//set mic key + { + //DEBUG_ERR(("\nset key length :param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); + _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); + + padapter->securitypriv.busetkipkey=_FALSE; + //_set_timer(&padapter->securitypriv.tkip_timer, 50); + } + + //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len)); + DBG_871X(" ~~~~set sta key:unicastkey\n"); + + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE, _TRUE); + } + else//group key + { + if(strcmp(param->u.crypt.alg, "TKIP") == 0 || strcmp(param->u.crypt.alg, "CCMP") == 0) + { + _rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8); + _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8); + padapter->securitypriv.binstallGrpkey = _TRUE; + //DEBUG_ERR((" param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); + DBG_871X(" ~~~~set sta key:groupkey\n"); + + padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->adapter_type == PRIMARY_ADAPTER) + rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1,_TRUE); + else + DBG_871X_LEVEL(_drv_always_, "second interface do not set cam.\n"); +#else + rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1,_TRUE); +#endif + } +#ifdef CONFIG_IEEE80211W + else if(strcmp(param->u.crypt.alg, "BIP") == 0) + { + int no; + //DBG_871X("BIP key_len=%d , index=%d @@@@@@@@@@@@@@@@@@\n", param->u.crypt.key_len, param->u.crypt.idx); + //save the IGTK key, length 16 bytes + _rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + /*DBG_871X("IGTK key below:\n"); + for(no=0;no<16;no++) + printk(" %02x ", padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey[no]); + DBG_871X("\n");*/ + padapter->securitypriv.dot11wBIPKeyid = param->u.crypt.idx; + padapter->securitypriv.binstallBIPkey = _TRUE; + DBG_871X(" ~~~~set sta key:IGKT\n"); + } +#endif //CONFIG_IEEE80211W + +#ifdef CONFIG_P2P + if(pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) + { + rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE); + } + } +#endif //CONFIG_P2P + + } + } + + pbcmc_sta=rtw_get_bcmc_stainfo(padapter); + if(pbcmc_sta==NULL) + { + //DEBUG_ERR( ("Set OID_802_11_ADD_KEY: bcmc stainfo is null \n")); + } + else + { + //Jeff: don't disable ieee8021x_blocked while clearing key + if (strcmp(param->u.crypt.alg, "none") != 0) + pbcmc_sta->ieee8021x_blocked = _FALSE; + + if((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)|| + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) + { + pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; + } + } + } + else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) //adhoc mode + { + } + } + +#ifdef CONFIG_WAPI_SUPPORT + if (strcmp(param->u.crypt.alg, "SMS4") == 0) + { + PRT_WAPI_T pWapiInfo = &padapter->wapiInfo; + PRT_WAPI_STA_INFO pWapiSta; + u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; + + if(param->u.crypt.set_tx == 1) + { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if(_rtw_memcmp(pWapiSta->PeerMacAddr,param->sta_addr,6)) + { + _rtw_memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16); + + pWapiSta->wapiUsk.bSet = true; + _rtw_memcpy(pWapiSta->wapiUsk.dataKey,param->u.crypt.key,16); + _rtw_memcpy(pWapiSta->wapiUsk.micKey,param->u.crypt.key+16,16); + pWapiSta->wapiUsk.keyId = param->u.crypt.idx ; + pWapiSta->wapiUsk.bTxEnable = true; + + _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16); + _rtw_memcpy(pWapiSta->lastRxUnicastPN,WapiAEPNInitialValueSrc,16); + pWapiSta->wapiUskUpdate.bTxEnable = false; + pWapiSta->wapiUskUpdate.bSet = false; + + if (psecuritypriv->sw_encrypt== false || psecuritypriv->sw_decrypt == false) + { + //set unicast key for ASUE + rtw_wapi_set_key(padapter, &pWapiSta->wapiUsk, pWapiSta, false, false); + } + } + } + } + else + { + list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) { + if(_rtw_memcmp(pWapiSta->PeerMacAddr,get_bssid(pmlmepriv),6)) + { + pWapiSta->wapiMsk.bSet = true; + _rtw_memcpy(pWapiSta->wapiMsk.dataKey,param->u.crypt.key,16); + _rtw_memcpy(pWapiSta->wapiMsk.micKey,param->u.crypt.key+16,16); + pWapiSta->wapiMsk.keyId = param->u.crypt.idx ; + pWapiSta->wapiMsk.bTxEnable = false; + if(!pWapiSta->bSetkeyOk) + pWapiSta->bSetkeyOk = true; + pWapiSta->bAuthenticateInProgress = false; + + _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16); + + if (psecuritypriv->sw_decrypt == false) + { + //set rx broadcast key for ASUE + rtw_wapi_set_key(padapter, &pWapiSta->wapiMsk, pWapiSta, true, false); + } + } + + } + } + } +#endif + + +exit: + + DBG_8192C("%s, ret=%d\n", __func__, ret); + + _func_exit_; + + return ret; +} + +static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + u8 key_index, bool pairwise, const u8 *mac_addr, +#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + u8 key_index, const u8 *mac_addr, +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + struct key_params *params) +{ + char *alg_name; + u32 param_len; + struct ieee_param *param = NULL; + int ret=0; + struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + DBG_871X(FUNC_NDEV_FMT" adding key for %pM\n", FUNC_NDEV_ARG(ndev), mac_addr); + DBG_871X("cipher=0x%x\n", params->cipher); + DBG_871X("key_len=0x%x\n", params->key_len); + DBG_871X("seq_len=0x%x\n", params->seq_len); + DBG_871X("key_index=%d\n", key_index); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + DBG_871X("pairwise=%d\n", pairwise); +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + + param_len = sizeof(struct ieee_param) + params->key_len; + param = (struct ieee_param *)rtw_malloc(param_len); + if (param == NULL) + return -1; + + _rtw_memset(param, 0, param_len); + + param->cmd = IEEE_CMD_SET_ENCRYPTION; + _rtw_memset(param->sta_addr, 0xff, ETH_ALEN); + + switch (params->cipher) { + case IW_AUTH_CIPHER_NONE: + //todo: remove key + //remove = 1; + alg_name = "none"; + break; + case WLAN_CIPHER_SUITE_WEP40: + case WLAN_CIPHER_SUITE_WEP104: + alg_name = "WEP"; + break; + case WLAN_CIPHER_SUITE_TKIP: + alg_name = "TKIP"; + break; + case WLAN_CIPHER_SUITE_CCMP: + alg_name = "CCMP"; + break; +#ifdef CONFIG_IEEE80211W + case WLAN_CIPHER_SUITE_AES_CMAC: + alg_name = "BIP"; + break; +#endif //CONFIG_IEEE80211W +#ifdef CONFIG_WAPI_SUPPORT + case WLAN_CIPHER_SUITE_SMS4: + alg_name= "SMS4"; + if(pairwise == NL80211_KEYTYPE_PAIRWISE) { + if (key_index != 0 && key_index != 1) { + ret = -ENOTSUPP; + goto addkey_end; + } + _rtw_memcpy((void*)param->sta_addr, (void*)mac_addr, ETH_ALEN); + } else { + DBG_871X("mac_addr is null \n"); + } + DBG_871X("rtw_wx_set_enc_ext: SMS4 case \n"); + break; +#endif + + default: + ret = -ENOTSUPP; + goto addkey_end; + } + + strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN); + + + if (!mac_addr || is_broadcast_ether_addr(mac_addr)) + { + param->u.crypt.set_tx = 0; //for wpa/wpa2 group key + } else { + param->u.crypt.set_tx = 1; //for wpa/wpa2 pairwise key + } + + + //param->u.crypt.idx = key_index - 1; + param->u.crypt.idx = key_index; + + if (params->seq_len && params->seq) + { + _rtw_memcpy(param->u.crypt.seq, params->seq, params->seq_len); + } + + if(params->key_len && params->key) + { + param->u.crypt.key_len = params->key_len; + _rtw_memcpy(param->u.crypt.key, params->key, params->key_len); + } + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + ret = rtw_cfg80211_set_encryption(ndev, param, param_len); + } + else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#ifdef CONFIG_AP_MODE + if(mac_addr) + _rtw_memcpy(param->sta_addr, (void*)mac_addr, ETH_ALEN); + + ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len); +#endif + } + else + { + DBG_8192C("error! fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype); + + } + +addkey_end: + if(param) + { + rtw_mfree((u8*)param, param_len); + } + + return ret; + +} + +static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + u8 key_index, bool pairwise, const u8 *mac_addr, +#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + u8 key_index, const u8 *mac_addr, +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + void *cookie, + void (*callback)(void *cookie, + struct key_params*)) +{ +#if 0 + struct iwm_priv *iwm = ndev_to_iwm(ndev); + struct iwm_key *key = &iwm->keys[key_index]; + struct key_params params; + + IWM_DBG_WEXT(iwm, DBG, "Getting key %d\n", key_index); + + memset(¶ms, 0, sizeof(params)); + + params.cipher = key->cipher; + params.key_len = key->key_len; + params.seq_len = key->seq_len; + params.seq = key->seq; + params.key = key->key; + + callback(cookie, ¶ms); + + return key->key_len ? 0 : -ENOENT; +#endif + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + return 0; +} + +static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + u8 key_index, bool pairwise, const u8 *mac_addr) +#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + u8 key_index, const u8 *mac_addr) +#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + DBG_871X(FUNC_NDEV_FMT" key_index=%d\n", FUNC_NDEV_ARG(ndev), key_index); + + if (key_index == psecuritypriv->dot11PrivacyKeyIndex) + { + //clear the flag of wep default key set. + psecuritypriv->bWepDefaultKeyIdxSet = 0; + } + + return 0; +} + +static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, + struct net_device *ndev, u8 key_index + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + , bool unicast, bool multicast + #endif + ) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + DBG_871X(FUNC_NDEV_FMT" key_index=%d" + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + ", unicast=%d, multicast=%d" + #endif + ".\n", FUNC_NDEV_ARG(ndev), key_index + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + , unicast, multicast + #endif + ); + + if ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) //set wep default key + { + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + + psecuritypriv->dot11PrivacyKeyIndex = key_index; + + psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + if (psecuritypriv->dot11DefKeylen[key_index] == 13) + { + psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + + psecuritypriv->bWepDefaultKeyIdxSet = 1; //set the flag to represent that wep default key has been set + } + + return 0; + +} + +static int cfg80211_rtw_get_station(struct wiphy *wiphy, + struct net_device *ndev, + u8 *mac, struct station_info *sinfo) +{ + int ret = 0; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + sinfo->filled = 0; + + if (!mac) { + DBG_871X(FUNC_NDEV_FMT" mac==%p\n", FUNC_NDEV_ARG(ndev), mac); + ret = -ENOENT; + goto exit; + } + + psta = rtw_get_stainfo(pstapriv, mac); + if (psta == NULL) { + DBG_8192C("%s, sta_info is null\n", __func__); + ret = -ENOENT; + goto exit; + } + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X(FUNC_NDEV_FMT" mac="MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(mac)); +#endif + + //for infra./P2PClient mode + if( check_fwstate(pmlmepriv, WIFI_STATION_STATE) + && check_fwstate(pmlmepriv, _FW_LINKED) + ) + { + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + + if (_rtw_memcmp(mac, cur_network->network.MacAddress, ETH_ALEN) == _FALSE) { + DBG_871X("%s, mismatch bssid="MAC_FMT"\n", __func__, MAC_ARG(cur_network->network.MacAddress)); + ret = -ENOENT; + goto exit; + } + + sinfo->filled |= STATION_INFO_SIGNAL; + sinfo->signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); + + sinfo->filled |= STATION_INFO_TX_BITRATE; + sinfo->txrate.legacy = rtw_get_cur_max_rate(padapter); + + sinfo->filled |= STATION_INFO_RX_PACKETS; + sinfo->rx_packets = sta_rx_data_pkts(psta); + + sinfo->filled |= STATION_INFO_TX_PACKETS; + sinfo->tx_packets = psta->sta_stats.tx_pkts; + + } + + //for Ad-Hoc/AP mode + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) + ||check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) + ||check_fwstate(pmlmepriv, WIFI_AP_STATE)) + && check_fwstate(pmlmepriv, _FW_LINKED) + ) + { + //TODO: should acquire station info... + } + +exit: + return ret; +} + +extern int netdev_open(struct net_device *pnetdev); +#ifdef CONFIG_CONCURRENT_MODE +extern int netdev_if2_open(struct net_device *pnetdev); +#endif + +/* +enum nl80211_iftype { + NL80211_IFTYPE_UNSPECIFIED, + NL80211_IFTYPE_ADHOC, //1 + NL80211_IFTYPE_STATION, //2 + NL80211_IFTYPE_AP, //3 + NL80211_IFTYPE_AP_VLAN, + NL80211_IFTYPE_WDS, + NL80211_IFTYPE_MONITOR, //6 + NL80211_IFTYPE_MESH_POINT, + NL80211_IFTYPE_P2P_CLIENT, //8 + NL80211_IFTYPE_P2P_GO, //9 + //keep last + NUM_NL80211_IFTYPES, + NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1 +}; +*/ +static int cfg80211_rtw_change_iface(struct wiphy *wiphy, + struct net_device *ndev, + enum nl80211_iftype type, u32 *flags, + struct vif_params *params) +{ + enum nl80211_iftype old_type; + NDIS_802_11_NETWORK_INFRASTRUCTURE networkType ; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); +#endif + int ret = 0; + u8 change = _FALSE; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + if(adapter_to_dvobj(padapter)->processing_dev_remove == _TRUE) + { + ret= -EPERM; + goto exit; + } + + +#ifdef CONFIG_CONCURRENT_MODE + if(padapter->adapter_type == SECONDARY_ADAPTER) + { + DBG_871X(FUNC_NDEV_FMT" call netdev_if2_open\n", FUNC_NDEV_ARG(ndev)); + if(netdev_if2_open(ndev) != 0) { + ret= -EPERM; + goto exit; + } + } + else if(padapter->adapter_type == PRIMARY_ADAPTER) +#endif //CONFIG_CONCURRENT_MODE + { + DBG_871X(FUNC_NDEV_FMT" call netdev_open\n", FUNC_NDEV_ARG(ndev)); + if(netdev_open(ndev) != 0) { + ret= -EPERM; + goto exit; + } + } + + if(_FAIL == rtw_pwr_wakeup(padapter)) { + ret= -EPERM; + goto exit; + } + + old_type = rtw_wdev->iftype; + DBG_871X(FUNC_NDEV_FMT" old_iftype=%d, new_iftype=%d\n", + FUNC_NDEV_ARG(ndev), old_type, type); + + if(old_type != type) + { + change = _TRUE; + pmlmeext->action_public_rxseq = 0xffff; + pmlmeext->action_public_dialog_token = 0xff; + } + + switch (type) { + case NL80211_IFTYPE_ADHOC: + networkType = Ndis802_11IBSS; + break; +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_CLIENT: +#endif + case NL80211_IFTYPE_STATION: + networkType = Ndis802_11Infrastructure; + #ifdef CONFIG_P2P + if(pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) + { + _cancel_timer_ex( &pwdinfo->find_phase_timer ); + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); + + //it means remove GO and change mode from AP(GO) to station(P2P DEVICE) + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); + + DBG_8192C("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); + } + } + #endif //CONFIG_P2P + break; +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_GO: +#endif + case NL80211_IFTYPE_AP: + networkType = Ndis802_11APMode; + #ifdef CONFIG_P2P + if(pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + //it means P2P Group created, we will be GO and change mode from P2P DEVICE to AP(GO) + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); + } + } + #endif //CONFIG_P2P + break; + default: + return -EOPNOTSUPP; + } + + rtw_wdev->iftype = type; + + if (rtw_set_802_11_infrastructure_mode(padapter, networkType) ==_FALSE) + { + rtw_wdev->iftype = old_type; + ret = -EPERM; + goto exit; + } + + rtw_setopmode_cmd(padapter, networkType,_TRUE); + +exit: + + return ret; +} + +void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted) +{ + _irqL irqL; + + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + if(pwdev_priv->scan_request != NULL) + { + //struct cfg80211_scan_request *scan_request = pwdev_priv->scan_request; + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_871X("%s with scan req\n", __FUNCTION__); + #endif + + //avoid WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req); + //if(scan_request == wiphy_to_dev(scan_request->wiphy)->scan_req) + if(pwdev_priv->scan_request->wiphy != pwdev_priv->rtw_wdev->wiphy) + { + DBG_8192C("error wiphy compare\n"); + } + else + { + cfg80211_scan_done(pwdev_priv->scan_request, aborted); + } + + pwdev_priv->scan_request = NULL; + + } else { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_871X("%s without scan req\n", __FUNCTION__); + #endif + } + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); +} + +void rtw_cfg80211_surveydone_event_callback(_adapter *padapter) +{ + _irqL irqL; + _list *plist, *phead; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + _queue *queue = &(pmlmepriv->scanned_queue); + struct wlan_network *pnetwork = NULL; + u32 cnt=0; + u32 wait_for_surveydone; + sint wait_status; +#ifdef CONFIG_P2P + struct wifidirect_info* pwdinfo = &padapter->wdinfo; +#endif //CONFIG_P2P + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s\n", __func__); +#endif + + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + phead = get_list_head(queue); + plist = get_next(phead); + + while(1) + { + if (rtw_end_of_queue_search(phead,plist)== _TRUE) + break; + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + + //report network only if the current channel set contains the channel to which this network belongs + if(rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0 + && _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid)) + ) + { + //ev=translate_scan(padapter, a, pnetwork, ev, stop); + rtw_cfg80211_inform_bss(padapter, pnetwork); + } + + plist = get_next(plist); + + } + + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + //call this after other things have been done + rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev), _FALSE); +} + +static int rtw_cfg80211_set_probe_req_wpsp2pie(_adapter *padapter, char *buf, int len) +{ + int ret = 0; + uint wps_ielen = 0; + u8 *wps_ie; + u32 p2p_ielen = 0; + u8 *p2p_ie; + u32 wfd_ielen = 0; + u8 *wfd_ie; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ielen=%d\n", __func__, len); +#endif + + if(len>0) + { + if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_req_wps_ielen=%d\n", wps_ielen); + #endif + + if(pmlmepriv->wps_probe_req_ie) + { + u32 free_len = pmlmepriv->wps_probe_req_ie_len; + pmlmepriv->wps_probe_req_ie_len = 0; + rtw_mfree(pmlmepriv->wps_probe_req_ie, free_len); + pmlmepriv->wps_probe_req_ie = NULL; + } + + pmlmepriv->wps_probe_req_ie = rtw_malloc(wps_ielen); + if ( pmlmepriv->wps_probe_req_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen); + pmlmepriv->wps_probe_req_ie_len = wps_ielen; + } + + //buf += wps_ielen; + //len -= wps_ielen; + + #ifdef CONFIG_P2P + if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) + { + struct wifidirect_info *wdinfo = &padapter->wdinfo; + u32 attr_contentlen = 0; + u8 listen_ch_attr[5]; + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_req_p2p_ielen=%d\n", p2p_ielen); + #endif + + if(pmlmepriv->p2p_probe_req_ie) + { + u32 free_len = pmlmepriv->p2p_probe_req_ie_len; + pmlmepriv->p2p_probe_req_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_probe_req_ie, free_len); + pmlmepriv->p2p_probe_req_ie = NULL; + } + + pmlmepriv->p2p_probe_req_ie = rtw_malloc(p2p_ielen); + if ( pmlmepriv->p2p_probe_req_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_probe_req_ie_len = p2p_ielen; + + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, (u8*)listen_ch_attr, (uint*) &attr_contentlen) + && attr_contentlen == 5) + { + if (wdinfo->listen_channel != listen_ch_attr[4]) { + DBG_871X(FUNC_ADPT_FMT" listen channel - country:%c%c%c, class:%u, ch:%u\n", + FUNC_ADPT_ARG(padapter), listen_ch_attr[0], listen_ch_attr[1], listen_ch_attr[2], + listen_ch_attr[3], listen_ch_attr[4]); + wdinfo->listen_channel = listen_ch_attr[4]; + } + } + } + #endif //CONFIG_P2P + + //buf += p2p_ielen; + //len -= p2p_ielen; + + #ifdef CONFIG_WFD + if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_req_wfd_ielen=%d\n", wfd_ielen); + #endif + + if(pmlmepriv->wfd_probe_req_ie) + { + u32 free_len = pmlmepriv->wfd_probe_req_ie_len; + pmlmepriv->wfd_probe_req_ie_len = 0; + rtw_mfree(pmlmepriv->wfd_probe_req_ie, free_len); + pmlmepriv->wfd_probe_req_ie = NULL; + } + + pmlmepriv->wfd_probe_req_ie = rtw_malloc(wfd_ielen); + if ( pmlmepriv->wfd_probe_req_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len); + } + #endif //CONFIG_WFD + + } + + return ret; + +} + +static int cfg80211_rtw_scan(struct wiphy *wiphy + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) + , struct net_device *ndev + #endif + , struct cfg80211_scan_request *request) +{ + int i; + u8 _status = _FALSE; + int ret = 0; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_priv *pmlmepriv= &padapter->mlmepriv; + NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT]; + struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT]; + _irqL irqL; + u8 *wps_ie=NULL; + uint wps_ielen=0; + u8 *p2p_ie=NULL; + uint p2p_ielen=0; + u8 survey_times=3; + u8 survey_times_for_one_ch=6; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); +#endif //CONFIG_P2P + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + struct cfg80211_ssid *ssids = request->ssids; + int social_channel = 0, j = 0; + bool need_indicate_scan_done = _FALSE; +#ifdef CONFIG_CONCURRENT_MODE + PADAPTER pbuddy_adapter = NULL; + struct mlme_priv *pbuddy_mlmepriv = NULL; +#endif //CONFIG_CONCURRENT_MODE + +//#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); +//#endif + +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->pbuddy_adapter) { + pbuddy_adapter = padapter->pbuddy_adapter; + pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv); + } +#endif //CONFIG_CONCURRENT_MODE + +#ifdef CONFIG_MP_INCLUDED +if (padapter->registrypriv.mp_mode == 1) +{ + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + { + ret = -EPERM; + goto exit; + } +} +#endif + + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + pwdev_priv->scan_request = request; + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X("%s under WIFI_AP_STATE\n", __FUNCTION__); +#endif + + if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) + { + DBG_8192C("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state); + + if(check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) + { + DBG_8192C("AP mode process WPS \n"); + } + + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + } + + if(_FAIL == rtw_pwr_wakeup(padapter)) { + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + + #ifdef CONFIG_P2P + if( pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(ssids->ssid != NULL + && _rtw_memcmp(ssids->ssid, "DIRECT-", 7) + && rtw_get_p2p_ie((u8 *)request->ie, request->ie_len, NULL, NULL) + ) + { + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); + wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE; + } + else + { + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); + #endif + } + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); + + if(request->n_channels == 3 && + request->channels[0]->hw_value == 1 && + request->channels[1]->hw_value == 6 && + request->channels[2]->hw_value == 11 + ) + { + social_channel = 1; + } + } + } + #endif //CONFIG_P2P + + if(request->ie && request->ie_len>0) + { + rtw_cfg80211_set_probe_req_wpsp2pie(padapter, (u8 *)request->ie, request->ie_len ); + } + + if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE) + { + DBG_8192C("%s, bBusyTraffic == _TRUE\n", __func__); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { + DBG_8192C("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { + DBG_8192C("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state); + ret = -EBUSY; + goto check_need_indicate_scan_done; + } + + if (rtw_is_scan_deny(padapter)){ + DBG_871X(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter)); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + +#ifdef CONFIG_CONCURRENT_MODE + if(pbuddy_mlmepriv && (pbuddy_mlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)) + { + DBG_8192C("%s, bBusyTraffic == _TRUE at buddy_intf\n", __func__); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + + if (check_buddy_fwstate(padapter, + _FW_UNDER_SURVEY|_FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE) + { + if(check_buddy_fwstate(padapter, _FW_UNDER_SURVEY)) + { + DBG_8192C("scanning_via_buddy_intf\n"); + pmlmepriv->scanning_via_buddy_intf = _TRUE; + } + + DBG_8192C("buddy_intf's mlme state:0x%x\n", pbuddy_mlmepriv->fw_state); + + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } +#endif + + +#ifdef CONFIG_P2P + if( pwdinfo->driver_interface == DRIVER_CFG80211 ) + { + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) + { + rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); + rtw_free_network_queue(padapter, _TRUE); + + if(social_channel == 0) + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); + else + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST); + } + } +#endif //CONFIG_P2P + + + _rtw_memset(ssid, 0, sizeof(NDIS_802_11_SSID)*RTW_SSID_SCAN_AMOUNT); + //parsing request ssids, n_ssids + for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("ssid=%s, len=%d\n", ssids[i].ssid, ssids[i].ssid_len); + #endif + _rtw_memcpy(ssid[i].Ssid, ssids[i].ssid, ssids[i].ssid_len); + ssid[i].SsidLength = ssids[i].ssid_len; + } + + + /* parsing channels, n_channels */ + _rtw_memset(ch, 0, sizeof(struct rtw_ieee80211_channel)*RTW_CHANNEL_SCAN_AMOUNT); + for (i=0;in_channels && ichannels[i])); + #endif + ch[i].hw_value = request->channels[i]->hw_value; + ch[i].flags = request->channels[i]->flags; + } + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + if (request->n_channels == 1) { + for(i=1;in_channels == 2) { + _rtw_memcpy(&ch[3], &ch[1], sizeof(struct rtw_ieee80211_channel)); + for(i=1;ilock, &irqL); + + + if(_status == _FALSE) + { + ret = -1; + } + +check_need_indicate_scan_done: + if(need_indicate_scan_done) + rtw_cfg80211_surveydone_event_callback(padapter); + +exit: + + return ret; + +} + +static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed) +{ +#if 0 + struct iwm_priv *iwm = wiphy_to_iwm(wiphy); + + if (changed & WIPHY_PARAM_RTS_THRESHOLD && + (iwm->conf.rts_threshold != wiphy->rts_threshold)) { + int ret; + + iwm->conf.rts_threshold = wiphy->rts_threshold; + + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, + CFG_RTS_THRESHOLD, + iwm->conf.rts_threshold); + if (ret < 0) + return ret; + } + + if (changed & WIPHY_PARAM_FRAG_THRESHOLD && + (iwm->conf.frag_threshold != wiphy->frag_threshold)) { + int ret; + + iwm->conf.frag_threshold = wiphy->frag_threshold; + + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_FA_CFG_FIX, + CFG_FRAG_THRESHOLD, + iwm->conf.frag_threshold); + if (ret < 0) + return ret; + } +#endif + DBG_8192C("%s\n", __func__); + return 0; +} + +static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_ibss_params *params) +{ +#if 0 + struct iwm_priv *iwm = wiphy_to_iwm(wiphy); + struct ieee80211_channel *chan = params->channel; + + if (!test_bit(IWM_STATUS_READY, &iwm->status)) + return -EIO; + + /* UMAC doesn't support creating or joining an IBSS network + * with specified bssid. */ + if (params->bssid) + return -EOPNOTSUPP; + + iwm->channel = ieee80211_frequency_to_channel(chan->center_freq); + iwm->umac_profile->ibss.band = chan->band; + iwm->umac_profile->ibss.channel = iwm->channel; + iwm->umac_profile->ssid.ssid_len = params->ssid_len; + memcpy(iwm->umac_profile->ssid.ssid, params->ssid, params->ssid_len); + + return iwm_send_mlme_profile(iwm); +#endif + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + return 0; +} + +static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev) +{ +#if 0 + struct iwm_priv *iwm = wiphy_to_iwm(wiphy); + + if (iwm->umac_profile_active) + return iwm_invalidate_mlme_profile(iwm); +#endif + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + return 0; +} + +static int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv, u32 wpa_version) +{ + DBG_8192C("%s, wpa_version=%d\n", __func__, wpa_version); + + if (!wpa_version) { + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; + return 0; + } + + + if (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2)) + { + psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK; + } + +/* + if (wpa_version & NL80211_WPA_VERSION_2) + { + psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; + } +*/ + + return 0; + +} + +static int rtw_cfg80211_set_auth_type(struct security_priv *psecuritypriv, + enum nl80211_auth_type sme_auth_type) +{ + DBG_8192C("%s, nl80211_auth_type=%d\n", __func__, sme_auth_type); + + + switch (sme_auth_type) { + case NL80211_AUTHTYPE_AUTOMATIC: + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; + + break; + case NL80211_AUTHTYPE_OPEN_SYSTEM: + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; + + if(psecuritypriv->ndisauthtype>Ndis802_11AuthModeWPA) + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + +#ifdef CONFIG_WAPI_SUPPORT + if(psecuritypriv->ndisauthtype == Ndis802_11AuthModeWAPI) + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; +#endif + + break; + case NL80211_AUTHTYPE_SHARED_KEY: + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Shared; + + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + + + break; + default: + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; + //return -ENOTSUPP; + } + + return 0; + +} + +static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv, u32 cipher, bool ucast) +{ + u32 ndisencryptstatus = Ndis802_11EncryptionDisabled; + + u32 *profile_cipher = ucast ? &psecuritypriv->dot11PrivacyAlgrthm : + &psecuritypriv->dot118021XGrpPrivacy; + + DBG_8192C("%s, ucast=%d, cipher=0x%x\n", __func__, ucast, cipher); + + + if (!cipher) { + *profile_cipher = _NO_PRIVACY_; + psecuritypriv->ndisencryptstatus = ndisencryptstatus; + return 0; + } + + switch (cipher) { + case IW_AUTH_CIPHER_NONE: + *profile_cipher = _NO_PRIVACY_; + ndisencryptstatus = Ndis802_11EncryptionDisabled; +#ifdef CONFIG_WAPI_SUPPORT + if(psecuritypriv->dot11PrivacyAlgrthm ==_SMS4_ ) + { + *profile_cipher = _SMS4_; + } +#endif + break; + case WLAN_CIPHER_SUITE_WEP40: + *profile_cipher = _WEP40_; + ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WLAN_CIPHER_SUITE_WEP104: + *profile_cipher = _WEP104_; + ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WLAN_CIPHER_SUITE_TKIP: + *profile_cipher = _TKIP_; + ndisencryptstatus = Ndis802_11Encryption2Enabled; + break; + case WLAN_CIPHER_SUITE_CCMP: + *profile_cipher = _AES_; + ndisencryptstatus = Ndis802_11Encryption3Enabled; + break; +#ifdef CONFIG_WAPI_SUPPORT + case WLAN_CIPHER_SUITE_SMS4: + *profile_cipher = _SMS4_; + ndisencryptstatus = Ndis802_11_EncrypteionWAPI; + break; +#endif + default: + DBG_8192C("Unsupported cipher: 0x%x\n", cipher); + return -ENOTSUPP; + } + + if(ucast) + { + psecuritypriv->ndisencryptstatus = ndisencryptstatus; + + //if(psecuritypriv->dot11PrivacyAlgrthm >= _AES_) + // psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; + } + + return 0; +} + +static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, u32 key_mgt) +{ + DBG_8192C("%s, key_mgt=0x%x\n", __func__, key_mgt); + + if (key_mgt == WLAN_AKM_SUITE_8021X) + //*auth_type = UMAC_AUTH_TYPE_8021X; + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + else if (key_mgt == WLAN_AKM_SUITE_PSK) { + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + } +#ifdef CONFIG_WAPI_SUPPORT + else if(key_mgt ==WLAN_AKM_SUITE_WAPI_PSK){ + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; + } + else if(key_mgt ==WLAN_AKM_SUITE_WAPI_CERT){ + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; + } +#endif + + + else { + DBG_8192C("Invalid key mgt: 0x%x\n", key_mgt); + //return -EINVAL; + } + + return 0; +} + +static int rtw_cfg80211_set_wpa_ie(_adapter *padapter, u8 *pie, size_t ielen) +{ + u8 *buf=NULL, *pos=NULL; + u32 left; + int group_cipher = 0, pairwise_cipher = 0; + int ret = 0; + int wpa_ielen=0; + int wpa2_ielen=0; + u8 *pwpa, *pwpa2; + u8 null_addr[]= {0,0,0,0,0,0}; + + if (pie == NULL || !ielen) { + /* Treat this as normal case, but need to clear WIFI_UNDER_WPS */ + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); + goto exit; + } + + if (ielen > MAX_WPA_IE_LEN+MAX_WPS_IE_LEN+MAX_P2P_IE_LEN) { + ret = -EINVAL; + goto exit; + } + + buf = rtw_zmalloc(ielen); + if (buf == NULL){ + ret = -ENOMEM; + goto exit; + } + + _rtw_memcpy(buf, pie , ielen); + + //dump + { + int i; + DBG_8192C("set wpa_ie(length:%zu):\n", ielen); + for(i=0;i0) + { + if(rtw_parse_wpa_ie(pwpa, wpa_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) + { + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; + padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPAPSK; + _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0], wpa_ielen+2); + + DBG_8192C("got wpa_ie, wpa_ielen:%u\n", wpa_ielen); + } + } + + pwpa2 = rtw_get_wpa2_ie(buf, &wpa2_ielen, ielen); + if(pwpa2 && wpa2_ielen>0) + { + if(rtw_parse_wpa2_ie(pwpa2, wpa2_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) + { + padapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; + padapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPA2PSK; + _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0], wpa2_ielen+2); + + DBG_8192C("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen); + } + } + + if (group_cipher == 0) + { + group_cipher = WPA_CIPHER_NONE; + } + if (pairwise_cipher == 0) + { + pairwise_cipher = WPA_CIPHER_NONE; + } + + switch(group_cipher) + { + case WPA_CIPHER_NONE: + padapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_; + padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled; + break; + case WPA_CIPHER_WEP40: + padapter->securitypriv.dot118021XGrpPrivacy=_WEP40_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WPA_CIPHER_TKIP: + padapter->securitypriv.dot118021XGrpPrivacy=_TKIP_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; + break; + case WPA_CIPHER_CCMP: + padapter->securitypriv.dot118021XGrpPrivacy=_AES_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; + break; + case WPA_CIPHER_WEP104: + padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + } + + switch(pairwise_cipher) + { + case WPA_CIPHER_NONE: + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_; + padapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled; + break; + case WPA_CIPHER_WEP40: + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WPA_CIPHER_TKIP: + padapter->securitypriv.dot11PrivacyAlgrthm=_TKIP_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; + break; + case WPA_CIPHER_CCMP: + padapter->securitypriv.dot11PrivacyAlgrthm=_AES_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; + break; + case WPA_CIPHER_WEP104: + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + } + + {/* handle wps_ie */ + uint wps_ielen; + u8 *wps_ie; + + wps_ie = rtw_get_wps_ie(buf, ielen, NULL, &wps_ielen); + if (wps_ie && wps_ielen > 0) { + DBG_8192C("got wps_ie, wps_ielen:%u\n", wps_ielen); + padapter->securitypriv.wps_ie_len = wps_ielensecuritypriv.wps_ie, wps_ie, padapter->securitypriv.wps_ie_len); + set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS); + } else { + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); + } + } + + #ifdef CONFIG_P2P + {//check p2p_ie for assoc req; + uint p2p_ielen=0; + u8 *p2p_ie; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + if((p2p_ie=rtw_get_p2p_ie(buf, ielen, NULL, &p2p_ielen))) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s p2p_assoc_req_ielen=%d\n", __FUNCTION__, p2p_ielen); + #endif + + if(pmlmepriv->p2p_assoc_req_ie) + { + u32 free_len = pmlmepriv->p2p_assoc_req_ie_len; + pmlmepriv->p2p_assoc_req_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_assoc_req_ie, free_len); + pmlmepriv->p2p_assoc_req_ie = NULL; + } + + pmlmepriv->p2p_assoc_req_ie = rtw_malloc(p2p_ielen); + if ( pmlmepriv->p2p_assoc_req_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + goto exit; + } + _rtw_memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen; + } + } + #endif //CONFIG_P2P + + #ifdef CONFIG_WFD + {//check wfd_ie for assoc req; + uint wfd_ielen=0; + u8 *wfd_ie; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + if(rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen)) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s wfd_assoc_req_ielen=%d\n", __FUNCTION__, wfd_ielen); + #endif + + if(pmlmepriv->wfd_assoc_req_ie) + { + u32 free_len = pmlmepriv->wfd_assoc_req_ie_len; + pmlmepriv->wfd_assoc_req_ie_len = 0; + rtw_mfree(pmlmepriv->wfd_assoc_req_ie, free_len); + pmlmepriv->wfd_assoc_req_ie = NULL; + } + + pmlmepriv->wfd_assoc_req_ie = rtw_malloc(wfd_ielen); + if ( pmlmepriv->wfd_assoc_req_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + goto exit; + } + rtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len); + } + } + #endif //CONFIG_WFD + + //TKIP and AES disallow multicast packets until installing group key + if(padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_ + || padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_ + || padapter->securitypriv.dot11PrivacyAlgrthm == _AES_) + //WPS open need to enable multicast + //|| check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == _TRUE) + rtw_hal_set_hwreg(padapter, HW_VAR_OFF_RCR_AM, null_addr); + + RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_, + ("rtw_set_wpa_ie: pairwise_cipher=0x%08x padapter->securitypriv.ndisencryptstatus=%d padapter->securitypriv.ndisauthtype=%d\n", + pairwise_cipher, padapter->securitypriv.ndisencryptstatus, padapter->securitypriv.ndisauthtype)); + +exit: + if (buf) + rtw_mfree(buf, ielen); + if (ret) + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); + return ret; +} + +static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_connect_params *sme) +{ + int ret=0; + _irqL irqL; + _list *phead; + struct wlan_network *pnetwork = NULL; + NDIS_802_11_AUTHENTICATION_MODE authmode; + NDIS_802_11_SSID ndis_ssid; + u8 *dst_ssid, *src_ssid; + u8 *dst_bssid, *src_bssid; + //u8 matched_by_bssid=_FALSE; + //u8 matched_by_ssid=_FALSE; + u8 matched=_FALSE; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + _queue *queue = &pmlmepriv->scanned_queue; + + DBG_871X("=>"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + DBG_871X("privacy=%d, key=%p, key_len=%d, key_idx=%d\n", + sme->privacy, sme->key, sme->key_len, sme->key_idx); + + + if(wdev_to_priv(padapter->rtw_wdev)->block == _TRUE) + { + ret = -EBUSY; + DBG_871X("%s wdev_priv.block is set\n", __FUNCTION__); + goto exit; + } + +#ifdef CONFIG_PLATFORM_MSTAR + printk("MStar Android!\n"); + if((wdev_to_priv(padapter->rtw_wdev))->bandroid_scan == _FALSE) + { +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) +#endif //CONFIG_P2P + { + ret = -EBUSY; + printk("Android hasn't attached yet!\n"); + goto exit; + } + } +#endif + + if(_FAIL == rtw_pwr_wakeup(padapter)) { + ret= -EPERM; + goto exit; + } + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) { + ret = -EPERM; + goto exit; + } + +#ifdef CONFIG_CONCURRENT_MODE + if (check_buddy_fwstate(padapter, _FW_UNDER_LINKING) == _TRUE) { + DBG_8192C("%s, but buddy_intf is under linking\n", __FUNCTION__); + ret = -EINVAL; + goto exit; + } + if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY) == _TRUE) { + rtw_scan_abort(padapter->pbuddy_adapter); + } +#endif + + if (!sme->ssid || !sme->ssid_len) + { + ret = -EINVAL; + goto exit; + } + + if (sme->ssid_len > IW_ESSID_MAX_SIZE){ + + ret= -E2BIG; + goto exit; + } + + _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID)); + ndis_ssid.SsidLength = sme->ssid_len; + _rtw_memcpy(ndis_ssid.Ssid, sme->ssid, sme->ssid_len); + + DBG_8192C("ssid=%s, len=%zu\n", ndis_ssid.Ssid, sme->ssid_len); + + + if (sme->bssid) + DBG_8192C("bssid="MAC_FMT"\n", MAC_ARG(sme->bssid)); + + + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { + ret = -EBUSY; + DBG_8192C("%s, fw_state=0x%x, goto exit\n", __FUNCTION__, pmlmepriv->fw_state); + goto exit; + } + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { + rtw_scan_abort(padapter); + } + + psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled; + psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; + +#ifdef CONFIG_WAPI_SUPPORT + padapter->wapiInfo.bWapiEnable = false; +#endif + + ret = rtw_cfg80211_set_wpa_version(psecuritypriv, sme->crypto.wpa_versions); + if (ret < 0) + goto exit; + +#ifdef CONFIG_WAPI_SUPPORT + if(sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1) + { + padapter->wapiInfo.bWapiEnable = true; + padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; + padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; + } +#endif + + ret = rtw_cfg80211_set_auth_type(psecuritypriv, sme->auth_type); + +#ifdef CONFIG_WAPI_SUPPORT + if(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_WAPI) + padapter->mlmeextpriv.mlmext_info.auth_algo = psecuritypriv->dot11AuthAlgrthm; +#endif + + + if (ret < 0) + goto exit; + + DBG_8192C("%s, ie_len=%zu\n", __func__, sme->ie_len); + + ret = rtw_cfg80211_set_wpa_ie(padapter, sme->ie, sme->ie_len); + if (ret < 0) + goto exit; + + if (sme->crypto.n_ciphers_pairwise) { + ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.ciphers_pairwise[0], _TRUE); + if (ret < 0) + goto exit; + } + + //For WEP Shared auth + if((psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Shared + || psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Auto) && sme->key + ) + { + u32 wep_key_idx, wep_key_len,wep_total_len; + NDIS_802_11_WEP *pwep = NULL; + DBG_871X("%s(): Shared/Auto WEP\n",__FUNCTION__); + + wep_key_idx = sme->key_idx; + wep_key_len = sme->key_len; + + if (sme->key_idx > WEP_KEYS) { + ret = -EINVAL; + goto exit; + } + + if (wep_key_len > 0) + { + wep_key_len = wep_key_len <= 5 ? 5 : 13; + wep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial); + pwep =(NDIS_802_11_WEP *) rtw_malloc(wep_total_len); + if(pwep == NULL){ + DBG_871X(" wpa_set_encryption: pwep allocate fail !!!\n"); + ret = -ENOMEM; + goto exit; + } + + _rtw_memset(pwep, 0, wep_total_len); + + pwep->KeyLength = wep_key_len; + pwep->Length = wep_total_len; + + if(wep_key_len==13) + { + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; + padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_; + } + } + else { + ret = -EINVAL; + goto exit; + } + + pwep->KeyIndex = wep_key_idx; + pwep->KeyIndex |= 0x80000000; + + _rtw_memcpy(pwep->KeyMaterial, (void *)sme->key, pwep->KeyLength); + + if(rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL) + { + ret = -EOPNOTSUPP ; + } + + if (pwep) { + rtw_mfree((u8 *)pwep,wep_total_len); + } + + if(ret < 0) + goto exit; + } + + ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.cipher_group, _FALSE); + if (ret < 0) + return ret; + + if (sme->crypto.n_akm_suites) { + ret = rtw_cfg80211_set_key_mgt(psecuritypriv, sme->crypto.akm_suites[0]); + if (ret < 0) + goto exit; + } + +#ifdef CONFIG_WAPI_SUPPORT + if(sme->crypto.akm_suites[0] ==WLAN_AKM_SUITE_WAPI_PSK){ + padapter->wapiInfo.bWapiPSK = true; + } + else if(sme->crypto.akm_suites[0] ==WLAN_AKM_SUITE_WAPI_CERT){ + padapter->wapiInfo.bWapiPSK = false; + } +#endif + + authmode = psecuritypriv->ndisauthtype; + rtw_set_802_11_authentication_mode(padapter, authmode); + + //rtw_set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus); + + if (rtw_set_802_11_connect(padapter, sme->bssid, &ndis_ssid) == _FALSE) { + ret = -1; + goto exit; + } + + DBG_8192C("set ssid:dot11AuthAlgrthm=%d, dot11PrivacyAlgrthm=%d, dot118021XGrpPrivacy=%d\n", psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, psecuritypriv->dot118021XGrpPrivacy); + +exit: + + DBG_8192C("<=%s, ret %d\n",__FUNCTION__, ret); + + return ret; +} + +static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev, + u16 reason_code) +{ + _adapter *padapter = wiphy_to_adapter(wiphy); + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + rtw_set_roaming(padapter, 0); + + if(check_fwstate(&padapter->mlmepriv, _FW_LINKED)) + { + rtw_scan_abort(padapter); + LeaveAllPowerSaveMode(padapter); + rtw_disassoc_cmd(padapter, 500, _FALSE); + + DBG_871X("%s...call rtw_indicate_disconnect\n", __FUNCTION__); + + padapter->mlmepriv.not_indic_disco = _TRUE; + rtw_indicate_disconnect(padapter); + padapter->mlmepriv.not_indic_disco = _FALSE; + + rtw_free_assoc_resources(padapter, 1); + } + + return 0; +} + +static int cfg80211_rtw_set_txpower(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) + struct wireless_dev *wdev, +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) || defined(COMPAT_KERNEL_RELEASE) + enum nl80211_tx_power_setting type, int mbm) +#else + enum tx_power_setting type, int dbm) +#endif +{ +#if 0 + struct iwm_priv *iwm = wiphy_to_iwm(wiphy); + int ret; + + switch (type) { + case NL80211_TX_POWER_AUTOMATIC: + return 0; + case NL80211_TX_POWER_FIXED: + if (mbm < 0 || (mbm % 100)) + return -EOPNOTSUPP; + + if (!test_bit(IWM_STATUS_READY, &iwm->status)) + return 0; + + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, + CFG_TX_PWR_LIMIT_USR, + MBM_TO_DBM(mbm) * 2); + if (ret < 0) + return ret; + + return iwm_tx_power_trigger(iwm); + default: + IWM_ERR(iwm, "Unsupported power type: %d\n", type); + return -EOPNOTSUPP; + } +#endif + DBG_8192C("%s\n", __func__); + return 0; +} + +static int cfg80211_rtw_get_txpower(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) + struct wireless_dev *wdev, +#endif + int *dbm) +{ + //_adapter *padapter = wiphy_to_adapter(wiphy); + + DBG_8192C("%s\n", __func__); + + *dbm = (12); + + return 0; +} + +inline bool rtw_cfg80211_pwr_mgmt(_adapter *adapter) +{ + struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(adapter->rtw_wdev); + return rtw_wdev_priv->power_mgmt; +} + +static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy, + struct net_device *ndev, + bool enabled, int timeout) +{ + _adapter *padapter = wiphy_to_adapter(wiphy); + struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(padapter->rtw_wdev); + + DBG_871X(FUNC_NDEV_FMT" enabled:%u, timeout:%d\n", FUNC_NDEV_ARG(ndev), + enabled, timeout); + + rtw_wdev_priv->power_mgmt = enabled; + + #ifdef CONFIG_LPS + if (!enabled) + LPS_Leave(padapter); + #endif + + return 0; +} + +static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy, + struct net_device *netdev, + struct cfg80211_pmksa *pmksa) +{ + u8 index,blInserted = _FALSE; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct security_priv *psecuritypriv = &padapter->securitypriv; + u8 strZeroMacAddress[ ETH_ALEN ] = { 0x00 }; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); + + if ( _rtw_memcmp( pmksa->bssid, strZeroMacAddress, ETH_ALEN ) == _TRUE ) + { + return -EINVAL; + } + + blInserted = _FALSE; + + //overwrite PMKID + for(index=0 ; indexPMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE ) + { // BSSID is matched, the same AP => rewrite with new PMKID. + DBG_871X(FUNC_NDEV_FMT" BSSID exists in the PMKList.\n", FUNC_NDEV_ARG(netdev)); + + _rtw_memcpy( psecuritypriv->PMKIDList[index].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); + psecuritypriv->PMKIDList[index].bUsed = _TRUE; + psecuritypriv->PMKIDIndex = index+1; + blInserted = _TRUE; + break; + } + } + + if(!blInserted) + { + // Find a new entry + DBG_871X(FUNC_NDEV_FMT" Use the new entry index = %d for this PMKID.\n", + FUNC_NDEV_ARG(netdev), psecuritypriv->PMKIDIndex ); + + _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, pmksa->bssid, ETH_ALEN); + _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); + + psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = _TRUE; + psecuritypriv->PMKIDIndex++ ; + if(psecuritypriv->PMKIDIndex==16) + { + psecuritypriv->PMKIDIndex =0; + } + } + + return 0; +} + +static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy, + struct net_device *netdev, + struct cfg80211_pmksa *pmksa) +{ + u8 index, bMatched = _FALSE; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); + + for(index=0 ; indexPMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE ) + { // BSSID is matched, the same AP => Remove this PMKID information and reset it. + _rtw_memset( psecuritypriv->PMKIDList[index].Bssid, 0x00, ETH_ALEN ); + _rtw_memset( psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN ); + psecuritypriv->PMKIDList[index].bUsed = _FALSE; + bMatched = _TRUE; + break; + } + } + + if(_FALSE == bMatched) + { + DBG_871X(FUNC_NDEV_FMT" do not have matched BSSID\n" + , FUNC_NDEV_ARG(netdev)); + return -EINVAL; + } + + return 0; +} + +static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy, + struct net_device *netdev) +{ + _adapter *padapter = wiphy_to_adapter(wiphy); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev)); + + _rtw_memset( &psecuritypriv->PMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); + psecuritypriv->PMKIDIndex = 0; + + return 0; +} + +#ifdef CONFIG_AP_MODE +void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) +{ + s32 freq; + int channel; + struct wireless_dev *pwdev = padapter->rtw_wdev; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct net_device *ndev = padapter->pnetdev; + + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + +#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) + { + struct station_info sinfo; + u8 ie_offset; + if (GetFrameSubType(pmgmt_frame) == WIFI_ASSOCREQ) + ie_offset = _ASOCREQ_IE_OFFSET_; + else // WIFI_REASSOCREQ + ie_offset = _REASOCREQ_IE_OFFSET_; + + sinfo.filled = 0; + sinfo.filled = STATION_INFO_ASSOC_REQ_IES; + sinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset; + sinfo.assoc_req_ies_len = frame_len - WLAN_HDR_A3_LEN - ie_offset; + cfg80211_new_sta(ndev, GetAddr2Ptr(pmgmt_frame), &sinfo, GFP_ATOMIC); + } +#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ + channel = pmlmeext->cur_channel; + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + + #ifdef COMPAT_KERNEL_RELEASE + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); + #else //COMPAT_KERNEL_RELEASE + { + //to avoid WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION) when calling cfg80211_send_rx_assoc() + #ifndef CONFIG_PLATFORM_MSTAR + pwdev->iftype = NL80211_IFTYPE_STATION; + #endif //CONFIG_PLATFORM_MSTAR + DBG_8192C("iftype=%d before call cfg80211_send_rx_assoc()\n", pwdev->iftype); + rtw_cfg80211_send_rx_assoc(padapter, NULL, pmgmt_frame, frame_len); + DBG_8192C("iftype=%d after call cfg80211_send_rx_assoc()\n", pwdev->iftype); + pwdev->iftype = NL80211_IFTYPE_AP; + //cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); + } + #endif //COMPAT_KERNEL_RELEASE +#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ + +} + +void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason) +{ + s32 freq; + int channel; + u8 *pmgmt_frame; + uint frame_len; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + u8 mgmt_buf[128] = {0}; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct net_device *ndev = padapter->pnetdev; + + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + +#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) + cfg80211_del_sta(ndev, da, GFP_ATOMIC); +#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ + channel = pmlmeext->cur_channel; + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + + pmgmt_frame = mgmt_buf; + pwlanhdr = (struct rtw_ieee80211_hdr *)pmgmt_frame; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + //_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + //_rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr1, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pmgmt_frame, WIFI_DEAUTH); + + pmgmt_frame += sizeof(struct rtw_ieee80211_hdr_3addr); + frame_len = sizeof(struct rtw_ieee80211_hdr_3addr); + + reason = cpu_to_le16(reason); + pmgmt_frame = rtw_set_fixed_ie(pmgmt_frame, _RSON_CODE_ , (unsigned char *)&reason, &frame_len); + + #ifdef COMPAT_KERNEL_RELEASE + rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); + #else //COMPAT_KERNEL_RELEASE + cfg80211_send_disassoc(padapter->pnetdev, mgmt_buf, frame_len); + //cfg80211_rx_action(padapter->pnetdev, freq, mgmt_buf, frame_len, GFP_ATOMIC); + #endif //COMPAT_KERNEL_RELEASE +#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ +} + +static int rtw_cfg80211_monitor_if_open(struct net_device *ndev) +{ + int ret = 0; + + DBG_8192C("%s\n", __func__); + + return ret; +} + +static int rtw_cfg80211_monitor_if_close(struct net_device *ndev) +{ + int ret = 0; + + DBG_8192C("%s\n", __func__); + + return ret; +} + +static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct net_device *ndev) +{ + int ret = 0; + int rtap_len; + int qos_len = 0; + int dot11_hdr_len = 24; + int snap_len = 6; + unsigned char *pdata; + u16 frame_ctl; + unsigned char src_mac_addr[6]; + unsigned char dst_mac_addr[6]; + struct ieee80211_hdr *dot11_hdr; + struct ieee80211_radiotap_header *rtap_hdr; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + if (skb) + rtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, skb->truesize); + + if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) + goto fail; + + rtap_hdr = (struct ieee80211_radiotap_header *)skb->data; + if (unlikely(rtap_hdr->it_version)) + goto fail; + + rtap_len = ieee80211_get_radiotap_len(skb->data); + if (unlikely(skb->len < rtap_len)) + goto fail; + + if(rtap_len != 14) + { + DBG_8192C("radiotap len (should be 14): %d\n", rtap_len); + goto fail; + } + + /* Skip the ratio tap header */ + skb_pull(skb, rtap_len); + + dot11_hdr = (struct ieee80211_hdr *)skb->data; + frame_ctl = le16_to_cpu(dot11_hdr->frame_control); + /* Check if the QoS bit is set */ + if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) { + /* Check if this ia a Wireless Distribution System (WDS) frame + * which has 4 MAC addresses + */ + if (dot11_hdr->frame_control & 0x0080) + qos_len = 2; + if ((dot11_hdr->frame_control & 0x0300) == 0x0300) + dot11_hdr_len += 6; + + memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr)); + memcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr)); + + /* Skip the 802.11 header, QoS (if any) and SNAP, but leave spaces for + * for two MAC addresses + */ + skb_pull(skb, dot11_hdr_len + qos_len + snap_len - sizeof(src_mac_addr) * 2); + pdata = (unsigned char*)skb->data; + memcpy(pdata, dst_mac_addr, sizeof(dst_mac_addr)); + memcpy(pdata + sizeof(dst_mac_addr), src_mac_addr, sizeof(src_mac_addr)); + + DBG_8192C("should be eapol packet\n"); + + /* Use the real net device to transmit the packet */ + ret = _rtw_xmit_entry(skb, padapter->pnetdev); + + return ret; + + } + else if ((frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)) + == (RTW_IEEE80211_FTYPE_MGMT|RTW_IEEE80211_STYPE_ACTION) + ) + { + //only for action frames + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + //u8 category, action, OUI_Subtype, dialogToken=0; + //unsigned char *frame_body; + struct rtw_ieee80211_hdr *pwlanhdr; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + u8 *buf = skb->data; + u32 len = skb->len; + u8 category, action; + int type = -1; + + if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) { + DBG_8192C(FUNC_NDEV_FMT" frame_control:0x%x\n", FUNC_NDEV_ARG(ndev), + le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); + goto fail; + } + + DBG_8192C("RTW_Tx:da="MAC_FMT" via "FUNC_NDEV_FMT"\n", + MAC_ARG(GetAddr1Ptr(buf)), FUNC_NDEV_ARG(ndev)); + #ifdef CONFIG_P2P + if((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0) + goto dump; + #endif + if (category == RTW_WLAN_CATEGORY_PUBLIC) + DBG_871X("RTW_Tx:%s\n", action_public_str(action)); + else + DBG_871X("RTW_Tx:category(%u), action(%u)\n", category, action); + +dump: + //starting alloc mgmt frame to dump it + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + goto fail; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->retry_ctrl = _FALSE; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + _rtw_memcpy(pframe, (void*)buf, len); + #ifdef CONFIG_WFD + if (type >= 0) + { + struct wifi_display_info *pwfd_info; + + pwfd_info = padapter->wdinfo.wfd_info; + + if ( _TRUE == pwfd_info->wfd_enable ) + { + rtw_append_wfd_ie( padapter, pframe, &len ); + } + } + #endif // CONFIG_WFD + pattrib->pktlen = len; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + //update seq number + pmlmeext->mgnt_seq = GetSequence(pwlanhdr); + pattrib->seqnum = pmlmeext->mgnt_seq; + pmlmeext->mgnt_seq++; + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + } + else + { + DBG_8192C("frame_ctl=0x%x\n", frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE)); + } + + +fail: + + dev_kfree_skb(skb); + + return 0; + +} + +static void rtw_cfg80211_monitor_if_set_multicast_list(struct net_device *ndev) +{ + DBG_8192C("%s\n", __func__); +} + +static int rtw_cfg80211_monitor_if_set_mac_address(struct net_device *ndev, void *addr) +{ + int ret = 0; + + DBG_8192C("%s\n", __func__); + + return ret; +} + +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) +static const struct net_device_ops rtw_cfg80211_monitor_if_ops = { + .ndo_open = rtw_cfg80211_monitor_if_open, + .ndo_stop = rtw_cfg80211_monitor_if_close, + .ndo_start_xmit = rtw_cfg80211_monitor_if_xmit_entry, + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) + .ndo_set_multicast_list = rtw_cfg80211_monitor_if_set_multicast_list, + #endif + .ndo_set_mac_address = rtw_cfg80211_monitor_if_set_mac_address, +}; +#endif + +static int rtw_cfg80211_add_monitor_if(_adapter *padapter, char *name, struct net_device **ndev) +{ + int ret = 0; + struct net_device* mon_ndev = NULL; + struct wireless_dev* mon_wdev = NULL; + struct rtw_netdev_priv_indicator *pnpi; + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + + if (!name ) { + DBG_871X(FUNC_ADPT_FMT" without specific name\n", FUNC_ADPT_ARG(padapter)); + ret = -EINVAL; + goto out; + } + + if (pwdev_priv->pmon_ndev) { + DBG_871X(FUNC_ADPT_FMT" monitor interface exist: "NDEV_FMT"\n", + FUNC_ADPT_ARG(padapter), NDEV_ARG(pwdev_priv->pmon_ndev)); + ret = -EBUSY; + goto out; + } + + mon_ndev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); + if (!mon_ndev) { + DBG_871X(FUNC_ADPT_FMT" allocate ndev fail\n", FUNC_ADPT_ARG(padapter)); + ret = -ENOMEM; + goto out; + } + + mon_ndev->type = ARPHRD_IEEE80211_RADIOTAP; + strncpy(mon_ndev->name, name, IFNAMSIZ); + mon_ndev->name[IFNAMSIZ - 1] = 0; + mon_ndev->destructor = rtw_ndev_destructor; + +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) + mon_ndev->netdev_ops = &rtw_cfg80211_monitor_if_ops; +#else + mon_ndev->open = rtw_cfg80211_monitor_if_open; + mon_ndev->stop = rtw_cfg80211_monitor_if_close; + mon_ndev->hard_start_xmit = rtw_cfg80211_monitor_if_xmit_entry; + mon_ndev->set_mac_address = rtw_cfg80211_monitor_if_set_mac_address; +#endif + + pnpi = netdev_priv(mon_ndev); + pnpi->priv = padapter; + pnpi->sizeof_priv = sizeof(_adapter); + + /* wdev */ + mon_wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); + if (!mon_wdev) { + DBG_871X(FUNC_ADPT_FMT" allocate mon_wdev fail\n", FUNC_ADPT_ARG(padapter)); + ret = -ENOMEM; + goto out; + } + + mon_wdev->wiphy = padapter->rtw_wdev->wiphy; + mon_wdev->netdev = mon_ndev; + mon_wdev->iftype = NL80211_IFTYPE_MONITOR; + mon_ndev->ieee80211_ptr = mon_wdev; + + ret = register_netdevice(mon_ndev); + if (ret) { + goto out; + } + + *ndev = pwdev_priv->pmon_ndev = mon_ndev; + _rtw_memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ+1); + +out: + if (ret && mon_wdev) { + rtw_mfree((u8*)mon_wdev, sizeof(struct wireless_dev)); + mon_wdev = NULL; + } + + if (ret && mon_ndev) { + free_netdev(mon_ndev); + *ndev = mon_ndev = NULL; + } + + return ret; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) +static struct wireless_dev * +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) +static struct net_device * +#else +static int +#endif + cfg80211_rtw_add_virtual_intf( + struct wiphy *wiphy, + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)) + const char *name, + #else + char *name, + #endif + enum nl80211_iftype type, u32 *flags, struct vif_params *params) +{ + int ret = 0; + struct net_device* ndev = NULL; + _adapter *padapter = wiphy_to_adapter(wiphy); + + DBG_871X(FUNC_ADPT_FMT " wiphy:%s, name:%s, type:%d\n", + FUNC_ADPT_ARG(padapter), wiphy_name(wiphy), name, type); + + switch (type) { + case NL80211_IFTYPE_ADHOC: + case NL80211_IFTYPE_AP_VLAN: + case NL80211_IFTYPE_WDS: + case NL80211_IFTYPE_MESH_POINT: + ret = -ENODEV; + break; + case NL80211_IFTYPE_MONITOR: + ret = rtw_cfg80211_add_monitor_if(padapter, (char *)name, &ndev); + break; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + case NL80211_IFTYPE_P2P_CLIENT: +#endif + case NL80211_IFTYPE_STATION: + ret = -ENODEV; + break; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + case NL80211_IFTYPE_P2P_GO: +#endif + case NL80211_IFTYPE_AP: + ret = -ENODEV; + break; + default: + ret = -ENODEV; + DBG_871X("Unsupported interface type\n"); + break; + } + + DBG_871X(FUNC_ADPT_FMT" ndev:%p, ret:%d\n", FUNC_ADPT_ARG(padapter), ndev, ret); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + return ndev ? ndev->ieee80211_ptr : ERR_PTR(ret); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + return ndev ? ndev : ERR_PTR(ret); +#else + return ret; +#endif +} + +static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + struct wireless_dev *wdev +#else + struct net_device *ndev +#endif +) +{ + struct rtw_wdev_priv *pwdev_priv = (struct rtw_wdev_priv *)wiphy_priv(wiphy); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + struct net_device *ndev; + ndev = wdev ? wdev->netdev : NULL; +#endif + + if (!ndev) + goto exit; + + unregister_netdevice(ndev); + + if (ndev == pwdev_priv->pmon_ndev) { + pwdev_priv->pmon_ndev = NULL; + pwdev_priv->ifname_mon[0] = '\0'; + DBG_871X(FUNC_NDEV_FMT" remove monitor interface\n", FUNC_NDEV_ARG(ndev)); + } + +exit: + return 0; +} + +static int rtw_add_beacon(_adapter *adapter, const u8 *head, size_t head_len, const u8 *tail, size_t tail_len) +{ + int ret=0; + u8 *pbuf = NULL; + uint len, wps_ielen=0; + uint p2p_ielen=0; + u8 *p2p_ie; + u8 got_p2p_ie = _FALSE; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + //struct sta_priv *pstapriv = &padapter->stapriv; + + + DBG_8192C("%s beacon_head_len=%zu, beacon_tail_len=%zu\n", __FUNCTION__, head_len, tail_len); + + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) + return -EINVAL; + + if(head_len<24) + return -EINVAL; + + + pbuf = rtw_zmalloc(head_len+tail_len); + if(!pbuf) + return -ENOMEM; + + + //_rtw_memcpy(&pstapriv->max_num_sta, param->u.bcn_ie.reserved, 2); + + //if((pstapriv->max_num_sta>NUM_STA) || (pstapriv->max_num_sta<=0)) + // pstapriv->max_num_sta = NUM_STA; + + + _rtw_memcpy(pbuf, (void *)head+24, head_len-24);// 24=beacon header len. + _rtw_memcpy(pbuf+head_len-24, (void *)tail, tail_len); + + len = head_len+tail_len-24; + + //check wps ie if inclued + if(rtw_get_wps_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &wps_ielen)) + DBG_8192C("add bcn, wps_ielen=%d\n", wps_ielen); + +#ifdef CONFIG_P2P + //check p2p ie if inclued + if( adapter->wdinfo.driver_interface == DRIVER_CFG80211 ) + { + //check p2p if enable + if(rtw_get_p2p_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &p2p_ielen)) + { + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct wifidirect_info *pwdinfo= &(adapter->wdinfo); + + DBG_8192C("got p2p_ie, len=%d\n", p2p_ielen); + got_p2p_ie = _TRUE; + + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + DBG_8192C("Enable P2P function for the first time\n"); + rtw_p2p_enable(adapter, P2P_ROLE_GO); + wdev_to_priv(adapter->rtw_wdev)->p2p_enabled = _TRUE; + } + else + { + _cancel_timer_ex( &pwdinfo->find_phase_timer ); + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); + + DBG_8192C("enter GO Mode, p2p_ielen=%d\n", p2p_ielen); + + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); + pwdinfo->intent = 15; + } + } + } +#endif // CONFIG_P2P + + /* pbss_network->IEs will not include p2p_ie, wfd ie */ + rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, P2P_OUI, 4); + rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, WFD_OUI, 4); + + if (rtw_check_beacon_data(adapter, pbuf, len) == _SUCCESS) + { +#ifdef CONFIG_P2P + //check p2p if enable + if(got_p2p_ie == _TRUE) + { + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct wifidirect_info *pwdinfo= &(adapter->wdinfo); + pwdinfo->operating_channel = pmlmeext->cur_channel; + } +#endif //CONFIG_P2P + ret = 0; + } + else + { + ret = -EINVAL; + } + + + rtw_mfree(pbuf, head_len+tail_len); + + return ret; +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE) +static int cfg80211_rtw_add_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct beacon_parameters *info) +{ + int ret=0; + _adapter *adapter = wiphy_to_adapter(wiphy); + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); + + return ret; +} + +static int cfg80211_rtw_set_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct beacon_parameters *info) +{ + _adapter *padapter = wiphy_to_adapter(wiphy); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + pmlmeext->bstart_bss = _TRUE; + + cfg80211_rtw_add_beacon(wiphy, ndev, info); + + return 0; +} + +static int cfg80211_rtw_del_beacon(struct wiphy *wiphy, struct net_device *ndev) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} +#else +static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_ap_settings *settings) +{ + int ret = 0; + _adapter *adapter = wiphy_to_adapter(wiphy); + + DBG_871X(FUNC_NDEV_FMT" hidden_ssid:%d, auth_type:%d\n", FUNC_NDEV_ARG(ndev), + settings->hidden_ssid, settings->auth_type); + + ret = rtw_add_beacon(adapter, settings->beacon.head, settings->beacon.head_len, + settings->beacon.tail, settings->beacon.tail_len); + + adapter->mlmeextpriv.mlmext_info.hidden_ssid_mode = settings->hidden_ssid; + + if (settings->ssid && settings->ssid_len) { + WLAN_BSSID_EX *pbss_network = &adapter->mlmepriv.cur_network.network; + WLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network; + + if(0) + DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter), + settings->ssid, settings->ssid_len, + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength); + + _rtw_memcpy(pbss_network->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); + pbss_network->Ssid.SsidLength = settings->ssid_len; + _rtw_memcpy(pbss_network_ext->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); + pbss_network_ext->Ssid.SsidLength = settings->ssid_len; + + if(0) + DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, + pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); + } + + return ret; +} + +static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_beacon_data *info) +{ + int ret = 0; + _adapter *adapter = wiphy_to_adapter(wiphy); + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); + + return ret; +} + +static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + return 0; +} + +#endif //(LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) + +static int cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev, + u8 *mac, struct station_parameters *params) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} + +static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev, + u8 *mac) +{ + int ret=0; + _irqL irqL; + _list *phead, *plist; + u8 updated; + struct sta_info *psta = NULL; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct sta_priv *pstapriv = &padapter->stapriv; + + DBG_871X("+"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE) + { + DBG_8192C("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n", __func__); + return -EINVAL; + } + + + if(!mac) + { + DBG_8192C("flush all sta, and cam_entry\n"); + + flush_all_cam_entry(padapter); //clear CAM + + ret = rtw_sta_flush(padapter); + + return ret; + } + + + DBG_8192C("free sta macaddr =" MAC_FMT "\n", MAC_ARG(mac)); + + if (mac[0] == 0xff && mac[1] == 0xff && + mac[2] == 0xff && mac[3] == 0xff && + mac[4] == 0xff && mac[5] == 0xff) + { + return -EINVAL; + } + + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //check asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + if(_rtw_memcmp(mac, psta->hwaddr, ETH_ALEN)) + { + if(psta->dot8021xalg == 1 && psta->bpairwise_key_installed == _FALSE) + { + DBG_8192C("%s, sta's dot8021xalg = 1 and key_installed = _FALSE\n", __func__); + } + else + { + DBG_8192C("free psta=%p, aid=%d\n", psta, psta->aid); + + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + + //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING); + //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + psta = NULL; + + break; + } + + } + + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + associated_clients_update(padapter, updated); + + DBG_871X("-"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return ret; + +} + +static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *ndev, + u8 *mac, struct station_parameters *params) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} + +static int cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev, + int idx, u8 *mac, struct station_info *sinfo) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + //TODO: dump scanned queue + + return -ENOENT; +} + +static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev, + struct bss_parameters *params) +{ + u8 i; + + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); +/* + DBG_8192C("use_cts_prot=%d\n", params->use_cts_prot); + DBG_8192C("use_short_preamble=%d\n", params->use_short_preamble); + DBG_8192C("use_short_slot_time=%d\n", params->use_short_slot_time); + DBG_8192C("ap_isolate=%d\n", params->ap_isolate); + + DBG_8192C("basic_rates_len=%d\n", params->basic_rates_len); + for(i=0; ibasic_rates_len; i++) + { + DBG_8192C("basic_rates=%d\n", params->basic_rates[i]); + + } +*/ + return 0; + +} + +static int cfg80211_rtw_set_channel(struct wiphy *wiphy + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + , struct net_device *ndev + #endif + , struct ieee80211_channel *chan, enum nl80211_channel_type channel_type) +{ + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + #endif + + return 0; +} + +static int cfg80211_rtw_auth(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_auth_request *req) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} + +static int cfg80211_rtw_assoc(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_assoc_request *req) +{ + DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} +#endif //CONFIG_AP_MODE + +void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) +{ + int type; + s32 freq; + int channel; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + u8 category, action; + + channel = rtw_get_oper_ch(padapter); + + DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); + #ifdef CONFIG_P2P + type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE); + if (type >= 0) + goto indicate; + #endif + rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action); + DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); + +indicate: + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); +#endif +} + +void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) +{ + int type; + s32 freq; + int channel; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + u8 category, action; + + channel = rtw_get_oper_ch(padapter); + + DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); + #ifdef CONFIG_P2P + type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE); + if (type >= 0) { + switch (type) { + case P2P_GO_NEGO_CONF: + case P2P_PROVISION_DISC_RESP: + case P2P_INVIT_RESP: + rtw_set_scan_deny(padapter, 2000); + rtw_clear_scan_deny(padapter); + } + goto indicate; + } + #endif + rtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action); + DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); + +indicate: + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); +#endif +} + +void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg) +{ + s32 freq; + int channel; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(adapter->rtw_wdev); + u8 category, action; + + channel = rtw_get_oper_ch(adapter); + + rtw_action_frame_parse(frame, frame_len, &category, &action); + + DBG_8192C("RTW_Rx:cur_ch=%d\n", channel); + if (msg) + DBG_871X("RTW_Rx:%s\n", msg); + else + DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action); + + if (channel <= RTW_CH_MAX_2G_CHANNEL) + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); + else + freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); +#endif + +} + +#ifdef CONFIG_P2P +void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len) +{ + u16 wps_devicepassword_id = 0x0000; + uint wps_devicepassword_id_len = 0; + u8 wpsie[ 255 ] = { 0x00 }, p2p_ie[ 255 ] = { 0x00 }; + uint p2p_ielen = 0; + uint wpsielen = 0; + u32 devinfo_contentlen = 0; + u8 devinfo_content[64] = { 0x00 }; + u16 capability = 0; + uint capability_len = 0; + + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u8 dialogToken = 1; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_PROVISION_DISC_REQ; + u32 p2pielen = 0; +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif //CONFIG_WFD + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 *frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); + size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr); + + + DBG_871X( "[%s] In\n", __FUNCTION__ ); + + //prepare for building provision_request frame + _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr1Ptr(buf), ETH_ALEN); + _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, GetAddr1Ptr(buf), ETH_ALEN); + + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; + + rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); + rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len); + wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id ); + + switch(wps_devicepassword_id) + { + case WPS_DPID_PIN: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL; + break; + case WPS_DPID_USER_SPEC: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA; + break; + case WPS_DPID_MACHINE_SPEC: + break; + case WPS_DPID_REKEY: + break; + case WPS_DPID_PBC: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; + break; + case WPS_DPID_REGISTRAR_SPEC: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD; + break; + default: + break; + } + + + if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, devinfo_content, &devinfo_contentlen); + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&capability, &capability_len); + + } + + + //start to build provision_request frame + _rtw_memset(wpsie, 0, sizeof(wpsie)); + _rtw_memset(p2p_ie, 0, sizeof(p2p_ie)); + p2p_ielen = 0; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + + //build_prov_disc_request_p2p_ie + // P2P OUI + p2pielen = 0; + p2p_ie[ p2pielen++ ] = 0x50; + p2p_ie[ p2pielen++ ] = 0x6F; + p2p_ie[ p2pielen++ ] = 0x9A; + p2p_ie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20110301 + // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes + // 1. P2P Capability + // 2. Device Info + // 3. Group ID ( When joining an operating P2P Group ) + + // P2P Capability ATTR + // Type: + p2p_ie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + RTW_PUT_LE16(p2p_ie + p2pielen, 0x0002); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Group Capability Bitmap, 1 byte + _rtw_memcpy(p2p_ie + p2pielen, &capability, 2); + p2pielen += 2; + + + // Device Info ATTR + // Type: + p2p_ie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + RTW_PUT_LE16(p2p_ie + p2pielen, devinfo_contentlen); + p2pielen += 2; + + // Value: + _rtw_memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen); + p2pielen += devinfo_contentlen; + + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2p_ie, &p2p_ielen); + //p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, NULL, 0, pwdinfo->tx_prov_disc_info.peerDevAddr); + //pframe += p2pielen; + pattrib->pktlen += p2p_ielen; + + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Config Method + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request ); + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + +#ifdef CONFIG_WFD + wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif //CONFIG_WFD + + pattrib->last_txcmdsz = pattrib->pktlen; + + //dump_mgntframe(padapter, pmgntframe); + if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) + DBG_8192C("%s, ack to\n", __func__); + + //if(wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) + //{ + // DBG_8192C("waiting for p2p peer key-in PIN CODE\n"); + // rtw_msleep_os(15000); // 15 sec for key in PIN CODE, workaround for GS2 before issuing Nego Req. + //} + +} + +static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + struct ieee80211_channel * channel, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + enum nl80211_channel_type channel_type, +#endif + unsigned int duration, u64 *cookie) +{ + s32 err = 0; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; + u8 remain_ch = (u8) ieee80211_frequency_to_channel(channel->center_freq); + u8 ready_on_channel = _FALSE; + + DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter), remain_ch, duration); + + if(pcfg80211_wdinfo->is_ro_ch == _TRUE) + { + DBG_8192C("%s, cancel ro ch timer\n", __func__); + + _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); + +#ifdef CONFIG_CONCURRENT_MODE + ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); +#endif //CONFIG_CONCURRENT_MODE + + p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK); + } + + pcfg80211_wdinfo->is_ro_ch = _TRUE; + + if(_FAIL == rtw_pwr_wakeup(padapter)) { + err = -EFAULT; + goto exit; + } + + _rtw_memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel, sizeof(struct ieee80211_channel)); + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + pcfg80211_wdinfo->remain_on_ch_type= channel_type; + #endif + pcfg80211_wdinfo->remain_on_ch_cookie= *cookie; + + rtw_scan_abort(padapter); +#ifdef CONFIG_CONCURRENT_MODE + if(rtw_buddy_adapter_up(padapter)) + rtw_scan_abort(padapter->pbuddy_adapter); +#endif //CONFIG_CONCURRENT_MODE + + //if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) + if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); + wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE; + } + else + { + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); +#endif + } + + + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); + + + if(duration < 400) + duration = duration*3;//extend from exper. + + +#ifdef CONFIG_CONCURRENT_MODE + if(check_buddy_fwstate(padapter, _FW_LINKED) && + (durationext_listen_interval)) + { + duration = duration + pwdinfo->ext_listen_interval; + } +#endif + + pcfg80211_wdinfo->restore_channel = rtw_get_oper_ch(padapter); + + if(rtw_ch_set_search_ch(pmlmeext->channel_set, remain_ch) >= 0) { +#ifdef CONFIG_CONCURRENT_MODE + if ( check_buddy_fwstate(padapter, _FW_LINKED ) ) + { + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + + if(remain_ch != pbuddy_mlmeext->cur_channel) + { + if(ATOMIC_READ(&pwdev_priv->switch_ch_to)==1 || + (remain_ch != pmlmeext->cur_channel)) + { + DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); + issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); + + ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); + + DBG_8192C("%s, set switch ch timer, duration=%d\n", __func__, duration-pwdinfo->ext_listen_interval); + _set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval); + } + } + + ready_on_channel = _TRUE; + //pmlmeext->cur_channel = remain_ch; + //set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + }else +#endif //CONFIG_CONCURRENT_MODE + if(remain_ch != pmlmeext->cur_channel ) + { + ready_on_channel = _TRUE; + //pmlmeext->cur_channel = remain_ch; + //set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + } + } else { + DBG_871X("%s remain_ch:%u not in channel plan!!!!\n", __FUNCTION__, remain_ch); + } + + + //call this after other things have been done +#ifdef CONFIG_CONCURRENT_MODE + if(ATOMIC_READ(&pwdev_priv->ro_ch_to)==1 || + (remain_ch != pmlmeext->cur_channel)) + { + u8 co_channel = 0xff; + ATOMIC_SET(&pwdev_priv->ro_ch_to, 0); +#endif + + if(ready_on_channel == _TRUE) + { + if ( !check_fwstate(&padapter->mlmepriv, _FW_LINKED ) ) + { + pmlmeext->cur_channel = remain_ch; + + + set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + } + } + DBG_8192C("%s, set ro ch timer, duration=%d\n", __func__, duration); + _set_timer( &pcfg80211_wdinfo->remain_on_ch_timer, duration); + +#ifdef CONFIG_CONCURRENT_MODE + } +#endif + + rtw_cfg80211_ready_on_channel(padapter, *cookie, channel, channel_type, duration, GFP_KERNEL); + +exit: + if (err) + pcfg80211_wdinfo->is_ro_ch = _FALSE; + + return err; +} + +static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + u64 cookie) +{ + s32 err = 0; + _adapter *padapter = wiphy_to_adapter(wiphy); + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; + + DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + if (pcfg80211_wdinfo->is_ro_ch == _TRUE) { + DBG_8192C("%s, cancel ro ch timer\n", __func__); + _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); + #ifdef CONFIG_CONCURRENT_MODE + ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); + #endif + p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK); + } + + #if 0 + // Disable P2P Listen State + if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) + { + if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + _cancel_timer_ex( &pwdinfo->find_phase_timer ); + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer); + + rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE); + _rtw_memset(pwdinfo, 0x00, sizeof(struct wifidirect_info)); + } + } + else + #endif + { + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); +#endif + } + pcfg80211_wdinfo->is_ro_ch = _FALSE; + + return err; +} + +#endif //CONFIG_P2P + +static int _cfg80211_rtw_mgmt_tx(_adapter *padapter, u8 tx_ch, const u8 *buf, size_t len) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + int ret = _FAIL; + bool ack = _TRUE; + struct rtw_ieee80211_hdr *pwlanhdr; + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + //struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; + + if(_FAIL == rtw_pwr_wakeup(padapter)) { + ret = -EFAULT; + goto exit; + } + + rtw_set_scan_deny(padapter, 1000); + + rtw_scan_abort(padapter); + #ifdef CONFIG_CONCURRENT_MODE + if(rtw_buddy_adapter_up(padapter)) + rtw_scan_abort(padapter->pbuddy_adapter); + #endif /* CONFIG_CONCURRENT_MODE */ + + if (padapter->cfg80211_wdinfo.is_ro_ch == _TRUE) { + //DBG_8192C("%s, cancel ro ch timer\n", __func__); + //_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); + //padapter->cfg80211_wdinfo.is_ro_ch = _FALSE; + #ifdef CONFIG_CONCURRENT_MODE + if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED )) + { + DBG_8192C("%s, extend ro ch time\n", __func__); + _set_timer( &padapter->cfg80211_wdinfo.remain_on_ch_timer, pwdinfo->ext_listen_period); + } + #endif //CONFIG_CONCURRENT_MODE + } + +#ifdef CONFIG_CONCURRENT_MODE + if (check_buddy_fwstate(padapter, _FW_LINKED )) { + u8 co_channel=0xff; + PADAPTER pbuddy_adapter = padapter->pbuddy_adapter; + struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; + + co_channel = rtw_get_oper_ch(padapter); + + if (tx_ch != pbuddy_mlmeext->cur_channel) { + + u16 ext_listen_period; + + if (ATOMIC_READ(&pwdev_priv->switch_ch_to)==1) { + DBG_8192C("%s, issue nulldata pwrbit=1\n", __func__); + issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500); + + ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); + + //DBG_8192C("%s, set switch ch timer, period=%d\n", __func__, pwdinfo->ext_listen_period); + //_set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period); + } + + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED )) + { + ext_listen_period = 500;// 500ms + } + else + { + ext_listen_period = pwdinfo->ext_listen_period; + } + + DBG_8192C("%s, set switch ch timer, period=%d\n", __func__, ext_listen_period); + _set_timer(&pwdinfo->ap_p2p_switch_timer, ext_listen_period); + + } + + if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED )) + pmlmeext->cur_channel = tx_ch; + + if (tx_ch != co_channel) + set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + }else +#endif //CONFIG_CONCURRENT_MODE + //if (tx_ch != pmlmeext->cur_channel) { + if(tx_ch != rtw_get_oper_ch(padapter)) { + if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED )) + pmlmeext->cur_channel = tx_ch; + set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + } + + //starting alloc mgmt frame to dump it + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + //ret = -ENOMEM; + ret = _FAIL; + goto exit; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->retry_ctrl = _FALSE; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + _rtw_memcpy(pframe, (void*)buf, len); + pattrib->pktlen = len; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + //update seq number + pmlmeext->mgnt_seq = GetSequence(pwlanhdr); + pattrib->seqnum = pmlmeext->mgnt_seq; + pmlmeext->mgnt_seq++; + +#ifdef CONFIG_WFD + { + struct wifi_display_info *pwfd_info; + + pwfd_info = padapter->wdinfo.wfd_info; + + if ( _TRUE == pwfd_info->wfd_enable ) + { + rtw_append_wfd_ie( padapter, pframe, &pattrib->pktlen ); + } + } +#endif // CONFIG_WFD + + pattrib->last_txcmdsz = pattrib->pktlen; + + if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) + { + ack = _FALSE; + ret = _FAIL; + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ack == _FAIL\n", __func__); + #endif + } + else + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ack=%d, ok!\n", __func__, ack); + #endif + ret = _SUCCESS; + } + +exit: + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ret=%d\n", __func__, ret); + #endif + + return ret; + +} + +static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + struct ieee80211_channel *chan, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + bool offchan, +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + enum nl80211_channel_type channel_type, + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + bool channel_type_valid, + #endif +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + unsigned int wait, +#endif + const u8 *buf, size_t len, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) + bool no_cck, +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) + bool dont_wait_for_ack, +#endif + u64 *cookie) +{ + _adapter *padapter = (_adapter *)wiphy_to_adapter(wiphy); + struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); + int ret = 0; + int tx_ret; + u32 dump_limit = RTW_MAX_MGMT_TX_CNT; + u32 dump_cnt = 0; + bool ack = _TRUE; + u8 tx_ch = (u8)ieee80211_frequency_to_channel(chan->center_freq); + u8 category, action; + int type = (-1); + u32 start = rtw_get_current_time(); + + /* cookie generation */ + *cookie = (unsigned long) buf; + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X(FUNC_ADPT_FMT" len=%zu, ch=%d" + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + ", ch_type=%d" + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + ", channel_type_valid=%d" + #endif + #endif + "\n", FUNC_ADPT_ARG(padapter), + len, tx_ch + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) + , channel_type + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + , channel_type_valid + #endif + #endif + ); +#endif /* CONFIG_DEBUG_CFG80211 */ + + /* indicate ack before issue frame to avoid racing with rsp frame */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_mgmt_tx_status(padapter, *cookie, buf, len, ack, GFP_KERNEL); +#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35)) + cfg80211_action_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); +#endif + + if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) { + DBG_8192C(FUNC_ADPT_FMT" frame_control:0x%x\n", FUNC_ADPT_ARG(padapter), + le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); + goto exit; + } + + DBG_8192C("RTW_Tx:tx_ch=%d, da="MAC_FMT"\n", tx_ch, MAC_ARG(GetAddr1Ptr(buf))); + #ifdef CONFIG_P2P + if((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0) { + goto dump; + } + #endif + if (category == RTW_WLAN_CATEGORY_PUBLIC) + DBG_871X("RTW_Tx:%s\n", action_public_str(action)); + else + DBG_871X("RTW_Tx:category(%u), action(%u)\n", category, action); + +dump: + do { + dump_cnt++; + tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len); + } while (dump_cnt < dump_limit && tx_ret != _SUCCESS); + + if (tx_ret != _SUCCESS || dump_cnt > 1) { + DBG_871X(FUNC_ADPT_FMT" %s (%d/%d) in %d ms\n", FUNC_ADPT_ARG(padapter), + tx_ret==_SUCCESS?"OK":"FAIL", dump_cnt, dump_limit, rtw_get_passing_time_ms(start)); + } + + switch (type) { + case P2P_GO_NEGO_CONF: + rtw_clear_scan_deny(padapter); + break; + case P2P_INVIT_RESP: + if (pwdev_priv->invit_info.flags & BIT(0) + && pwdev_priv->invit_info.status == 0) + { + DBG_871X(FUNC_ADPT_FMT" agree with invitation of persistent group\n", + FUNC_ADPT_ARG(padapter)); + rtw_set_scan_deny(padapter, 5000); + rtw_pwr_wakeup_ex(padapter, 5000); + rtw_clear_scan_deny(padapter); + } + break; + } + +exit: + return ret; +} + +static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + u16 frame_type, bool reg) +{ + _adapter *adapter = wiphy_to_adapter(wiphy); + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_871X(FUNC_ADPT_FMT" frame_type:%x, reg:%d\n", FUNC_ADPT_ARG(adapter), + frame_type, reg); +#endif + + if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ)) + return; + + return; +} + +static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len) +{ + int ret = 0; + uint wps_ielen = 0; + u8 *wps_ie; + u32 p2p_ielen = 0; + u8 wps_oui[8]={0x0,0x50,0xf2,0x04}; + u8 *p2p_ie; + u32 wfd_ielen = 0; + u8 *wfd_ie; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + DBG_871X(FUNC_NDEV_FMT" ielen=%d\n", FUNC_NDEV_ARG(ndev), len); + + if(len>0) + { + if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("bcn_wps_ielen=%d\n", wps_ielen); + #endif + + if(pmlmepriv->wps_beacon_ie) + { + u32 free_len = pmlmepriv->wps_beacon_ie_len; + pmlmepriv->wps_beacon_ie_len = 0; + rtw_mfree(pmlmepriv->wps_beacon_ie, free_len); + pmlmepriv->wps_beacon_ie = NULL; + } + + pmlmepriv->wps_beacon_ie = rtw_malloc(wps_ielen); + if ( pmlmepriv->wps_beacon_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + + _rtw_memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen); + pmlmepriv->wps_beacon_ie_len = wps_ielen; + + update_beacon(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, _TRUE); + + } + + //buf += wps_ielen; + //len -= wps_ielen; + + #ifdef CONFIG_P2P + if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("bcn_p2p_ielen=%d\n", p2p_ielen); + #endif + + if(pmlmepriv->p2p_beacon_ie) + { + u32 free_len = pmlmepriv->p2p_beacon_ie_len; + pmlmepriv->p2p_beacon_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_beacon_ie, free_len); + pmlmepriv->p2p_beacon_ie = NULL; + } + + pmlmepriv->p2p_beacon_ie = rtw_malloc(p2p_ielen); + if ( pmlmepriv->p2p_beacon_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + + _rtw_memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_beacon_ie_len = p2p_ielen; + + } + #endif //CONFIG_P2P + + //buf += p2p_ielen; + //len -= p2p_ielen; + + #ifdef CONFIG_WFD + if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("bcn_wfd_ielen=%d\n", wfd_ielen); + #endif + + if(pmlmepriv->wfd_beacon_ie) + { + u32 free_len = pmlmepriv->wfd_beacon_ie_len; + pmlmepriv->wfd_beacon_ie_len = 0; + rtw_mfree(pmlmepriv->wfd_beacon_ie, free_len); + pmlmepriv->wfd_beacon_ie = NULL; + } + + pmlmepriv->wfd_beacon_ie = rtw_malloc(wfd_ielen); + if ( pmlmepriv->wfd_beacon_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len); + } + #endif //CONFIG_WFD + + pmlmeext->bstart_bss = _TRUE; + + } + + return ret; + +} + +static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net, char *buf, int len) +{ + int ret = 0; + uint wps_ielen = 0; + u8 *wps_ie; + u32 p2p_ielen = 0; + u8 *p2p_ie; + u32 wfd_ielen = 0; + u8 *wfd_ie; + _adapter *padapter = (_adapter *)rtw_netdev_priv(net); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ielen=%d\n", __func__, len); +#endif + + if(len>0) + { + if((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen))) + { + uint attr_contentlen = 0; + u16 uconfig_method, *puconfig_method = NULL; + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_resp_wps_ielen=%d\n", wps_ielen); + #endif + + if(check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) + { + u8 sr = 0; + rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL); + + if (sr != 0) + { + DBG_871X("%s, got sr\n", __func__); + } + else + { + DBG_8192C("GO mode process WPS under site-survey, sr no set\n"); + return ret; + } + } + + if(pmlmepriv->wps_probe_resp_ie) + { + u32 free_len = pmlmepriv->wps_probe_resp_ie_len; + pmlmepriv->wps_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->wps_probe_resp_ie, free_len); + pmlmepriv->wps_probe_resp_ie = NULL; + } + + pmlmepriv->wps_probe_resp_ie = rtw_malloc(wps_ielen); + if ( pmlmepriv->wps_probe_resp_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + + //add PUSH_BUTTON config_method by driver self in wpsie of probe_resp at GO Mode + if ( (puconfig_method = (u16*)rtw_get_wps_attr_content( wps_ie, wps_ielen, WPS_ATTR_CONF_METHOD , NULL, &attr_contentlen)) != NULL ) + { + #ifdef CONFIG_DEBUG_CFG80211 + //printk("config_method in wpsie of probe_resp = 0x%x\n", be16_to_cpu(*puconfig_method)); + #endif + + uconfig_method = WPS_CM_PUSH_BUTTON; + uconfig_method = cpu_to_be16( uconfig_method ); + + *puconfig_method |= uconfig_method; + } + + _rtw_memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen); + pmlmepriv->wps_probe_resp_ie_len = wps_ielen; + + } + + //buf += wps_ielen; + //len -= wps_ielen; + + #ifdef CONFIG_P2P + if((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) + { + u8 is_GO = _FALSE; + u32 attr_contentlen = 0; + u16 cap_attr=0; + + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_resp_p2p_ielen=%d\n", p2p_ielen); + #endif + + //Check P2P Capability ATTR + if( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen) ) + { + u8 grp_cap=0; + //DBG_8192C( "[%s] Got P2P Capability Attr!!\n", __FUNCTION__ ); + cap_attr = le16_to_cpu(cap_attr); + grp_cap = (u8)((cap_attr >> 8)&0xff); + + is_GO = (grp_cap&BIT(0)) ? _TRUE:_FALSE; + + if(is_GO) + DBG_8192C("Got P2P Capability Attr, grp_cap=0x%x, is_GO\n", grp_cap); + } + + + if(is_GO == _FALSE) + { + if(pmlmepriv->p2p_probe_resp_ie) + { + u32 free_len = pmlmepriv->p2p_probe_resp_ie_len; + pmlmepriv->p2p_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_probe_resp_ie, free_len); + pmlmepriv->p2p_probe_resp_ie = NULL; + } + + pmlmepriv->p2p_probe_resp_ie = rtw_malloc(p2p_ielen); + if ( pmlmepriv->p2p_probe_resp_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen; + } + else + { + if(pmlmepriv->p2p_go_probe_resp_ie) + { + u32 free_len = pmlmepriv->p2p_go_probe_resp_ie_len; + pmlmepriv->p2p_go_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_go_probe_resp_ie, free_len); + pmlmepriv->p2p_go_probe_resp_ie = NULL; + } + + pmlmepriv->p2p_go_probe_resp_ie = rtw_malloc(p2p_ielen); + if ( pmlmepriv->p2p_go_probe_resp_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->p2p_go_probe_resp_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen; + } + + } + #endif //CONFIG_P2P + + //buf += p2p_ielen; + //len -= p2p_ielen; + + #ifdef CONFIG_WFD + if(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) + { + #ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("probe_resp_wfd_ielen=%d\n", wfd_ielen); + #endif + + if(pmlmepriv->wfd_probe_resp_ie) + { + u32 free_len = pmlmepriv->wfd_probe_resp_ie_len; + pmlmepriv->wfd_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->wfd_probe_resp_ie, free_len); + pmlmepriv->wfd_probe_resp_ie = NULL; + } + + pmlmepriv->wfd_probe_resp_ie = rtw_malloc(wfd_ielen); + if ( pmlmepriv->wfd_probe_resp_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len); + } + #endif //CONFIG_WFD + + } + + return ret; + +} + +static int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net, char *buf, int len) +{ + int ret = 0; + _adapter *padapter = (_adapter *)rtw_netdev_priv(net); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + DBG_8192C("%s, ielen=%d\n", __func__, len); + + if(len>0) + { + if(pmlmepriv->wps_assoc_resp_ie) + { + u32 free_len = pmlmepriv->wps_assoc_resp_ie_len; + pmlmepriv->wps_assoc_resp_ie_len = 0; + rtw_mfree(pmlmepriv->wps_assoc_resp_ie, free_len); + pmlmepriv->wps_assoc_resp_ie = NULL; + } + + pmlmepriv->wps_assoc_resp_ie = rtw_malloc(len); + if ( pmlmepriv->wps_assoc_resp_ie == NULL) { + DBG_8192C("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->wps_assoc_resp_ie, buf, len); + pmlmepriv->wps_assoc_resp_ie_len = len; + } + + return ret; + +} + +int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, + int type) +{ + int ret = 0; + uint wps_ielen = 0; + u32 p2p_ielen = 0; + +#ifdef CONFIG_DEBUG_CFG80211 + DBG_8192C("%s, ielen=%d\n", __func__, len); +#endif + + if( (rtw_get_wps_ie(buf, len, NULL, &wps_ielen) && (wps_ielen>0)) + #ifdef CONFIG_P2P + || (rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen) && (p2p_ielen>0)) + #endif + ) + { + if (net != NULL) + { + switch (type) + { + case 0x1: //BEACON + ret = rtw_cfg80211_set_beacon_wpsp2pie(net, buf, len); + break; + case 0x2: //PROBE_RESP + ret = rtw_cfg80211_set_probe_resp_wpsp2pie(net, buf, len); + break; + case 0x4: //ASSOC_RESP + ret = rtw_cfg80211_set_assoc_resp_wpsp2pie(net, buf, len); + break; + } + } + } + + return ret; + +} + +static struct cfg80211_ops rtw_cfg80211_ops = { + .change_virtual_intf = cfg80211_rtw_change_iface, + .add_key = cfg80211_rtw_add_key, + .get_key = cfg80211_rtw_get_key, + .del_key = cfg80211_rtw_del_key, + .set_default_key = cfg80211_rtw_set_default_key, + .get_station = cfg80211_rtw_get_station, + .scan = cfg80211_rtw_scan, + .set_wiphy_params = cfg80211_rtw_set_wiphy_params, + .connect = cfg80211_rtw_connect, + .disconnect = cfg80211_rtw_disconnect, + .join_ibss = cfg80211_rtw_join_ibss, + .leave_ibss = cfg80211_rtw_leave_ibss, + .set_tx_power = cfg80211_rtw_set_txpower, + .get_tx_power = cfg80211_rtw_get_txpower, + .set_power_mgmt = cfg80211_rtw_set_power_mgmt, + .set_pmksa = cfg80211_rtw_set_pmksa, + .del_pmksa = cfg80211_rtw_del_pmksa, + .flush_pmksa = cfg80211_rtw_flush_pmksa, + +#ifdef CONFIG_AP_MODE + .add_virtual_intf = cfg80211_rtw_add_virtual_intf, + .del_virtual_intf = cfg80211_rtw_del_virtual_intf, + + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE) + .add_beacon = cfg80211_rtw_add_beacon, + .set_beacon = cfg80211_rtw_set_beacon, + .del_beacon = cfg80211_rtw_del_beacon, + #else + .start_ap = cfg80211_rtw_start_ap, + .change_beacon = cfg80211_rtw_change_beacon, + .stop_ap = cfg80211_rtw_stop_ap, + #endif + + .add_station = cfg80211_rtw_add_station, + .del_station = cfg80211_rtw_del_station, + .change_station = cfg80211_rtw_change_station, + .dump_station = cfg80211_rtw_dump_station, + .change_bss = cfg80211_rtw_change_bss, + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) + .set_channel = cfg80211_rtw_set_channel, + #endif + //.auth = cfg80211_rtw_auth, + //.assoc = cfg80211_rtw_assoc, +#endif //CONFIG_AP_MODE + +#ifdef CONFIG_P2P + .remain_on_channel = cfg80211_rtw_remain_on_channel, + .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel, +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + .mgmt_tx = cfg80211_rtw_mgmt_tx, + .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, +#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35)) + .action = cfg80211_rtw_mgmt_tx, +#endif +}; + +static void rtw_cfg80211_init_ht_capab(struct ieee80211_sta_ht_cap *ht_cap, enum ieee80211_band band, u8 rf_type) +{ + +#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */ +#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */ + + ht_cap->ht_supported = _TRUE; + + ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 | + IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU; + + /* + *Maximum length of AMPDU that the STA can receive. + *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets) + */ + ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; + + /*Minimum MPDU start spacing , */ + ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; + + ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; + + /* + *hw->wiphy->bands[IEEE80211_BAND_2GHZ] + *base on ant_num + *rx_mask: RX mask + *if rx_ant =1 rx_mask[0]=0xff;==>MCS0-MCS7 + *if rx_ant =2 rx_mask[1]=0xff;==>MCS8-MCS15 + *if rx_ant >=3 rx_mask[2]=0xff; + *if BW_40 rx_mask[4]=0x01; + *highest supported RX rate + */ + if(rf_type == RF_1T1R) + { + ht_cap->mcs.rx_mask[0] = 0xFF; + ht_cap->mcs.rx_mask[1] = 0x00; + ht_cap->mcs.rx_mask[4] = 0x01; + + ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS7; + } + else if((rf_type == RF_1T2R) || (rf_type==RF_2T2R)) + { + ht_cap->mcs.rx_mask[0] = 0xFF; + ht_cap->mcs.rx_mask[1] = 0xFF; + ht_cap->mcs.rx_mask[4] = 0x01; + + ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS15; + } + else + { + DBG_8192C("%s, error rf_type=%d\n", __func__, rf_type); + } + +} + +void rtw_cfg80211_init_wiphy(_adapter *padapter) +{ + u8 rf_type; + struct ieee80211_supported_band *bands; + struct wireless_dev *pwdev = padapter->rtw_wdev; + struct wiphy *wiphy = pwdev->wiphy; + + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + + DBG_8192C("%s:rf_type=%d\n", __func__, rf_type); + + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ + { + bands = wiphy->bands[IEEE80211_BAND_2GHZ]; + if(bands) + rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_2GHZ, rf_type); + } + + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ + { + bands = wiphy->bands[IEEE80211_BAND_5GHZ]; + if(bands) + rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_5GHZ, rf_type); + } +} + +/* +struct ieee80211_iface_limit rtw_limits[] = { + { .max = 1, .types = BIT(NL80211_IFTYPE_STATION) + | BIT(NL80211_IFTYPE_ADHOC) +#ifdef CONFIG_AP_MODE + | BIT(NL80211_IFTYPE_AP) +#endif +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) + | BIT(NL80211_IFTYPE_P2P_CLIENT) + | BIT(NL80211_IFTYPE_P2P_GO) +#endif + }, + {.max = 1, .types = BIT(NL80211_IFTYPE_MONITOR)}, +}; + +struct ieee80211_iface_combination rtw_combinations = { + .limits = rtw_limits, + .n_limits = ARRAY_SIZE(rtw_limits), + .max_interfaces = 2, + .num_different_channels = 1, +}; +*/ + +static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy) +{ + + wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; + + wiphy->max_scan_ssids = RTW_SSID_SCAN_AMOUNT; + wiphy->max_scan_ie_len = RTW_SCAN_IE_LEN_MAX; + wiphy->max_num_pmkids = RTW_MAX_NUM_PMKIDS; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE) + wiphy->max_remain_on_channel_duration = RTW_MAX_REMAIN_ON_CHANNEL_DURATION; +#endif + + wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) + | BIT(NL80211_IFTYPE_ADHOC) +#ifdef CONFIG_AP_MODE + | BIT(NL80211_IFTYPE_AP) + | BIT(NL80211_IFTYPE_MONITOR) +#endif +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)) + | BIT(NL80211_IFTYPE_P2P_CLIENT) + | BIT(NL80211_IFTYPE_P2P_GO) +#endif + ; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) +#ifdef CONFIG_AP_MODE + wiphy->mgmt_stypes = rtw_cfg80211_default_mgmt_stypes; +#endif //CONFIG_AP_MODE +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)) + wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR); +#endif + + /* + wiphy->iface_combinations = &rtw_combinations; + wiphy->n_iface_combinations = 1; + */ + + wiphy->cipher_suites = rtw_cipher_suites; + wiphy->n_cipher_suites = ARRAY_SIZE(rtw_cipher_suites); + + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ + wiphy->bands[IEEE80211_BAND_2GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_2GHZ); + /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ + wiphy->bands[IEEE80211_BAND_5GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_5GHZ); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) && LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)) + wiphy->flags |= WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0)) + wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; + wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME; +#endif + + if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) + wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; + else + wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; +} + +int rtw_wdev_alloc(_adapter *padapter, struct device *dev) +{ + int ret = 0; + struct wiphy *wiphy; + struct wireless_dev *wdev; + struct rtw_wdev_priv *pwdev_priv; + struct net_device *pnetdev = padapter->pnetdev; + + DBG_8192C("%s(padapter=%p)\n", __func__, padapter); + + /* wiphy */ + wiphy = wiphy_new(&rtw_cfg80211_ops, sizeof(struct rtw_wdev_priv)); + if (!wiphy) { + DBG_8192C("Couldn't allocate wiphy device\n"); + ret = -ENOMEM; + goto exit; + } + set_wiphy_dev(wiphy, dev); + rtw_cfg80211_preinit_wiphy(padapter, wiphy); + + ret = wiphy_register(wiphy); + if (ret < 0) { + DBG_8192C("Couldn't register wiphy device\n"); + goto free_wiphy; + } + + /* wdev */ + wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); + if (!wdev) { + DBG_8192C("Couldn't allocate wireless device\n"); + ret = -ENOMEM; + goto unregister_wiphy; + } + wdev->wiphy = wiphy; + wdev->netdev = pnetdev; + //wdev->iftype = NL80211_IFTYPE_STATION; + wdev->iftype = NL80211_IFTYPE_MONITOR; // for rtw_setopmode_cmd() in cfg80211_rtw_change_iface() + padapter->rtw_wdev = wdev; + pnetdev->ieee80211_ptr = wdev; + + //init pwdev_priv + pwdev_priv = wdev_to_priv(wdev); + pwdev_priv->rtw_wdev = wdev; + pwdev_priv->pmon_ndev = NULL; + pwdev_priv->ifname_mon[0] = '\0'; + pwdev_priv->padapter = padapter; + pwdev_priv->scan_request = NULL; + _rtw_spinlock_init(&pwdev_priv->scan_req_lock); + + pwdev_priv->p2p_enabled = _FALSE; + pwdev_priv->provdisc_req_issued = _FALSE; + rtw_wdev_invit_info_init(&pwdev_priv->invit_info); + rtw_wdev_nego_info_init(&pwdev_priv->nego_info); + + pwdev_priv->bandroid_scan = _FALSE; + + if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) + pwdev_priv->power_mgmt = _TRUE; + else + pwdev_priv->power_mgmt = _FALSE; + +#ifdef CONFIG_CONCURRENT_MODE + ATOMIC_SET(&pwdev_priv->switch_ch_to, 1); + ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); +#endif + + return ret; + + rtw_mfree((u8*)wdev, sizeof(struct wireless_dev)); +unregister_wiphy: + wiphy_unregister(wiphy); + free_wiphy: + wiphy_free(wiphy); +exit: + return ret; + +} + +void rtw_wdev_free(struct wireless_dev *wdev) +{ + struct rtw_wdev_priv *pwdev_priv; + + DBG_8192C("%s(wdev=%p)\n", __func__, wdev); + + if (!wdev) + return; + + pwdev_priv = wdev_to_priv(wdev); + + rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_2GHZ]); + rtw_spt_band_free(wdev->wiphy->bands[IEEE80211_BAND_5GHZ]); + + wiphy_free(wdev->wiphy); + + rtw_mfree((u8*)wdev, sizeof(struct wireless_dev)); +} + +void rtw_wdev_unregister(struct wireless_dev *wdev) +{ + struct rtw_wdev_priv *pwdev_priv; + + DBG_8192C("%s(wdev=%p)\n", __func__, wdev); + + if (!wdev) + return; + + pwdev_priv = wdev_to_priv(wdev); + + rtw_cfg80211_indicate_scan_done(pwdev_priv, _TRUE); + + if (pwdev_priv->pmon_ndev) { + DBG_8192C("%s, unregister monitor interface\n", __func__); + unregister_netdev(pwdev_priv->pmon_ndev); + } + + wiphy_unregister(wdev->wiphy); +} + +#endif //CONFIG_IOCTL_CFG80211 + diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_linux.c index e3252e233511..d0fd7479ec1e 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_linux.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_linux.c @@ -376,7 +376,7 @@ static char *translate_scan(_adapter *padapter, u8 wfd_ie[ 128 ] = { 0x00 }; uint wfd_ielen = 0; - if ( rtw_get_wfd_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, wfd_ie, &wfd_ielen ) ) + if ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) ) { u8 wfd_devinfo[ 6 ] = { 0x00 }; uint wfd_devlen = 6; @@ -454,7 +454,7 @@ static char *translate_scan(_adapter *padapter, if(ht_cap == _TRUE) snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bgn"); else - snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bg"); + snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bg"); } else { @@ -608,6 +608,17 @@ static char *translate_scan(_adapter *padapter, u8 *ie_ptr = pnetwork->network.IEs +_FIXED_IE_LENGTH_; total_ielen= pnetwork->network.IELength - _FIXED_IE_LENGTH_; + if (pnetwork->network.Reserved[0] == 2) // Probe Request + { + ie_ptr = pnetwork->network.IEs; + total_ielen = pnetwork->network.IELength; + } + else // Beacon or Probe Respones + { + ie_ptr = pnetwork->network.IEs + _FIXED_IE_LENGTH_; + total_ielen = pnetwork->network.IELength - _FIXED_IE_LENGTH_; + } + while(cnt < total_ielen) { if(rtw_is_wps_ie(&ie_ptr[cnt], &wps_ielen) && (wps_ielen>2)) @@ -661,7 +672,7 @@ static char *translate_scan(_adapter *padapter, start = iwe_stream_add_point(info, start, stop, &iwe, wapi_ie); } } -#endif +#endif //CONFIG_WAPI_SUPPORT { struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); @@ -676,7 +687,7 @@ static char *translate_scan(_adapter *padapter, ; if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE && - is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) { + is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) { ss = padapter->recvpriv.signal_strength; sq = padapter->recvpriv.signal_qual; } else { @@ -706,6 +717,20 @@ static char *translate_scan(_adapter *padapter, start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN); } + + { + u8 buf[MAX_WPA_IE_LEN]; + u8 * p,*pos; + int len; + p = buf; + pos = pnetwork->network.Reserved; + _rtw_memset(buf, 0, MAX_WPA_IE_LEN); + p += sprintf(p, "fm=%02X%02X", pos[1], pos[0]); + _rtw_memset(&iwe, 0, sizeof(iwe)); + iwe.cmd = IWEVCUSTOM; + iwe.u.data.length = strlen(buf); + start = iwe_stream_add_point(info, start, stop, &iwe, buf); + } return start; } @@ -792,20 +817,26 @@ _func_enter_; param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) { - if (param->u.crypt.idx >= WEP_KEYS) + + if (param->u.crypt.idx >= WEP_KEYS +#ifdef CONFIG_IEEE80211W + && param->u.crypt.idx > BIP_MAX_KEYID +#endif //CONFIG_IEEE80211W + ) { ret = -EINVAL; goto exit; } - } else { + } + else + { #ifdef CONFIG_WAPI_SUPPORT - if (strcmp(param->u.crypt.alg, "SMS4")) + if (strcmp(param->u.crypt.alg, "SMS4")) #endif - { - - ret = -EINVAL; - goto exit; - } + { + ret = -EINVAL; + goto exit; + } } if (strcmp(param->u.crypt.alg, "WEP") == 0) @@ -882,7 +913,7 @@ _func_enter_; _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), pwep->KeyMaterial, pwep->KeyLength); psecuritypriv->dot11DefKeylen[wep_key_idx]=pwep->KeyLength; - rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0); + rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0,_TRUE); } goto exit; @@ -928,20 +959,45 @@ _func_enter_; //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len)); DBG_871X(" ~~~~set sta key:unicastkey\n"); - rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE, _TRUE); } else//group key { - _rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); - _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8); - _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8); - padapter->securitypriv.binstallGrpkey = _TRUE; - //DEBUG_ERR((" param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); - DBG_871X(" ~~~~set sta key:groupkey\n"); - - padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; - - rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1); + if(strcmp(param->u.crypt.alg, "TKIP") == 0 || strcmp(param->u.crypt.alg, "CCMP") == 0) + { + printk("[%s] GTK key_len=%d @@@@@@@@@@@@@@@@@@\n", param->u.crypt.alg, param->u.crypt.key_len); + _rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + //only TKIP group key need to install this + if(param->u.crypt.key_len > 16) + { + _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8); + _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8); + } + padapter->securitypriv.binstallGrpkey = _TRUE; + //DEBUG_ERR((" param->u.crypt.key_len=%d\n", param->u.crypt.key_len)); + DBG_871X(" ~~~~set sta key:groupkey\n"); + + padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; + + rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1,_TRUE); + } +#ifdef CONFIG_IEEE80211W + else if(strcmp(param->u.crypt.alg, "BIP") == 0) + { + int no; + //printk("BIP key_len=%d , index=%d @@@@@@@@@@@@@@@@@@\n", param->u.crypt.key_len, param->u.crypt.idx); + //save the IGTK key, length 16 bytes + _rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey, param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len)); + /*printk("IGTK key below:\n"); + for(no=0;no<16;no++) + printk(" %02x ", padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey[no]); + printk("\n");*/ + padapter->securitypriv.dot11wBIPKeyid = param->u.crypt.idx; + padapter->securitypriv.binstallBIPkey = _TRUE; + DBG_871X(" ~~~~set sta key:IGKT\n"); + } +#endif //CONFIG_IEEE80211W + #ifdef CONFIG_P2P if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) { @@ -967,8 +1023,8 @@ _func_enter_; (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) { pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; - } - } + } + } } else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) //adhoc mode { @@ -1378,7 +1434,7 @@ static int rtw_wx_set_mode(struct net_device *dev, struct iw_request_info *a, case IW_MODE_MASTER: networkType = Ndis802_11APMode; DBG_871X("set_mode = IW_MODE_MASTER\n"); - //rtw_setopmode_cmd(padapter, networkType); + //rtw_setopmode_cmd(padapter, networkType,_TRUE); break; case IW_MODE_INFRA: networkType = Ndis802_11Infrastructure; @@ -1394,11 +1450,11 @@ static int rtw_wx_set_mode(struct net_device *dev, struct iw_request_info *a, /* if(Ndis802_11APMode == networkType) { - rtw_setopmode_cmd(padapter, networkType); + rtw_setopmode_cmd(padapter, networkType,_TRUE); } else { - rtw_setopmode_cmd(padapter, Ndis802_11AutoUnknown); + rtw_setopmode_cmd(padapter, Ndis802_11AutoUnknown,_TRUE); } */ @@ -1409,7 +1465,7 @@ static int rtw_wx_set_mode(struct net_device *dev, struct iw_request_info *a, } - rtw_setopmode_cmd(padapter, networkType); + rtw_setopmode_cmd(padapter, networkType,_TRUE); exit: @@ -2009,7 +2065,7 @@ if (padapter->registrypriv.mp_mode == 1) // under DHCP(Special packet) curr_time = rtw_get_current_time(); - delta_time = curr_time - padapter->pwrctrlpriv.DelayLPSLastTimeStamp; + delta_time = curr_time - adapter_to_pwrctl(padapter)->DelayLPSLastTimeStamp; delta_time = rtw_systime_to_ms(delta_time); if (delta_time < 500) // 500ms { @@ -2236,7 +2292,7 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a, } #endif */ - if(padapter->pwrctrlpriv.brfoffbyhw && padapter->bDriverStopped) + if(adapter_to_pwrctl(padapter)->brfoffbyhw && padapter->bDriverStopped) { ret = -EINVAL; goto exit; @@ -2276,7 +2332,18 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a, } #endif // CONFIG_CONCURRENT_MODE */ +#if 1 // Wireless Extension use EAGAIN to try + wait_status = _FW_UNDER_SURVEY +#ifndef CONFIG_ANDROID + | _FW_UNDER_LINKING +#endif + ; + while (check_fwstate(pmlmepriv, wait_status) == _TRUE) + { + return -EAGAIN; + } +#else wait_status = _FW_UNDER_SURVEY #ifndef CONFIG_ANDROID |_FW_UNDER_LINKING @@ -2300,6 +2367,7 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a, if(cnt > wait_for_surveydone ) break; } +#endif _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); @@ -2320,9 +2388,7 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a, //report network only if the current channel set contains the channel to which this network belongs if(rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0 - #ifdef CONFIG_VALIDATE_SSID && _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid)) - #endif ) { ev=translate_scan(padapter, a, pnetwork, ev, stop); @@ -2362,7 +2428,6 @@ static int rtw_wx_set_essid(struct net_device *dev, _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct mlme_priv *pmlmepriv = &padapter->mlmepriv; _queue *queue = &pmlmepriv->scanned_queue; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; _list *phead; s8 status = _TRUE; struct wlan_network *pnetwork = NULL; @@ -2832,7 +2897,7 @@ static int rtw_wx_set_enc(struct net_device *dev, struct iw_point *erq = &(wrqu->encoding); _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); DBG_871X("+rtw_wx_set_enc, flags=0x%x\n", erq->flags); _rtw_memset(&wep, 0, sizeof(NDIS_802_11_WEP)); @@ -3280,6 +3345,11 @@ static int rtw_wx_set_enc_ext(struct net_device *dev, case IW_ENCODE_ALG_CCMP: alg_name = "CCMP"; break; +#ifdef CONFIG_IEEE80211W + case IW_ENCODE_ALG_AES_CMAC: + alg_name = "BIP"; + break; +#endif //CONFIG_IEEE80211W #ifdef CONFIG_WAPI_SUPPORT #ifndef CONFIG_IOCTL_CFG80211 case IW_ENCODE_ALG_SM4: @@ -3304,7 +3374,11 @@ static int rtw_wx_set_enc_ext(struct net_device *dev, * just not checking GROUP key setting */ if ((pext->alg != IW_ENCODE_ALG_WEP) && - (pext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)) + ((pext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) +#ifdef CONFIG_IEEE80211W + || (pext->ext_flags & IW_ENCODE_ALG_AES_CMAC) +#endif //CONFIG_IEEE80211W + )) { param->u.crypt.set_tx = 0; } @@ -3318,8 +3392,8 @@ static int rtw_wx_set_enc_ext(struct net_device *dev, if(pext->alg == IW_ENCODE_ALG_SM4) _rtw_memcpy(param->u.crypt.seq, pext->rx_seq, 16); else -#endif -#endif +#endif //CONFIG_IOCTL_CFG80211 +#endif //CONFIG_WAPI_SUPPORT _rtw_memcpy(param->u.crypt.seq, pext->rx_seq, 8); } @@ -4175,7 +4249,6 @@ static int rtw_wext_p2p_enable(struct net_device *dev, struct iw_point *pdata = &wrqu->data; struct wifidirect_info *pwdinfo= &(padapter->wdinfo); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; enum P2P_ROLE init_role = P2P_ROLE_DISABLE; if(*extra == '0' ) @@ -4277,19 +4350,9 @@ static int rtw_p2p_set_intent(struct net_device *dev, struct wifidirect_info *pwdinfo= &(padapter->wdinfo); u8 intent = pwdinfo->intent; - switch( wrqu->data.length ) - { - case 1: - { - intent = extra[ 0 ] - '0'; - break; - } - case 2: - { - intent = str_2char2num( extra[ 0 ], extra[ 1 ]); - break; - } - } + extra[ wrqu->data.length ] = 0x00; + + intent = rtw_atoi( extra ); if ( intent <= 15 ) { @@ -4303,7 +4366,7 @@ static int rtw_p2p_set_intent(struct net_device *dev, DBG_871X( "[%s] intent = %d\n", __FUNCTION__, intent); return ret; - + } static int rtw_p2p_set_listen_ch(struct net_device *dev, @@ -4316,19 +4379,8 @@ static int rtw_p2p_set_listen_ch(struct net_device *dev, struct wifidirect_info *pwdinfo= &(padapter->wdinfo); u8 listen_ch = pwdinfo->listen_channel; // Listen channel number - switch( wrqu->data.length ) - { - case 1: - { - listen_ch = extra[ 0 ] - '0'; - break; - } - case 2: - { - listen_ch = str_2char2num( extra[ 0 ], extra[ 1 ]); - break; - } - } + extra[ wrqu->data.length ] = 0x00; + listen_ch = rtw_atoi( extra ); if ( ( listen_ch == 1 ) || ( listen_ch == 6 ) || ( listen_ch == 11 ) ) { @@ -4358,20 +4410,9 @@ static int rtw_p2p_set_op_ch(struct net_device *dev, struct wifidirect_info *pwdinfo= &(padapter->wdinfo); u8 op_ch = pwdinfo->operating_channel; // Operating channel number - switch( wrqu->data.length ) - { - case 1: - { - op_ch = extra[ 0 ] - '0'; - break; - } - case 2: - { - op_ch = str_2char2num( extra[ 0 ], extra[ 1 ]); - break; - } - } + extra[ wrqu->data.length ] = 0x00; + op_ch = ( u8 ) rtw_atoi( extra ); if ( op_ch > 0 ) { pwdinfo->operating_channel = op_ch; @@ -4384,7 +4425,7 @@ static int rtw_p2p_set_op_ch(struct net_device *dev, DBG_871X( "[%s] op_ch = %d\n", __FUNCTION__, pwdinfo->operating_channel ); return ret; - + } @@ -4436,8 +4477,8 @@ static int rtw_p2p_profilefound(struct net_device *dev, pwdinfo->profileinfo[ pwdinfo->profileindex ].peermac[ jj ] = key_2char2num(extra[ kk ], extra[ kk+ 1 ]); } - pwdinfo->profileinfo[ pwdinfo->profileindex ].ssidlen = ( extra[18] - '0' ) * 10 + ( extra[ 19 ] - '0' ); - _rtw_memcpy( pwdinfo->profileinfo[ pwdinfo->profileindex ].ssid, &extra[ 20 ], pwdinfo->profileinfo[ pwdinfo->profileindex ].ssidlen ); + //pwdinfo->profileinfo[ pwdinfo->profileindex ].ssidlen = ( extra[18] - '0' ) * 10 + ( extra[ 19 ] - '0' ); + //_rtw_memcpy( pwdinfo->profileinfo[ pwdinfo->profileindex ].ssid, &extra[ 20 ], pwdinfo->profileinfo[ pwdinfo->profileindex ].ssidlen ); pwdinfo->profileindex++; } } @@ -4709,7 +4750,7 @@ static int rtw_p2p_get_wps_configmethod(struct net_device *dev, // The mac address is matched. - if ((wpsie = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsie_len))) + if ( (wpsie=rtw_get_wps_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &wpsie_len, pnetwork->network.Reserved[0])) ) { rtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_CONF_METHOD, (u8 *)&attr_content, &attr_contentlen); if (attr_contentlen) @@ -4845,7 +4886,7 @@ static int rtw_p2p_get_go_device_address(struct net_device *dev, // Match the device address located in the P2P IE // This is for the case that the P2P device address is not the same as the P2P interface address. - if ((p2pie = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen))) + if ((p2pie = rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0]))) { while (p2pie) { @@ -4938,7 +4979,7 @@ static int rtw_p2p_get_device_type(struct net_device *dev, // The mac address is matched. - if ((wpsie = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsie_len))) + if ( (wpsie=rtw_get_wps_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &wpsie_len, pnetwork->network.Reserved[0])) ) { rtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_PRIMARY_DEV_TYPE, dev_type, &dev_type_len); if (dev_type_len) @@ -5016,7 +5057,7 @@ static int rtw_p2p_get_device_name(struct net_device *dev, // The mac address is matched. - if ((wpsie = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsie_len))) + if ( (wpsie=rtw_get_wps_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &wpsie_len, pnetwork->network.Reserved[0])) ) { rtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_DEVICE_NAME, dev_name, &dev_len); if (dev_len) @@ -5089,7 +5130,7 @@ static int rtw_p2p_get_invitation_procedure(struct net_device *dev, // Match the device address located in the P2P IE // This is for the case that the P2P device address is not the same as the P2P interface address. - if ((p2pie = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen))) + if ((p2pie = rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0]))) { while (p2pie) { @@ -5351,7 +5392,7 @@ static int rtw_p2p_invite_req(struct net_device *dev, // Match the device address located in the P2P IE // This is for the case that the P2P device address is not the same as the P2P interface address. - if ( (p2pie=rtw_get_p2p_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen)) ) + if ( (p2pie=rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0]))) { // The P2P Device ID attribute is included in the Beacon frame. // The P2P Device Info attribute is included in the probe response frame. @@ -5389,7 +5430,7 @@ static int rtw_p2p_invite_req(struct net_device *dev, u8 wfd_ie[ 128 ] = { 0x00 }; uint wfd_ielen = 0; - if ( rtw_get_wfd_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, wfd_ie, &wfd_ielen ) ) + if ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) ) { u8 wfd_devinfo[ 6 ] = { 0x00 }; uint wfd_devlen = 6; @@ -5555,6 +5596,79 @@ exit: } +static int hexstr2bin(const char *hex, u8 *buf, size_t len) +{ + size_t i; + int a; + const char *ipos = hex; + u8 *opos = buf; + + for (i = 0; i < len; i++) { + a = hex2byte_i(ipos); + if (a < 0) + return -1; + *opos++ = a; + ipos += 2; + } + return 0; +} + +static int uuid_str2bin(const char *str, u8 *bin) +{ + const char *pos; + u8 *opos; + + pos = str; + opos = bin; + + if (hexstr2bin(pos, opos, 4)) + return -1; + pos += 8; + opos += 4; + + if (*pos++ != '-' || hexstr2bin(pos, opos, 2)) + return -1; + pos += 4; + opos += 2; + + if (*pos++ != '-' || hexstr2bin(pos, opos, 2)) + return -1; + pos += 4; + opos += 2; + + if (*pos++ != '-' || hexstr2bin(pos, opos, 2)) + return -1; + pos += 4; + opos += 2; + + if (*pos++ != '-' || hexstr2bin(pos, opos, 6)) + return -1; + + return 0; +} + +static int rtw_p2p_set_wps_uuid(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + + int ret = 0; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + + DBG_871X("[%s] data = %s\n", __FUNCTION__, extra); + + if ((36 == strlen(extra)) && (uuid_str2bin(extra, pwdinfo->uuid) == 0)) + { + pwdinfo->external_uuid = 1; + } else { + pwdinfo->external_uuid = 0; + ret = -EINVAL; + } + + return ret; + +} #ifdef CONFIG_WFD static int rtw_p2p_set_pc(struct net_device *dev, struct iw_request_info *info, @@ -5616,7 +5730,7 @@ static int rtw_p2p_set_pc(struct net_device *dev, // Match the device address located in the P2P IE // This is for the case that the P2P device address is not the same as the P2P interface address. - if ( (p2pie=rtw_get_p2p_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen)) ) + if ( (p2pie=rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0]))) { // The P2P Device ID attribute is included in the Beacon frame. // The P2P Device Info attribute is included in the probe response frame. @@ -5656,7 +5770,7 @@ static int rtw_p2p_set_pc(struct net_device *dev, u8 wfd_ie[ 128 ] = { 0x00 }; uint wfd_ielen = 0; - if ( rtw_get_wfd_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, wfd_ie, &wfd_ielen ) ) + if ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) ) { u8 wfd_devinfo[ 6 ] = { 0x00 }; uint wfd_devlen = 6; @@ -5769,6 +5883,53 @@ exit: } +static int rtw_p2p_set_wfd_enable(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ +// Commented by Kurt 20121206 +// This function is used to set wfd enabled + + int ret = 0; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + + if(*extra == '0' ) + pwdinfo->wfd_info->wfd_enable = _FALSE; + else if(*extra == '1') + pwdinfo->wfd_info->wfd_enable = _TRUE; + + DBG_871X( "[%s] wfd_enable = %d\n", __FUNCTION__, pwdinfo->wfd_info->wfd_enable ); + + return ret; + +} + +static int rtw_p2p_set_driver_iface(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ +// Commented by Kurt 20121206 +// This function is used to set driver iface is WEXT or CFG80211 + int ret = 0; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + + if(*extra == '1' ) + { + pwdinfo->driver_interface = DRIVER_WEXT; + DBG_871X( "[%s] driver_interface = WEXT\n", __FUNCTION__); + } + else if(*extra == '2') + { + pwdinfo->driver_interface = DRIVER_CFG80211; + DBG_871X( "[%s] driver_interface = CFG80211\n", __FUNCTION__); + } + + return ret; + +} + // To set the WFD session available to enable or disable static int rtw_p2p_set_sa(struct net_device *dev, struct iw_request_info *info, @@ -5831,11 +5992,13 @@ static int rtw_p2p_prov_disc(struct net_device *dev, u8 *p2pie; uint p2pielen = 0, attr_contentlen = 0; _irqL irqL; + u8 ie_offset; #ifdef CONFIG_CONCURRENT_MODE _adapter *pbuddy_adapter = padapter->pbuddy_adapter; struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv; struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv; #endif // CONFIG_CONCURRENT_MODE + #ifdef CONFIG_WFD struct wifi_display_info* pwfd_info = pwdinfo->wfd_info; #endif // CONFIG_WFD @@ -5858,6 +6021,13 @@ static int rtw_p2p_prov_disc(struct net_device *dev, } else { +#ifdef CONFIG_INTEL_WIDI + if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE){ + DBG_871X( "[%s] WiFi is under survey!\n", __FUNCTION__ ); + return ret; + } +#endif //CONFIG_INTEL_WIDI + // Reset the content of struct tx_provdisc_req_info excluded the wps_config_method_request. _rtw_memset( pwdinfo->tx_prov_disc_info.peerDevAddr, 0x00, ETH_ALEN ); _rtw_memset( pwdinfo->tx_prov_disc_info.peerIFAddr, 0x00, ETH_ALEN ); @@ -5913,7 +6083,12 @@ static int rtw_p2p_prov_disc(struct net_device *dev, // Match the device address located in the P2P IE // This is for the case that the P2P device address is not the same as the P2P interface address. - if ( (p2pie=rtw_get_p2p_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen)) ) + if (pnetwork->network.Reserved[0] == 2) { // Probe Request + ie_offset = 0; + } else { // Beacon or Probe Respones + ie_offset = 12; + } + if ( (p2pie=rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0]))) { while ( p2pie ) { @@ -5940,10 +6115,23 @@ static int rtw_p2p_prov_disc(struct net_device *dev, } //Get the next P2P IE - p2pie = rtw_get_p2p_ie(p2pie+p2pielen, pnetwork->network.IELength - 12 -(p2pie -&pnetwork->network.IEs[12] + p2pielen), NULL, &p2pielen); + p2pie = rtw_get_p2p_ie(p2pie+p2pielen, pnetwork->network.IELength - ie_offset -(p2pie -&pnetwork->network.IEs[ie_offset] + p2pielen), NULL, &p2pielen); } + } +#ifdef CONFIG_INTEL_WIDI + // Some Intel WiDi source may not provide P2P IE, + // so we could only compare mac addr by 802.11 Source Address + if( pmlmepriv->widi_state == INTEL_WIDI_STATE_WFD_CONNECTION + && uintPeerChannel == 0 ) + { + if ( _rtw_memcmp( pnetwork->network.MacAddress, peerMAC, ETH_ALEN ) ) + { + uintPeerChannel = pnetwork->network.Configuration.DSConfig; + break; + } } +#endif //CONFIG_INTEL_WIDI plist = get_next(plist); @@ -5951,47 +6139,46 @@ static int rtw_p2p_prov_disc(struct net_device *dev, _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); -#ifdef CONFIG_WFD + if ( uintPeerChannel ) { - u8 wfd_ie[ 128 ] = { 0x00 }; - uint wfd_ielen = 0; - - if ( rtw_get_wfd_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, wfd_ie, &wfd_ielen ) ) +#ifdef CONFIG_WFD { - u8 wfd_devinfo[ 6 ] = { 0x00 }; - uint wfd_devlen = 6; - - DBG_871X( "[%s] Found WFD IE!\n", __FUNCTION__ ); - if ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) ) + u8 wfd_ie[ 128 ] = { 0x00 }; + uint wfd_ielen = 0; + + if ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) ) { - u16 wfd_devinfo_field = 0; - - // Commented by Albert 20120319 - // The first two bytes are the WFD device information field of WFD device information subelement. - // In big endian format. - wfd_devinfo_field = RTW_GET_BE16(wfd_devinfo); - if ( wfd_devinfo_field & WFD_DEVINFO_SESSION_AVAIL ) - { - pwfd_info->peer_session_avail = _TRUE; - } - else + u8 wfd_devinfo[ 6 ] = { 0x00 }; + uint wfd_devlen = 6; + + DBG_871X( "[%s] Found WFD IE!\n", __FUNCTION__ ); + if ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) ) { - pwfd_info->peer_session_avail = _FALSE; + u16 wfd_devinfo_field = 0; + + // Commented by Albert 20120319 + // The first two bytes are the WFD device information field of WFD device information subelement. + // In big endian format. + wfd_devinfo_field = RTW_GET_BE16(wfd_devinfo); + if ( wfd_devinfo_field & WFD_DEVINFO_SESSION_AVAIL ) + { + pwfd_info->peer_session_avail = _TRUE; + } + else + { + pwfd_info->peer_session_avail = _FALSE; + } } } + + if ( _FALSE == pwfd_info->peer_session_avail ) + { + DBG_871X( "[%s] WFD Session not avaiable!\n", __FUNCTION__ ); + goto exit; + } } - - if ( _FALSE == pwfd_info->peer_session_avail ) - { - DBG_871X( "[%s] WFD Session not avaiable!\n", __FUNCTION__ ); - goto exit; - } - } #endif // CONFIG_WFD - if ( uintPeerChannel ) - { - DBG_871X( "[%s] peer channel: %d!\n", __FUNCTION__, uintPeerChannel ); #ifdef CONFIG_CONCURRENT_MODE if ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) ) @@ -6051,6 +6238,14 @@ static int rtw_p2p_prov_disc(struct net_device *dev, else { DBG_871X( "[%s] NOT Found in the Scanning Queue!\n", __FUNCTION__ ); +#ifdef CONFIG_INTEL_WIDI + rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); + rtw_free_network_queue(padapter, _TRUE); + _enter_critical_bh(&pmlmepriv->lock, &irqL); + rtw_sitesurvey_cmd(padapter, NULL, 0, NULL, 0); + _exit_critical_bh(&pmlmepriv->lock, &irqL); +#endif //CONFIG_INTEL_WIDI } exit: @@ -6190,6 +6385,11 @@ static int rtw_p2p_set(struct net_device *dev, wrqu->data.length -= 11; rtw_p2p_set_persistent( dev, info, wrqu, &extra[11] ); } + else if ( _rtw_memcmp ( extra, "uuid=", 5) ) + { + wrqu->data.length -= 5; + ret = rtw_p2p_set_wps_uuid( dev, info, wrqu, &extra[5] ); + } #ifdef CONFIG_WFD else if ( _rtw_memcmp( extra, "sa=", 3 ) ) { @@ -6214,8 +6414,17 @@ static int rtw_p2p_set(struct net_device *dev, wrqu->data.length -= 10; rtw_p2p_set_scan_result_type( dev, info, wrqu, &extra[10] ); } + else if ( _rtw_memcmp( extra, "wfd_enable=", 11 ) ) + { + wrqu->data.length -= 11; + rtw_p2p_set_wfd_enable( dev, info, wrqu, &extra[11] ); + } + else if ( _rtw_memcmp( extra, "driver_iface=", 13 ) ) + { + wrqu->data.length -= 13; + rtw_p2p_set_driver_iface( dev, info, wrqu, &extra[13] ); + } #endif //CONFIG_WFD - #endif //CONFIG_P2P return ret; @@ -6267,7 +6476,7 @@ static int rtw_p2p_get(struct net_device *dev, { rtw_p2p_get_groupid( dev, info, wrqu, extra); } - else if ( _rtw_memcmp( wrqu->data.pointer, "peer_deva_inv", 9 ) ) + else if ( _rtw_memcmp( wrqu->data.pointer, "inv_peer_deva", 13 ) ) { // Get the P2P device address when receiving the P2P Invitation request frame. rtw_p2p_get_peer_devaddr_by_invitation( dev, info, wrqu, extra); @@ -6347,7 +6556,7 @@ static int rtw_p2p_get2(struct net_device *dev, bad: if (buffer) { - _rtw_mfree(buffer, length); + rtw_mfree(buffer, length); } #endif //CONFIG_P2P @@ -6429,7 +6638,7 @@ static int rtw_rereg_nd_name(struct net_device *dev, if(_rtw_memcmp(rereg_priv->old_ifname, "disable%d", 9) == _TRUE) { padapter->ledpriv.bRegUseLed= rereg_priv->old_bRegUseLed; rtw_hal_sw_led_init(padapter); - rtw_ips_mode_req(&padapter->pwrctrlpriv, rereg_priv->old_ips_mode); + /* rtw_ips_mode_req(&padapter->pwrctrlpriv, rereg_priv->old_ips_mode); */ } strncpy(rereg_priv->old_ifname, new_ifname, IFNAMSIZ); @@ -6446,10 +6655,12 @@ static int rtw_rereg_nd_name(struct net_device *dev, rereg_priv->old_bRegUseLed = padapter->ledpriv.bRegUseLed; padapter->ledpriv.bRegUseLed= _FALSE; rtw_hal_sw_led_deinit(padapter); - + + /* // the interface is being "disabled", we can do deeper IPS rereg_priv->old_ips_mode = rtw_get_ips_mode_req(&padapter->pwrctrlpriv); rtw_ips_mode_req(&padapter->pwrctrlpriv, IPS_NORMAL); + */ } exit: return ret; @@ -6998,8 +7209,58 @@ static int rtw_dbg_port(struct net_device *dev, } break; + case 0x0a: + { + #ifdef DBG_TRX_STA_PKTS + int i, j; + _list *plist, *phead; + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + for(i=0; i< NUM_STA; i++) + { + phead = &(pstapriv->sta_hash[i]); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); - case 0x0c://dump rx/tx packet + plist = get_next(plist); + if(arg == 0xff){ + psta->rx_bk_cnt =0; + psta->rx_be_cnt =0; + psta->rx_vo_cnt =0; + psta->rx_vi_cnt =0; + psta->tx_bk_cnt =0; + psta->tx_be_cnt =0; + psta->tx_vo_cnt =0; + psta->tx_vi_cnt =0; + } + else{ + if(extra_arg == psta->mac_id) + { + DBG_871X("=== sta's macaddr:" MAC_FMT "===\n", MAC_ARG(psta->hwaddr)); + DBG_871X("rx_bk_cnt =%d\n", psta->rx_bk_cnt); + DBG_871X("rx_be_cnt =%d\n", psta->rx_be_cnt); + DBG_871X("rx_vo_cnt =%d\n", psta->rx_vo_cnt); + DBG_871X("rx_vi_cnt =%d\n\n", psta->rx_vi_cnt); + + DBG_871X("tx_bk_cnt =%d\n", psta->tx_bk_cnt); + DBG_871X("tx_be_cnt =%d\n", psta->tx_be_cnt); + DBG_871X("tx_vo_cnt =%d\n", psta->tx_vo_cnt); + DBG_871X("tx_vi_cnt =%dn\n", psta->tx_vi_cnt); + } + } + + } + } + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + #endif + } + break; + + case 0x0c://dump rx/tx packet { if(arg == 0){ DBG_871X("dump rx packet (%d)\n",extra_arg); @@ -7039,7 +7300,7 @@ static int rtw_dbg_port(struct net_device *dev, break; case 0x15: { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); DBG_871X("==>silent resete cnts:%d\n",pwrpriv->ips_enter_cnts); } break; @@ -7050,10 +7311,10 @@ static int rtw_dbg_port(struct net_device *dev, DBG_871X("rtw driver version=%s\n", DRIVERVERSION); break; case 0x11: - { + { DBG_871X("turn %s Rx RSSI display function\n",(extra_arg==1)?"on":"off"); - padapter->bRxRSSIDisplay = extra_arg ; - rtw_hal_set_def_var(padapter, HW_DEF_FA_CNT_DUMP,&extra_arg); + padapter->bRxRSSIDisplay = extra_arg; + rtw_hal_set_def_var(padapter, HW_DEF_FA_CNT_DUMP, &(padapter->bRxRSSIDisplay)); } break; case 0x12: //set rx_stbc @@ -7095,29 +7356,11 @@ static int rtw_dbg_port(struct net_device *dev, case 0x16: { if(arg == 0xff){ - printk("ODM_COMP_DIG\t\tBIT0\n"); - printk("ODM_COMP_RA_MASK\t\tBIT1\n"); - printk("ODM_COMP_DYNAMIC_TXPWR\tBIT2\n"); - printk("ODM_COMP_FA_CNT\t\tBIT3\n"); - printk("ODM_COMP_RSSI_MONITOR\tBIT4\n"); - printk("ODM_COMP_CCK_PD\t\tBIT5\n"); - printk("ODM_COMP_ANT_DIV\t\tBIT6\n"); - printk("ODM_COMP_PWR_SAVE\t\tBIT7\n"); - printk("ODM_COMP_PWR_TRAIN\tBIT8\n"); - printk("ODM_COMP_RATE_ADAPTIVE\tBIT9\n"); - printk("ODM_COMP_PATH_DIV\t\tBIT10\n"); - printk("ODM_COMP_PSD \tBIT11\n"); - printk("ODM_COMP_DYNAMIC_PRICCA\tBIT12\n"); - printk("ODM_COMP_RXHP\t\tBIT13\n"); - printk("ODM_COMP_EDCA_TURBO\tBIT16\n"); - printk("ODM_COMP_EARLY_MODE\tBIT17\n"); - printk("ODM_COMP_TX_PWR_TRACK\tBIT24\n"); - printk("ODM_COMP_RX_GAIN_TRACK\tBIT25\n"); - printk("ODM_COMP_CALIBRATION\tBIT26\n"); - rtw_hal_get_def_var(padapter, HW_DEF_ODM_DBG_FLAG,&extra_arg); + rtw_odm_dbg_comp_msg(padapter); } else{ - rtw_hal_set_def_var(padapter, HW_DEF_ODM_DBG_FLAG,&extra_arg); + u64 dbg_comp = (u64)extra_arg; + rtw_odm_dbg_comp_set(padapter, dbg_comp); } } break; @@ -7527,7 +7770,7 @@ static int set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid) psetkeyparm->keyid=(u8)keyid; if (is_wep_enc(alg)) - padapter->mlmepriv.key_mask |= BIT(psetkeyparm->keyid); + padapter->securitypriv.key_mask |= BIT(psetkeyparm->keyid); psetkeyparm->algorithm = alg; psetkeyparm->set_tx = 1; @@ -8814,6 +9057,101 @@ FREE_EXT: } +#ifdef CONFIG_WOWLAN +static int rtw_wowlan_ctrl(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct wowlan_ioctl_param poidparam; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct sta_info *psta = NULL; + int ret = 0; + u32 start_time = rtw_get_current_time(); + poidparam.subcode = 0; + + DBG_871X("+rtw_wowlan_ctrl: %s\n", extra); + + if(pwrctrlpriv->bSupportRemoteWakeup==_FALSE){ + ret = -EPERM; + DBG_871X("+rtw_wowlan_ctrl: Device didn't support the remote wakeup!!\n"); + goto _rtw_wowlan_ctrl_exit_free; + } + + if (!check_fwstate(pmlmepriv, _FW_LINKED) && + check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { + DBG_871X("[%s] WARNING: Please Connect With AP First!!\n", __func__); + goto _rtw_wowlan_ctrl_exit_free; + } + + if (_rtw_memcmp( extra, "enable", 6 )) { + + while (pwrctrlpriv->bips_processing == _TRUE) + rtw_msleep_os(1); + + rtw_cancel_all_timer(padapter); + + padapter->bDriverStopped = _TRUE; //for stop thread + rtw_stop_drv_threads(padapter); + padapter->bDriverStopped = _FALSE; //for 32k command + +#ifdef CONFIG_LPS + rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0); +#endif + rtw_hal_disable_interrupt(padapter); // It need wait for leaving 32K. + + // 2.1 clean interupt + if (padapter->HalFunc.clear_interrupt) + padapter->HalFunc.clear_interrupt(padapter); + + poidparam.subcode = WOWLAN_ENABLE; + + rtw_hal_set_hwreg(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); + } else if (_rtw_memcmp( extra, "disable", 6 )) { +#ifdef CONFIG_LPS + rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0); +#endif //CONFIG_LPS + pwrctrlpriv->bFwCurrentInPSMode = _FALSE; + + rtw_hal_disable_interrupt(padapter); + + if (padapter->HalFunc.clear_interrupt) + padapter->HalFunc.clear_interrupt(padapter); + + poidparam.subcode = WOWLAN_DISABLE; + + rtw_hal_set_hwreg(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); + + psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); + if (psta) { + set_sta_rate(padapter, psta); + } + + padapter->bDriverStopped = _FALSE; + DBG_871X("%s: wowmode resuming, DriverStopped:%d\n", __func__, padapter->bDriverStopped); + rtw_start_drv_threads(padapter); + + rtw_hal_enable_interrupt(padapter); + + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); + pwrctrlpriv->bips_processing = _FALSE; + rtw_set_pwr_state_check_timer(pwrctrlpriv); + + } else { + DBG_871X("[%s] Invalid Parameter.\n", __func__); + goto _rtw_wowlan_ctrl_exit_free; + } + //mutex_lock(&ioctl_mutex); +_rtw_wowlan_ctrl_exit_free: + DBG_871X("-rtw_wowlan_ctrl( subcode = %d)\n", poidparam.subcode); + DBG_871X_LEVEL(_drv_always_, "%s in %d ms\n", __func__, + rtw_get_passing_time_ms(start_time)); +_rtw_wowlan_ctrl_exit: + return ret; +} +#endif //CONFIG_WOWLAN + static int rtw_pm_set(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) @@ -8867,17 +9205,17 @@ static int rtw_mp_efuse_get(struct net_device *dev, #endif wrqu = (struct iw_point*)wdata; - pwrctrlpriv = &padapter->pwrctrlpriv; + pwrctrlpriv = adapter_to_pwrctl(padapter); pEfuseHal = &pHalData->EfuseHal; err = 0; - data = _rtw_zmalloc(EFUSE_BT_MAX_MAP_LEN); + data = rtw_zmalloc(EFUSE_BT_MAX_MAP_LEN); if (data == NULL) { err = -ENOMEM; goto exit; } - rawdata = _rtw_zmalloc(EFUSE_BT_MAX_MAP_LEN); + rawdata = rtw_zmalloc(EFUSE_BT_MAX_MAP_LEN); if (rawdata == NULL) { err = -ENOMEM; @@ -9070,6 +9408,15 @@ static int rtw_mp_efuse_get(struct net_device *dev, addr = EEPROM_MAC_ADDR_8723AU; #endif #endif // CONFIG_RTL8723A + + #ifdef CONFIG_RTL8188E + #ifdef CONFIG_SDIO_HCI + addr = EEPROM_MAC_ADDR_88ES; + #else + addr = EEPROM_MAC_ADDR_88EU; + #endif + #endif + cnts = 6; EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); @@ -9388,9 +9735,9 @@ static int rtw_mp_efuse_get(struct net_device *dev, exit: if (data) - _rtw_mfree(data, EFUSE_BT_MAX_MAP_LEN); + rtw_mfree(data, EFUSE_BT_MAX_MAP_LEN); if (rawdata) - _rtw_mfree(rawdata, EFUSE_BT_MAX_MAP_LEN); + rtw_mfree(rawdata, EFUSE_BT_MAX_MAP_LEN); if (!err) wrqu->length = strlen(extra); @@ -9429,29 +9776,29 @@ static int rtw_mp_efuse_set(struct net_device *dev, wrqu = (struct iw_point*)wdata; padapter = rtw_netdev_priv(dev); - pwrctrlpriv = &padapter->pwrctrlpriv; + pwrctrlpriv = adapter_to_pwrctl(padapter); pHalData = GET_HAL_DATA(padapter); pEfuseHal = &pHalData->EfuseHal; err = 0; - setdata = _rtw_zmalloc(1024); + setdata = rtw_zmalloc(1024); if (setdata == NULL) { err = -ENOMEM; goto exit; } - ShadowMapBT = _rtw_malloc(EFUSE_BT_MAX_MAP_LEN); + ShadowMapBT = rtw_malloc(EFUSE_BT_MAX_MAP_LEN); if (ShadowMapBT == NULL) { err = -ENOMEM; goto exit; } - ShadowMapWiFi = _rtw_malloc(EFUSE_MAP_SIZE); + ShadowMapWiFi = rtw_malloc(EFUSE_MAP_SIZE); if (ShadowMapWiFi == NULL) { err = -ENOMEM; goto exit; } - setrawdata = _rtw_malloc(EFUSE_MAX_SIZE); + setrawdata = rtw_malloc(EFUSE_MAX_SIZE); if (setrawdata == NULL) { err = -ENOMEM; @@ -9890,13 +10237,13 @@ static int rtw_mp_efuse_set(struct net_device *dev, exit: if (setdata) - _rtw_mfree(setdata, 1024); + rtw_mfree(setdata, 1024); if (ShadowMapBT) - _rtw_mfree(ShadowMapBT, EFUSE_BT_MAX_MAP_LEN); + rtw_mfree(ShadowMapBT, EFUSE_BT_MAX_MAP_LEN); if (ShadowMapWiFi) - _rtw_mfree(ShadowMapWiFi, EFUSE_MAP_SIZE); + rtw_mfree(ShadowMapWiFi, EFUSE_MAP_SIZE); if (setrawdata) - _rtw_mfree(setrawdata, EFUSE_MAX_SIZE); + rtw_mfree(setrawdata, EFUSE_MAX_SIZE); #ifdef CONFIG_IPS rtw_pm_set_ips(padapter, ips_mode); @@ -9928,9 +10275,15 @@ static int rtw_mp_write_reg(struct net_device *dev, u32 addr, data; int ret; PADAPTER padapter = rtw_netdev_priv(dev); + char input[wrqu->length]; + + if (copy_from_user(input, wrqu->pointer, wrqu->length)) + return -EFAULT; + + _rtw_memset(extra, 0, wrqu->length); + + pch = input; - - pch = extra; pnext = strpbrk(pch, " ,.-"); if (pnext == NULL) return -EINVAL; *pnext = 0; @@ -10141,9 +10494,13 @@ static int rtw_mp_read_reg(struct net_device *dev, u32 path, addr, data; int ret; PADAPTER padapter = rtw_netdev_priv(dev); + char input[wrqu->length]; + + if (copy_from_user(input, wrqu->pointer, wrqu->length)) + return -EFAULT; - ret = sscanf(extra, "%d,%x,%x", &path, &addr, &data); + ret = sscanf(input, "%d,%x,%x", &path, &addr, &data); if (ret < 3) return -EINVAL; if (path >= MAX_RF_PATH_NUMS) return -EINVAL; @@ -10234,20 +10591,40 @@ static int rtw_mp_start(struct net_device *dev, { u8 val8; PADAPTER padapter = rtw_netdev_priv(dev); - + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct hal_ops *pHalFunc = &padapter->HalFunc; +#ifdef CONFIG_BT_COEXIST + PBT30Info pBTInfo; + PBT_MGNT pBtMgnt; + + pBTInfo = GET_BT_INFO(padapter); + pBtMgnt = &pBTInfo->BtMgnt; +#endif if(padapter->registrypriv.mp_mode ==0) { #ifdef CONFIG_RTL8723A DBG_871X("_rtw_mp_xmit_priv for Download BT patch FW\n"); _rtw_mp_xmit_priv(&padapter->xmitpriv); #endif - - padapter->registrypriv.mp_mode =1; - + + padapter->registrypriv.mp_mode =1; rtw_pm_set_ips(padapter,IPS_NONE); LeaveAllPowerSaveMode(padapter); - MPT_InitializeAdapter(padapter, 1); +#ifdef CONFIG_BT_COEXIST + pHalData->bt_coexist.BluetoothCoexist = 0; + pBtMgnt->ExtConfig.bManualControl = _TRUE; + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_BT); + BT_HaltProcess(padapter); + DBG_871X("Set disable BT_COEXIST\n"); + //padapter->registrypriv.mp_mode =0; + //pHalFunc->hal_init(padapter); + //padapter->registrypriv.mp_mode =1; + // Force to switch Antenna to WiFi + rtw_write16(padapter, 0x870, 0x300); + rtw_write16(padapter, 0x860, 0x110); +#endif } if (padapter->registrypriv.mp_mode == 0) @@ -10257,6 +10634,7 @@ static int rtw_mp_start(struct net_device *dev, if (mp_start_test(padapter) == _FAIL) return -EPERM; padapter->mppriv.mode = MP_ON; + MPT_PwrCtlDM(padapter,0); } return 0; @@ -10370,24 +10748,30 @@ static int rtw_mp_txpower(struct net_device *dev, struct iw_request_info *info, struct iw_point *wrqu, char *extra) { - u32 idx_a=0,idx_b=0; + u32 idx_a=0,idx_b=0,MsetPower=1; u8 input[wrqu->length]; PADAPTER padapter = rtw_netdev_priv(dev); - if (copy_from_user(input, wrqu->pointer, wrqu->length)) return -EFAULT; + MsetPower = strncmp(input, "off", 3); sscanf(input,"patha=%d,pathb=%d",&idx_a,&idx_b); //DBG_871X("%s: tx_pwr_idx_a=%x b=%x\n", __func__, idx_a, idx_b); - + if(MsetPower==0) + { + padapter->mppriv.bSetTxPower = 0; + sprintf( extra, "MP Set power off"); + } + else + { sprintf( extra, "Set power level path_A:%d path_B:%d", idx_a , idx_b ); padapter->mppriv.txpoweridx = (u8)idx_a; padapter->mppriv.txpoweridx_b = (u8)idx_b; padapter->mppriv.bSetTxPower = 1; Hal_SetAntennaPathPower(padapter); - + } wrqu->length = strlen(extra) + 1; return 0; } @@ -10622,6 +11006,10 @@ static int rtw_mp_disable_bt_coexist(struct net_device *dev, union iwreq_data *wrqu, char *extra) { PADAPTER padapter = (PADAPTER)rtw_netdev_priv(dev); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct hal_ops *pHalFunc = &padapter->HalFunc; + u8 input[wrqu->data.length]; u32 bt_coexist; @@ -10641,8 +11029,17 @@ static int rtw_mp_disable_bt_coexist(struct net_device *dev, { RT_TRACE(_module_mp_, _drv_info_, ("Set OID_RT_SET_DISABLE_BT_COEXIST: disable BT_COEXIST\n")); -#ifdef CONFIG_BT_COEXIST + DBG_871X("Set OID_RT_SET_DISABLE_BT_COEXIST: disable BT_COEXIST\n"); +#ifdef CONFIG_BT_COEXIST + pHalData->bt_coexist.BluetoothCoexist = 0; pBtMgnt->ExtConfig.bManualControl = _TRUE; + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_BT); + BT_HaltProcess(padapter); +#if 1 + padapter->registrypriv.mp_mode=0; + pHalFunc->hal_init(padapter); + padapter->registrypriv.mp_mode=1; +#endif // Force to switch Antenna to WiFi rtw_write16(padapter, 0x870, 0x300); rtw_write16(padapter, 0x860, 0x110); @@ -10668,9 +11065,10 @@ static int rtw_mp_arx(struct net_device *dev, struct iw_point *wrqu, char *extra) { u8 bStartRx=0,bStopRx=0,bQueryPhy=0,bQueryMac=0; - u32 cckok=0,cckcrc=0,ofdmok=0,ofdmcrc=0,htok=0,htcrc=0,OFDM_FA=0,CCK_FA=0,DropPacket=0; + u32 cckok=0,cckcrc=0,ofdmok=0,ofdmcrc=0,htok=0,htcrc=0,OFDM_FA=0,CCK_FA=0,DropPacket=0,vht_ok=0,vht_err=0; u8 input[wrqu->length]; - + u32 mac_cck_ok=0, mac_ofdm_ok=0, mac_ht_ok=0, mac_vht_ok=0; + u32 mac_cck_err=0, mac_ofdm_err=0, mac_ht_err=0, mac_vht_err=0; PADAPTER padapter = rtw_netdev_priv(dev); @@ -10696,62 +11094,63 @@ static int rtw_mp_arx(struct net_device *dev, } else if(bQueryPhy) { - /* - OFDM FA - RegCF0[15:0] - RegCF2[31:16] - RegDA0[31:16] - RegDA4[15:0] - RegDA4[31:16] - RegDA8[15:0] - CCK FA - (RegA5B<<8) | RegA5C - */ - cckok = read_bbreg(padapter, 0xf88, 0xffffffff ); - cckcrc = read_bbreg(padapter, 0xf84, 0xffffffff ); - ofdmok = read_bbreg(padapter, 0xf94, 0x0000FFFF ); - ofdmcrc = read_bbreg(padapter, 0xf94 , 0xFFFF0000 ); - htok = read_bbreg(padapter, 0xf90, 0x0000FFFF ); - htcrc = read_bbreg(padapter,0xf90, 0xFFFF0000 ); - - OFDM_FA=+read_bbreg(padapter, 0xcf0, 0x0000FFFF ); - OFDM_FA=+read_bbreg(padapter, 0xcf2, 0xFFFF0000 ); - OFDM_FA=+read_bbreg(padapter, 0xda0, 0xFFFF0000 ); - OFDM_FA=+read_bbreg(padapter, 0xda4, 0x0000FFFF ); - OFDM_FA=+read_bbreg(padapter, 0xda4, 0xFFFF0000 ); - OFDM_FA=+read_bbreg(padapter, 0xda8, 0x0000FFFF ); + + //if (IS_HARDWARE_TYPE_JAGUAR(padapter)) + #ifdef CONFIG_RTL8188A + { + cckok = PHY_QueryBBReg(padapter, 0xF04, 0x3FFF); // [13:0] + ofdmok = PHY_QueryBBReg(padapter, 0xF14, 0x3FFF); // [13:0] + htok = PHY_QueryBBReg(padapter, 0xF10, 0x3FFF); // [13:0] + vht_ok = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF); // [13:0] + + cckcrc = PHY_QueryBBReg(padapter, 0xF04, 0x3FFF0000); // [29:16] + ofdmcrc = PHY_QueryBBReg(padapter, 0xF14, 0x3FFF0000); // [29:16] + htcrc = PHY_QueryBBReg(padapter, 0xF10, 0x3FFF0000); // [29:16] + vht_err = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF0000); // [29:16] + } + #else + { + cckok = PHY_QueryBBReg(padapter, 0xF88, bMaskDWord); + ofdmok = PHY_QueryBBReg(padapter, 0xF94, bMaskLWord); + htok = PHY_QueryBBReg(padapter, 0xF90, bMaskLWord); + vht_ok = 0; + + cckcrc = PHY_QueryBBReg(padapter, 0xF84, bMaskDWord); + ofdmcrc = PHY_QueryBBReg(padapter, 0xF94, bMaskHWord); + htcrc = PHY_QueryBBReg(padapter, 0xF90, bMaskHWord); + vht_err = 0; + } + #endif CCK_FA=(rtw_read8(padapter, 0xa5b )<<8 ) | (rtw_read8(padapter, 0xa5c)); - - sprintf( extra, "Phy Received packet OK:%d CRC error:%d FA Counter: %d",cckok+ofdmok+htok,cckcrc+ofdmcrc+htcrc,OFDM_FA+CCK_FA); + sprintf( extra, "Phy Received packet OK:%d CRC error:%d FA Counter: %d",cckok+ofdmok+htok+vht_ok,cckcrc+ofdmcrc+htcrc+vht_err,OFDM_FA+CCK_FA); } else if(bQueryMac) { - //OFDM - rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)| Mac_OFDM_OK); - ofdmok = rtw_read32(padapter, 0x664)& 0x0000FFFF; //[15:0] R/W 0 BIT_RPT_COUNTER - rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)| Mac_OFDM_Fail); - ofdmcrc = rtw_read32(padapter, 0x664)& 0x0000FFFF; - rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)| Mac_OFDM_FasleAlarm); - OFDM_FA = rtw_read32(padapter, 0x664)& 0x0000FFFF; - //CCK - rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)|Mac_CCK_OK); - cckok = rtw_read32(padapter, 0x664)& 0x0000FFFF; - rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)| Mac_CCK_Fail); - cckcrc = rtw_read32(padapter, 0x664)& 0x0000FFFF; - rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)| Mac_CCK_FasleAlarm); - CCK_FA = rtw_read32(padapter, 0x664)& 0x0000FFFF; - //HT - rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)| Mac_HT_OK); - htok = rtw_read32(padapter, 0x664)& 0x0000FFFF; - rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)| Mac_HT_Fail); - htcrc = rtw_read32(padapter, 0x664)& 0x0000FFFF; - rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)|Mac_HT_FasleAlarm); - OFDM_FA += rtw_read32(padapter, 0x664)& 0x0000FFFF; - //Mac_DropPacket + + // for 8723A + { + PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x3); + mac_cck_ok = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] + PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x0); + mac_ofdm_ok = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] + PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x6); + mac_ht_ok = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] + mac_vht_ok = 0; + + PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x4); + mac_cck_err = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] + PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x1); + mac_ofdm_err = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] + PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x7); + mac_ht_err = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0] + mac_vht_err = 0; + //Mac_DropPacket rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)| Mac_DropPacket); DropPacket = rtw_read32(padapter, 0x664)& 0x0000FFFF; - - sprintf( extra, "Mac Received packet OK: %d , CRC error: %d , FA Counter: %d , Drop Packets: %d\n",cckok+ofdmok+htok,cckcrc+ofdmcrc+htcrc,OFDM_FA+CCK_FA,DropPacket); + } + + sprintf( extra, "Mac Received packet OK: %d , CRC error: %d , FA Counter: %d , Drop Packets: %d\n", + mac_cck_ok+mac_ofdm_ok+mac_ht_ok+mac_vht_ok,mac_cck_err+mac_ofdm_err+mac_ht_err+mac_vht_err,OFDM_FA+CCK_FA,DropPacket); } wrqu->length = strlen(extra) + 1; return 0; @@ -10913,7 +11312,9 @@ static int rtw_mp_reset_stats(struct net_device *dev, write_bbreg(padapter,0xf14,BIT16,0x1); rtw_msleep_os(10); write_bbreg(padapter,0xf14,BIT16,0x0); - + //reset mac counter + PHY_SetMacReg(padapter, 0x664, BIT27, 0x1); + PHY_SetMacReg(padapter, 0x664, BIT27, 0x0); return 0; } @@ -10921,39 +11322,40 @@ static int rtw_mp_dump(struct net_device *dev, struct iw_request_info *info, struct iw_point *wrqu, char *extra) { - struct mp_priv *pmp_priv; - struct pkt_attrib *pattrib; - u32 value; + u32 value,i,j=1,path; + u8 input[wrqu->length]; u8 rf_type,path_nums = 0; - u32 i,j=1,path; PADAPTER padapter = rtw_netdev_priv(dev); - + struct mp_priv *pmp_priv; + struct pkt_attrib *pattrib; + pmp_priv = &padapter->mppriv; - - //if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) - // return -EFAULT; - - if ( strncmp(extra, "all", 4)==0 ) + if (copy_from_user(input, wrqu->pointer, wrqu->length)) + return -EFAULT; + + if ( strncmp(input, "all", 4)==0 ) { - DBG_871X("\n======= MAC REG =======\n"); + printk("\n======= MAC REG =======\n"); for ( i=0x0;i<0x300;i+=4 ) { - if(j%4==1) DBG_871X("0x%02x",i); - DBG_871X(" 0x%08x ",rtw_read32(padapter,i)); - if((j++)%4 == 0) DBG_871X("\n"); + if(j%4==1) printk("0x%02x ",i); + printk(" 0x%08x ",rtw_read32(padapter,i)); + if((j++)%4 == 0) printk("\n"); } for( i=0x400;i<0x1000;i+=4 ) { if(j%4==1) DBG_871X("0x%02x",i); - DBG_871X(" 0x%08x ",rtw_read32(padapter,i)); - if((j++)%4 == 0) DBG_871X("\n"); + printk(" 0x%08x ",rtw_read32(padapter,i)); + if((j++)%4 == 0) printk("\n"); } i,j=1; rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - - DBG_871X("\n======= RF REG =======\n"); + bb_reg_dump(padapter); + rf_reg_dump(padapter); + /* + printk("\n======= RF REG =======\n"); if(( RF_1T2R == rf_type ) ||( RF_1T1R ==rf_type )) path_nums = 1; else @@ -10969,11 +11371,11 @@ static int rtw_mp_dump(struct net_device *dev, { //value = PHY_QueryRFReg(padapter, (RF_RADIO_PATH_E)path,i, bMaskDWord); value = rtw_hal_read_rfreg(padapter, path, i, 0xffffffff); - if(j%4==1) DBG_871X("0x%02x ",i); - DBG_871X(" 0x%08x ",value); - if((j++)%4==0) DBG_871X("\n"); + if(j%4==1) printk("0x%02x ",i); + printk(" 0x%08x ",value); + if((j++)%4==0) printk("\n"); } - } + }*/ } return 0; } @@ -11115,9 +11517,9 @@ static int rtw_mp_SetBT(struct net_device *dev, char *pch, *ptmp, *token, *tmp[2]={0x00,0x00}; u8 setdata[100]; u8 resetbt=0x00; - u16 dltime=0; + u8 H2cSetbtmac[6]; - u16 testmode=1,ready=1,trxparam=1,setgen=1,getgen=1,testctrl=1,testbt=1; + u16 testmode=1,ready=1,trxparam=1,setgen=1,getgen=1,testctrl=1,testbt=1,readtherm=1,setbtmac=1; u32 i,ii,jj,kk,cnts,status; PRT_FIRMWARE_8723A pBTFirmware = NULL; @@ -11133,26 +11535,28 @@ static int rtw_mp_SetBT(struct net_device *dev, getgen = strncmp(extra, "getgen", 6); testctrl = strncmp(extra, "testctrl", 8); testbt = strncmp(extra, "testbt", 6); + readtherm = strncmp(extra, "readtherm", 9); + setbtmac = strncmp(extra, "setbtmac", 8); if ( strncmp(extra, "dlfw", 4) == 0) { - - while(dltime<3) - { - //rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)| 0x00000002)); - //rtw_msleep_os(1000); - rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)| 0x00000002)); - rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)& 0xFFFFFFFB)); - rtw_msleep_os(500); - rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)& 0xFFFFFFFE)); - rtw_msleep_os(500); - rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)| 0x00000004)); - rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)& 0xFFFFFFFD)); - rtw_msleep_os(1000); - #if 0 + padapter->registrypriv.mp_mode =0; + pHalFunc->hal_init(padapter); + padapter->registrypriv.mp_mode =1; + MPT_PwrCtlDM(padapter,0); + rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)| 0x00000004)); + rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)& 0xFFFFFFEF)); + rtw_msleep_os(600); + //rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)& 0xFFFFFFFE)); + rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)| 0x00000010)); + rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)& 0xFFFFFFFB)); + rtw_msleep_os(1200); + + DBG_871X("padapter->bBTFWReady == _FALSE rtl8723a_FirmwareDownload !\n"); + status = rtl8723a_FirmwareDownload(padapter); + #if 0 FillH2CCmd(padapter, 0x32, 1, &resetbt); rtw_msleep_os(1000); - #endif if(padapter->bBTFWReady == _FALSE && padapter->registrypriv.mp_mode == 1) { @@ -11168,42 +11572,63 @@ static int rtw_mp_SetBT(struct net_device *dev, if (pBTFirmware) rtw_mfree((u8*)pBTFirmware, sizeof(RT_FIRMWARE_8723A)); } - - rtw_msleep_os(1200); + #endif + DBG_871X("Wait for FirmwareDownloadBT fw boot!\n"); + rtw_msleep_os(1000); _rtw_memset(extra,'\0', wrqu->data.length); BtReq.opCodeVer=1; BtReq.OpCode=0; BtReq.paraLength=0; mptbt_BtControlProcess(padapter,&BtReq); - + rtw_msleep_os(100); for (i=4; imptOutLen; i++) { DBG_8192C("FirmwareDownloadBT ready = 0x%x ", pMptCtx->mptOutBuf[i]); if( (pMptCtx->mptOutBuf[i]==0x00) && (pMptCtx->mptOutBuf[i+1]==0x00)) { - sprintf(extra, "download FW Fail! retry = %d\n",dltime); - padapter->bBTFWReady = _FALSE; - + sprintf(extra, "download FW Fail.\n"); } else { - padapter->bBTFWReady = _TRUE; - sprintf(extra, "download FW OK. \n"); + sprintf(extra, "download FW OK.\n"); goto exit; } } - dltime++; - } - + goto exit; } if ( strncmp(extra, "down", 4) == 0){ DBG_871X("SetBT down for to hal_init !\n"); + mp_stop_test(padapter); pHalFunc->hal_init(padapter); + mp_start_test(padapter); + MPT_PwrCtlDM(padapter,0); + rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)| 0x00000004)); + rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)& 0xFFFFFFEF)); + rtw_msleep_os(600); + //rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)& 0xFFFFFFFE)); + rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)| 0x00000010)); + rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)& 0xFFFFFFFB)); + rtw_msleep_os(1200); + goto exit; + } + if ( strncmp(extra, "disable", 4) == 0){ + DBG_871X("SetBT enable !\n"); + rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)& 0xFFFFFFFB)); + rtw_msleep_os(500); + goto exit; + } + if ( strncmp(extra, "enable", 4) == 0){ + DBG_871X("SetBT disable !\n"); + rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)| 0x00000004)); + rtw_msleep_os(500); goto exit; } + if( ready!=0 && testmode!=0 && trxparam!=0 && setgen!=0 && getgen!=0 && testctrl!=0 && testbt!=0 && readtherm!=0 &&setbtmac!=0) + return -EFAULT; + if( testbt==0 ) { BtReq.opCodeVer=1; @@ -11247,6 +11672,25 @@ static int rtw_mp_SetBT(struct net_device *dev, DBG_871X("BtReq.pParamStart[%d]=%x \n",ii,BtReq.pParamStart[jj]); } } + if( setbtmac==0 ) { + H2cSetbtmac[0]=54; + H2cSetbtmac[1]=00; + H2cSetbtmac[2]=BtReq.pParamStart[0]; + H2cSetbtmac[3]=BtReq.pParamStart[1]; + H2cSetbtmac[4]=BtReq.pParamStart[2]; + H2cSetbtmac[5]=BtReq.pParamStart[3]; + FillH2CCmd(padapter, 70, 6, H2cSetbtmac); + sprintf(extra, "%s\n",H2cSetbtmac); + rtw_msleep_os(200); + H2cSetbtmac[0]=54; + H2cSetbtmac[1]=01; + H2cSetbtmac[2]=BtReq.pParamStart[4]; + H2cSetbtmac[3]=BtReq.pParamStart[5]; + FillH2CCmd(padapter, 70, 4, H2cSetbtmac); + + sprintf(extra, "setbtmac H2C part1=%s ,part2=%s \n",extra,H2cSetbtmac); + goto exit; + } if( testmode==0 ) { @@ -11274,6 +11718,14 @@ static int rtw_mp_SetBT(struct net_device *dev, BtReq.OpCode=4; //BT_GET_GENERAL 4 BtReq.paraLength=cnts/2; } + if( readtherm==0 ) + { + DBG_871X("%s: BT_GET_GENERAL \n", __func__); + BtReq.opCodeVer=1; + BtReq.OpCode=4; //BT_GET_GENERAL 4 + BtReq.paraLength=cnts/2; + } + if( testctrl==0 ) { DBG_871X("%s: BT_TEST_CTRL \n", __func__); @@ -11299,12 +11751,23 @@ todo: _rtw_memset(extra,'\0', wrqu->data.length); mptbt_BtControlProcess(padapter,&BtReq); - - for (i=4; imptOutLen; i++) - { - DBG_8192C("0x%x ", pMptCtx->mptOutBuf[i]); - sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); - } + + if(readtherm==0){ + sprintf(extra,"BT thermal="); + for (i=4; imptOutLen; i++) + { + if( (pMptCtx->mptOutBuf[i]==0x00) && (pMptCtx->mptOutBuf[i+1]==0x00)) + goto exit; + DBG_8192C("0x%x ", pMptCtx->mptOutBuf[i]); + sprintf(extra, "%s %d ", extra, pMptCtx->mptOutBuf[i]); + } + }else{ + for (i=4; imptOutLen; i++) + { + DBG_8192C("0x%x ", pMptCtx->mptOutBuf[i]); + sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]); + } + } exit: wrqu->data.length = strlen(extra) + 1; @@ -11368,7 +11831,13 @@ static int rtw_mp_set(struct net_device *dev, case MP_DISABLE_BT_COEXIST: DBG_871X("set case MP_DISABLE_BT_COEXIST \n"); rtw_mp_disable_bt_coexist(dev, info, wdata, extra); - break; + break; +#ifdef CONFIG_WOWLAN + case MP_WOW_ENABLE: + DBG_871X("set case MP_WOW_ENABLE: %s \n", extra); + rtw_wowlan_ctrl(dev, info, wdata, extra); + break; +#endif } @@ -12178,18 +12647,17 @@ static int rtw_widi_set_probe_request(struct net_device *dev, u8 *pbuf = NULL; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); -#if 1 pbuf = rtw_malloc(sizeof(l2_msg_t)); if(pbuf) { - _rtw_memcpy(pbuf, wrqu->data.pointer, wrqu->data.length); + copy_from_user(pbuf, wrqu->data.pointer, wrqu->data.length); + //_rtw_memcpy(pbuf, wrqu->data.pointer, wrqu->data.length); + + if( wrqu->data.flags == 0 ) intel_widi_wk_cmd(padapter, INTEL_WIDI_ISSUE_PROB_WK, pbuf); + else if( wrqu->data.flags == 1 ) + rtw_set_wfd_rds_sink_info( padapter, (l2_msg_t *)pbuf ); } -#else - DBG_871X( "[%s] len = %d\n", __FUNCTION__,wrqu->data.length); - - issue_probereq_widi(padapter, wrqu->data.pointer); -#endif return ret; } #endif // CONFIG_INTEL_WIDI @@ -12253,7 +12721,7 @@ static s32 initpseudoadhoc(PADAPTER padapter) err = rtw_set_802_11_infrastructure_mode(padapter, networkType); if (err == _FALSE) return _FAIL; - err = rtw_setopmode_cmd(padapter, networkType); + err = rtw_setopmode_cmd(padapter, networkType,_TRUE); if (err == _FAIL) return _FAIL; return _SUCCESS; @@ -13100,18 +13568,13 @@ static const struct iw_priv_args rtw_private_args[] = { SIOCIWFIRSTPRIV + 0xD, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "rfr" }, -#if 0 - { - SIOCIWFIRSTPRIV + 0xE,0,0, "wowlan_ctrl" - }, -#endif { SIOCIWFIRSTPRIV + 0x10, - IW_PRIV_TYPE_CHAR | P2P_PRIVATE_IOCTL_SET_LEN, 0, "p2p_set" + IW_PRIV_TYPE_CHAR | 1024, 0, "p2p_set" }, { SIOCIWFIRSTPRIV + 0x11, - IW_PRIV_TYPE_CHAR | P2P_PRIVATE_IOCTL_SET_LEN, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | P2P_PRIVATE_IOCTL_SET_LEN , "p2p_get" + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , "p2p_get" }, { SIOCIWFIRSTPRIV + 0x12, 0, 0, "NULL" @@ -13145,7 +13608,7 @@ static const struct iw_priv_args rtw_private_args[] = { #ifdef CONFIG_INTEL_WIDI { SIOCIWFIRSTPRIV + 0x1E, - IW_PRIV_TYPE_CHAR | 64, 0, "widi_set" + IW_PRIV_TYPE_CHAR | 1024, 0, "widi_set" }, { SIOCIWFIRSTPRIV + 0x1F, @@ -13193,6 +13656,9 @@ static const struct iw_priv_args rtw_private_args[] = { #endif { CTA_TEST, IW_PRIV_TYPE_CHAR | 1024, 0, "cta_test"}, #endif +#ifdef CONFIG_WOWLAN + { MP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "wow_enable" }, //set +#endif }; static iw_handler rtw_private_handler[] = @@ -13726,4 +14192,3 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) return ret; } - diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/mlme_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/mlme_linux.c index 1e5a19c0ee97..41e870f7aac5 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/mlme_linux.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/mlme_linux.c @@ -94,11 +94,12 @@ void _rtw_scan_timeout_handler (void *FunctionContext) void _dynamic_check_timer_handlder (void *FunctionContext) { _adapter *adapter = (_adapter *)FunctionContext; - +/* remove for MP power tracking DM. #if (MP_DRIVER == 1) if (adapter->registrypriv.mp_mode == 1) return; #endif +*/ rtw_dynamic_check_timer_handlder(adapter); _set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000); @@ -112,6 +113,16 @@ void _rtw_set_scan_deny_timer_hdl(void *FunctionContext) } #endif +#ifdef CONFIG_DETECT_C2H_BY_POLLING +void _rtw_event_polling_timer_hdl(void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + + rtw_event_polling_timer_hdl(adapter); + + _set_timer(&adapter->mlmepriv.event_polling_timer, 200); +} +#endif void rtw_init_mlme_timer(_adapter *padapter) { @@ -127,6 +138,10 @@ void rtw_init_mlme_timer(_adapter *padapter) _init_timer(&(pmlmepriv->set_scan_deny_timer), padapter->pnetdev, _rtw_set_scan_deny_timer_hdl, padapter); #endif +#ifdef CONFIG_DETECT_C2H_BY_POLLING + _init_timer(&(pmlmepriv->event_polling_timer), padapter->pnetdev, _rtw_event_polling_timer_hdl, padapter); +#endif + #ifdef RTK_DMP_PLATFORM _init_workitem(&(pmlmepriv->Linkup_workitem), Linkup_workitem_callback, padapter); _init_workitem(&(pmlmepriv->Linkdown_workitem), Linkdown_workitem_callback, padapter); @@ -178,7 +193,12 @@ void rtw_reset_securitypriv( _adapter *adapter ) u8 backupPMKIDIndex = 0; u8 backupTKIPCountermeasure = 0x00; u32 backupTKIPcountermeasure_time = 0; - + // add for CONFIG_IEEE80211W, none 11w also can use + _irqL irqL; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + + _enter_critical_bh(&adapter->security_key_mutex, &irqL); + if(adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)//802.1x { // Added by Albert 2009/02/18 @@ -193,7 +213,10 @@ void rtw_reset_securitypriv( _adapter *adapter ) backupPMKIDIndex = adapter->securitypriv.PMKIDIndex; backupTKIPCountermeasure = adapter->securitypriv.btkip_countermeasure; backupTKIPcountermeasure_time = adapter->securitypriv.btkip_countermeasure_time; - +#ifdef CONFIG_IEEE80211W + //reset RX BIP packet number + pmlmeext->mgnt_80211w_IPN_rx = 0; +#endif //CONFIG_IEEE80211W _rtw_memset((unsigned char *)&adapter->securitypriv, 0, sizeof (struct security_priv)); //_init_timer(&(adapter->securitypriv.tkip_timer),adapter->pnetdev, rtw_use_tkipkey_handler, adapter); @@ -225,6 +248,8 @@ void rtw_reset_securitypriv( _adapter *adapter ) psec_priv->ndisencryptstatus = Ndis802_11WEPDisabled; //} } + // add for CONFIG_IEEE80211W, none 11w also can use + _exit_critical_bh(&adapter->security_key_mutex, &irqL); } void rtw_os_indicate_disconnect( _adapter *adapter ) @@ -244,7 +269,8 @@ _func_enter_; #ifdef RTK_DMP_PLATFORM _set_workitem(&adapter->mlmepriv.Linkdown_workitem); #endif - rtw_reset_securitypriv( adapter ); + //modify for CONFIG_IEEE80211W, none 11w also can use the same command + rtw_reset_securitypriv_cmd(adapter); _func_exit_; @@ -320,6 +346,14 @@ void _addba_timer_hdl(void *FunctionContext) addba_timer_hdl(psta); } +#ifdef CONFIG_IEEE80211W +void _sa_query_timer_hdl (void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + sa_query_timer_hdl(padapter); +} +#endif //CONFIG_IEEE80211W + void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta) { @@ -346,6 +380,9 @@ void init_mlme_ext_timer(_adapter *padapter) _init_timer(&pmlmeext->survey_timer, padapter->pnetdev, _survey_timer_hdl, padapter); _init_timer(&pmlmeext->link_timer, padapter->pnetdev, _link_timer_hdl, padapter); +#ifdef CONFIG_IEEE80211W + _init_timer(&pmlmeext->sa_query_timer, padapter->pnetdev, _sa_query_timer_hdl, padapter); +#endif //CONFIG_IEEE80211W //_init_timer(&pmlmeext->ADDBA_timer, padapter->pnetdev, _addba_timer_hdl, padapter); //_init_timer(&pmlmeext->reauth_timer, padapter->pnetdev, _reauth_timer_hdl, padapter); diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/os_intfs.c b/drivers/net/wireless/rtl8723as/os_dep/linux/os_intfs.c index 6d89da078749..ce0b23dd04c4 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/os_intfs.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/os_intfs.c @@ -48,8 +48,15 @@ #endif //CONFIG_BR_EXT #ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RTL8723A +#define RF_GAIN_OFFSET_ON BIT0 +#define REG_RF_BB_GAIN_OFFSET 0x7f +#define RF_GAIN_OFFSET_MASK 0xfffff +#else +#define RF_GAIN_OFFSET_ON BIT4 #define REG_RF_BB_GAIN_OFFSET 0x55 #define RF_GAIN_OFFSET_MASK 0xfffff +#endif //CONFIG_RTL8723A #endif //CONFIG_RF_GAIN_OFFSET MODULE_LICENSE("GPL"); @@ -198,6 +205,13 @@ module_param(rtw_force_ant, int, 0644); module_param(rtw_force_igi, int, 0644); #endif +#ifdef CONFIG_QOS_OPTIMIZATION +int rtw_qos_opt_enable=1;//0: disable,1:enable +#else +int rtw_qos_opt_enable=0;//0: disable,1:enable +#endif +module_param(rtw_qos_opt_enable,int,0644); + char* ifname = "wlan%d"; module_param(ifname, charp, 0644); MODULE_PARM_DESC(ifname, "The default name to allocate for first interface"); @@ -354,6 +368,15 @@ void rtw_proc_init_one(struct net_device *dev) DBG_871X("Unable to create_proc_read_entry!\n"); return; } + +#ifdef DBG_MEM_ALLOC + entry = create_proc_read_entry("mstat", S_IFREG | S_IRUGO, + rtw_proc, proc_get_mstat, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } +#endif /* DBG_MEM_ALLOC */ } @@ -573,6 +596,7 @@ void rtw_proc_init_one(struct net_device *dev) DBG_871X("Unable to create_proc_read_entry!\n"); return; } + entry->write_proc = proc_set_best_channel; #endif entry = create_proc_read_entry("rx_signal", S_IFREG | S_IRUGO, @@ -647,6 +671,50 @@ void rtw_proc_init_one(struct net_device *dev) entry->write_proc = proc_set_sreset; #endif /* DBG_CONFIG_ERROR_DETECT */ + /* for odm */ + { + struct proc_dir_entry *dir_odm = NULL; + + if (padapter->dir_odm == NULL) { + padapter->dir_odm = create_proc_entry( + "odm", S_IFDIR | S_IRUGO | S_IXUGO, dir_dev); + + dir_odm = padapter->dir_odm; + + if(dir_odm==NULL) { + DBG_871X("Unable to create dir_odm directory\n"); + return; + } + } + else + { + return; + } + + entry = create_proc_read_entry("dbg_comp", S_IFREG | S_IRUGO, + dir_odm, proc_get_odm_dbg_comp, dev); + if (!entry) { + rtw_warn_on(1); + return; + } + entry->write_proc = proc_set_odm_dbg_comp; + + entry = create_proc_read_entry("dbg_level", S_IFREG | S_IRUGO, + dir_odm, proc_get_odm_dbg_level, dev); + if (!entry) { + rtw_warn_on(1); + return; + } + entry->write_proc = proc_set_odm_dbg_level; + + entry = create_proc_read_entry("adaptivity", S_IFREG | S_IRUGO, + dir_odm, proc_get_odm_adaptivity, dev); + if (!entry) { + rtw_warn_on(1); + return; + } + entry->write_proc = proc_set_odm_adaptivity; + } } void rtw_proc_remove_one(struct net_device *dev) @@ -718,6 +786,21 @@ void rtw_proc_remove_one(struct net_device *dev) remove_proc_entry("sreset", dir_dev); #endif /* DBG_CONFIG_ERROR_DETECT */ + /* for odm */ + { + struct proc_dir_entry *dir_odm = NULL; + dir_odm = padapter->dir_odm; + padapter->dir_odm = NULL; + + if (dir_odm) { + remove_proc_entry("dbg_comp", dir_odm); + remove_proc_entry("dbg_level", dir_odm); + remove_proc_entry("adaptivity", dir_odm); + + remove_proc_entry("odm", dir_dev); + } + } + remove_proc_entry(dev->name, rtw_proc); dir_dev = NULL; @@ -733,7 +816,9 @@ void rtw_proc_remove_one(struct net_device *dev) { if(rtw_proc){ remove_proc_entry("ver_info", rtw_proc); - + #ifdef DBG_MEM_ALLOC + remove_proc_entry("mstat", rtw_proc); + #endif /* DBG_MEM_ALLOC */ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) remove_proc_entry(rtw_proc_name, proc_net); #else @@ -836,6 +921,7 @@ _func_enter_; registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;//0:disable,1:enable #endif + registry_par->qos_opt_enable = (u8)rtw_qos_opt_enable; registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc; #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE @@ -1163,6 +1249,37 @@ u32 rtw_start_drv_threads(_adapter *padapter) } +void rtw_unregister_netdevs(struct dvobj_priv *dvobj) +{ + int i; + _adapter *padapter = NULL; + + for(i=0;iiface_nums;i++) + { + struct net_device *pnetdev = NULL; + + padapter = dvobj->padapters[i]; + + if (padapter == NULL) + continue; + + pnetdev = padapter->pnetdev; + + if((padapter->DriverState != DRIVER_DISAPPEAR) && pnetdev) { + + unregister_netdev(pnetdev); //will call netdev_close() + rtw_proc_remove_one(pnetdev); + } + +#ifdef CONFIG_IOCTL_CFG80211 + rtw_wdev_unregister(padapter->rtw_wdev); +#endif + + } + +} + + void rtw_stop_drv_threads (_adapter *padapter) { RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_stop_drv_threads\n")); @@ -1171,12 +1288,7 @@ void rtw_stop_drv_threads (_adapter *padapter) if(padapter->isprimary == _TRUE) #endif //CONFIG_CONCURRENT_MODE { - //Below is to termindate rtw_cmd_thread & event_thread... - _rtw_up_sema(&padapter->cmdpriv.cmd_queue_sema); - //_rtw_up_sema(&padapter->cmdpriv.cmd_done_sema); - if(padapter->cmdThread){ - _rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); - } + rtw_stop_cmd_thread(padapter); } #ifdef CONFIG_EVENT_THREAD_MODE @@ -1287,7 +1399,7 @@ u8 rtw_reset_drv_sw(_adapter *padapter) { u8 ret8=_SUCCESS; struct mlme_priv *pmlmepriv= &padapter->mlmepriv; - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); //hal_priv rtw_hal_def_value_init(padapter); @@ -1400,7 +1512,9 @@ _func_enter_; ret8=_FAIL; goto exit; } - + // add for CONFIG_IEEE80211W, none 11w also can use + _rtw_spinlock_init(&padapter->security_key_mutex); + // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). //_rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); @@ -1414,7 +1528,8 @@ _func_enter_; } padapter->stapriv.padapter = padapter; - padapter->setband = GHZ24_50; + padapter->setband = GHZ24_50; + padapter->fix_rate = 0xFF; rtw_init_bcmc_stainfo(padapter); rtw_init_pwrctrl_priv(padapter); @@ -1492,7 +1607,7 @@ void rtw_cancel_all_timer(_adapter *padapter) rtw_hal_sw_led_deinit(padapter); RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel DeInitSwLeds! \n")); - _cancel_timer_ex(&padapter->pwrctrlpriv.pwr_state_check_timer); + _cancel_timer_ex(&(adapter_to_pwrctl(padapter)->pwr_state_check_timer)); #ifdef CONFIG_IOCTL_CFG80211 #ifdef CONFIG_P2P @@ -1509,6 +1624,11 @@ void rtw_cancel_all_timer(_adapter *padapter) #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS _cancel_timer_ex(&padapter->recvpriv.signal_stat_timer); #endif + +#ifdef CONFIG_DETECT_C2H_BY_POLLING + _cancel_timer_ex(&padapter->mlmepriv.event_polling_timer); +#endif + #if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST) if (padapter->HalFunc.hal_cancel_checkbthang_workqueue) padapter->HalFunc.hal_cancel_checkbthang_workqueue(padapter); @@ -1546,8 +1666,9 @@ u8 rtw_free_drv_sw(_adapter *padapter) } } #endif - - + // add for CONFIG_IEEE80211W, none 11w also can use + _rtw_spinlock_free(&padapter->security_key_mutex); + #ifdef CONFIG_BR_EXT _rtw_spinlock_free(&padapter->br_ext_lock); #endif // CONFIG_BR_EXT @@ -1630,9 +1751,6 @@ int _netdev_if2_open(struct net_device *pnetdev) padapter->bSurpriseRemoved = _FALSE; padapter->bCardDisableWOHSM = _FALSE; -// _rtw_memcpy(padapter->HalData, primary_padapter->HalData, padapter->hal_data_sz); - rtw_hal_clone_data(padapter, primary_padapter); - padapter->bFWReady = primary_padapter->bFWReady; //if (init_mlme_ext_priv(padapter) == _FAIL) @@ -1649,12 +1767,7 @@ int _netdev_if2_open(struct net_device *pnetdev) { padapter->intf_start(padapter); } - - - padapter->hw_init_completed = _TRUE; - - - padapter->dir_dev = NULL; + rtw_proc_init_one(pnetdev); @@ -1774,7 +1887,8 @@ _adapter *rtw_drv_if2_init(_adapter *primary_padapter, void (*set_intf_ops)(stru padapter->bup = _FALSE; padapter->net_closed = _TRUE; padapter->hw_init_completed = _FALSE; - + padapter->dir_dev = NULL; + padapter->dir_odm = NULL; //set adapter_type/iface type padapter->isprimary = _FALSE; @@ -1856,9 +1970,7 @@ _adapter *rtw_drv_if2_init(_adapter *primary_padapter, void (*set_intf_ops)(stru _rtw_memcpy(padapter->eeprompriv.mac_addr, mac, ETH_ALEN); rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr, padapter->eeprompriv.mac_addr); - primary_padapter->pbuddy_adapter = padapter; - - padapter->dir_dev = NULL; + primary_padapter->pbuddy_adapter = padapter; res = _SUCCESS; @@ -1901,18 +2013,18 @@ void rtw_drv_if2_free(_adapter *if2) void rtw_drv_if2_stop(_adapter *if2) { _adapter *padapter = if2; - struct net_device *pnetdev = NULL; + //struct net_device *pnetdev = NULL; if (padapter == NULL) return; - +/* pnetdev = padapter->pnetdev; if (pnetdev) { unregister_netdev(pnetdev); //will call netdev_close() rtw_proc_remove_one(pnetdev); } - +*/ rtw_cancel_all_timer(padapter); if (padapter->bup == _TRUE) { @@ -1931,11 +2043,11 @@ void rtw_drv_if2_stop(_adapter *if2) padapter->bup = _FALSE; } - +/* #ifdef CONFIG_IOCTL_CFG80211 rtw_wdev_unregister(padapter->rtw_wdev); #endif - +*/ } #endif //end of CONFIG_CONCURRENT_MODE @@ -2057,7 +2169,7 @@ int _netdev_open(struct net_device *pnetdev) { uint status; _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - dev_open\n")); DBG_871X("+871x_drv - drv_open, bup=%d\n", padapter->bup); @@ -2093,12 +2205,6 @@ int _netdev_open(struct net_device *pnetdev) goto netdev_open_error; } - if (init_hw_mlme_ext(padapter) == _FAIL) - { - DBG_871X("can't init mlme_ext_priv\n"); - goto netdev_open_error; - } - #ifdef CONFIG_DRVEXT_MODULE init_drvext(padapter); #endif @@ -2119,13 +2225,18 @@ int _netdev_open(struct net_device *pnetdev) rtw_led_control(padapter, LED_CTL_NO_LINK); padapter->bup = _TRUE; + + pwrctrlpriv->bips_processing = _FALSE; } padapter->net_closed = _FALSE; _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); - padapter->pwrctrlpriv.bips_processing = _FALSE; - rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); +#ifdef CONFIG_DETECT_C2H_BY_POLLING + _set_timer(&padapter->mlmepriv.event_polling_timer, 200); +#endif + + rtw_set_pwr_state_check_timer(pwrctrlpriv); //netif_carrier_on(pnetdev);//call this func when rtw_joinbss_event_callback return success if(!rtw_netif_queue_stopped(pnetdev)) @@ -2142,7 +2253,7 @@ netdev_open_normal_process: #ifdef CONFIG_CONCURRENT_MODE { _adapter *sec_adapter = padapter->pbuddy_adapter; - if(sec_adapter && (sec_adapter->bup == _FALSE || sec_adapter->hw_init_completed == _FALSE)) + if(sec_adapter && (sec_adapter->bup == _FALSE)) _netdev_if2_open(sec_adapter->pnetdev); } #endif @@ -2187,7 +2298,6 @@ int ips_netdrv_open(_adapter *padapter) padapter->bDriverStopped = _FALSE; - padapter->bSurpriseRemoved = _FALSE; padapter->bCardDisableWOHSM = _FALSE; //padapter->bup = _TRUE; @@ -2197,13 +2307,17 @@ int ips_netdrv_open(_adapter *padapter) RT_TRACE(_module_os_intfs_c_,_drv_err_,("ips_netdrv_open(): Can't init h/w!\n")); goto netdev_open_error; } + +#ifdef CONFIG_RF_GAIN_OFFSET + rtw_bb_rf_gain_offset(padapter); +#endif //CONFIG_RF_GAIN_OFFSET if(padapter->intf_start) { padapter->intf_start(padapter); } - rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); + rtw_set_pwr_state_check_timer(adapter_to_pwrctl(padapter)); _set_timer(&padapter->mlmepriv.dynamic_chk_timer,5000); return _SUCCESS; @@ -2277,15 +2391,45 @@ void rtw_bb_rf_gain_offset(_adapter *padapter) DBG_871X("+%s value: 0x%02x+\n", __func__, value); - if (!(value & 0x01)) { - DBG_871X("Offset RF Gain.\n"); - res = rtw_hal_read_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, 0xffffffff); - value &= tmp; - res = value << 14; - rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); + if (value & RF_GAIN_OFFSET_ON) { + //DBG_871X("Offset RF Gain.\n"); + //DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal); + if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){ +#ifdef CONFIG_RTL8723A + res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xd, 0xffffffff); + //DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res); + res &= 0xfff87fff; + + res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15; + //DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res); + + rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); + + res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xe, 0xffffffff); + DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res); + res &= 0xfffffff0; + + res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f); + //DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res); + + rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); +#else + res = rtw_hal_read_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, 0xffffffff); + DBG_871X("REG_RF_BB_GAIN_OFFSET=%x \n",res); + res &= 0xfff87fff; + res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15; + DBG_871X("write REG_RF_BB_GAIN_OFFSET=%x \n",res); + rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); +#endif + } + else + { + //DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal); + } } else { - DBG_871X("Using the default RF gain.\n"); + //DBG_871X("Using the default RF gain.\n"); } + } #endif //CONFIG_RF_GAIN_OFFSET @@ -2310,11 +2454,11 @@ static int netdev_close(struct net_device *pnetdev) RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - drv_close\n")); - if(padapter->pwrctrlpriv.bInternalAutoSuspend == _TRUE) + if(adapter_to_pwrctl(padapter)->bInternalAutoSuspend == _TRUE) { //rtw_pwr_wakeup(padapter); - if(padapter->pwrctrlpriv.rf_pwrstate == rf_off) - padapter->pwrctrlpriv.ps_flag = _TRUE; + if(adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off) + adapter_to_pwrctl(padapter)->ps_flag = _TRUE; } padapter->net_closed = _TRUE; @@ -2327,7 +2471,7 @@ static int netdev_close(struct net_device *pnetdev) rtw_dev_unload(padapter); } else*/ - if(padapter->pwrctrlpriv.rf_pwrstate == rf_on){ + if(adapter_to_pwrctl(padapter)->rf_pwrstate == rf_on){ DBG_871X("(2)871x_drv - drv_close, bup=%d, hw_init_completed=%d\n", padapter->bup, padapter->hw_init_completed); //s1. @@ -2361,10 +2505,13 @@ static int netdev_close(struct net_device *pnetdev) #endif // CONFIG_BR_EXT #ifdef CONFIG_P2P - #ifdef CONFIG_IOCTL_CFG80211 - if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == _TRUE) - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _FALSE; - #endif +#ifdef CONFIG_IOCTL_CFG80211 + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 ) + { + if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == _TRUE) + wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _FALSE; + } +#endif //CONFIG_IOCTL_CFG80211 rtw_p2p_enable(padapter, P2P_ROLE_DISABLE); #endif //CONFIG_P2P @@ -2396,3 +2543,445 @@ void rtw_ndev_destructor(struct net_device *ndev) free_netdev(ndev); } +#ifdef CONFIG_ARP_KEEP_ALIVE +struct route_info { + struct in_addr dst_addr; + struct in_addr src_addr; + struct in_addr gateway; + unsigned int dev_index; +}; + +static void parse_routes(struct nlmsghdr *nl_hdr, struct route_info *rt_info) +{ + struct rtmsg *rt_msg; + struct rtattr *rt_attr; + int rt_len; + + rt_msg = (struct rtmsg *) NLMSG_DATA(nl_hdr); + if ((rt_msg->rtm_family != AF_INET) || (rt_msg->rtm_table != RT_TABLE_MAIN)) + return; + + rt_attr = (struct rtattr *) RTM_RTA(rt_msg); + rt_len = RTM_PAYLOAD(nl_hdr); + + for (; RTA_OK(rt_attr, rt_len); rt_attr = RTA_NEXT(rt_attr, rt_len)) + { + switch (rt_attr->rta_type) { + case RTA_OIF: + rt_info->dev_index = *(int *) RTA_DATA(rt_attr); + break; + case RTA_GATEWAY: + rt_info->gateway.s_addr = *(u_int *) RTA_DATA(rt_attr); + break; + case RTA_PREFSRC: + rt_info->src_addr.s_addr = *(u_int *) RTA_DATA(rt_attr); + break; + case RTA_DST: + rt_info->dst_addr.s_addr = *(u_int *) RTA_DATA(rt_attr); + break; + } + } +} + +static int route_dump(u32 *gw_addr ,int* gw_index) +{ + int err = 0; + struct socket *sock; + struct { + struct nlmsghdr nlh; + struct rtgenmsg g; + } req; + struct msghdr msg; + struct iovec iov; + struct sockaddr_nl nladdr; + mm_segment_t oldfs; + char *pg; + int size = 0; + + err = sock_create(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE, &sock); + if (err) + { + printk( ": Could not create a datagram socket, error = %d\n", -ENXIO); + return err; + } + + memset(&nladdr, 0, sizeof(nladdr)); + nladdr.nl_family = AF_NETLINK; + + req.nlh.nlmsg_len = sizeof(req); + req.nlh.nlmsg_type = RTM_GETROUTE; + req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST; + req.nlh.nlmsg_pid = 0; + req.g.rtgen_family = AF_INET; + + iov.iov_base = &req; + iov.iov_len = sizeof(req); + + msg.msg_name = &nladdr; + msg.msg_namelen = sizeof(nladdr); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = NULL; + msg.msg_controllen = 0; + msg.msg_flags = MSG_DONTWAIT; + + oldfs = get_fs(); set_fs(KERNEL_DS); + err = sock_sendmsg(sock, &msg, sizeof(req)); + set_fs(oldfs); + + if (size < 0) + goto out_sock; + + pg = (char *) __get_free_page(GFP_KERNEL); + if (pg == NULL) { + err = -ENOMEM; + goto out_sock; + } + +#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) +restart: +#endif + + for (;;) + { + struct nlmsghdr *h; + + iov.iov_base = pg; + iov.iov_len = PAGE_SIZE; + + oldfs = get_fs(); set_fs(KERNEL_DS); + err = sock_recvmsg(sock, &msg, PAGE_SIZE, MSG_DONTWAIT); + set_fs(oldfs); + + if (err < 0) + goto out_sock_pg; + + if (msg.msg_flags & MSG_TRUNC) { + err = -ENOBUFS; + goto out_sock_pg; + } + + h = (struct nlmsghdr*) pg; + + while (NLMSG_OK(h, err)) + { + struct route_info rt_info; + if (h->nlmsg_type == NLMSG_DONE) { + err = 0; + goto done; + } + + if (h->nlmsg_type == NLMSG_ERROR) { + struct nlmsgerr *errm = (struct nlmsgerr*) NLMSG_DATA(h); + err = errm->error; + printk( "NLMSG error: %d\n", errm->error); + goto done; + } + + if (h->nlmsg_type == RTM_GETROUTE) + { + printk( "RTM_GETROUTE: NLMSG: %d\n", h->nlmsg_type); + } + if (h->nlmsg_type != RTM_NEWROUTE) { + printk( "NLMSG: %d\n", h->nlmsg_type); + err = -EINVAL; + goto done; + } + + memset(&rt_info, 0, sizeof(struct route_info)); + parse_routes(h, &rt_info); + if(!rt_info.dst_addr.s_addr && rt_info.gateway.s_addr && rt_info.dev_index) + { + *gw_addr = rt_info.gateway.s_addr; + *gw_index = rt_info.dev_index; + + } + h = NLMSG_NEXT(h, err); + } + + if (err) + { + printk( "!!!Remnant of size %d %d %d\n", err, h->nlmsg_len, h->nlmsg_type); + err = -EINVAL; + break; + } + } + +done: +#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) + if (!err && req.g.rtgen_family == AF_INET) { + req.g.rtgen_family = AF_INET6; + + iov.iov_base = &req; + iov.iov_len = sizeof(req); + + msg.msg_name = &nladdr; + msg.msg_namelen = sizeof(nladdr); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = NULL; + msg.msg_controllen = 0; + msg.msg_flags=MSG_DONTWAIT; + + oldfs = get_fs(); set_fs(KERNEL_DS); + err = sock_sendmsg(sock, &msg, sizeof(req)); + set_fs(oldfs); + + if (err > 0) + goto restart; + } +#endif + +out_sock_pg: + free_page((unsigned long) pg); + +out_sock: + sock_release(sock); + return err; +} + +static int arp_query(unsigned char *haddr, u32 paddr, + struct net_device *dev) +{ + struct neighbour *neighbor_entry; + int ret = 0; + + neighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev); + + if (neighbor_entry != NULL) { + neighbor_entry->used = jiffies; + if (neighbor_entry->nud_state & NUD_VALID) { + _rtw_memcpy(haddr, neighbor_entry->ha, dev->addr_len); + ret = 1; + } + neigh_release(neighbor_entry); + } + return ret; +} + +static int get_defaultgw(u32 *ip_addr ,char mac[]) +{ + int gw_index = 0; // oif device index + struct net_device *gw_dev = NULL; //oif device + + route_dump(ip_addr, &gw_index); + + if( !(*ip_addr) || !gw_index ) + { + //DBG_871X("No default GW \n"); + return -1; + } + + gw_dev = dev_get_by_index(&init_net, gw_index); + + if(gw_dev == NULL) + { + //DBG_871X("get Oif Device Fail \n"); + return -1; + } + + if(!arp_query(mac, *ip_addr, gw_dev)) + { + //DBG_871X( "arp query failed\n"); + dev_put(gw_dev); + return -1; + + } + dev_put(gw_dev); + + return 0; +} + +int rtw_gw_addr_query(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u32 gw_addr = 0; // default gw address + unsigned char gw_mac[32] = {0}; // default gw mac + int i; + int res; + + res = get_defaultgw(&gw_addr, gw_mac); + if(!res) + { + pmlmepriv->gw_ip[0] = gw_addr&0xff; + pmlmepriv->gw_ip[1] = (gw_addr&0xff00)>>8; + pmlmepriv->gw_ip[2] = (gw_addr&0xff0000)>>16; + pmlmepriv->gw_ip[3] = (gw_addr&0xff000000)>>24; + _rtw_memcpy(pmlmepriv->gw_mac_addr, gw_mac, 6); + DBG_871X("%s Gateway Mac:\t" MAC_FMT "\n", __FUNCTION__, MAC_ARG(pmlmepriv->gw_mac_addr)); + DBG_871X("%s Gateway IP:\t" IP_FMT "\n", __FUNCTION__, IP_ARG(pmlmepriv->gw_ip)); + } + else + { + //DBG_871X("Get Gateway IP/MAC fail!\n"); + } + + return res; +} +#endif + +int rtw_suspend_free_assoc_resource(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct net_device *pnetdev = padapter->pnetdev; + struct wifidirect_info* pwdinfo = &padapter->wdinfo; + + DBG_871X("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter)); + + rtw_cancel_all_timer(padapter); + if(pnetdev){ + netif_carrier_off(pnetdev); + rtw_netif_stop_queue(pnetdev); + } + + #ifdef CONFIG_LAYER2_ROAMING_RESUME + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED) && rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + DBG_871X("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__, + pmlmepriv->cur_network.network.Ssid.Ssid, + MAC_ARG(pmlmepriv->cur_network.network.MacAddress), + pmlmepriv->cur_network.network.Ssid.SsidLength, + pmlmepriv->assoc_ssid.SsidLength); + rtw_set_roaming(padapter, 1); + } + #endif //CONFIG_LAYER2_ROAMING_RESUME + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED)) + { + rtw_disassoc_cmd(padapter, 0, _FALSE); + } + #ifdef CONFIG_AP_MODE + else if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) + { + rtw_sta_flush(padapter); + } + #endif + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) ){ + //s2-2. indicate disconnect to os + rtw_indicate_disconnect(padapter); + } + + //s2-3. + rtw_free_assoc_resources(padapter, 1); + + //s2-4. +#ifdef CONFIG_AUTOSUSPEND + if(is_primary_adapter(padapter) && (!adapter_to_pwrctl(padapter)->bInternalAutoSuspend )) +#endif + rtw_free_network_queue(padapter, _TRUE); + + if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) + rtw_indicate_scan_done(padapter, 1); + + DBG_871X("==> "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter)); + return 0; +} +extern void rtw_dev_unload(_adapter *padapter); +int rtw_suspend_common(_adapter *padapter) +{ + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + int ret = 0; + _func_enter_; + LeaveAllPowerSaveMode(padapter); + + rtw_suspend_free_assoc_resource(padapter); + +#ifdef CONFIG_CONCURRENT_MODE + if(rtw_buddy_adapter_up(padapter)){ + rtw_suspend_free_assoc_resource(padapter->pbuddy_adapter); + } +#endif + rtw_led_control(padapter, LED_CTL_POWER_OFF); + +#ifdef CONFIG_CONCURRENT_MODE + if(rtw_buddy_adapter_up(padapter)){ + rtw_dev_unload(padapter->pbuddy_adapter); + } +#endif + rtw_dev_unload(padapter); + +exit: + + _func_exit_; + return ret; +} + +int rtw_resume_common(_adapter *padapter) +{ + int ret = 0; + struct net_device *pnetdev= padapter->pnetdev; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + + _func_enter_; + + #ifdef CONFIG_CONCURRENT_MODE + rtw_reset_drv_sw(padapter->pbuddy_adapter); + #endif + + rtw_reset_drv_sw(padapter); + pwrpriv->bkeepfwalive = _FALSE; + + DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive); + if(pm_netdev_open(pnetdev,_TRUE) != 0) { + DBG_871X("%s ==> pm_netdev_open failed \n",__FUNCTION__); + ret = -1; + return ret; + } + + netif_device_attach(pnetdev); + netif_carrier_on(pnetdev); + + + #ifdef CONFIG_CONCURRENT_MODE + if(rtw_buddy_adapter_up(padapter)){ + pnetdev = padapter->pbuddy_adapter->pnetdev; + + netif_device_attach(pnetdev); + netif_carrier_on(pnetdev); + } + #endif + + if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + + #ifdef CONFIG_LAYER2_ROAMING_RESUME + rtw_roaming(padapter, NULL); + #endif //CONFIG_LAYER2_ROAMING_RESUME + + } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + rtw_ap_restore_network(padapter); + } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + } else { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + } + + #ifdef CONFIG_CONCURRENT_MODE + if(rtw_buddy_adapter_up(padapter)) + { + mlmepriv = &padapter->pbuddy_adapter->mlmepriv; + if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + + #ifdef CONFIG_LAYER2_ROAMING_RESUME + rtw_roaming(padapter->pbuddy_adapter, NULL); + #endif //CONFIG_LAYER2_ROAMING_RESUME + + } else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + rtw_ap_restore_network(padapter->pbuddy_adapter); + } else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + } else { + DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv)); + } + } + #endif + + _func_exit_; + return ret; +} diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/pci_intf.c b/drivers/net/wireless/rtl8723as/os_dep/linux/pci_intf.c index e6bca0b6a7a3..4d00d304bcb0 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/pci_intf.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/pci_intf.c @@ -163,7 +163,7 @@ static u8 rtw_pci_switch_clk_req(_adapter *padapter, u8 value) void rtw_pci_disable_aspm(_adapter *padapter) { struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(pdvobjpriv); struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv); u32 pcicfg_addrport = 0; u8 num4bytes; @@ -254,7 +254,7 @@ void rtw_pci_disable_aspm(_adapter *padapter) void rtw_pci_enable_aspm(_adapter *padapter) { struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(pdvobjpriv); struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv); u16 aspmlevel = 0; u32 pcicfg_addrport = 0; @@ -728,7 +728,7 @@ rtw_get_amd_l1_patch(_adapter *padapter, u8 busnum, u8 devnum, void rtw_pci_disable_aspm(_adapter *padapter) { struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(pdvobjpriv); struct pci_dev *pdev = pdvobjpriv->ppcidev; struct pci_dev *bridge_pdev = pdev->bus->self; struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv); @@ -802,7 +802,7 @@ or the system will show bluescreen.*/ void rtw_pci_enable_aspm(_adapter *padapter) { struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(pdvobjpriv); struct pci_dev *pdev = pdvobjpriv->ppcidev; struct pci_dev *bridge_pdev = pdev->bus->self; struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv); @@ -978,7 +978,7 @@ static void rtw_pci_update_default_setting(_adapter *padapter) { struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(pdvobjpriv); //reset pPSC->reg_rfps_level & priv->b_support_aspm pwrpriv->reg_rfps_level = 0; @@ -1078,7 +1078,7 @@ static void rtw_pci_update_default_setting(_adapter *padapter) static void rtw_pci_initialize_adapter_common(_adapter *padapter) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); rtw_pci_update_default_setting(padapter); @@ -1158,7 +1158,7 @@ _func_enter_; _rtw_mutex_init(&dvobj->setch_mutex); _rtw_mutex_init(&dvobj->setbw_mutex); - + dvobj->processing_dev_remove = _FALSE; if ( (err = pci_enable_device(pdev)) != 0) { DBG_871X(KERN_ERR "%s : Cannot enable new PCI device\n", pci_name(pdev)); goto free_dvobj; @@ -1531,7 +1531,7 @@ static void pci_intf_stop(_adapter *padapter) } -static void rtw_dev_unload(_adapter *padapter) +void rtw_dev_unload(_adapter *padapter) { struct net_device *pnetdev= (struct net_device*)padapter->pnetdev; @@ -1779,7 +1779,7 @@ static void rtw_pci_if1_deinit(_adapter *if1) rtw_cancel_all_timer(if1); #ifdef CONFIG_WOWLAN - if1->pwrctrlpriv.wowlan_mode=_FALSE; + adapter_to_pwrctl(if1)->wowlan_mode=_FALSE; #endif //CONFIG_WOWLAN rtw_dev_unload(if1); @@ -1892,6 +1892,7 @@ exit: return status == _SUCCESS?0:-ENODEV; } +extern void rtw_unregister_netdevs(struct dvobj_priv *dvobj); /* * dev_remove() - our device is being removed */ @@ -1906,6 +1907,9 @@ _func_exit_; DBG_871X("+rtw_dev_remove\n"); + pdvobjpriv->processing_dev_remove = _TRUE; + rtw_unregister_netdevs(pdvobjpriv); + if (unlikely(!padapter)) { return; } @@ -1929,7 +1933,7 @@ _func_exit_; #endif #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) - rtw_unregister_early_suspend(&padapter->pwrctrlpriv); + rtw_unregister_early_suspend(dvobj_to_pwrctl(pdvobjpriv)); #endif rtw_pm_set_ips(padapter, IPS_NONE); @@ -1979,13 +1983,16 @@ static void __exit rtw_drv_halt(void) { RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_halt\n")); DBG_871X("+rtw_drv_halt\n"); - - rtw_suspend_lock_uninit(); + pci_drvpriv.drv_registered = _FALSE; pci_unregister_driver(&pci_drvpriv.rtw_pci_drv); + rtw_suspend_lock_uninit(); + DBG_871X("-rtw_drv_halt\n"); + + rtw_mstat_dump(); } diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/pci_ops_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/pci_ops_linux.c index 7d671df3932c..12c6c6832304 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/pci_ops_linux.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/pci_ops_linux.c @@ -1,24 +1,24 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - *******************************************************************************/ -#define _PCI_OPS_LINUX_C_ - -#include - - - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#define _PCI_OPS_LINUX_C_ + +#include + + + diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/recv_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/recv_linux.c index 3399918068be..bb6de8a96b6b 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/recv_linux.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/recv_linux.c @@ -55,6 +55,19 @@ int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe) //free os related resource in union recv_frame void rtw_os_recv_resource_free(struct recv_priv *precvpriv) { + sint i; + union recv_frame *precvframe; + precvframe = (union recv_frame*) precvpriv->precv_frame_buf; + + for(i=0; i < NR_RECVFRAME; i++) + { + if(precvframe->u.hdr.pkt) + { + rtw_skb_free(precvframe->u.hdr.pkt);//free skb by driver + precvframe->u.hdr.pkt = NULL; + } + precvframe++; + } } @@ -126,7 +139,7 @@ int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf) if(precvbuf->pskb) - dev_kfree_skb_any(precvbuf->pskb); + rtw_skb_free(precvbuf->pskb); return ret; @@ -217,7 +230,7 @@ void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame) skb->tail = precv_frame->u.hdr.rx_tail; skb->len = precv_frame->u.hdr.len; - //pskb_copy = skb_copy(skb, GFP_ATOMIC); + //pskb_copy = rtw_skb_copy(skb); // if(skb == NULL) goto _exit; skb->dev = pmgnt_netdev; @@ -234,9 +247,9 @@ void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame) //skb_pull(skb, 24); _rtw_memset(skb->cb, 0, sizeof(skb->cb)); - netif_rx(skb); + rtw_netif_rx(pmgnt_netdev, skb); - precv_frame->u.hdr.pkt = NULL; // set pointer to NULL before rtw_free_recvframe() if call netif_rx() + precv_frame->u.hdr.pkt = NULL; // set pointer to NULL before rtw_free_recvframe() if call rtw_netif_rx() #endif } @@ -310,7 +323,7 @@ _func_enter_; if(bmcast) { psta = rtw_get_bcmc_stainfo(padapter); - pskb2 = skb_clone(skb, GFP_ATOMIC); + pskb2 = rtw_skb_clone(skb); } else { psta = rtw_get_stainfo(pstapriv, pattrib->dst); } @@ -327,7 +340,7 @@ _func_enter_; skb_set_queue_mapping(skb, rtw_recv_select_queue(skb)); #endif //LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35) - rtw_xmit_entry(skb, pnetdev); + _rtw_xmit_entry(skb, pnetdev); if(bmcast) skb = pskb2; @@ -389,7 +402,48 @@ _func_enter_; skb->dev = padapter->pnetdev; skb->protocol = eth_type_trans(skb, padapter->pnetdev); - netif_rx(skb); + #ifdef DBG_TRX_STA_PKTS + { + + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + int bmcast = IS_MCAST(pattrib->dst); + + if(bmcast) + { + psta = rtw_get_bcmc_stainfo(padapter); + + } else { + psta = rtw_get_stainfo(pstapriv, pattrib->src); + } + if(psta) + { + switch(pattrib->priority) + { + case 1: + case 2: + psta->rx_bk_cnt++; + break; + case 4: + case 5: + psta->rx_vi_cnt++; + break; + case 6: + case 7: + psta->rx_vo_cnt++; + break; + case 0: + case 3: + default: + psta->rx_be_cnt++; + break; + } + } + } + #endif + + rtw_netif_rx(padapter->pnetdev, skb); _recv_indicatepkt_end: @@ -397,7 +451,7 @@ _recv_indicatepkt_end: rtw_free_recvframe(precv_frame, pfree_recv_queue); - RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n rtw_recv_indicatepkt :after netif_rx!!!!\n")); + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n rtw_recv_indicatepkt :after rtw_netif_rx!!!!\n")); _func_exit_; @@ -424,7 +478,7 @@ void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf) precvbuf->ref_cnt--; //free skb in recv_buf - dev_kfree_skb_any(precvbuf->pskb); + rtw_skb_free(precvbuf->pskb); precvbuf->pskb = NULL; precvbuf->reuse = _FALSE; diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/rtw_android.c b/drivers/net/wireless/rtl8723as/os_dep/linux/rtw_android.c index baedeb2f1fc5..440566e8a637 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/rtw_android.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/rtw_android.c @@ -27,6 +27,11 @@ #include #include +#ifdef CONFIG_GPIO_WAKEUP +#include +#endif + +#include #if defined(RTW_ENABLE_WIFI_CONTROL_FUNC) #include @@ -37,6 +42,11 @@ #endif #endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */ +#ifdef CONFIG_GPIO_WAKEUP +#include +#include +#endif + const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = { "START", "STOP", @@ -118,6 +128,7 @@ typedef struct android_wifi_priv_cmd { */ static int g_wifi_on = _TRUE; +unsigned int oob_irq; #ifdef PNO_SUPPORT static int wl_android_set_pno_setup(struct net_device *dev, char *command, int total_len) @@ -279,7 +290,7 @@ int rtw_android_set_country(struct net_device *net, char *command, int total_len { _adapter *adapter = (_adapter *)rtw_netdev_priv(net); char *country_code = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_COUNTRY]) + 1; - int ret; + int ret = _FAIL; ret = rtw_set_country(adapter, country_code); @@ -288,7 +299,6 @@ int rtw_android_set_country(struct net_device *net, char *command, int total_len int rtw_android_get_p2p_dev_addr(struct net_device *net, char *command, int total_len) { - int ret; int bytes_written = 0; //We use the same address as our HW MAC address @@ -300,7 +310,6 @@ int rtw_android_get_p2p_dev_addr(struct net_device *net, char *command, int tota int rtw_android_set_block(struct net_device *net, char *command, int total_len) { - int ret; _adapter *adapter = (_adapter *)rtw_netdev_priv(net); char *block_value = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_BLOCK]) + 1; @@ -393,11 +402,11 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) case ANDROID_WIFI_CMD_SCAN_ACTIVE: //rtw_set_scan_mode((_adapter *)rtw_netdev_priv(net), SCAN_ACTIVE); -#ifdef CONFIG_PLATFORM_MSTAR_TITANIA12 +#ifdef CONFIG_PLATFORM_MSTAR #ifdef CONFIG_IOCTL_CFG80211 (wdev_to_priv(net->ieee80211_ptr))->bandroid_scan = _TRUE; #endif //CONFIG_IOCTL_CFG80211 -#endif //CONFIG_PLATFORM_MSTAR_TITANIA12 +#endif //CONFIG_PLATFORM_MSTAR break; case ANDROID_WIFI_CMD_SCAN_PASSIVE: //rtw_set_scan_mode((_adapter *)rtw_netdev_priv(net), SCAN_PASSIVE); @@ -522,7 +531,8 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net); pwfd_info = &padapter->wfd_info; - pwfd_info->wfd_enable = _TRUE; + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 ) + pwfd_info->wfd_enable = _TRUE; break; } @@ -536,7 +546,8 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net); pwfd_info = &padapter->wfd_info; - pwfd_info->wfd_enable = _FALSE; + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 ) + pwfd_info->wfd_enable = _FALSE; break; } case ANDROID_WIFI_CMD_WFD_SET_TCPPORT: @@ -549,7 +560,8 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net); pwfd_info = &padapter->wfd_info; - pwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( priv_cmd.buf ); + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 ) + pwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( priv_cmd.buf ); break; } case ANDROID_WIFI_CMD_WFD_SET_MAX_TPUT: @@ -567,9 +579,12 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd) _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net); pwfd_info = &padapter->wfd_info; - pwfd_info->wfd_device_type = ( u8 ) get_int_from_command( priv_cmd.buf ); + if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 ) + { + pwfd_info->wfd_device_type = ( u8 ) get_int_from_command( priv_cmd.buf ); - pwfd_info->wfd_device_type &= WFD_DEVINFO_DUAL; + pwfd_info->wfd_device_type &= WFD_DEVINFO_DUAL; + } break; } #endif @@ -602,7 +617,7 @@ response: exit: rtw_unlock_suspend(); if (command) { - kfree(command); + rtw_mfree(command, priv_cmd.total_len); } return ret; @@ -732,12 +747,28 @@ static int wifi_probe(struct platform_device *pdev) { struct wifi_platform_data *wifi_ctrl = (struct wifi_platform_data *)(pdev->dev.platform_data); + int wifi_wake_gpio = 0; DBG_871X("## %s\n", __FUNCTION__); wifi_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcmdhd_wlan_irq"); + if (wifi_irqres == NULL) wifi_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcm4329_wlan_irq"); + else + wifi_wake_gpio = wifi_irqres->start; + +#ifdef CONFIG_GPIO_WAKEUP + printk("%s: gpio:%d wifi_wake_gpio:%d\n", __func__, + wifi_irqres->start, wifi_wake_gpio); + + if (wifi_wake_gpio > 0) { + gpio_request(wifi_wake_gpio, "oob_irq"); + gpio_direction_input(wifi_wake_gpio); + oob_irq = gpio_to_irq(wifi_wake_gpio); + printk("%s oob_irq:%d\n", __func__, oob_irq); + } +#endif wifi_control_data = wifi_ctrl; wifi_set_power(1, 0); /* Power On */ diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_intf.c b/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_intf.c index 51abf690212e..8e188dad43c1 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_intf.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_intf.c @@ -39,20 +39,21 @@ #endif #ifdef CONFIG_PLATFORM_SPRD -#include #include -#ifdef CONFIG_RTL8188E -#include -#endif #endif // CONFIG_PLATFORM_SPRD - #include #include #include #include +#ifdef CONFIG_PLATFORM_SPRD +#ifdef CONFIG_PM_RUNTIME +#include +#endif +#endif + #ifdef CONFIG_PLATFORM_ARM_SUNxI #if defined(CONFIG_MMC_SUNXI_POWER_CONTROL) @@ -92,6 +93,29 @@ int rtl8189es_sdio_poweroff(void) #endif //defined(CONFIG_MMC_SUNXI_POWER_CONTROL) #endif //CONFIG_PLATFORM_ARM_SUNxI +#ifdef CONFIG_PLATFORM_ARM_SUN6I +#ifdef CONFIG_MMC + +#ifdef CONFIG_A31_EVB +#define SDIOID 0 +#else +#define SDIOID 1 +#endif +#define SUNXI_SDIO_WIFI_NUM_RTL8723AS 3 +#define SUNXI_SDIO_WIFI_NUM_RTL8189ES 4 + +#ifdef CONFIG_RTL8188E +#define SUNXI_SDIO_WIFI_NUM SUNXI_SDIO_WIFI_NUM_RTL8189ES +#else // CONFIG_RTL8723A +#define SUNXI_SDIO_WIFI_NUM SUNXI_SDIO_WIFI_NUM_RTL8723AS +#endif + +extern void sw_mci_rescan_card(unsigned id, unsigned insert); +extern int wifi_pm_get_mod_type(void); +extern void wifi_pm_power(int on); +#endif //CONFIG_MMC +#endif //CONFIG_PLATFORM_ARM_SUN6I + #ifndef dev_to_sdio_func #define dev_to_sdio_func(d) container_of(d, struct sdio_func, dev) #endif @@ -119,6 +143,9 @@ static int rtw_drv_init(struct sdio_func *func, const struct sdio_device_id *id) static void rtw_dev_remove(struct sdio_func *func); static int rtw_sdio_resume(struct device *dev); static int rtw_sdio_suspend(struct device *dev); +#ifdef CONFIG_PM_RUNTIME +static void rtw_start_runtime(struct sdio_func *func); +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)) static const struct dev_pm_ops rtw_sdio_pm_ops = { @@ -161,48 +188,93 @@ static void sd_sync_int_hdl(struct sdio_func *func) rtw_sdio_set_irq_thd(psdpriv, NULL); } -void sdio_free_irq(struct dvobj_priv *dvobj) +int sdio_alloc_irq(struct dvobj_priv *dvobj) { PSDIO_DATA psdio_data; struct sdio_func *func; int err; - if(dvobj->irq_alloc) { psdio_data = &dvobj->intf_data; func = psdio_data->func; - if(func) { + sdio_claim_host(func); - err = sdio_release_irq(func); + + err = sdio_claim_irq(func, &sd_sync_int_hdl); if (err) - DBG_871X_LEVEL(_drv_err_,"%s: sdio_release_irq FAIL(%d)!\n", __func__, err); + printk(KERN_CRIT "%s: sdio_claim_irq FAIL(%d)!\n", __func__, err); + else + dvobj->irq_alloc = 1; + sdio_release_host(func); - } - dvobj->irq_alloc = 0; - } + return err?_FAIL:_SUCCESS; } -int sdio_alloc_irq(struct dvobj_priv *dvobj) +void sdio_free_irq(struct dvobj_priv *dvobj) { PSDIO_DATA psdio_data; struct sdio_func *func; int err; - psdio_data = &dvobj->intf_data; - func = psdio_data->func; + if (dvobj->irq_alloc) { + psdio_data = &dvobj->intf_data; + func = psdio_data->func; - sdio_claim_host(func); + if (func) { + sdio_claim_host(func); + err = sdio_release_irq(func); + if (err) + DBG_871X_LEVEL(_drv_err_,"%s: sdio_release_irq FAIL(%d)!\n", __func__, err); + sdio_release_host(func); + } + dvobj->irq_alloc = 0; + } +} - err = sdio_claim_irq(func, &sd_sync_int_hdl); - if (err) - printk(KERN_CRIT "%s: sdio_claim_irq FAIL(%d)!\n", __func__, err); - else - dvobj->irq_alloc = 1; +#ifdef CONFIG_GPIO_WAKEUP +extern unsigned int oob_irq; +static irqreturn_t gpio_hostwakeup_irq_thread(int irq, void *data) +{ + PADAPTER padapter = (PADAPTER)data; + DBG_871X_LEVEL(_drv_always_, "gpio_hostwakeup_irq_thread\n"); + /* Disable interrupt before calling handler */ + //disable_irq_nosync(oob_irq); + rtw_lock_suspend_timeout(HZ/2); + return IRQ_HANDLED; +} - sdio_release_host(func); +static u8 gpio_hostwakeup_alloc_irq(PADAPTER padapter) +{ + int err; + if (oob_irq == 0) + return _FAIL; + /* dont set it IRQF_TRIGGER_LOW, or wowlan */ + /* power is high after suspend */ + /* and failing can prevent can not sleep issue if */ + /* wifi gpio12 pin is not linked with CPU */ + err = request_threaded_irq(oob_irq, gpio_hostwakeup_irq_thread, NULL, + //IRQF_TRIGGER_LOW | IRQF_ONESHOT, + IRQF_TRIGGER_FALLING, + "rtw_wifi_gpio_wakeup", padapter); + if (err < 0) { + DBG_871X("Oops: can't allocate gpio irq %d err:%d\n", oob_irq, err); + return _FALSE; + } else { + DBG_871X("allocate gpio irq %d ok\n", oob_irq); +} - return err?_FAIL:_SUCCESS; + enable_irq_wake(oob_irq); + return _SUCCESS; +} + +static void gpio_hostwakeup_free_irq(PADAPTER padapter) +{ + if (oob_irq == 0) + return; + disable_irq_wake(oob_irq); + free_irq(oob_irq, padapter); } +#endif static u32 sdio_init(struct dvobj_priv *dvobj) { @@ -283,14 +355,15 @@ _func_enter_; _rtw_mutex_init(&dvobj->h2c_fwcmd_mutex); _rtw_mutex_init(&dvobj->setch_mutex); _rtw_mutex_init(&dvobj->setbw_mutex); - + + sdio_set_drvdata(func, dvobj); + dvobj->processing_dev_remove = _FALSE; + #ifdef CONFIG_WOWLAN sdio_claim_host(func); - sdio_set_drvdata(func, dvobj); mmc_host = func->card->host; + sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); sdio_release_host(func); -#else - sdio_set_drvdata(func, dvobj); #endif psdio = &dvobj->intf_data; @@ -300,7 +373,7 @@ _func_enter_; RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!\n", __FUNCTION__)); goto free_dvobj; } - + rtw_reset_continual_io_error(dvobj); status = _SUCCESS; free_dvobj: @@ -388,10 +461,11 @@ static void sd_intf_stop(PADAPTER padapter) /* * Do deinit job corresponding to netdev_open() */ -static void rtw_dev_unload(PADAPTER padapter) +void rtw_dev_unload(PADAPTER padapter) { struct net_device *pnetdev = (struct net_device*)padapter->pnetdev; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+rtw_dev_unload\n")); @@ -415,7 +489,7 @@ static void rtw_dev_unload(PADAPTER padapter) #endif RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("@ rtw_dev_unload: stop intf complete!\n")); - if (!padapter->pwrctrlpriv.bInternalAutoSuspend) + if (!pwrctl->bInternalAutoSuspend) rtw_stop_drv_threads(padapter); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("@ rtw_dev_unload: stop thread complete!\n")); @@ -423,8 +497,8 @@ static void rtw_dev_unload(PADAPTER padapter) if (padapter->bSurpriseRemoved == _FALSE) { #ifdef CONFIG_WOWLAN - if (padapter->pwrctrlpriv.bSupportRemoteWakeup == _TRUE && - padapter->pwrctrlpriv.wowlan_mode ==_TRUE) { + if (pwrctl->bSupportRemoteWakeup == _TRUE && + pwrctl->wowlan_mode ==_TRUE) { DBG_871X_LEVEL(_drv_always_, "%s bSupportRemoteWakeup==_TRUE do not run rtw_hal_deinit()\n",__FUNCTION__); } else @@ -577,18 +651,22 @@ static void rtw_sdio_if1_deinit(_adapter *if1) #endif #endif +#ifdef CONFIG_GPIO_WAKEUP + gpio_hostwakeup_free_irq(if1); +#endif +/* if(if1->DriverState != DRIVER_DISAPPEAR) { if(pnetdev) { unregister_netdev(pnetdev); //will call netdev_close() rtw_proc_remove_one(pnetdev); } } - +*/ rtw_cancel_all_timer(if1); #ifdef CONFIG_WOWLAN - if1->pwrctrlpriv.wowlan_mode=_FALSE; - DBG_871X_LEVEL(_drv_always_, "%s wowlan_mode:%d\n", __func__, if1->pwrctrlpriv.wowlan_mode); + adapter_to_pwrctl(if1)->wowlan_mode=_FALSE; + DBG_871X_LEVEL(_drv_always_, "%s wowlan_mode:%d\n", __func__, adapter_to_pwrctl(if1)->wowlan_mode); #endif //CONFIG_WOWLAN rtw_dev_unload(if1); @@ -599,7 +677,7 @@ static void rtw_sdio_if1_deinit(_adapter *if1) #ifdef CONFIG_IOCTL_CFG80211 if (if1->rtw_wdev) { - rtw_wdev_unregister(if1->rtw_wdev); + //rtw_wdev_unregister(if1->rtw_wdev); rtw_wdev_free(if1->rtw_wdev); } #endif @@ -616,6 +694,26 @@ static void rtw_sdio_if1_deinit(_adapter *if1) } +#ifdef CONFIG_PLATFORM_SPRD +#ifdef CONFIG_PM_RUNTIME +#include +static void rtw_start_runtime(struct sdio_func *func) +{ + unsigned long flags; + struct mmc_card *card = func->card; + struct mmc_host *host = card->host; + + DBG_871X("%s \n", __func__); + + pm_runtime_no_callbacks(&func->dev); + pm_suspend_ignore_children(&func->dev, true); + pm_runtime_set_autosuspend_delay(&func->dev, 50); + pm_runtime_use_autosuspend(&func->dev); + pm_runtime_put_autosuspend(&func->dev); +} +#endif +#endif + /* * drv_init() - a device potentially for us * @@ -672,6 +770,10 @@ static int rtw_drv_init( if (sdio_alloc_irq(dvobj) != _SUCCESS) goto free_if2; +#ifdef CONFIG_GPIO_WAKEUP + gpio_hostwakeup_alloc_irq(if1); +#endif + #ifdef CONFIG_GLOBAL_UI_PID if(ui_pid[1]!=0) { DBG_871X("ui_pid[1]:%d\n",ui_pid[1]); @@ -679,6 +781,12 @@ static int rtw_drv_init( } #endif +#ifdef CONFIG_PLATFORM_SPRD +#ifdef CONFIG_PM_RUNTIME + rtw_start_runtime(func); +#endif +#endif + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-871x_drv - drv_init, success!\n")); status = _SUCCESS; @@ -700,7 +808,7 @@ free_dvobj: exit: return status == _SUCCESS?0:-ENODEV; } - +extern void rtw_unregister_netdevs(struct dvobj_priv *dvobj); static void rtw_dev_remove(struct sdio_func *func) { struct dvobj_priv *dvobj = sdio_get_drvdata(func); @@ -710,6 +818,9 @@ _func_enter_; RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+rtw_dev_remove\n")); + dvobj->processing_dev_remove = _TRUE; + rtw_unregister_netdevs(dvobj); + if (padapter->bSurpriseRemoved == _FALSE) { int err; @@ -727,7 +838,7 @@ _func_enter_; MPT_DeInitAdapter(padapter); #endif #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) - rtw_unregister_early_suspend(&padapter->pwrctrlpriv); + rtw_unregister_early_suspend(dvobj_to_pwrctl(dvobj)); #endif rtw_pm_set_ips(padapter, IPS_NONE); @@ -752,89 +863,76 @@ _func_enter_; _func_exit_; } -static int rtw_sdio_suspend(struct device *dev) +#if 1 + +#ifdef CONFIG_WOWLAN +static int rtw_suspend_wow(_adapter *padapter,struct sdio_func *func ) { - struct sdio_func *func =dev_to_sdio_func(dev); - struct dvobj_priv *psdpriv = sdio_get_drvdata(func); - _adapter *padapter = psdpriv->if1; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + _adapter *pbuddy_adapter = padapter->pbuddy_adapter; + + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct net_device *pnetdev = padapter->pnetdev; + struct wifidirect_info* pwdinfo = &padapter->wdinfo; int ret = 0; -#ifdef CONFIG_PLATFORM_SPRD - u32 value; -#endif // CONFIG_PLATFORM_SPRD -#ifdef CONFIG_WOWLAN struct wowlan_ioctl_param poidparam; u8 ps_mode; -#endif //CONFIG_WOWLAN - - u32 start_time = rtw_get_current_time(); _func_enter_; - DBG_871X_LEVEL(_drv_always_, "sdio suspend start\n"); - DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); - -#ifdef CONFIG_WOWLAN if (check_fwstate(pmlmepriv, _FW_LINKED)) - padapter->pwrctrlpriv.wowlan_mode = _TRUE; + pwrpriv->wowlan_mode = _TRUE; else - padapter->pwrctrlpriv.wowlan_mode = _FALSE; -#endif - - //pwrpriv->bInSuspend = _TRUE; - - while (pwrpriv->bips_processing == _TRUE) - rtw_msleep_os(1); - - if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) - { - DBG_871X("%s bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", __FUNCTION__ - ,padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); - goto exit; - } + pwrpriv->wowlan_mode = _FALSE; rtw_cancel_all_timer(padapter); - LeaveAllPowerSaveMode(padapter); - //for power down during suspend, need leave ips mode before entering power down. - pwrpriv->bInSuspend = _TRUE; + if (pwrpriv->wowlan_mode == _TRUE) { + // 1. stop thread + padapter->bDriverStopped = _TRUE; //for stop thread + rtw_stop_drv_threads(padapter); + padapter->bDriverStopped = _FALSE; //for 32k command +#ifdef CONFIG_POWER_SAVING + rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0); +#endif + // 2. disable interrupt + rtw_hal_disable_interrupt(padapter); // It need wait for leaving 32K. - //padapter->net_closed = _TRUE; - //s1. -#ifdef CONFIG_WOWLAN - if(pnetdev && !padapter->pwrctrlpriv.wowlan_mode) - { - netif_carrier_off(pnetdev); - rtw_netif_stop_queue(pnetdev); - } else { - DBG_871X_LEVEL(_drv_always_, "wowlan_mode: NO netif_off and stop queuq\n"); + // 2.1 clean interupt + if (padapter->HalFunc.clear_interrupt) + padapter->HalFunc.clear_interrupt(padapter); + + // 2.2 free irq + sdio_free_irq(adapter_to_dvobj(padapter)); } -#else - if(pnetdev) - { + else { + LeaveAllPowerSaveMode(padapter); + } + + if(pnetdev){ + if(pwrpriv->wowlan_mode == _TRUE) { + rtw_netif_stop_queue(pnetdev); + } else { netif_carrier_off(pnetdev); rtw_netif_stop_queue(pnetdev); + } } -#endif -#ifdef CONFIG_WOWLAN - DBG_871X_LEVEL(_drv_always_, "wowlan_mode: %d\n", padapter->pwrctrlpriv.wowlan_mode); - if(padapter->pwrctrlpriv.bSupportRemoteWakeup==_TRUE && - padapter->pwrctrlpriv.wowlan_mode==_TRUE){ - poidparam.subcode=WOWLAN_ENABLE; + + DBG_871X("wowlan_mode: %d\n", pwrpriv->wowlan_mode); + + if ((pwrpriv->bSupportRemoteWakeup == _TRUE) && + (pwrpriv->wowlan_mode == _TRUE)) { + poidparam.subcode = WOWLAN_ENABLE; padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); - } else -#else - { - //s2. - rtw_disassoc_cmd(padapter, 0, _FALSE); + } else { + //s2-1. issue rtw_disassoc_cmd to fw + rtw_disassoc_cmd(padapter, 0, _FALSE); } -#endif //CONFIG_WOWLAN + #ifdef CONFIG_LAYER2_ROAMING_RESUME - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED) ) + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED) && rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) ) { DBG_871X("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__, pmlmepriv->cur_network.network.Ssid.Ssid, @@ -842,12 +940,15 @@ static int rtw_sdio_suspend(struct device *dev) pmlmepriv->cur_network.network.Ssid.SsidLength, pmlmepriv->assoc_ssid.SsidLength); - rtw_set_roaming(padapter, 1); + if (pwrpriv->wowlan_mode != _TRUE) + rtw_set_roaming(padapter, 1); + else + rtw_set_roaming(padapter, 0); } -#endif +#endif //CONFIG_LAYER2_ROAMING_RESUME -#ifdef CONFIG_WOWLAN - if(!padapter->pwrctrlpriv.wowlan_mode){ + if (pwrpriv->wowlan_mode == _FALSE) + { //s2-2. indicate disconnect to os rtw_indicate_disconnect(padapter); //s2-3. @@ -871,57 +972,25 @@ static int rtw_sdio_suspend(struct device *dev) } sdio_deinit(adapter_to_dvobj(padapter)); - } else { - DBG_871X_LEVEL(_drv_always_, "%s: wowmode suspending, DriverStopped: %d\n", - __func__, padapter->bDriverStopped); - - padapter->bDriverStopped = _TRUE; //for stop thread - - rtw_stop_drv_threads(padapter); - - padapter->bDriverStopped = _FALSE; //for 32k command + } + else + { + DBG_871X_LEVEL(_drv_always_, "%s: wowmode suspending\n", __func__); - if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)){ + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) + { DBG_871X_LEVEL(_drv_always_, "%s: fw_under_survey\n", __func__); rtw_indicate_scan_done(padapter, 1); + clr_fwstate(pmlmepriv, _FW_UNDER_SURVEY); } - if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING)){ - DBG_871X_LEVEL(_drv_always_, "%s: fw_under_linking\n", __func__); - rtw_indicate_disconnect(padapter); - } - +#ifdef CONFIG_POWER_SAVING rtw_set_ps_mode(padapter, PS_MODE_MIN, 0, 0); - - sdio_free_irq(adapter_to_dvobj(padapter)); - } -#else - //s2-2. indicate disconnect to os - rtw_indicate_disconnect(padapter); - //s2-3. - rtw_free_assoc_resources(padapter, 1); - - //s2-4. - rtw_free_network_queue(padapter, _TRUE); - - rtw_led_control(padapter, LED_CTL_POWER_OFF); - - rtw_dev_unload(padapter); - - if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) - rtw_indicate_scan_done(padapter, 1); - - if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) - rtw_indicate_disconnect(padapter); - - // interface deinit - sdio_deinit(adapter_to_dvobj(padapter)); #endif - DBG_871X_LEVEL(_drv_always_, "sdio suspend success in %d ms\n", - rtw_get_passing_time_ms(start_time)); + } exit: - -#if (defined CONFIG_WOWLAN) || (!(defined ANDROID_2X) && (defined CONFIG_PLATFORM_SPRD)) + +#if (!(defined ANDROID_2X)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) //Android 4.0 don't support WIFI close power //or power down or clock will close after wifi resume, //this is sprd's bug in Android 4.0, but sprd don't @@ -941,62 +1010,381 @@ exit: } #endif -#ifdef CONFIG_PLATFORM_SPRD -#ifndef CONFIG_WOWLAN -#ifdef CONFIG_RTL8188E - /* - * Pull down wifi power pin here - * Pull up wifi power pin before sdio resume. - */ - rtw_wifi_gpio_wlan_ctrl(WLAN_POWER_OFF); -#endif // CONFIG_RTL8188E -#endif // CONFIG_WOWLAN -#endif // CONFIG_PLATFORM_SPRD - - DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__ - , ret, rtw_get_passing_time_ms(start_time)); _func_exit_; return ret; } +#endif //#ifdef CONFIG_WOWLAN -extern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal); -int rtw_resume_process(_adapter *padapter) +static int rtw_sdio_suspend(struct device *dev) { - struct net_device *pnetdev; - struct pwrctrl_priv *pwrpriv; - u8 is_pwrlock_hold_by_caller; - u8 is_directly_called_by_auto_resume; + struct sdio_func *func =dev_to_sdio_func(dev); + struct dvobj_priv *psdpriv = sdio_get_drvdata(func); + _adapter *padapter = psdpriv->if1; + + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(psdpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct net_device *pnetdev = padapter->pnetdev; int ret = 0; +#ifdef CONFIG_PLATFORM_SPRD + u32 value; +#endif // CONFIG_PLATFORM_SPRD + u32 start_time = rtw_get_current_time(); -#ifdef CONFIG_WOWLAN - u32 value = 0; - struct wowlan_ioctl_param poidparam; -#endif // CONFIG_WOWLAN _func_enter_; - DBG_871X_LEVEL(_drv_always_, "sdio resume start\n"); + DBG_871X_LEVEL(_drv_always_, "sdio suspend start\n"); DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); -#ifdef CONFIG_WOWLAN - if (!padapter->pwrctrlpriv.wowlan_mode){ - if (padapter) { - pnetdev = padapter->pnetdev; - pwrpriv = &padapter->pwrctrlpriv; - } else { - ret = -1; - goto exit; - } + pwrpriv->bInSuspend = _TRUE; + +#if (!(defined ANDROID_2X) && (defined CONFIG_PLATFORM_SPRD)) + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { + //we should not suspend softap, bcm also do like this + DBG_871X("%s should not suspend hw and system in AP mode\n",__FUNCTION__); + goto exit; + } +#endif + + while (pwrpriv->bips_processing == _TRUE) + rtw_msleep_os(1); + + if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) + { + DBG_871X("%s bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", __FUNCTION__ + ,padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); + goto exit; + } + + +#ifdef CONFIG_WOWLAN + rtw_suspend_wow(padapter,func); +#else + rtw_suspend_common(padapter); +#endif + + // interface deinit + sdio_deinit(adapter_to_dvobj(padapter)); + + DBG_871X_LEVEL(_drv_always_, "sdio suspend success in %d ms\n", + rtw_get_passing_time_ms(start_time)); + +exit: + if (func) { + mmc_pm_flag_t pm_flag = 0; + pm_flag = sdio_get_host_pm_caps(func); + DBG_871X("cmd: %s: suspend: PM flag = 0x%x\n", sdio_func_id(func), pm_flag); + if (!(pm_flag & MMC_PM_KEEP_POWER)) { + DBG_871X("%s: cannot remain alive while host is suspended\n", sdio_func_id(func)); + return -ENOSYS; + } else { + DBG_871X("cmd: suspend with MMC_PM_KEEP_POWER\n"); + sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); + } + } + +#ifdef CONFIG_PLATFORM_SPRD +#ifndef CONFIG_WOWLAN +#ifdef CONFIG_RTL8188E +#ifdef ANDROID_2X + /* + * Pull down wifi power pin here + * Pull up wifi power pin before sdio resume. + */ + rtw_wifi_gpio_wlan_ctrl(WLAN_POWER_OFF); +#endif // ANDROID_2X +#endif // CONFIG_RTL8188E +#endif // CONFIG_WOWLAN +#endif // CONFIG_PLATFORM_SPRD + + + DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__ + , ret, rtw_get_passing_time_ms(start_time)); + + _func_exit_; + return ret; +} + + +#else +static int rtw_sdio_suspend(struct device *dev) +{ + struct sdio_func *func =dev_to_sdio_func(dev); + struct dvobj_priv *psdpriv = sdio_get_drvdata(func); + _adapter *padapter = psdpriv->if1; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(psdpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct net_device *pnetdev = padapter->pnetdev; + int ret = 0; +#ifdef CONFIG_PLATFORM_SPRD + u32 value; +#endif // CONFIG_PLATFORM_SPRD + +#ifdef CONFIG_WOWLAN + struct wowlan_ioctl_param poidparam; + u8 ps_mode; +#endif //CONFIG_WOWLAN + + u32 start_time = rtw_get_current_time(); + + _func_enter_; + + DBG_871X_LEVEL(_drv_always_, "sdio suspend start\n"); + DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); + + pwrpriv->bInSuspend = _TRUE; + +#if (!(defined ANDROID_2X) && (defined CONFIG_PLATFORM_SPRD)) + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { + //we should not suspend softap, bcm also do like this + DBG_871X("%s should not suspend hw and system in AP mode\n",__FUNCTION__); + goto exit; + } +#endif + +#ifdef CONFIG_WOWLAN + if (check_fwstate(pmlmepriv, _FW_LINKED)) + pwrpriv->wowlan_mode = _TRUE; + else + pwrpriv->wowlan_mode = _FALSE; +#endif + + //pwrpriv->bInSuspend = _TRUE; + + while (pwrpriv->bips_processing == _TRUE) + rtw_msleep_os(1); + + if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) + { + DBG_871X("%s bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", __FUNCTION__ + ,padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); + goto exit; + } + + rtw_cancel_all_timer(padapter); + +#ifdef CONFIG_WOWLAN + if (pwrpriv->wowlan_mode == _TRUE) { + // 1. stop thread + padapter->bDriverStopped = _TRUE; //for stop thread + rtw_stop_drv_threads(padapter); + padapter->bDriverStopped = _FALSE; //for 32k command +#ifdef CONFIG_POWER_SAVING + rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0); +#endif + // 2. disable interrupt + rtw_hal_disable_interrupt(padapter); // It need wait for leaving 32K. + + // 2.1 clean interupt + if (padapter->HalFunc.clear_interrupt) + padapter->HalFunc.clear_interrupt(padapter); + + // 2.2 free irq + sdio_free_irq(adapter_to_dvobj(padapter)); + } else { + LeaveAllPowerSaveMode(padapter); + } + + if(pnetdev){ + if(pwrpriv->wowlan_mode == _TRUE) { + rtw_netif_stop_queue(pnetdev); + } else { + netif_carrier_off(pnetdev); + rtw_netif_stop_queue(pnetdev); + } + } + + DBG_871X("wowlan_mode: %d\n", pwrpriv->wowlan_mode); + + if ((pwrpriv->bSupportRemoteWakeup == _TRUE) && + (pwrpriv->wowlan_mode == _TRUE)) { + poidparam.subcode = WOWLAN_ENABLE; + padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); + } else { + //s2-1. issue rtw_disassoc_cmd to fw + rtw_disassoc_cmd(padapter, 0, _FALSE); + } +#else // !CONFIG_WOWLAN + LeaveAllPowerSaveMode(padapter); + + if(pnetdev) + { + netif_carrier_off(pnetdev); + rtw_netif_stop_queue(pnetdev); + } + + rtw_disassoc_cmd(padapter, 0, _FALSE); +#endif // !CONFIG_WOWLAN + + //for power down during suspend, need leave ips mode before entering power down. + //pwrpriv->bInSuspend = _TRUE; + + //padapter->net_closed = _TRUE; + //s1. + +#ifdef CONFIG_LAYER2_ROAMING_RESUME + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED) ) + { + DBG_871X("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__, + pmlmepriv->cur_network.network.Ssid.Ssid, + MAC_ARG(pmlmepriv->cur_network.network.MacAddress), + pmlmepriv->cur_network.network.Ssid.SsidLength, + pmlmepriv->assoc_ssid.SsidLength); +#ifdef CONFIG_WOWLAN + if (pwrpriv->wowlan_mode != _TRUE) + rtw_set_roaming(padapter, 1); + else + rtw_set_roaming(padapter, 0); +#else //CONFIG_WOWLAN + rtw_set_roaming(padapter, 1); +#endif // !CONFIG_WOWLAN + } +#endif //CONFIG_LAYER2_ROAMING_RESUME + +#ifdef CONFIG_WOWLAN + if (pwrpriv->wowlan_mode == _FALSE) + { + //s2-2. indicate disconnect to os + rtw_indicate_disconnect(padapter); + //s2-3. + rtw_free_assoc_resources(padapter, 1); + + //s2-4. + rtw_free_network_queue(padapter, _TRUE); + + rtw_led_control(padapter, LED_CTL_POWER_OFF); + + rtw_dev_unload(padapter); + + if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)){ + DBG_871X_LEVEL(_drv_always_, "%s: fw_under_survey\n", __func__); + rtw_indicate_scan_done(padapter, 1); + } + + if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING)){ + DBG_871X_LEVEL(_drv_always_, "%s: fw_under_linking\n", __func__); + rtw_indicate_disconnect(padapter); + } + + sdio_deinit(adapter_to_dvobj(padapter)); + } + else + { + DBG_871X_LEVEL(_drv_always_, "%s: wowmode suspending\n", __func__); + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) + { + DBG_871X_LEVEL(_drv_always_, "%s: fw_under_survey\n", __func__); + rtw_indicate_scan_done(padapter, 1); + clr_fwstate(pmlmepriv, _FW_UNDER_SURVEY); + } +#ifdef CONFIG_POWER_SAVING + rtw_set_ps_mode(padapter, PS_MODE_MIN, 0, 0); +#endif + } +#else + //s2-2. indicate disconnect to os + rtw_indicate_disconnect(padapter); + //s2-3. + rtw_free_assoc_resources(padapter, 1); + + //s2-4. + rtw_free_network_queue(padapter, _TRUE); + + rtw_led_control(padapter, LED_CTL_POWER_OFF); + + rtw_dev_unload(padapter); + + if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) + rtw_indicate_scan_done(padapter, 1); + + if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) + rtw_indicate_disconnect(padapter); + + // interface deinit + sdio_deinit(adapter_to_dvobj(padapter)); +#endif + DBG_871X_LEVEL(_drv_always_, "sdio suspend success in %d ms\n", + rtw_get_passing_time_ms(start_time)); + +exit: + +//#if (defined CONFIG_WOWLAN) || (!(defined ANDROID_2X) && (defined CONFIG_PLATFORM_SPRD)) +#if (defined CONFIG_WOWLAN) +#if (!(defined ANDROID_2X)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34)) + //Android 4.0 don't support WIFI close power + //or power down or clock will close after wifi resume, + //this is sprd's bug in Android 4.0, but sprd don't + //want to fix it. + //we have test power under 8723as, power consumption is ok + if (func) { + mmc_pm_flag_t pm_flag = 0; + pm_flag = sdio_get_host_pm_caps(func); + DBG_871X("cmd: %s: suspend: PM flag = 0x%x\n", sdio_func_id(func), pm_flag); + if (!(pm_flag & MMC_PM_KEEP_POWER)) { + DBG_871X("%s: cannot remain alive while host is suspended\n", sdio_func_id(func)); + return -ENOSYS; + } else { + DBG_871X("cmd: suspend with MMC_PM_KEEP_POWER\n"); + sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); + } + } +#endif +#endif + +#ifdef CONFIG_PLATFORM_SPRD +#ifndef CONFIG_WOWLAN +#ifdef CONFIG_RTL8188E +#ifdef ANDROID_2X + /* + * Pull down wifi power pin here + * Pull up wifi power pin before sdio resume. + */ + rtw_wifi_gpio_wlan_ctrl(WLAN_POWER_OFF); +#endif // ANDROID_2X +#endif // CONFIG_RTL8188E +#endif // CONFIG_WOWLAN +#endif // CONFIG_PLATFORM_SPRD + + DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__ + , ret, rtw_get_passing_time_ms(start_time)); + + _func_exit_; + return ret; +} +#endif +extern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal); + +#if 1 +#ifdef CONFIG_WOWLAN +int rtw_resume_process_wow(_adapter *padapter) +{ + struct net_device *pnetdev = padapter->pnetdev; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + int ret = 0; + + u32 value = 0; + struct wowlan_ioctl_param poidparam; + struct sta_info *psta = NULL; + + _func_enter_; + + if (pwrpriv->wowlan_mode == _FALSE){ + + // interface init + if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS) + { + ret = -1; + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__)); + goto exit; + } + + rtw_hal_disable_interrupt(padapter); + + if (padapter->HalFunc.clear_interrupt) + padapter->HalFunc.clear_interrupt(padapter); - // interface init - if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS) - { - ret = -1; - RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__)); - goto exit; - } - rtw_hal_disable_interrupt(padapter); if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) { ret = -1; @@ -1008,6 +1396,7 @@ int rtw_resume_process(_adapter *padapter) pwrpriv->bkeepfwalive = _FALSE; DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive); + if(pm_netdev_open(pnetdev,_TRUE) != 0) { ret = -1; goto exit; @@ -1015,49 +1404,289 @@ int rtw_resume_process(_adapter *padapter) netif_device_attach(pnetdev); netif_carrier_on(pnetdev); + } + else //pwrpriv->wowlan_mode == _TRUE + { - } else { - +#ifdef CONFIG_POWER_SAVING +#ifdef CONFIG_LPS rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0); - LPS_RF_ON_check(padapter, 100); +#endif //CONFIG_LPS +#endif + + pwrpriv->bFwCurrentInPSMode = _FALSE; rtw_hal_disable_interrupt(padapter); + + if (padapter->HalFunc.clear_interrupt) + padapter->HalFunc.clear_interrupt(padapter); + if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) { ret = -1; RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__)); goto exit; } - if (padapter->HalFunc.clear_interrupt) - padapter->HalFunc.clear_interrupt(padapter); - - rtw_hal_enable_interrupt(padapter); + //Disable WOW, set H2C command + poidparam.subcode=WOWLAN_DISABLE; + padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); + psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); + if (psta) { + set_sta_rate(padapter, psta); + } + padapter->bDriverStopped = _FALSE; + DBG_871X("%s: wowmode resuming, DriverStopped:%d\n", __func__, padapter->bDriverStopped); rtw_start_drv_threads(padapter); - //Disable WOW, set H2C command - poidparam.subcode=WOWLAN_DISABLE; - padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); + rtw_hal_enable_interrupt(padapter); - if (padapter) { - pnetdev = padapter->pnetdev; - pwrpriv = &padapter->pwrctrlpriv; - } else { - ret = -1; - goto exit; + // start netif queue + if(pnetdev) { + if(!rtw_netif_queue_stopped(pnetdev)) + rtw_netif_start_queue(pnetdev); + else + rtw_netif_wake_queue(pnetdev); } } -#else //CONFIG_WOWLAN + + +#ifdef CONFIG_LAYER2_ROAMING_RESUME + + if (pwrpriv->wowlan_wake_reason == FWDecisionDisconnect || + pwrpriv->wowlan_wake_reason == Rx_DisAssoc || + pwrpriv->wowlan_wake_reason == Rx_DeAuth) { + + DBG_871X("%s: disconnect reason: %02x\n", __func__, + pwrpriv->wowlan_wake_reason); + rtw_indicate_disconnect(padapter); + rtw_sta_media_status_rpt(padapter, rtw_get_stainfo(&padapter->stapriv, + get_bssid(&padapter->mlmepriv)), 0); + rtw_free_assoc_resources(padapter, 1); + } else { + DBG_871X("%s: do roaming\n", __func__); + rtw_roaming(padapter, NULL); + } + +#endif //CONFIG_LAYER2_ROAMING_RESUME + + if (pwrpriv->wowlan_wake_reason == Rx_GTK || + pwrpriv->wowlan_wake_reason == Rx_DisAssoc || + pwrpriv->wowlan_wake_reason == Rx_DeAuth) { + DBG_871X("%s: set ext wake lock\n", __func__); + rtw_lock_ext_suspend_timeout(1500); + } + + if (pwrpriv->wowlan_mode == _TRUE) { + pwrpriv->bips_processing = _FALSE; + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); + rtw_set_pwr_state_check_timer(pwrpriv); + pwrpriv->bips_processing = _FALSE; + rtw_unlock_suspend(); + } else { + DBG_871X_LEVEL(_drv_always_, "do not reset timer\n"); + } + + pwrpriv->wowlan_mode =_FALSE; + +exit: + + _func_exit_; + + return ret; +} +#endif //CONFIG_WOWLAN + +int rtw_resume_process_normal(_adapter *padapter) +{ + struct net_device *pnetdev= padapter->pnetdev; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct mlme_priv *mlmepriv = &padapter->mlmepriv; + int ret = 0; + + _func_enter_; + // interface init + if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS) + { + ret = -1; + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__)); + goto exit; + } + rtw_hal_disable_interrupt(padapter); + if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) + { + ret = -1; + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__)); + goto exit; + } + + if(rtw_resume_common(padapter)!= 0) { + DBG_871X("%s rtw_resume_common failed\n",__FUNCTION__); + goto exit; + } + _func_exit_; +exit: + return ret; +} + +int rtw_resume_process(_adapter *padapter) +{ + struct net_device *pnetdev; + struct pwrctrl_priv *pwrpriv = NULL; + + int ret = 0; + u32 start_time = rtw_get_current_time(); + + _func_enter_; + + DBG_871X_LEVEL(_drv_always_, "sdio resume start\n"); + DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); + if (padapter) { - pnetdev = padapter->pnetdev; - pwrpriv = &padapter->pwrctrlpriv; - } else { + pnetdev = padapter->pnetdev; + pwrpriv = adapter_to_pwrctl(padapter); + } else { + ret = -1; + goto exit; + } + +#ifdef CONFIG_WOWLAN + rtw_resume_process_wow( padapter); +#else //!CONFIG_WOWLAN + rtw_resume_process_normal( padapter); +#endif + + if( padapter->pid[1]!=0) { + DBG_871X("pid[1]:%d\n",padapter->pid[1]); + rtw_signal_process(padapter->pid[1], SIGUSR2); + } + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + rtw_unlock_suspend(); + #endif //CONFIG_RESUME_IN_WORKQUEUE + +exit: + if (pwrpriv) + pwrpriv->bInSuspend = _FALSE; + DBG_871X_LEVEL(_drv_always_, "sdio resume ret:%d in %d ms\n", ret, + rtw_get_passing_time_ms(start_time)); + + _func_exit_; + + return ret; +} +#else +int rtw_resume_process(_adapter *padapter) +{ + struct net_device *pnetdev; + struct pwrctrl_priv *pwrpriv = NULL; + u8 is_pwrlock_hold_by_caller; + u8 is_directly_called_by_auto_resume; + int ret = 0; + u32 start_time = rtw_get_current_time(); +#ifdef CONFIG_WOWLAN + u32 value = 0; + struct wowlan_ioctl_param poidparam; + struct sta_info *psta = NULL; +#endif // CONFIG_WOWLAN + + _func_enter_; + + DBG_871X_LEVEL(_drv_always_, "sdio resume start\n"); + DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); + + if (padapter) { + pnetdev = padapter->pnetdev; + pwrpriv = adapter_to_pwrctl(padapter); + } else { + ret = -1; + goto exit; + } + +#ifdef CONFIG_WOWLAN + if (pwrpriv->wowlan_mode == _FALSE){ + + // interface init + if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS) + { + ret = -1; + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__)); + goto exit; + } + + rtw_hal_disable_interrupt(padapter); + + if (padapter->HalFunc.clear_interrupt) + padapter->HalFunc.clear_interrupt(padapter); + + if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) + { + ret = -1; + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__)); + goto exit; + } + + rtw_reset_drv_sw(padapter); + pwrpriv->bkeepfwalive = _FALSE; + + DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive); + + if(pm_netdev_open(pnetdev,_TRUE) != 0) { + ret = -1; + goto exit; + } + + netif_device_attach(pnetdev); + netif_carrier_on(pnetdev); + } else { + +#ifdef CONFIG_POWER_SAVING +#ifdef CONFIG_LPS + rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0); +#endif //CONFIG_LPS +#endif + + pwrpriv->bFwCurrentInPSMode = _FALSE; + + rtw_hal_disable_interrupt(padapter); + + if (padapter->HalFunc.clear_interrupt) + padapter->HalFunc.clear_interrupt(padapter); + + if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) { ret = -1; + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__)); goto exit; } + //Disable WOW, set H2C command + poidparam.subcode=WOWLAN_DISABLE; + padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); + + psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); + if (psta) { + set_sta_rate(padapter, psta); + } + + padapter->bDriverStopped = _FALSE; + + DBG_871X("%s: wowmode resuming, DriverStopped:%d\n", __func__, padapter->bDriverStopped); + rtw_start_drv_threads(padapter); + + rtw_hal_enable_interrupt(padapter); + + // start netif queue + if(pnetdev) { + if(!rtw_netif_queue_stopped(pnetdev)) + rtw_netif_start_queue(pnetdev); + else + rtw_netif_wake_queue(pnetdev); + } + } +#else //!CONFIG_WOWLAN + // interface init if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS) { @@ -1092,11 +1721,18 @@ int rtw_resume_process(_adapter *padapter) #ifdef CONFIG_LAYER2_ROAMING_RESUME #ifdef CONFIG_WOWLAN - if(!padapter->pwrctrlpriv.wowlan_mode){ - rtw_roaming(padapter, NULL); - } else if (padapter->pwrctrlpriv.wowlan_wake_reason & FWDecisionDisconnect){ + if (pwrpriv->wowlan_wake_reason == FWDecisionDisconnect || + pwrpriv->wowlan_wake_reason == Rx_DisAssoc || + pwrpriv->wowlan_wake_reason == Rx_DeAuth) { + + DBG_871X("%s: disconnect reason: %02x\n", __func__, + pwrpriv->wowlan_wake_reason); rtw_indicate_disconnect(padapter); - } else if (padapter->pwrctrlpriv.wowlan_wake_reason & Rx_GTK){ + rtw_sta_media_status_rpt(padapter, rtw_get_stainfo(&padapter->stapriv, + get_bssid(&padapter->mlmepriv)), 0); + rtw_free_assoc_resources(padapter, 1); + } else { + DBG_871X("%s: do roaming\n", __func__); rtw_roaming(padapter, NULL); } #else @@ -1109,17 +1745,29 @@ int rtw_resume_process(_adapter *padapter) #endif //CONFIG_RESUME_IN_WORKQUEUE #ifdef CONFIG_WOWLAN - if (padapter->pwrctrlpriv.wowlan_wake_reason & FWDecisionDisconnect) - rtw_indicate_disconnect(padapter); - - padapter->pwrctrlpriv.wowlan_mode =_FALSE; + if (pwrpriv->wowlan_wake_reason == Rx_GTK || + pwrpriv->wowlan_wake_reason == Rx_DisAssoc || + pwrpriv->wowlan_wake_reason == Rx_DeAuth) { + DBG_871X("%s: set ext wake lock\n", __func__); + rtw_lock_ext_suspend_timeout(1500); + } - _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); + if (pwrpriv->wowlan_mode == _TRUE) { + pwrpriv->bips_processing = _FALSE; + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); + rtw_set_pwr_state_check_timer(pwrpriv); + pwrpriv->bips_processing = _FALSE; + rtw_unlock_suspend(); + } else { + DBG_871X_LEVEL(_drv_always_, "do not reset timer\n"); + } + pwrpriv->wowlan_mode =_FALSE; #endif //CONFIG_WOWLAN exit: - pwrpriv->bInSuspend = _FALSE; + if (pwrpriv) + pwrpriv->bInSuspend = _FALSE; DBG_871X_LEVEL(_drv_always_, "sdio resume ret:%d in %d ms\n", ret, rtw_get_passing_time_ms(start_time)); @@ -1127,13 +1775,15 @@ exit: return ret; } +#endif + static int rtw_sdio_resume(struct device *dev) { struct sdio_func *func =dev_to_sdio_func(dev); struct dvobj_priv *psdpriv = sdio_get_drvdata(func); _adapter *padapter = psdpriv->if1; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(psdpriv); int ret = 0; DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); @@ -1146,14 +1796,16 @@ static int rtw_sdio_resume(struct device *dev) #else if (rtw_is_earlysuspend_registered(pwrpriv) #ifdef CONFIG_WOWLAN - && !padapter->pwrctrlpriv.wowlan_mode + && !pwrpriv->wowlan_mode #endif /* CONFIG_WOWLAN */ ) { /* jeff: bypass resume here, do in late_resume */ rtw_set_do_late_resume(pwrpriv, _TRUE); } else { + rtw_set_do_late_resume(pwrpriv, _FALSE); #ifdef CONFIG_WOWLAN - rtw_lock_suspend_timeout(15 * HZ); + //rtw_lock_suspend_timeout(4000); + rtw_lock_suspend(); #endif ret = rtw_resume_process(padapter); } @@ -1190,7 +1842,14 @@ static int __init rtw_drv_entry(void) unsigned int mod_sel = mmc_pm_get_mod_type(); #endif #endif - DBG_871X_LEVEL(_drv_always_, "module init start version:"DRIVERVERSION"\n"); + +#ifdef CONFIG_PLATFORM_ARM_SUN6I +#ifdef CONFIG_MMC + unsigned int mod_sel = wifi_pm_get_mod_type(); +#endif //CONFIG_MMC +#endif //CONFIG_PLATFORM_ARM_SUN6I + + DBG_871X_LEVEL(_drv_always_, "module init start version:"DRIVERVERSION"\n"); // DBG_871X(KERN_INFO "+%s", __func__); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+rtw_drv_entry\n")); @@ -1218,23 +1877,40 @@ static int __init rtw_drv_entry(void) #endif //CONFIG_PLATFORM_ARM_SUNxI +#ifdef CONFIG_PLATFORM_ARM_SUN6I +#ifdef CONFIG_MMC + DBG_871X("----- %s mod_sel: %d, sdio num: %d\n", __FUNCTION__, mod_sel, SUNXI_SDIO_WIFI_NUM); + if(mod_sel == SUNXI_SDIO_WIFI_NUM) + { + wifi_pm_power(1); + mdelay(10); + sw_mci_rescan_card(SDIOID, 1); + printk("[rtw_sdio] %s: power up, rescan card.\n", __FUNCTION__); + } + else + { + ret = -1; + printk("[rtw_sdio] %s: mod_sel = %d is incorrect.\n", __FUNCTION__, mod_sel); + } +#endif //CONFIG_MMC + if(ret != 0) + goto exit; +#endif //CONFIG_PLATFORM_ARM_SUN6I + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) //console_suspend_enabled=0; #endif #ifdef CONFIG_PLATFORM_SPRD + rtw_wifi_gpio_init(); +#ifdef ANDROID_2X #ifdef CONFIG_RTL8188E rtw_wifi_gpio_wlan_ctrl(WLAN_POWER_ON); - - DBG_8192C("%s: turn on VDD-WIFI0 3.3V\n", __func__); - //---VDD-WIFI0 3.3V - LDO_TurnOnLDO(LDO_LDO_WIF0); - LDO_SetVoltLevel(LDO_LDO_WIF0,LDO_VOLT_LEVEL1); -#endif //CONFIG_RTL8188E +#endif //CONFIG_RTL8188E +#endif //ANDROID_2X /* Pull up pwd pin, make wifi leave power down mode. */ - rtw_wifi_gpio_init(); rtw_wifi_gpio_wlan_ctrl(WLAN_PWDN_ON); #if defined(CONFIG_RTL8723A) && (MP_DRIVER == 1) @@ -1246,18 +1922,8 @@ static int __init rtw_drv_entry(void) sdhci_bus_scan(); #if (defined ANDROID_2X) rtw_mdelay_os(200); -#else - if (1) { - int i = 0; - - for (i = 0; i <= 50; i++) { - msleep(10); - if (sdhci_device_attached()) - break; - printk("%s delay times:%d\n", __func__, i); - } - } -#endif +#endif //ANDROID_2X + #endif // CONFIG_PLATFORM_SPRD rtw_suspend_lock_init(); @@ -1279,9 +1945,7 @@ static void __exit rtw_drv_halt(void) { DBG_871X_LEVEL(_drv_always_, "module exit start\n"); - rtw_android_wifictrl_func_del(); - - rtw_suspend_lock_uninit(); + rtw_android_wifictrl_func_del(); sdio_drvpriv.drv_registered = _FALSE; sdio_unregister_driver(&sdio_drvpriv.r871xs_drv); @@ -1292,17 +1956,11 @@ static void __exit rtw_drv_halt(void) rtw_mdelay_os(5); rtw_wifi_gpio_deinit(); +#ifdef ANDROID_2X #ifdef CONFIG_RTL8188E - DBG_8192C("%s: turn off VDD-WIFI0 3.3V\n", __func__); - LDO_TurnOffLDO(LDO_LDO_WIF0); rtw_wifi_gpio_wlan_ctrl(WLAN_POWER_OFF); #endif // CONFIG_RTL8188E - -#ifdef CONFIG_WOWLAN - if(mmc_host){ - mmc_host->pm_flags &= ~MMC_PM_KEEP_POWER; - } -#endif //CONFIG_WOWLAN +#endif // ANDROID_2X #endif // CONFIG_PLATFORM_SPRD @@ -1316,7 +1974,17 @@ static void __exit rtw_drv_halt(void) #endif //defined(CONFIG_MMC_SUNXI_POWER_CONTROL) #endif //CONFIG_PLATFORM_ARM_SUNxI - DBG_871X_LEVEL(_drv_always_, "module exit success\n"); +#ifdef CONFIG_PLATFORM_ARM_SUN6I +#ifdef CONFIG_MMC + wifi_pm_power(0); + sw_mci_rescan_card(SDIOID, 0); + printk("[rtl8723as] %s: remove card, power off.\n", __FUNCTION__); +#endif //CONFIG_MMC +#endif //CONFIG_PLATFORM_ARM_SUN6I + rtw_suspend_lock_uninit(); + DBG_871X_LEVEL(_drv_always_, "module exit success\n"); + + rtw_mstat_dump(); } diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_ops_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_ops_linux.c index 2950a783c5aa..4a1078927f5f 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_ops_linux.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_ops_linux.c @@ -22,8 +22,6 @@ #include -#define SD_IO_TRY_CNT (8) - static bool rtw_sdio_claim_host_needed(struct sdio_func *func) { struct dvobj_priv *dvobj = sdio_get_drvdata(func); @@ -41,14 +39,27 @@ inline void rtw_sdio_set_irq_thd(struct dvobj_priv *dvobj, _thread_hdl_ thd_hdl) sdio_data->sys_sdio_irq_thd = thd_hdl; } -u8 sd_f0_read8(PSDIO_DATA psdio, u32 addr, s32 *err) +u8 sd_f0_read8(struct intf_hdl *pintfhdl,u32 addr, s32 *err) { - u8 v; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + u8 v=0; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -65,13 +76,25 @@ _func_exit_; return v; } -void sd_f0_write8(PSDIO_DATA psdio, u32 addr, u8 v, s32 *err) +void sd_f0_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; bool claim_needed; _func_enter_; - + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -91,14 +114,25 @@ _func_exit_; * 0 Success * others Fail */ -s32 _sd_cmd52_read(PSDIO_DATA psdio, u32 addr, u32 cnt, u8 *pdata) +s32 _sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata) { - int err, i; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + int err=0, i; struct sdio_func *func; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; - err = 0; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; for (i = 0; i < cnt; i++) { @@ -119,21 +153,32 @@ _func_exit_; * 0 Success * others Fail */ -s32 sd_cmd52_read(PSDIO_DATA psdio, u32 addr, u32 cnt, u8 *pdata) +s32 sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata) { - int err, i; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + int err=0, i; struct sdio_func *func; - bool claim_needed; + bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; - err = 0; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); if (claim_needed) sdio_claim_host(func); - err = _sd_cmd52_read(psdio, addr, cnt, pdata); + err = _sd_cmd52_read(pintfhdl, addr, cnt, pdata); if (claim_needed) sdio_release_host(func); @@ -147,14 +192,25 @@ _func_exit_; * 0 Success * others Fail */ -s32 _sd_cmd52_write(PSDIO_DATA psdio, u32 addr, u32 cnt, u8 *pdata) +s32 _sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata) { - int err, i; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + int err=0, i; struct sdio_func *func; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; - err = 0; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved)!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; for (i = 0; i < cnt; i++) { @@ -175,21 +231,32 @@ _func_exit_; * 0 Success * others Fail */ -s32 sd_cmd52_write(PSDIO_DATA psdio, u32 addr, u32 cnt, u8 *pdata) +s32 sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata) { - int err, i; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + int err=0, i; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; - err = 0; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); if (claim_needed) sdio_claim_host(func); - err = _sd_cmd52_write(psdio, addr, cnt, pdata); + err = _sd_cmd52_write(pintfhdl, addr, cnt, pdata); if (claim_needed) sdio_release_host(func); @@ -198,13 +265,25 @@ _func_exit_; return err; } -u8 _sd_read8(PSDIO_DATA psdio, u32 addr, s32 *err) +u8 _sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err) { - u8 v; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + u8 v=0; struct sdio_func *func; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved)!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; v = sdio_readb(func, addr, err); @@ -217,14 +296,26 @@ _func_exit_; return v; } -u8 sd_read8(PSDIO_DATA psdio, u32 addr, s32 *err) +u8 sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + u8 v; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -241,14 +332,26 @@ _func_exit_; return v; } -u16 sd_read16(PSDIO_DATA psdio, u32 addr, s32 *err) +u16 sd_read16(struct intf_hdl *pintfhdl, u32 addr, s32 *err) { - u16 v; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + u16 v=0; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -265,13 +368,25 @@ _func_exit_; return v; } -u32 _sd_read32(PSDIO_DATA psdio, u32 addr, s32 *err) +u32 _sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err) { - u32 v; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + u32 v=0; struct sdio_func *func; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; v = sdio_readl(func, addr, err); @@ -288,8 +403,23 @@ _func_enter_; //sdio_claim_host(func); v = sdio_readl(func, addr, err); //sdio_release_host(func); - if (*err == 0) + if (*err == 0){ + rtw_reset_continual_io_error(psdiodev); break; + } + else{ + DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i); + if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err)) + { + padapter->bSurpriseRemoved = _TRUE; + } + + if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + break; + } + + } } if (i==SD_IO_TRY_CNT) @@ -304,14 +434,26 @@ _func_exit_; return v; } -u32 sd_read32(PSDIO_DATA psdio, u32 addr, s32 *err) +u32 sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err) { - u32 v; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + u32 v=0; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -333,8 +475,21 @@ _func_enter_; if (claim_needed) sdio_claim_host(func); v = sdio_readl(func, addr, err); if (claim_needed) sdio_release_host(func); - if (*err == 0) + + if (*err == 0){ + rtw_reset_continual_io_error(psdiodev); break; + }else{ + DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i); + if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err)){ + padapter->bSurpriseRemoved = _TRUE; + } + + if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + break; + } + } } if (i==SD_IO_TRY_CNT) @@ -349,13 +504,26 @@ _func_exit_; return v; } -void sd_write8(PSDIO_DATA psdio, u32 addr, u8 v, s32 *err) +void sd_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return ; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -370,13 +538,25 @@ _func_enter_; _func_exit_; } -void sd_write16(PSDIO_DATA psdio, u32 addr, u16 v, s32 *err) +void sd_write16(struct intf_hdl *pintfhdl, u32 addr, u16 v, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return ; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -391,12 +571,24 @@ _func_enter_; _func_exit_; } -void _sd_write32(PSDIO_DATA psdio, u32 addr, u32 v, s32 *err) +void _sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return ; + } + func = psdio->func; sdio_writel(func, v, addr, err); @@ -411,8 +603,20 @@ _func_enter_; for(i=0; ibSurpriseRemoved = _TRUE; + } + + if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + break; + } + } } if (i==SD_IO_TRY_CNT) @@ -425,13 +629,24 @@ _func_enter_; _func_exit_; } -void sd_write32(PSDIO_DATA psdio, u32 addr, u32 v, s32 *err) +void sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved)!!!\n",__FUNCTION__); + return ; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -453,8 +668,20 @@ _func_enter_; if (claim_needed) sdio_claim_host(func); sdio_writel(func, v, addr, err); if (claim_needed) sdio_release_host(func); - if (*err == 0) + if (*err == 0){ + rtw_reset_continual_io_error(psdiodev); break; + }else{ + DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i); + if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err)){ + padapter->bSurpriseRemoved = _TRUE; + } + + if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + break; + } + } } if (i==SD_IO_TRY_CNT) @@ -481,13 +708,25 @@ _func_exit_; * 0 Success * others Fail */ -s32 _sd_read(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata) +s32 _sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata) { - int err; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + int err= -EPERM; struct sdio_func *func; _func_enter_; - + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; if (unlikely((cnt==1) || (cnt==2))) @@ -530,21 +769,34 @@ _func_exit_; * 0 Success * others Fail */ -s32 sd_read(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata) +s32 sd_read(struct intf_hdl * pintfhdl, u32 addr, u32 cnt, void *pdata) { - s32 err; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; bool claim_needed; - + s32 err= -EPERM; + +_func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); if (claim_needed) sdio_claim_host(func); - err = _sd_read(psdio, addr, cnt, pdata); + err = _sd_read(pintfhdl, addr, cnt, pdata); if (claim_needed) sdio_release_host(func); - +_func_exit_; return err; } @@ -563,14 +815,26 @@ s32 sd_read(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata) * 0 Success * others Fail */ -s32 _sd_write(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata) +s32 _sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata) { - int err; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; u32 size; + s32 err=-EPERM; _func_enter_; - + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; // size = sdio_align_size(func, cnt); @@ -615,21 +879,34 @@ _func_exit_; * 0 Success * others Fail */ -s32 sd_write(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata) +s32 sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata) { - s32 err; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; bool claim_needed; - + s32 err=-EPERM; +_func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); if (claim_needed) sdio_claim_host(func); - err = _sd_write(psdio, addr, cnt, pdata); + err = _sd_write(pintfhdl, addr, cnt, pdata); if (claim_needed) sdio_release_host(func); - +_func_exit_; return err; } diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c b/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c index 0815a0cc9146..284d23a8d71b 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c @@ -66,6 +66,23 @@ int rtw_resume_process(_adapter *padapter); static int rtw_drv_init(struct usb_interface *pusb_intf,const struct usb_device_id *pdid); static void rtw_dev_remove(struct usb_interface *pusb_intf); +static void rtw_dev_shutdown(struct device *dev) +{ + struct usb_interface *usb_intf = container_of(dev, struct usb_interface, dev); + struct dvobj_priv *dvobj = usb_get_intfdata(usb_intf); + _adapter *adapter = dvobj->if1; + int i; + + DBG_871X("%s\n", __func__); + + for (i = 0; iiface_nums; i++) { + adapter = dvobj->padapters[i]; + adapter->bSurpriseRemoved = _TRUE; + } + + ATOMIC_SET(&dvobj->continual_io_error, MAX_CONTINUAL_IO_ERR+1); +} + #if (LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,23)) /* Some useful macros to use to create struct usb_device_id */ #define USB_DEVICE_ID_MATCH_VENDOR 0x0001 @@ -320,6 +337,12 @@ struct rtw_usb_drv rtl8192c_usb_drv = { #ifdef CONFIG_AUTOSUSPEND .usbdrv.supports_autosuspend = 1, #endif + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) + .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown, + #else + .usbdrv.driver.shutdown = rtw_dev_shutdown, + #endif }; static struct rtw_usb_drv *usb_drv = &rtl8192c_usb_drv; @@ -344,6 +367,12 @@ struct rtw_usb_drv rtl8192d_usb_drv = { #ifdef CONFIG_AUTOSUSPEND .usbdrv.supports_autosuspend = 1, #endif + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) + .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown, + #else + .usbdrv.driver.shutdown = rtw_dev_shutdown, + #endif }; static struct rtw_usb_drv *usb_drv = &rtl8192d_usb_drv; #endif /* CONFIG_RTL8192D */ @@ -367,6 +396,12 @@ struct rtw_usb_drv rtl8723a_usb_drv = { #ifdef CONFIG_AUTOSUSPEND .usbdrv.supports_autosuspend = 1, #endif + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) + .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown, + #else + .usbdrv.driver.shutdown = rtw_dev_shutdown, + #endif }; static struct rtw_usb_drv *usb_drv = &rtl8723a_usb_drv; @@ -391,6 +426,12 @@ struct rtw_usb_drv rtl8188e_usb_drv = { #ifdef CONFIG_AUTOSUSPEND .usbdrv.supports_autosuspend = 1, #endif + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)) + .usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown, + #else + .usbdrv.driver.shutdown = rtw_dev_shutdown, + #endif }; static struct rtw_usb_drv *usb_drv = &rtl8188e_usb_drv; @@ -502,7 +543,7 @@ _func_enter_; _rtw_mutex_init(&pdvobjpriv->h2c_fwcmd_mutex); _rtw_mutex_init(&pdvobjpriv->setch_mutex); _rtw_mutex_init(&pdvobjpriv->setbw_mutex); - + pdvobjpriv->processing_dev_remove = _FALSE; pdvobjpriv->pusbintf = usb_intf ; pusbd = pdvobjpriv->pusbdev = interface_to_usbdev(usb_intf); @@ -629,7 +670,7 @@ _func_enter_; //.3 misc _rtw_init_sema(&(pdvobjpriv->usb_suspend_sema), 0); - rtw_reset_continual_urb_error(pdvobjpriv); + rtw_reset_continual_io_error(pdvobjpriv); usb_get_dev(pusbd); @@ -724,7 +765,7 @@ static void usb_intf_stop(_adapter *padapter) } -static void rtw_dev_unload(_adapter *padapter) +void rtw_dev_unload(_adapter *padapter) { struct net_device *pnetdev= (struct net_device*)padapter->pnetdev; u8 val8; @@ -747,7 +788,7 @@ static void rtw_dev_unload(_adapter *padapter) } //s4. - if(!padapter->pwrctrlpriv.bInternalAutoSuspend ) + if(!adapter_to_pwrctl(padapter)->bInternalAutoSuspend ) rtw_stop_drv_threads(padapter); @@ -756,7 +797,7 @@ static void rtw_dev_unload(_adapter *padapter) { //DBG_871X("r871x_dev_unload()->rtl871x_hal_deinit()\n"); #ifdef CONFIG_WOWLAN - if((padapter->pwrctrlpriv.bSupportRemoteWakeup==_TRUE)&&(padapter->pwrctrlpriv.wowlan_mode==_TRUE)){ + if((adapter_to_pwrctl(padapter)->bSupportRemoteWakeup==_TRUE)&&(adapter_to_pwrctl(padapter)->wowlan_mode==_TRUE)){ DBG_871X("%s bSupportWakeOnWlan==_TRUE do not run rtw_hal_deinit()\n",__FUNCTION__); } else @@ -822,7 +863,7 @@ static void process_spec_devid(const struct usb_device_id *pdid) #ifdef SUPPORT_HW_RFOFF_DETECTED int rtw_hw_suspend(_adapter *padapter ) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct usb_interface *pusb_intf = adapter_to_dvobj(padapter)->pusbintf; struct net_device *pnetdev = padapter->pnetdev; @@ -900,7 +941,7 @@ error_exit: int rtw_hw_resume(_adapter *padapter) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct usb_interface *pusb_intf = adapter_to_dvobj(padapter)->pusbintf; struct net_device *pnetdev = padapter->pnetdev; @@ -949,13 +990,150 @@ error_exit: } #endif +#if 1 +#ifdef CONFIG_WOWLAN +static void rtw_suspend_wow(_adapter *padapter) +{ + struct net_device *pnetdev = padapter->pnetdev; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + struct wifidirect_info* pwdinfo = &padapter->wdinfo; + struct wowlan_ioctl_param poidparam; + + if (check_fwstate(pmlmepriv, _FW_LINKED)) + pwrpriv->wowlan_mode = _TRUE; + else + pwrpriv->wowlan_mode = _FALSE; + + rtw_cancel_all_timer(padapter); + LeaveAllPowerSaveMode(padapter); + + rtw_stop_cmd_thread(padapter); + + + //padapter->net_closed = _TRUE; + //s1. + if(pnetdev) + { + netif_carrier_off(pnetdev); + rtw_netif_stop_queue(pnetdev); + } + + if(pwrpriv->bSupportRemoteWakeup==_TRUE && pwrpriv->wowlan_mode==_TRUE){ + //set H2C command + poidparam.subcode=WOWLAN_ENABLE; + padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); + } + else + { + //s2. + rtw_disassoc_cmd(padapter, 0, _FALSE); + } + + +#ifdef CONFIG_LAYER2_ROAMING_RESUME + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED)&& rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + { + //DBG_871X("%s:%d assoc_ssid:%s\n", __FUNCTION__, __LINE__, pmlmepriv->assoc_ssid.Ssid); + DBG_871X("%s:%d %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__, __LINE__, + pmlmepriv->cur_network.network.Ssid.Ssid, + MAC_ARG(pmlmepriv->cur_network.network.MacAddress), + pmlmepriv->cur_network.network.Ssid.SsidLength, + pmlmepriv->assoc_ssid.SsidLength); + + rtw_set_roaming(padapter, 1); + } +#endif + //s2-2. indicate disconnect to os + rtw_indicate_disconnect(padapter); + //s2-3. + rtw_free_assoc_resources(padapter, 1); +#ifdef CONFIG_AUTOSUSPEND + if(!pwrpriv->bInternalAutoSuspend ) +#endif + //s2-4. + rtw_free_network_queue(padapter, _TRUE); + + rtw_dev_unload(padapter); + + if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) + rtw_indicate_scan_done(padapter, 1); + + //if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) + // rtw_indicate_disconnect(padapter); + +} +#endif +static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) +{ + struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf); + _adapter *padapter = dvobj->if1; + struct net_device *pnetdev = padapter->pnetdev; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj); + struct usb_device *usb_dev = interface_to_usbdev(pusb_intf); + + + int ret = 0; + u32 start_time = rtw_get_current_time(); + + _func_enter_; + + DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); + + if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) + { + DBG_871X("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", + padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); + goto exit; + } + + if(pwrpriv->bInternalAutoSuspend ) + { + #ifdef CONFIG_AUTOSUSPEND + #ifdef SUPPORT_HW_RFOFF_DETECTED + // The FW command register update must after MAC and FW init ready. + if((padapter->bFWReady) && (pwrpriv->bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable )) + { + u8 bOpen = _TRUE; + rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen); + //rtl8192c_set_FwSelectSuspend_cmd(padapter,_TRUE ,500);//note fw to support hw power down ping detect + } + #endif + #endif + } + + pwrpriv->bInSuspend = _TRUE; + + _enter_pwrlock(&pwrpriv->lock); +#ifdef CONFIG_WOWLAN + rtw_suspend_wow(padapter); +#else + rtw_suspend_common(padapter); +#endif + +#ifdef CONFIG_AUTOSUSPEND + pwrpriv->rf_pwrstate = rf_off; + pwrpriv->bips_processing = _FALSE; +#endif + _exit_pwrlock(&pwrpriv->lock); + + +exit: + DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__ + , ret, rtw_get_passing_time_ms(start_time)); + + _func_exit_; + return ret; +} +#else static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) { struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf); _adapter *padapter = dvobj->if1; struct net_device *pnetdev = padapter->pnetdev; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj); struct usb_device *usb_dev = interface_to_usbdev(pusb_intf); #ifdef CONFIG_WOWLAN struct wowlan_ioctl_param poidparam; @@ -970,9 +1148,9 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) #ifdef CONFIG_WOWLAN if (check_fwstate(pmlmepriv, _FW_LINKED)) - padapter->pwrctrlpriv.wowlan_mode = _TRUE; + pwrpriv->wowlan_mode = _TRUE; else - padapter->pwrctrlpriv.wowlan_mode = _FALSE; + pwrpriv->wowlan_mode = _FALSE; #endif if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) @@ -987,7 +1165,7 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) #ifdef CONFIG_AUTOSUSPEND #ifdef SUPPORT_HW_RFOFF_DETECTED // The FW command register update must after MAC and FW init ready. - if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable )) + if((padapter->bFWReady) && (pwrpriv->bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable )) { u8 bOpen = _TRUE; rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen); @@ -1000,6 +1178,8 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) rtw_cancel_all_timer(padapter); LeaveAllPowerSaveMode(padapter); + rtw_stop_cmd_thread(padapter); + _enter_pwrlock(&pwrpriv->lock); //padapter->net_closed = _TRUE; //s1. @@ -1010,7 +1190,7 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) } #ifdef CONFIG_WOWLAN - if(padapter->pwrctrlpriv.bSupportRemoteWakeup==_TRUE&&padapter->pwrctrlpriv.wowlan_mode==_TRUE){ + if(pwrpriv->bSupportRemoteWakeup==_TRUE && pwrpriv->wowlan_mode==_TRUE){ //set H2C command poidparam.subcode=WOWLAN_ENABLE; padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam); @@ -1067,12 +1247,13 @@ exit: return ret; } +#endif static int rtw_resume(struct usb_interface *pusb_intf) { struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf); _adapter *padapter = dvobj->if1; struct net_device *pnetdev = padapter->pnetdev; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj); int ret = 0; if(pwrpriv->bInternalAutoSuspend ){ @@ -1083,7 +1264,7 @@ static int rtw_resume(struct usb_interface *pusb_intf) #else if (rtw_is_earlysuspend_registered(pwrpriv) #ifdef CONFIG_WOWLAN - && !padapter->pwrctrlpriv.wowlan_mode + && !pwrpriv->wowlan_mode #endif /* CONFIG_WOWLAN */ ) { /* jeff: bypass resume here, do in late_resume */ @@ -1113,7 +1294,7 @@ int rtw_resume_process(_adapter *padapter) if(padapter) { pnetdev= padapter->pnetdev; - pwrpriv = &padapter->pwrctrlpriv; + pwrpriv = adapter_to_pwrctl(padapter); } else { goto exit; } @@ -1138,15 +1319,13 @@ int rtw_resume_process(_adapter *padapter) } #endif //#ifdef CONFIG_AUTOSUSPEND #endif //#ifdef CONFIG_BT_COEXIST - rtw_reset_drv_sw(padapter); - pwrpriv->bkeepfwalive = _FALSE; - DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive); - if(pm_netdev_open(pnetdev,_TRUE) != 0) - goto exit; - netif_device_attach(pnetdev); - netif_carrier_on(pnetdev); + if(rtw_resume_common(padapter)!= 0) { + DBG_871X("%s rtw_resume_common failed\n",__FUNCTION__); + _exit_pwrlock(&pwrpriv->lock); + goto exit; + } #ifdef CONFIG_AUTOSUSPEND if(pwrpriv->bInternalAutoSuspend ) @@ -1154,7 +1333,7 @@ int rtw_resume_process(_adapter *padapter) #ifdef CONFIG_AUTOSUSPEND #ifdef SUPPORT_HW_RFOFF_DETECTED // The FW command register update must after MAC and FW init ready. - if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable )) + if((padapter->bFWReady) && (pwrpriv->bHWPwrPindetect) && (padapter->registrypriv.usbss_enable )) { //rtl8192c_set_FwSelectSuspend_cmd(padapter,_FALSE ,500);//note fw to support hw power down ping detect u8 bOpen = _FALSE; @@ -1165,7 +1344,7 @@ int rtw_resume_process(_adapter *padapter) #ifdef CONFIG_BT_COEXIST DBG_871X("pwrpriv->bAutoResume (%x)\n",pwrpriv->bAutoResume ); if( _TRUE == pwrpriv->bAutoResume ){ - pwrpriv->bInternalAutoSuspend = _FALSE; + pwrpriv->bInternalAutoSuspend = _FALSE; pwrpriv->bAutoResume=_FALSE; DBG_871X("pwrpriv->bAutoResume (%x) pwrpriv->bInternalAutoSuspend(%x)\n",pwrpriv->bAutoResume,pwrpriv->bInternalAutoSuspend ); } @@ -1174,24 +1353,6 @@ int rtw_resume_process(_adapter *padapter) pwrpriv->bInternalAutoSuspend = _FALSE; #endif //#ifdef CONFIG_BT_COEXIST pwrpriv->brfoffbyhw = _FALSE; - { - DBG_871X("enc_algorithm(%x),wepkeymask(%x)\n", - padapter->securitypriv.dot11PrivacyAlgrthm,pwrpriv->wepkeymask); - if( (_WEP40_ == padapter->securitypriv.dot11PrivacyAlgrthm) || - (_WEP104_ == padapter->securitypriv.dot11PrivacyAlgrthm)) - { - sint keyid; - - for(keyid=0;keyid<4;keyid++){ - if(pwrpriv->wepkeymask & BIT(keyid)) { - if(keyid == padapter->securitypriv.dot11PrivacyKeyIndex) - rtw_set_key(padapter,&padapter->securitypriv, keyid, 1); - else - rtw_set_key(padapter,&padapter->securitypriv, keyid, 0); - } - } - } - } } #endif _exit_pwrlock(&pwrpriv->lock); @@ -1199,11 +1360,7 @@ int rtw_resume_process(_adapter *padapter) if( padapter->pid[1]!=0) { DBG_871X("pid[1]:%d\n",padapter->pid[1]); rtw_signal_process(padapter->pid[1], SIGUSR2); - } - - #ifdef CONFIG_LAYER2_ROAMING_RESUME - rtw_roaming(padapter, NULL); - #endif + } ret = 0; exit: @@ -1223,7 +1380,7 @@ exit: #ifdef CONFIG_AUTOSUSPEND void autosuspend_enter(_adapter* padapter) { - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); DBG_871X("==>autosuspend_enter...........\n"); @@ -1279,7 +1436,7 @@ void autosuspend_enter(_adapter* padapter) int autoresume_enter(_adapter* padapter) { int result = _SUCCESS; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct security_priv* psecuritypriv=&(padapter->securitypriv); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -1447,13 +1604,13 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, #ifdef CONFIG_PM #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) - if(padapter->pwrctrlpriv.bSupportRemoteWakeup) + if(adapter_to_pwrctl(padapter)->bSupportRemoteWakeup) { dvobj->pusbdev->do_remote_wakeup=1; pusb_intf->needs_remote_wakeup = 1; device_init_wakeup(&pusb_intf->dev, 1); - DBG_871X("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n"); - DBG_871X("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n",device_may_wakeup(&pusb_intf->dev)); + DBG_871X("\n pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n"); + DBG_871X("\n pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n",device_may_wakeup(&pusb_intf->dev)); } #endif #endif @@ -1493,7 +1650,7 @@ _adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, } #endif #ifdef CONFIG_BT_COEXIST - padapter->pwrctrlpriv.autopm_cnt=1; + adapter_to_pwrctl(padapter)->autopm_cnt=1; #endif // set mac addr @@ -1538,6 +1695,7 @@ static void rtw_usb_if1_deinit(_adapter *if1) { struct net_device *pnetdev = if1->pnetdev; struct mlme_priv *pmlmepriv= &if1->mlmepriv; + struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(if1); if(check_fwstate(pmlmepriv, _FW_LINKED)) rtw_disassoc_cmd(if1, 0, _FALSE); @@ -1549,18 +1707,18 @@ static void rtw_usb_if1_deinit(_adapter *if1) hostapd_mode_unload(if1); #endif #endif - +/* if(if1->DriverState != DRIVER_DISAPPEAR) { if(pnetdev) { unregister_netdev(pnetdev); //will call netdev_close() rtw_proc_remove_one(pnetdev); } } - +*/ rtw_cancel_all_timer(if1); #ifdef CONFIG_WOWLAN - if1->pwrctrlpriv.wowlan_mode=_FALSE; + pwrctl->wowlan_mode=_FALSE; #endif //CONFIG_WOWLAN rtw_dev_unload(if1); @@ -1572,13 +1730,13 @@ static void rtw_usb_if1_deinit(_adapter *if1) #ifdef CONFIG_IOCTL_CFG80211 if(if1->rtw_wdev) { - rtw_wdev_unregister(if1->rtw_wdev); + //rtw_wdev_unregister(if1->rtw_wdev); rtw_wdev_free(if1->rtw_wdev); } #endif #ifdef CONFIG_BT_COEXIST - if(1 == if1->pwrctrlpriv.autopm_cnt){ + if(1 == pwrctl->autopm_cnt){ #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33)) usb_autopm_put_interface(adapter_to_dvobj(if1)->pusbintf); #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20)) @@ -1586,7 +1744,7 @@ static void rtw_usb_if1_deinit(_adapter *if1) #else usb_autosuspend_device(adapter_to_dvobj(if1)->pusbdev, 1); #endif - if1->pwrctrlpriv.autopm_cnt --; + pwrctl->autopm_cnt --; } #endif @@ -1804,7 +1962,7 @@ free_dvobj: exit: return status == _SUCCESS?0:-ENODEV; } - +extern void rtw_unregister_netdevs(struct dvobj_priv *dvobj); /* * dev_remove() - our device is being removed */ @@ -1820,7 +1978,9 @@ _func_enter_; DBG_871X("+rtw_dev_remove\n"); RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+dev_remove()\n")); - + dvobj->processing_dev_remove = _TRUE; + rtw_unregister_netdevs(dvobj); + if(usb_drv->drv_registered == _TRUE) { //DBG_871X("r871xu_dev_remove():padapter->bSurpriseRemoved == _TRUE\n"); @@ -1836,7 +1996,7 @@ _func_enter_; MPT_DeInitAdapter(padapter); #endif #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) - rtw_unregister_early_suspend(&padapter->pwrctrlpriv); + rtw_unregister_early_suspend(dvobj_to_pwrctl(dvobj)); #endif rtw_pm_set_ips(padapter, IPS_NONE); @@ -1864,9 +2024,6 @@ _func_enter_; rtw_sw_export=NULL; #endif - #ifdef DBG_MEM_ALLOC - rtw_dump_mem_stat (); - #endif _func_exit_; return; @@ -1900,7 +2057,7 @@ static int __init rtw_drv_entry(void) #endif //CONFIG_RTL8723A #endif //CONFIG_PLATFORM_ARM_SUNxI -#ifdef CONFIG_PLATFORM_ARM_SUN6I +#if defined CONFIG_PLATFORM_ARM_SUN6I script_item_value_type_e type; type = script_get_item("wifi_para", "wifi_usbc_id", &item); @@ -1912,8 +2069,11 @@ static int __init rtw_drv_entry(void) printk("sw_usb_enable_hcd: usbc_num = %d\n", item.val); wifi_pm_power(1); mdelay(10); + + #ifndef CONFIG_RTL8723A sw_usb_enable_hcd(item.val); -#endif //CONFIG_PLATFORM_ARM_SUN6I + #endif +#endif // defined CONFIG_PLATFORM_ARM_SUN6I && !(defined CONFIG_RTL8723A) RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_entry\n")); @@ -1933,9 +2093,7 @@ static int __init rtw_drv_entry(void) static void __exit rtw_drv_halt(void) { RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_halt\n")); - DBG_871X("+rtw_drv_halt\n"); - - rtw_suspend_lock_uninit(); + DBG_871X("+rtw_drv_halt\n"); usb_drv->drv_registered = _FALSE; usb_deregister(&usb_drv->usbdrv); @@ -1947,12 +2105,17 @@ static void __exit rtw_drv_halt(void) #endif //ifndef CONFIG_RTL8723A #endif //CONFIG_PLATFORM_ARM_SUNxI -#ifdef CONFIG_PLATFORM_ARM_SUN6I +#if defined CONFIG_PLATFORM_ARM_SUN6I + #ifndef CONFIG_RTL8723A sw_usb_disable_hcd(item.val); + #endif wifi_pm_power(0); -#endif +#endif // defined CONFIG_PLATFORM_ARM_SUN6I && !(defined CONFIG_RTL8723A) + rtw_suspend_lock_uninit(); DBG_871X("-rtw_drv_halt\n"); + + rtw_mstat_dump(); } diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/usb_ops_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/usb_ops_linux.c index c9418e593a9e..db7546447bf0 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/usb_ops_linux.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/usb_ops_linux.c @@ -1,646 +1,698 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - *******************************************************************************/ -#define _USB_OPS_LINUX_C_ - -#include -#include -#include - -#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ -static void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *regs) -{ - if (urb) { - if (urb->context) { - kfree(urb->context); - } - usb_free_urb(urb); - } -} - -static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request, - u16 value, u16 index, void *pdata, u16 len, u8 requesttype) -{ - int rc; - unsigned int pipe; - u8 reqtype; - struct usb_ctrlrequest *dr; - struct urb *urb; - struct rtl819x_async_write_data { - u8 data[VENDOR_CMD_MAX_DATA_LEN]; - struct usb_ctrlrequest dr; - } *buf; - - - if (requesttype == VENDOR_READ) { - pipe = usb_rcvctrlpipe(udev, 0);//read_in - reqtype = REALTEK_USB_VENQT_READ; - } - else { - pipe = usb_sndctrlpipe(udev, 0);//write_out - reqtype = REALTEK_USB_VENQT_WRITE; - } - - buf = (struct rtl819x_async_write_data *)rtw_zmalloc(sizeof(*buf)); - if (!buf) { - rc = -ENOMEM; - goto exit; - } - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!urb) { - rtw_mfree((u8*)buf, sizeof(*buf)); - rc = -ENOMEM; - goto exit; - } - - dr = &buf->dr; - - dr->bRequestType = reqtype; - dr->bRequest = request; - dr->wValue = cpu_to_le16(value); - dr->wIndex = cpu_to_le16(index); - dr->wLength = cpu_to_le16(len); - - _rtw_memcpy(buf, pdata, len); - - usb_fill_control_urb(urb, udev, pipe, (unsigned char *)dr, buf, len, - _usbctrl_vendorreq_async_callback, buf); - - rc = usb_submit_urb(urb, GFP_ATOMIC); - if (rc < 0) { - rtw_mfree((u8*)buf, sizeof(*buf)); - usb_free_urb(urb); - } - -exit: - return rc; -} - -int usb_write_async(struct usb_device *udev, u32 addr, void *pdata, u16 len) -{ - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - - int ret; - - requesttype = VENDOR_WRITE;//write_out - request = REALTEK_USB_VENQT_CMD_REQ; - index = REALTEK_USB_VENQT_CMD_IDX;//n/a - - wvalue = (u16)(addr&0x0000ffff); - - ret = _usbctrl_vendorreq_async_write(udev, request, wvalue, index, pdata, len, requesttype); - - return ret; -} - -int usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) -{ - u8 data; - int ret; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - struct usb_device *udev=pdvobjpriv->pusbdev; - - _func_enter_; - data = val; - ret = usb_write_async(udev, addr, &data, 1); - _func_exit_; - - return ret; -} - -int usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) -{ - u16 data; - int ret; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - struct usb_device *udev=pdvobjpriv->pusbdev; - - _func_enter_; - data = val; - ret = usb_write_async(udev, addr, &data, 2); - _func_exit_; - - return ret; -} - -int usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) -{ - u32 data; - int ret; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - struct usb_device *udev=pdvobjpriv->pusbdev; - - _func_enter_; - data = val; - ret = usb_write_async(udev, addr, &data, 4); - _func_exit_; - - return ret; -} -#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */ - -unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) -{ - unsigned int pipe=0, ep_num=0; - struct usb_device *pusbd = pdvobj->pusbdev; - - if (addr == RECV_BULK_IN_ADDR) { - pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[0]); - - } else if (addr == RECV_INT_IN_ADDR) { - pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[1]); - - } else if (addr < HW_QUEUE_ENTRY) { - ep_num = pdvobj->Queue2Pipe[addr]; - pipe = usb_sndbulkpipe(pusbd, ep_num); - } - - return pipe; -} - -struct zero_bulkout_context{ - void *pbuf; - void *purb; - void *pirp; - void *padapter; -}; - -static void usb_bulkout_zero_complete(struct urb *purb, struct pt_regs *regs) -{ - struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)purb->context; - - //DBG_8192C("+usb_bulkout_zero_complete\n"); - - if(pcontext) - { - if(pcontext->pbuf) - { - rtw_mfree(pcontext->pbuf, sizeof(int)); - } - - if(pcontext->purb && (pcontext->purb==purb)) - { - usb_free_urb(pcontext->purb); - } - - - rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context)); - } - - -} - -static u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) -{ - int pipe, status, len; - u32 ret; - unsigned char *pbuf; - struct zero_bulkout_context *pcontext; - PURB purb = NULL; - _adapter *padapter = (_adapter *)pintfhdl->padapter; - struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); - struct usb_device *pusbd = pdvobj->pusbdev; - - //DBG_871X("%s\n", __func__); - - - if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) - { - return _FAIL; - } - - - pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context)); - - pbuf = (unsigned char *)rtw_zmalloc(sizeof(int)); - purb = usb_alloc_urb(0, GFP_ATOMIC); - - len = 0; - pcontext->pbuf = pbuf; - pcontext->purb = purb; - pcontext->pirp = NULL; - pcontext->padapter = padapter; - - - //translate DMA FIFO addr to pipehandle - //pipe = ffaddr2pipehdl(pdvobj, addr); - - usb_fill_bulk_urb(purb, pusbd, pipe, - pbuf, - len, - usb_bulkout_zero_complete, - pcontext);//context is pcontext - - status = usb_submit_urb(purb, GFP_ATOMIC); - - if (!status) - { - ret= _SUCCESS; - } - else - { - ret= _FAIL; - } - - - return _SUCCESS; - -} - -void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) -{ - -} - -void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) -{ - -} - - -void usb_read_port_cancel(struct intf_hdl *pintfhdl) -{ - int i; - struct recv_buf *precvbuf; - _adapter *padapter = pintfhdl->padapter; - precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf; - - DBG_871X("%s\n", __func__); - - padapter->bReadPortCancel = _TRUE; - - for (i=0; i < NR_RECVBUFF ; i++) { - - precvbuf->reuse = _TRUE; - if (precvbuf->purb) { - //DBG_8192C("usb_read_port_cancel : usb_kill_urb \n"); - usb_kill_urb(precvbuf->purb); - } - precvbuf++; - } - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE - usb_kill_urb(padapter->recvpriv.int_in_urb); -#endif -} - -static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs) -{ - _irqL irqL; - int i; - struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context; - //struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; - //_adapter *padapter = pxmitframe->padapter; - _adapter *padapter = pxmitbuf->padapter; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - //struct pkt_attrib *pattrib = &pxmitframe->attrib; - -_func_enter_; - - switch(pxmitbuf->flags) - { - case VO_QUEUE_INX: - pxmitpriv->voq_cnt--; - break; - case VI_QUEUE_INX: - pxmitpriv->viq_cnt--; - break; - case BE_QUEUE_INX: - pxmitpriv->beq_cnt--; - break; - case BK_QUEUE_INX: - pxmitpriv->bkq_cnt--; - break; - case HIGH_QUEUE_INX: -#ifdef CONFIG_AP_MODE - rtw_chk_hi_queue_cmd(padapter); -#endif - break; - default: - break; - } - - -/* - _enter_critical(&pxmitpriv->lock, &irqL); - - pxmitpriv->txirp_cnt--; - - switch(pattrib->priority) - { - case 1: - case 2: - pxmitpriv->bkq_cnt--; - //DBG_8192C("pxmitpriv->bkq_cnt=%d\n", pxmitpriv->bkq_cnt); - break; - case 4: - case 5: - pxmitpriv->viq_cnt--; - //DBG_8192C("pxmitpriv->viq_cnt=%d\n", pxmitpriv->viq_cnt); - break; - case 6: - case 7: - pxmitpriv->voq_cnt--; - //DBG_8192C("pxmitpriv->voq_cnt=%d\n", pxmitpriv->voq_cnt); - break; - case 0: - case 3: - default: - pxmitpriv->beq_cnt--; - //DBG_8192C("pxmitpriv->beq_cnt=%d\n", pxmitpriv->beq_cnt); - break; - - } - - _exit_critical(&pxmitpriv->lock, &irqL); - - - if(pxmitpriv->txirp_cnt==0) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); - _rtw_up_sema(&(pxmitpriv->tx_retevt)); - } -*/ - //rtw_free_xmitframe(pxmitpriv, pxmitframe); - - if(padapter->bSurpriseRemoved || padapter->bDriverStopped ||padapter->bWritePortCancel) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - DBG_8192C("%s(): TX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) bWritePortCancel(%d) pxmitbuf->ext_tag(%x) \n", - __FUNCTION__,padapter->bDriverStopped, padapter->bSurpriseRemoved,padapter->bReadPortCancel,pxmitbuf->ext_tag); - - goto check_completion; - } - - - if (purb->status==0) { - - } else { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete : purb->status(%d) != 0 \n", purb->status)); - DBG_871X("###=> urb_write_port_complete status(%d)\n",purb->status); - if((purb->status==-EPIPE)||(purb->status==-EPROTO)) - { - //usb_clear_halt(pusbdev, purb->pipe); - //msleep(10); - sreset_set_wifi_error_status(padapter, USB_WRITE_PORT_FAIL); - } else if (purb->status == -EINPROGRESS) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: EINPROGESS\n")); - goto check_completion; - - } else if (purb->status == -ENOENT) { - DBG_871X("%s: -ENOENT\n", __func__); - goto check_completion; - - } else if (purb->status == -ECONNRESET) { - DBG_871X("%s: -ECONNRESET\n", __func__); - goto check_completion; - - } else if (purb->status == -ESHUTDOWN) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n")); - padapter->bDriverStopped=_TRUE; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped=TRUE\n")); - - goto check_completion; - } - else - { - padapter->bSurpriseRemoved=_TRUE; - DBG_8192C("bSurpriseRemoved=TRUE\n"); - //rtl8192cu_trigger_gpio_0(padapter); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n")); - - goto check_completion; - } - } - - #ifdef DBG_CONFIG_ERROR_DETECT - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.last_tx_complete_time = rtw_get_current_time(); - } - #endif - -check_completion: - _enter_critical(&pxmitpriv->lock_sctx, &irqL); - rtw_sctx_done_err(&pxmitbuf->sctx, - purb->status ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS); - _exit_critical(&pxmitpriv->lock_sctx, &irqL); - - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - - //if(rtw_txframes_pending(padapter)) - { - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); - } - -_func_exit_; - -} - -u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) -{ - _irqL irqL; - unsigned int pipe; - int status; - u32 ret = _FAIL, bwritezero = _FALSE; - PURB purb = NULL; - _adapter *padapter = (_adapter *)pintfhdl->padapter; - struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem; - struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; - struct usb_device *pusbd = pdvobj->pusbdev; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - -_func_enter_; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port\n")); - - if ((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) { - #ifdef DBG_TX - DBG_871X(" DBG_TX %s:%d bDriverStopped%d, bSurpriseRemoved:%d, pnp_bstop_trx:%d\n",__FUNCTION__, __LINE__ - ,padapter->bDriverStopped, padapter->bSurpriseRemoved, padapter->pwrctrlpriv.pnp_bstop_trx ); - #endif - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_TX_DENY); - goto exit; - } - - _enter_critical(&pxmitpriv->lock, &irqL); - - switch(addr) - { - case VO_QUEUE_INX: - pxmitpriv->voq_cnt++; - pxmitbuf->flags = VO_QUEUE_INX; - break; - case VI_QUEUE_INX: - pxmitpriv->viq_cnt++; - pxmitbuf->flags = VI_QUEUE_INX; - break; - case BE_QUEUE_INX: - pxmitpriv->beq_cnt++; - pxmitbuf->flags = BE_QUEUE_INX; - break; - case BK_QUEUE_INX: - pxmitpriv->bkq_cnt++; - pxmitbuf->flags = BK_QUEUE_INX; - break; - case HIGH_QUEUE_INX: - pxmitbuf->flags = HIGH_QUEUE_INX; - break; - default: - pxmitbuf->flags = MGT_QUEUE_INX; - break; - } - - _exit_critical(&pxmitpriv->lock, &irqL); - - purb = pxmitbuf->pxmit_urb[0]; - -#if 0 - if(pdvobj->ishighspeed) - { - if(cnt> 0 && cnt%512 == 0) - { - //DBG_8192C("ishighspeed, cnt=%d\n", cnt); - bwritezero = _TRUE; - } - } - else - { - if(cnt > 0 && cnt%64 == 0) - { - //DBG_8192C("cnt=%d\n", cnt); - bwritezero = _TRUE; - } - } -#endif - - //translate DMA FIFO addr to pipehandle - pipe = ffaddr2pipehdl(pdvobj, addr); - -#ifdef CONFIG_REDUCE_USB_TX_INT - if ( (pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0) - || (pxmitbuf->ext_tag == _TRUE) ) - { - purb->transfer_flags &= (~URB_NO_INTERRUPT); - } else { - purb->transfer_flags |= URB_NO_INTERRUPT; - //DBG_8192C("URB_NO_INTERRUPT "); - } -#endif - - - usb_fill_bulk_urb(purb, pusbd, pipe, - pxmitframe->buf_addr, //= pxmitbuf->pbuf - cnt, - usb_write_port_complete, - pxmitbuf);//context is pxmitbuf - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX - purb->transfer_dma = pxmitbuf->dma_transfer_addr; - purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - purb->transfer_flags |= URB_ZERO_PACKET; -#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX - -#if 0 - if (bwritezero) - { - purb->transfer_flags |= URB_ZERO_PACKET; - } -#endif - - status = usb_submit_urb(purb, GFP_ATOMIC); - if (!status) { - #ifdef DBG_CONFIG_ERROR_DETECT - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.last_tx_time = rtw_get_current_time(); - } - #endif - } else { - rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR); - DBG_871X("usb_write_port, status=%d\n", status); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port(): usb_submit_urb, status=%x\n", status)); - - switch (status) { - case -ENODEV: - padapter->bDriverStopped=_TRUE; - break; - default: - break; - } - goto exit; - } - - ret= _SUCCESS; - -// Commented by Albert 2009/10/13 -// We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically. -/* - if(bwritezero == _TRUE) - { - usb_bulkout_zero(pintfhdl, addr); - } -*/ - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port\n")); - -exit: - if (ret != _SUCCESS) - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); -_func_exit_; - return ret; - -} - -void usb_write_port_cancel(struct intf_hdl *pintfhdl) -{ - int i, j; - _adapter *padapter = pintfhdl->padapter; - struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf; - - DBG_871X("%s \n", __func__); - - padapter->bWritePortCancel = _TRUE; - - for (i=0; ipxmit_urb[j]) { - usb_kill_urb(pxmitbuf->pxmit_urb[j]); - } - } - pxmitbuf++; - } - - pxmitbuf = (struct xmit_buf*)padapter->xmitpriv.pxmit_extbuf; - for (i = 0; i < NR_XMIT_EXTBUFF; i++) { - for (j=0; j<8; j++) { - if(pxmitbuf->pxmit_urb[j]) { - usb_kill_urb(pxmitbuf->pxmit_urb[j]); - } - } - pxmitbuf++; - } -} - +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + *******************************************************************************/ +#define _USB_OPS_LINUX_C_ + +#include +#include +#include + +#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ +static void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *regs) +{ + if (urb) { + if (urb->context) { + rtw_mfree(urb->context); + } + usb_free_urb(urb); + } +} + +static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request, + u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + int rc; + unsigned int pipe; + u8 reqtype; + struct usb_ctrlrequest *dr; + struct urb *urb; + struct rtl819x_async_write_data { + u8 data[VENDOR_CMD_MAX_DATA_LEN]; + struct usb_ctrlrequest dr; + } *buf; + + + if (requesttype == VENDOR_READ) { + pipe = usb_rcvctrlpipe(udev, 0);//read_in + reqtype = REALTEK_USB_VENQT_READ; + } + else { + pipe = usb_sndctrlpipe(udev, 0);//write_out + reqtype = REALTEK_USB_VENQT_WRITE; + } + + buf = (struct rtl819x_async_write_data *)rtw_zmalloc(sizeof(*buf)); + if (!buf) { + rc = -ENOMEM; + goto exit; + } + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + rtw_mfree((u8*)buf, sizeof(*buf)); + rc = -ENOMEM; + goto exit; + } + + dr = &buf->dr; + + dr->bRequestType = reqtype; + dr->bRequest = request; + dr->wValue = cpu_to_le16(value); + dr->wIndex = cpu_to_le16(index); + dr->wLength = cpu_to_le16(len); + + _rtw_memcpy(buf, pdata, len); + + usb_fill_control_urb(urb, udev, pipe, (unsigned char *)dr, buf, len, + _usbctrl_vendorreq_async_callback, buf); + + rc = usb_submit_urb(urb, GFP_ATOMIC); + if (rc < 0) { + rtw_mfree((u8*)buf, sizeof(*buf)); + usb_free_urb(urb); + } + +exit: + return rc; +} + +int usb_write_async(struct usb_device *udev, u32 addr, void *pdata, u16 len) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + + int ret; + + requesttype = VENDOR_WRITE;//write_out + request = REALTEK_USB_VENQT_CMD_REQ; + index = REALTEK_USB_VENQT_CMD_IDX;//n/a + + wvalue = (u16)(addr&0x0000ffff); + + ret = _usbctrl_vendorreq_async_write(udev, request, wvalue, index, pdata, len, requesttype); + + return ret; +} + +int usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) +{ + u8 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = val; + ret = usb_write_async(udev, addr, &data, 1); + _func_exit_; + + return ret; +} + +int usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) +{ + u16 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = val; + ret = usb_write_async(udev, addr, &data, 2); + _func_exit_; + + return ret; +} + +int usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) +{ + u32 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = val; + ret = usb_write_async(udev, addr, &data, 4); + _func_exit_; + + return ret; +} +#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */ + +unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) +{ + unsigned int pipe=0, ep_num=0; + struct usb_device *pusbd = pdvobj->pusbdev; + + if (addr == RECV_BULK_IN_ADDR) { + pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[0]); + + } else if (addr == RECV_INT_IN_ADDR) { + pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[1]); + + } else if (addr < HW_QUEUE_ENTRY) { + ep_num = pdvobj->Queue2Pipe[addr]; + pipe = usb_sndbulkpipe(pusbd, ep_num); + } + + return pipe; +} + +struct zero_bulkout_context{ + void *pbuf; + void *purb; + void *pirp; + void *padapter; +}; + +static void usb_bulkout_zero_complete(struct urb *purb, struct pt_regs *regs) +{ + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)purb->context; + + //DBG_8192C("+usb_bulkout_zero_complete\n"); + + if(pcontext) + { + if(pcontext->pbuf) + { + rtw_mfree(pcontext->pbuf, sizeof(int)); + } + + if(pcontext->purb && (pcontext->purb==purb)) + { + usb_free_urb(pcontext->purb); + } + + + rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context)); + } + + +} + +static u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) +{ + int pipe, status, len; + u32 ret; + unsigned char *pbuf; + struct zero_bulkout_context *pcontext; + PURB purb = NULL; + _adapter *padapter = (_adapter *)pintfhdl->padapter; + struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); + struct usb_device *pusbd = pdvobj->pusbdev; + + //DBG_871X("%s\n", __func__); + + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(dvobj_to_pwrctl(pdvobj)->pnp_bstop_trx)) + { + return _FAIL; + } + + + pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context)); + + pbuf = (unsigned char *)rtw_zmalloc(sizeof(int)); + purb = usb_alloc_urb(0, GFP_ATOMIC); + + len = 0; + pcontext->pbuf = pbuf; + pcontext->purb = purb; + pcontext->pirp = NULL; + pcontext->padapter = padapter; + + + //translate DMA FIFO addr to pipehandle + //pipe = ffaddr2pipehdl(pdvobj, addr); + + usb_fill_bulk_urb(purb, pusbd, pipe, + pbuf, + len, + usb_bulkout_zero_complete, + pcontext);//context is pcontext + + status = usb_submit_urb(purb, GFP_ATOMIC); + + if (!status) + { + ret= _SUCCESS; + } + else + { + ret= _FAIL; + } + + + return _SUCCESS; + +} + +void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + +} + +void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + +} + + +void usb_read_port_cancel(struct intf_hdl *pintfhdl) +{ + int i; + struct recv_buf *precvbuf; + _adapter *padapter = pintfhdl->padapter; + precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf; + + DBG_871X("%s\n", __func__); + + padapter->bReadPortCancel = _TRUE; + + for (i=0; i < NR_RECVBUFF ; i++) { + + precvbuf->reuse = _TRUE; + if (precvbuf->purb) { + //DBG_8192C("usb_read_port_cancel : usb_kill_urb \n"); + usb_kill_urb(precvbuf->purb); + } + precvbuf++; + } + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + usb_kill_urb(padapter->recvpriv.int_in_urb); +#endif +} + +static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs) +{ + _irqL irqL; + int i; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context; + //struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; + //_adapter *padapter = pxmitframe->padapter; + _adapter *padapter = pxmitbuf->padapter; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + //struct pkt_attrib *pattrib = &pxmitframe->attrib; + +_func_enter_; + + switch(pxmitbuf->flags) + { + case VO_QUEUE_INX: + pxmitpriv->voq_cnt--; + break; + case VI_QUEUE_INX: + pxmitpriv->viq_cnt--; + break; + case BE_QUEUE_INX: + pxmitpriv->beq_cnt--; + break; + case BK_QUEUE_INX: + pxmitpriv->bkq_cnt--; + break; + case HIGH_QUEUE_INX: +#ifdef CONFIG_AP_MODE + rtw_chk_hi_queue_cmd(padapter); +#endif + break; + default: + break; + } + + +/* + _enter_critical(&pxmitpriv->lock, &irqL); + + pxmitpriv->txirp_cnt--; + + switch(pattrib->priority) + { + case 1: + case 2: + pxmitpriv->bkq_cnt--; + //DBG_8192C("pxmitpriv->bkq_cnt=%d\n", pxmitpriv->bkq_cnt); + break; + case 4: + case 5: + pxmitpriv->viq_cnt--; + //DBG_8192C("pxmitpriv->viq_cnt=%d\n", pxmitpriv->viq_cnt); + break; + case 6: + case 7: + pxmitpriv->voq_cnt--; + //DBG_8192C("pxmitpriv->voq_cnt=%d\n", pxmitpriv->voq_cnt); + break; + case 0: + case 3: + default: + pxmitpriv->beq_cnt--; + //DBG_8192C("pxmitpriv->beq_cnt=%d\n", pxmitpriv->beq_cnt); + break; + + } + + _exit_critical(&pxmitpriv->lock, &irqL); + + + if(pxmitpriv->txirp_cnt==0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); + _rtw_up_sema(&(pxmitpriv->tx_retevt)); + } +*/ + //rtw_free_xmitframe(pxmitpriv, pxmitframe); + + if(padapter->bSurpriseRemoved || padapter->bDriverStopped ||padapter->bWritePortCancel) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + DBG_8192C("%s(): TX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) bWritePortCancel(%d) pxmitbuf->ext_tag(%x) \n", + __FUNCTION__,padapter->bDriverStopped, padapter->bSurpriseRemoved,padapter->bReadPortCancel,pxmitbuf->ext_tag); + + goto check_completion; + } + + + if (purb->status==0) { + + } else { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete : purb->status(%d) != 0 \n", purb->status)); + DBG_871X("###=> urb_write_port_complete status(%d)\n",purb->status); + if((purb->status==-EPIPE)||(purb->status==-EPROTO)) + { + //usb_clear_halt(pusbdev, purb->pipe); + //msleep(10); + sreset_set_wifi_error_status(padapter, USB_WRITE_PORT_FAIL); + } else if (purb->status == -EINPROGRESS) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: EINPROGESS\n")); + goto check_completion; + + } else if (purb->status == -ENOENT) { + DBG_871X("%s: -ENOENT\n", __func__); + goto check_completion; + + } else if (purb->status == -ECONNRESET) { + DBG_871X("%s: -ECONNRESET\n", __func__); + goto check_completion; + + } else if (purb->status == -ESHUTDOWN) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n")); + padapter->bDriverStopped=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped=TRUE\n")); + + goto check_completion; + } + else + { + padapter->bSurpriseRemoved=_TRUE; + DBG_8192C("bSurpriseRemoved=TRUE\n"); + //rtl8192cu_trigger_gpio_0(padapter); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n")); + + goto check_completion; + } + } + + #ifdef DBG_CONFIG_ERROR_DETECT + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.last_tx_complete_time = rtw_get_current_time(); + } + #endif + +check_completion: + _enter_critical(&pxmitpriv->lock_sctx, &irqL); + rtw_sctx_done_err(&pxmitbuf->sctx, + purb->status ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS); + _exit_critical(&pxmitpriv->lock_sctx, &irqL); + + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + + //if(rtw_txframes_pending(padapter)) + { + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); + } + +_func_exit_; + +} + +u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + _irqL irqL; + unsigned int pipe; + int status; + u32 ret = _FAIL, bwritezero = _FALSE; + PURB purb = NULL; + _adapter *padapter = (_adapter *)pintfhdl->padapter; + struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem; + struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; + struct usb_device *pusbd = pdvobj->pusbdev; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port\n")); + + if ((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(dvobj_to_pwrctl(pdvobj)->pnp_bstop_trx)) { + #ifdef DBG_TX + DBG_871X(" DBG_TX %s:%d bDriverStopped%d, bSurpriseRemoved:%d, pnp_bstop_trx:%d\n",__FUNCTION__, __LINE__ + ,padapter->bDriverStopped, padapter->bSurpriseRemoved, dvobj_to_pwrctl(pdvobj)->pnp_bstop_trx ); + #endif + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||pwrctl->pnp_bstop_trx)!!!\n")); + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_TX_DENY); + goto exit; + } + + _enter_critical(&pxmitpriv->lock, &irqL); + + switch(addr) + { + case VO_QUEUE_INX: + pxmitpriv->voq_cnt++; + pxmitbuf->flags = VO_QUEUE_INX; + break; + case VI_QUEUE_INX: + pxmitpriv->viq_cnt++; + pxmitbuf->flags = VI_QUEUE_INX; + break; + case BE_QUEUE_INX: + pxmitpriv->beq_cnt++; + pxmitbuf->flags = BE_QUEUE_INX; + break; + case BK_QUEUE_INX: + pxmitpriv->bkq_cnt++; + pxmitbuf->flags = BK_QUEUE_INX; + break; + case HIGH_QUEUE_INX: + pxmitbuf->flags = HIGH_QUEUE_INX; + break; + default: + pxmitbuf->flags = MGT_QUEUE_INX; + break; + } + + _exit_critical(&pxmitpriv->lock, &irqL); + + #ifdef DBG_TRX_STA_PKTS + { + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + int bmcast = IS_MCAST(pattrib->dst); + u8 agg_num = 1; + + #ifdef CONFIG_USB_HCI + #ifdef CONFIG_USB_TX_AGGREGATION + if(pxmitframe->agg_num>1) + agg_num = pxmitframe->agg_num; + #endif + #endif + + #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + if(pxmitframe->agg_num>1) + agg_num = pxmitframe->agg_num; + #endif + + if(bmcast) + { + psta = rtw_get_bcmc_stainfo(padapter); + + } else { + psta = rtw_get_stainfo(pstapriv, pattrib->dst); + } + if(psta) + { + switch(pattrib->priority) + { + case 1: + case 2: + psta->tx_bk_cnt += agg_num; + break; + case 4: + case 5: + psta->tx_vi_cnt += agg_num; + break; + case 6: + case 7: + psta->tx_vo_cnt += agg_num; + break; + case 0: + case 3: + default: + psta->tx_be_cnt += agg_num; + break; + } + } + } + #endif + + purb = pxmitbuf->pxmit_urb[0]; + +#if 0 + if(pdvobj->ishighspeed) + { + if(cnt> 0 && cnt%512 == 0) + { + //DBG_8192C("ishighspeed, cnt=%d\n", cnt); + bwritezero = _TRUE; + } + } + else + { + if(cnt > 0 && cnt%64 == 0) + { + //DBG_8192C("cnt=%d\n", cnt); + bwritezero = _TRUE; + } + } +#endif + + //translate DMA FIFO addr to pipehandle + pipe = ffaddr2pipehdl(pdvobj, addr); + +#ifdef CONFIG_REDUCE_USB_TX_INT + if ( (pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0) + || (pxmitbuf->ext_tag == _TRUE) ) + { + purb->transfer_flags &= (~URB_NO_INTERRUPT); + } else { + purb->transfer_flags |= URB_NO_INTERRUPT; + //DBG_8192C("URB_NO_INTERRUPT "); + } +#endif + + + usb_fill_bulk_urb(purb, pusbd, pipe, + pxmitframe->buf_addr, //= pxmitbuf->pbuf + cnt, + usb_write_port_complete, + pxmitbuf);//context is pxmitbuf + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX + purb->transfer_dma = pxmitbuf->dma_transfer_addr; + purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + purb->transfer_flags |= URB_ZERO_PACKET; +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + +#if 0 + if (bwritezero) + { + purb->transfer_flags |= URB_ZERO_PACKET; + } +#endif + + status = usb_submit_urb(purb, GFP_ATOMIC); + if (!status) { + #ifdef DBG_CONFIG_ERROR_DETECT + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.last_tx_time = rtw_get_current_time(); + } + #endif + } else { + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR); + DBG_871X("usb_write_port, status=%d\n", status); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port(): usb_submit_urb, status=%x\n", status)); + + switch (status) { + case -ENODEV: + padapter->bDriverStopped=_TRUE; + break; + default: + break; + } + goto exit; + } + + ret= _SUCCESS; + +// Commented by Albert 2009/10/13 +// We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically. +/* + if(bwritezero == _TRUE) + { + usb_bulkout_zero(pintfhdl, addr); + } +*/ + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port\n")); + +exit: + if (ret != _SUCCESS) + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); +_func_exit_; + return ret; + +} + +void usb_write_port_cancel(struct intf_hdl *pintfhdl) +{ + int i, j; + _adapter *padapter = pintfhdl->padapter; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf; + + DBG_871X("%s \n", __func__); + + padapter->bWritePortCancel = _TRUE; + + for (i=0; ipxmit_urb[j]) { + usb_kill_urb(pxmitbuf->pxmit_urb[j]); + } + } + pxmitbuf++; + } + + pxmitbuf = (struct xmit_buf*)padapter->xmitpriv.pxmit_extbuf; + for (i = 0; i < NR_XMIT_EXTBUFF; i++) { + for (j=0; j<8; j++) { + if(pxmitbuf->pxmit_urb[j]) { + usb_kill_urb(pxmitbuf->pxmit_urb[j]); + } + } + pxmitbuf++; + } +} + diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/xmit_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/xmit_linux.c index 1d852964031d..979066d86b8a 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/xmit_linux.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/xmit_linux.c @@ -229,19 +229,13 @@ void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt) netif_wake_queue(padapter->pnetdev); #endif - dev_kfree_skb_any(pkt); + rtw_skb_free(pkt); } void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe) { if(pxframe->pkt) - { - //RT_TRACE(_module_xmit_osdep_c_,_drv_err_,("linux : rtw_os_xmit_complete, dev_kfree_skb()\n")); - - //dev_kfree_skb_any(pxframe->pkt); rtw_os_pkt_complete(padapter, pxframe->pkt); - - } pxframe->pkt = NULL; } @@ -357,7 +351,7 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb) ) continue; - newskb = skb_copy(skb, GFP_ATOMIC); + newskb = rtw_skb_copy(skb); if (newskb) { _rtw_memcpy(newskb->data, psta->hwaddr, 6); @@ -365,24 +359,24 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb) if (res < 0) { DBG_871X("%s()-%d: rtw_xmit() return error!\n", __FUNCTION__, __LINE__); pxmitpriv->tx_drop++; - dev_kfree_skb_any(newskb); + rtw_skb_free(newskb); } else pxmitpriv->tx_pkts++; } else { - DBG_871X("%s-%d: skb_copy() failed!\n", __FUNCTION__, __LINE__); + DBG_871X("%s-%d: rtw_skb_copy() failed!\n", __FUNCTION__, __LINE__); pxmitpriv->tx_drop++; - //dev_kfree_skb_any(skb); + //rtw_skb_free(skb); return _FALSE; // Caller shall tx this multicast frame via normal way. } } - dev_kfree_skb_any(skb); + rtw_skb_free(skb); return _TRUE; } #endif // CONFIG_TX_MCAST2UNI -int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev) +int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev) { _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -443,7 +437,7 @@ _func_enter_; drop_packet: pxmitpriv->tx_drop++; - dev_kfree_skb_any(pkt); + rtw_skb_free(pkt); RT_TRACE(_module_xmit_osdep_c_, _drv_notice_, ("rtw_xmit_entry: drop, tx_drop=%d\n", (u32)pxmitpriv->tx_drop)); exit: @@ -453,3 +447,10 @@ _func_exit_; return 0; } +int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev) +{ + if (pkt) + rtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, pkt->truesize); + return _rtw_xmit_entry(pkt, pnetdev); +} + diff --git a/drivers/net/wireless/rtl8723as/os_dep/osdep_service.c b/drivers/net/wireless/rtl8723as/os_dep/osdep_service.c index 646877ccdee8..ac86e4d2f251 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/osdep_service.c +++ b/drivers/net/wireless/rtl8723as/os_dep/osdep_service.c @@ -249,235 +249,524 @@ void _rtw_mfree(u8 *pbuf, u32 sz) } -#ifdef DBG_MEM_ALLOC +#ifdef PLATFORM_FREEBSD +//review again +struct sk_buff * dev_alloc_skb(unsigned int size) +{ + struct sk_buff *skb=NULL; + u8 *data=NULL; + + //skb = (struct sk_buff *)_rtw_zmalloc(sizeof(struct sk_buff)); // for skb->len, etc. + skb = (struct sk_buff *)_rtw_malloc(sizeof(struct sk_buff)); + if(!skb) + goto out; + data = _rtw_malloc(size); + if(!data) + goto nodata; + + skb->head = (unsigned char*)data; + skb->data = (unsigned char*)data; + skb->tail = (unsigned char*)data; + skb->end = (unsigned char*)data + size; + skb->len = 0; + //printf("%s()-%d: skb=%p, skb->head = %p\n", __FUNCTION__, __LINE__, skb, skb->head); -struct rtw_dbg_mem_stat { - ATOMIC_T vir_alloc; // the memory bytes we allocate now - ATOMIC_T vir_peak; // the peak memory bytes we allocate - ATOMIC_T vir_alloc_err; // the error times we fail to allocate memory +out: + return skb; +nodata: + _rtw_mfree((u8 *)skb, sizeof(struct sk_buff)); + skb = NULL; +goto out; - ATOMIC_T phy_alloc; - ATOMIC_T phy_peak; - ATOMIC_T phy_alloc_err; +} + +void dev_kfree_skb_any(struct sk_buff *skb) +{ + //printf("%s()-%d: skb->head = %p\n", __FUNCTION__, __LINE__, skb->head); + if(skb->head) + _rtw_mfree(skb->head, 0); + //printf("%s()-%d: skb = %p\n", __FUNCTION__, __LINE__, skb); + if(skb) + _rtw_mfree((u8 *)skb, 0); +} +struct sk_buff *skb_clone(const struct sk_buff *skb) +{ + return NULL; +} + +#endif /* PLATFORM_FREEBSD */ - ATOMIC_T tx_alloc; - ATOMIC_T tx_peak; - ATOMIC_T tx_alloc_err; +inline struct sk_buff *_rtw_skb_alloc(u32 sz) +{ +#ifdef PLATFORM_LINUX + return __dev_alloc_skb(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL); +#endif /* PLATFORM_LINUX */ - ATOMIC_T rx_alloc; - ATOMIC_T rx_peak; - ATOMIC_T rx_alloc_err; -} rtw_dbg_mem_stat; +#ifdef PLATFORM_FREEBSD + return dev_alloc_skb(sz); +#endif /* PLATFORM_FREEBSD */ +} -void rtw_dump_mem_stat (void) +inline void _rtw_skb_free(struct sk_buff *skb) { - int vir_alloc, vir_peak, vir_alloc_err, phy_alloc, phy_peak, phy_alloc_err; - int tx_alloc, tx_peak, tx_alloc_err, rx_alloc, rx_peak, rx_alloc_err; + dev_kfree_skb_any(skb); +} + +inline struct sk_buff *_rtw_skb_copy(const struct sk_buff *skb) +{ +#ifdef PLATFORM_LINUX + return skb_copy(skb, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL); +#endif /* PLATFORM_LINUX */ + +#ifdef PLATFORM_FREEBSD + return NULL; +#endif /* PLATFORM_FREEBSD */ +} + +inline struct sk_buff *_rtw_skb_clone(struct sk_buff *skb) +{ +#ifdef PLATFORM_LINUX + return skb_clone(skb, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL); +#endif /* PLATFORM_LINUX */ + +#ifdef PLATFORM_FREEBSD + return skb_clone(skb); +#endif /* PLATFORM_FREEBSD */ +} + +inline int _rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb) +{ +#ifdef PLATFORM_LINUX + skb->dev = ndev; + return netif_rx(skb); +#endif /* PLATFORM_LINUX */ + +#ifdef PLATFORM_FREEBSD + return (*ndev->if_input)(ndev, skb); +#endif /* PLATFORM_FREEBSD */ +} + +void _rtw_skb_queue_purge(struct sk_buff_head *list) +{ + struct sk_buff *skb; + + while ((skb = skb_dequeue(list)) != NULL) + _rtw_skb_free(skb); +} + +#ifdef CONFIG_USB_HCI +inline void *_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma) +{ +#ifdef PLATFORM_LINUX +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + return usb_alloc_coherent(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma); +#else + return usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma); +#endif +#endif /* PLATFORM_LINUX */ - vir_alloc=ATOMIC_READ(&rtw_dbg_mem_stat.vir_alloc); - vir_peak=ATOMIC_READ(&rtw_dbg_mem_stat.vir_peak); - vir_alloc_err=ATOMIC_READ(&rtw_dbg_mem_stat.vir_alloc_err); +#ifdef PLATFORM_FREEBSD + return (malloc(size, M_USBDEV, M_NOWAIT | M_ZERO)); +#endif /* PLATFORM_FREEBSD */ +} +inline void _rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma) +{ +#ifdef PLATFORM_LINUX +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) + usb_free_coherent(dev, size, addr, dma); +#else + usb_buffer_free(dev, size, addr, dma); +#endif +#endif /* PLATFORM_LINUX */ + +#ifdef PLATFORM_FREEBSD + free(addr, M_USBDEV); +#endif /* PLATFORM_FREEBSD */ +} +#endif /* CONFIG_USB_HCI */ + +#ifdef DBG_MEM_ALLOC - phy_alloc=ATOMIC_READ(&rtw_dbg_mem_stat.phy_alloc); - phy_peak=ATOMIC_READ(&rtw_dbg_mem_stat.phy_peak); - phy_alloc_err=ATOMIC_READ(&rtw_dbg_mem_stat.phy_alloc_err); +struct rtw_mem_stat { + ATOMIC_T alloc; // the memory bytes we allocate currently + ATOMIC_T peak; // the peak memory bytes we allocate + ATOMIC_T alloc_cnt; // the alloc count for alloc currently + ATOMIC_T alloc_err_cnt; // the error times we fail to allocate memory +}; + +struct rtw_mem_stat rtw_mem_type_stat[mstat_tf_idx(MSTAT_TYPE_MAX)]; +struct rtw_mem_stat rtw_mem_func_stat[mstat_ff_idx(MSTAT_FUNC_MAX)]; - tx_alloc=ATOMIC_READ(&rtw_dbg_mem_stat.tx_alloc); - tx_peak=ATOMIC_READ(&rtw_dbg_mem_stat.tx_peak); - tx_alloc_err=ATOMIC_READ(&rtw_dbg_mem_stat.tx_alloc_err); +char *MSTAT_TYPE_str[] = { + "VIR", + "PHY", + "SKB", + "USB", +}; + +char *MSTAT_FUNC_str[] = { + "UNSP", + "IO", + "TXIO", + "RXIO", + "TX", + "RX", +}; + +int _rtw_mstat_dump(char *buf, int len) +{ + int cnt = 0; + int i; + int value_t[4][mstat_tf_idx(MSTAT_TYPE_MAX)]; + int value_f[4][mstat_ff_idx(MSTAT_FUNC_MAX)]; - rx_alloc=ATOMIC_READ(&rtw_dbg_mem_stat.rx_alloc); - rx_peak=ATOMIC_READ(&rtw_dbg_mem_stat.rx_peak); - rx_alloc_err=ATOMIC_READ(&rtw_dbg_mem_stat.rx_alloc_err); - - DBG_871X( "vir_alloc:%d, vir_peak:%d, vir_alloc_err:%d\n" - "phy_alloc:%d, phy_peak:%d, phy_alloc_err:%d\n" - "tx_alloc:%d, tx_peak:%d, tx_alloc_err:%d\n" - "rx_alloc:%d, rx_peak:%d, rx_alloc_err:%d\n" - , vir_alloc, vir_peak, vir_alloc_err - , phy_alloc, phy_peak, phy_alloc_err - , tx_alloc, tx_peak, tx_alloc_err - , rx_alloc, rx_peak, rx_alloc_err - ); + int vir_alloc, vir_peak, vir_alloc_err, phy_alloc, phy_peak, phy_alloc_err; + int tx_alloc, tx_peak, tx_alloc_err, rx_alloc, rx_peak, rx_alloc_err; + + for(i=0;i 5000) { - rtw_dump_mem_stat(); + //if (rtw_get_passing_time_ms(update_time) > 5000) { + // rtw_mstat_dump(); update_time=rtw_get_current_time(); - } - - + //} } -inline u8* dbg_rtw_vmalloc(u32 sz, const char *func, int line) + +inline u8* dbg_rtw_vmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line) { u8 *p; //DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); p=_rtw_vmalloc((sz)); - rtw_update_mem_stat( - p ? MEM_STAT_VIR_ALLOC_SUCCESS : MEM_STAT_VIR_ALLOC_FAIL + rtw_mstat_update( + flags + , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL , sz ); return p; } -inline u8* dbg_rtw_zvmalloc(u32 sz, const char *func, int line) +inline u8* dbg_rtw_zvmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line) { u8 *p; //DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); p=_rtw_zvmalloc((sz)); - rtw_update_mem_stat( - p ? MEM_STAT_VIR_ALLOC_SUCCESS : MEM_STAT_VIR_ALLOC_FAIL + rtw_mstat_update( + flags + , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL , sz ); return p; } -inline void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const char *func, int line) +inline void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const enum mstat_f flags, const char *func, const int line) { //DBG_871X("DBG_MEM_ALLOC %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz)); _rtw_vmfree((pbuf), (sz)); - rtw_update_mem_stat( - MEM_STAT_VIR_FREE + rtw_mstat_update( + flags + , MSTAT_FREE , sz ); - } -inline u8* dbg_rtw_malloc(u32 sz, const char *func, int line) +inline u8* dbg_rtw_malloc(u32 sz, const enum mstat_f flags, const char *func, const int line) { u8 *p; - - if((sz)>4096) - DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + //if(sz>=153 && sz<=306) + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + //if((sz)>4096) + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); p=_rtw_malloc((sz)); - rtw_update_mem_stat( - p ? MEM_STAT_PHY_ALLOC_SUCCESS : MEM_STAT_PHY_ALLOC_FAIL + rtw_mstat_update( + flags + , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL , sz ); return p; } -inline u8* dbg_rtw_zmalloc(u32 sz, const char *func, int line) +inline u8* dbg_rtw_zmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line) { u8 *p; - if((sz)>4096) - DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + //if(sz>=153 && sz<=306) + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + //if((sz)>4096) + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); p = _rtw_zmalloc((sz)); - rtw_update_mem_stat( - p ? MEM_STAT_PHY_ALLOC_SUCCESS : MEM_STAT_PHY_ALLOC_FAIL + rtw_mstat_update( + flags + , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL , sz ); return p; - } -inline void dbg_rtw_mfree(u8 *pbuf, u32 sz, const char *func, int line) +inline void dbg_rtw_mfree(u8 *pbuf, u32 sz, const enum mstat_f flags, const char *func, const int line) { - if((sz)>4096) - DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz)); + //if(sz>=153 && sz<=306) + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + //if((sz)>4096) + // DBG_871X("DBG_MEM_ALLOC %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz)); _rtw_mfree((pbuf), (sz)); - rtw_update_mem_stat( - MEM_STAT_PHY_FREE + rtw_mstat_update( + flags + , MSTAT_FREE , sz ); } -#endif + +inline struct sk_buff * dbg_rtw_skb_alloc(unsigned int size, const enum mstat_f flags, const char *func, int line) +{ + struct sk_buff *skb; + unsigned int truesize = 0; + + skb = _rtw_skb_alloc(size); + + if(skb) + truesize = skb->truesize; + + if(!skb || truesize < size /*|| size > 4096*/) + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d), skb:%p, truesize=%u\n", func, line, __FUNCTION__, size, skb, truesize); + + rtw_mstat_update( + flags + , skb ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL + , truesize + ); + + return skb; +} + +inline void dbg_rtw_skb_free(struct sk_buff *skb, const enum mstat_f flags, const char *func, int line) +{ + unsigned int truesize = skb->truesize; + + //if(truesize > 4096) + // DBG_871X("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize); + + _rtw_skb_free(skb); + + rtw_mstat_update( + flags + , MSTAT_FREE + , truesize + ); +} + +inline struct sk_buff *dbg_rtw_skb_copy(const struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line) +{ + struct sk_buff *skb_cp; + unsigned int truesize = skb->truesize; + unsigned int cp_truesize = 0; + + skb_cp = _rtw_skb_copy(skb); + if(skb_cp) + cp_truesize = skb_cp->truesize; + + if(!skb_cp || cp_truesize != truesize /*||cp_truesize > 4096*/) + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%u), skb_cp:%p, cp_truesize=%u\n", func, line, __FUNCTION__, truesize, skb_cp, cp_truesize); + + rtw_mstat_update( + flags + , skb_cp ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL + , truesize + ); + + return skb_cp; +} + +inline struct sk_buff *dbg_rtw_skb_clone(struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line) +{ + struct sk_buff *skb_cl; + unsigned int truesize = skb->truesize; + unsigned int cl_truesize = 0; + + skb_cl = _rtw_skb_clone(skb); + if(skb_cl) + cl_truesize = skb_cl->truesize; + + if(!skb_cl || cl_truesize != truesize /*|| cl_truesize > 4096*/) + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%u), skb_cl:%p, cl_truesize=%u\n", func, line, __FUNCTION__, truesize, skb_cl, cl_truesize); + + rtw_mstat_update( + flags + , skb_cl ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL + , truesize + ); + + return skb_cl; +} + +inline int dbg_rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb, const enum mstat_f flags, const char *func, int line) +{ + int ret; + unsigned int truesize = skb->truesize; + + //if(truesize > 4096) + // DBG_871X("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize); + + ret = _rtw_netif_rx(ndev, skb); + + rtw_mstat_update( + flags + , MSTAT_FREE + , truesize + ); + + return ret; +} + +inline void dbg_rtw_skb_queue_purge(struct sk_buff_head *list, enum mstat_f flags, const char *func, int line) +{ + struct sk_buff *skb; + + while ((skb = skb_dequeue(list)) != NULL) + dbg_rtw_skb_free(skb, flags, func, line); +} + +#ifdef CONFIG_USB_HCI +inline void *dbg_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma, const enum mstat_f flags, const char *func, int line) +{ + void *p; + //DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, size); + + p = _rtw_usb_buffer_alloc(dev, size, dma); + + rtw_mstat_update( + flags + , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL + , size + ); + + return p; +} + +inline void dbg_rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma, const enum mstat_f flags, const char *func, int line) +{ + //DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, size); + + _rtw_usb_buffer_free(dev, size, addr, dma); + + rtw_mstat_update( + flags + , MSTAT_FREE + , size + ); +} +#endif /* CONFIG_USB_HCI */ +#endif /* DBG_MEM_ALLOC */ void* rtw_malloc2d(int h, int w, int size) { @@ -566,7 +855,6 @@ void _rtw_memset(void *pbuf, int c, u32 sz) } #ifdef PLATFORM_FREEBSD - static inline void __list_add(_list *pnew, _list *pprev, _list *pnext) { pnext->prev = pnew; @@ -574,53 +862,7 @@ static inline void __list_add(_list *pnew, _list *pprev, _list *pnext) pnew->prev = pprev; pprev->next = pnew; } - -//review again -struct sk_buff * dev_alloc_skb(unsigned int size) -{ - struct sk_buff *skb=NULL; - u8 *data=NULL; - - //skb = (struct sk_buff *)_rtw_zmalloc(sizeof(struct sk_buff)); // for skb->len, etc. - skb = (struct sk_buff *)_rtw_malloc(sizeof(struct sk_buff)); - if(!skb) - goto out; - data = _rtw_malloc(size); - if(!data) - goto nodata; - - skb->head = (unsigned char*)data; - skb->data = (unsigned char*)data; - skb->tail = (unsigned char*)data; - skb->end = (unsigned char*)data + size; - skb->len = 0; - //printf("%s()-%d: skb=%p, skb->head = %p\n", __FUNCTION__, __LINE__, skb, skb->head); - -out: - return skb; -nodata: - _rtw_mfree((u8 *)skb, sizeof(struct sk_buff)); - skb = NULL; -goto out; - -} - -void dev_kfree_skb_any(struct sk_buff *skb) -{ - //printf("%s()-%d: skb->head = %p\n", __FUNCTION__, __LINE__, skb->head); - if(skb->head) - _rtw_mfree(skb->head, 0); - //printf("%s()-%d: skb = %p\n", __FUNCTION__, __LINE__, skb); - if(skb) - _rtw_mfree((u8 *)skb, 0); -} -struct sk_buff *skb_clone(const struct sk_buff *skb) -{ - return NULL; -} - -#endif - +#endif /* PLATFORM_FREEBSD */ void _rtw_init_listhead(_list *list) { @@ -1286,21 +1528,29 @@ void rtw_yield_os() } #define RTW_SUSPEND_LOCK_NAME "rtw_wifi" +#define RTW_SUSPEND_EXT_LOCK_NAME "rtw_wifi_ext" + #ifdef CONFIG_WAKELOCK static struct wake_lock rtw_suspend_lock; +static struct wake_lock rtw_suspend_ext_lock; #elif defined(CONFIG_ANDROID_POWER) static android_suspend_lock_t rtw_suspend_lock ={ .name = RTW_SUSPEND_LOCK_NAME }; +static android_suspend_lock_t rtw_suspend_ext_lock ={ + .name = RTW_SUSPEND_EXT_LOCK_NAME +}; #endif inline void rtw_suspend_lock_init() { #ifdef CONFIG_WAKELOCK wake_lock_init(&rtw_suspend_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_LOCK_NAME); + wake_lock_init(&rtw_suspend_ext_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_EXT_LOCK_NAME); #elif defined(CONFIG_ANDROID_POWER) android_init_suspend_lock(&rtw_suspend_lock); + android_init_suspend_ext_lock(&rtw_suspend_ext_lock); #endif } @@ -1308,8 +1558,10 @@ inline void rtw_suspend_lock_uninit() { #ifdef CONFIG_WAKELOCK wake_lock_destroy(&rtw_suspend_lock); + wake_lock_destroy(&rtw_suspend_ext_lock); #elif defined(CONFIG_ANDROID_POWER) android_uninit_suspend_lock(&rtw_suspend_lock); + android_uninit_suspend_lock(&rtw_suspend_ext_lock); #endif } @@ -1339,16 +1591,23 @@ inline void rtw_unlock_suspend() #endif } -#ifdef CONFIG_WOWLAN -inline void rtw_lock_suspend_timeout(long timeout) +inline void rtw_lock_suspend_timeout(u32 timeout_ms) +{ + #ifdef CONFIG_WAKELOCK + wake_lock_timeout(&rtw_suspend_lock, rtw_ms_to_systime(timeout_ms)); + #elif defined(CONFIG_ANDROID_POWER) + android_lock_suspend_auto_expire(&rtw_suspend_lock, rtw_ms_to_systime(timeout_ms)); + #endif +} + +inline void rtw_lock_ext_suspend_timeout(u32 timeout_ms) { #ifdef CONFIG_WAKELOCK - wake_lock_timeout(&rtw_suspend_lock, timeout); + wake_lock_timeout(&rtw_suspend_ext_lock, rtw_ms_to_systime(timeout_ms)); #elif defined(CONFIG_ANDROID_POWER) - android_lock_suspend_auto_expire(&rtw_suspend_lock, timeout); + android_lock_suspend_auto_expire(&rtw_suspend_ext_lock, rtw_ms_to_systime(timeout_ms)); #endif } -#endif //CONFIG_WOWLAN inline void ATOMIC_SET(ATOMIC_T *v, int i) { @@ -1940,8 +2199,9 @@ void rtw_buf_free(u8 **buf, u32 *buf_len) ori_len = *buf_len; if (*buf) { + u32 tmp_buf_len = *buf_len; *buf_len = 0; - _rtw_mfree(*buf, *buf_len); + rtw_mfree(*buf, tmp_buf_len); *buf = NULL; } } @@ -1976,7 +2236,7 @@ keep_ori: /* free ori */ if (ori && ori_len > 0) - _rtw_mfree(ori, ori_len); + rtw_mfree(ori, ori_len); } -- cgit v1.2.3